From 4f811cc4b07a27457b2951da131db2cbcfa39cb7 Mon Sep 17 00:00:00 2001 From: Peder Bergebakken Sundt Date: Wed, 19 Jul 2023 19:29:10 +0200 Subject: [PATCH] Add code --- .envrc | 6 + .gitignore | 9 + .localenv | 71 + .localenv-bootstrap-conda | 53 + .remoteenv | 29 + .remoteignore.toml | 30 + README.md | 128 +- ablation.md | 139 + experiments/marf.py | 624 ++ experiments/marf.yaml.j2 | 263 + experiments/summary.py | 849 +++ figures/nn-architecture.svg | 822 +++ ifield/__init__.py | 57 + ifield/cli.py | 1006 +++ ifield/cli_utils.py | 174 + ifield/data/__init__.py | 3 + ifield/data/common/__init__.py | 0 ifield/data/common/download.py | 90 + ifield/data/common/h5_dataclasses.py | 370 ++ ifield/data/common/mesh.py | 48 + ifield/data/common/points.py | 297 + ifield/data/common/processing.py | 85 + ifield/data/common/scan.py | 768 +++ ifield/data/common/types.py | 6 + ifield/data/config.py | 28 + ifield/data/coseg/__init__.py | 56 + ifield/data/coseg/download.py | 135 + ifield/data/coseg/preprocess.py | 137 + ifield/data/coseg/read.py | 290 + ifield/data/stanford/__init__.py | 76 + ifield/data/stanford/download.py | 129 + ifield/data/stanford/preprocess.py | 118 + ifield/data/stanford/read.py | 251 + ifield/datasets/__init__.py | 3 + ifield/datasets/common.py | 196 + ifield/datasets/coseg.py | 40 + ifield/datasets/stanford.py | 64 + ifield/logging.py | 258 + ifield/models/__init__.py | 3 + ifield/models/conditioning.py | 159 + ifield/models/intersection_fields.py | 589 ++ ifield/models/medial_atoms.py | 186 + ifield/models/orthogonal_plane.py | 101 + ifield/modules/__init__.py | 3 + ifield/modules/dtype.py | 22 + ifield/modules/fc.py | 424 ++ ifield/modules/siren.py | 25 + ifield/param.py | 231 + ifield/utils/__init__.py | 0 ifield/utils/geometry.py | 197 + ifield/utils/helpers.py | 205 + ifield/utils/loss.py | 590 ++ ifield/utils/operators/__init__.py | 0 ifield/utils/operators/diff.py | 96 + ifield/viewer/__init__.py | 0 ifield/viewer/assets/texturify_pano-1-4.jpg | Bin 0 -> 966126 bytes ifield/viewer/common.py | 430 ++ ifield/viewer/ray_field.py | 792 +++ poetry.lock | 6369 +++++++++++++++++++ pyproject.toml | 80 + 60 files changed, 18209 insertions(+), 1 deletion(-) create mode 100644 .envrc create mode 100644 .gitignore create mode 100644 .localenv create mode 100644 .localenv-bootstrap-conda create mode 100644 .remoteenv create mode 100644 .remoteignore.toml create mode 100644 ablation.md create mode 100755 experiments/marf.py create mode 100755 experiments/marf.yaml.j2 create mode 100755 experiments/summary.py create mode 100644 figures/nn-architecture.svg create mode 100644 ifield/__init__.py create mode 100644 ifield/cli.py create mode 100644 ifield/cli_utils.py create mode 100644 ifield/data/__init__.py create mode 100644 ifield/data/common/__init__.py create mode 100644 ifield/data/common/download.py create mode 100644 ifield/data/common/h5_dataclasses.py create mode 100644 ifield/data/common/mesh.py create mode 100644 ifield/data/common/points.py create mode 100644 ifield/data/common/processing.py create mode 100644 ifield/data/common/scan.py create mode 100644 ifield/data/common/types.py create mode 100644 ifield/data/config.py create mode 100644 ifield/data/coseg/__init__.py create mode 100644 ifield/data/coseg/download.py create mode 100644 ifield/data/coseg/preprocess.py create mode 100644 ifield/data/coseg/read.py create mode 100644 ifield/data/stanford/__init__.py create mode 100644 ifield/data/stanford/download.py create mode 100644 ifield/data/stanford/preprocess.py create mode 100644 ifield/data/stanford/read.py create mode 100644 ifield/datasets/__init__.py create mode 100644 ifield/datasets/common.py create mode 100644 ifield/datasets/coseg.py create mode 100644 ifield/datasets/stanford.py create mode 100644 ifield/logging.py create mode 100644 ifield/models/__init__.py create mode 100644 ifield/models/conditioning.py create mode 100644 ifield/models/intersection_fields.py create mode 100644 ifield/models/medial_atoms.py create mode 100644 ifield/models/orthogonal_plane.py create mode 100644 ifield/modules/__init__.py create mode 100644 ifield/modules/dtype.py create mode 100644 ifield/modules/fc.py create mode 100644 ifield/modules/siren.py create mode 100644 ifield/param.py create mode 100644 ifield/utils/__init__.py create mode 100644 ifield/utils/geometry.py create mode 100644 ifield/utils/helpers.py create mode 100644 ifield/utils/loss.py create mode 100644 ifield/utils/operators/__init__.py create mode 100644 ifield/utils/operators/diff.py create mode 100644 ifield/viewer/__init__.py create mode 100644 ifield/viewer/assets/texturify_pano-1-4.jpg create mode 100644 ifield/viewer/common.py create mode 100644 ifield/viewer/ray_field.py create mode 100644 poetry.lock create mode 100644 pyproject.toml diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..82d958a --- /dev/null +++ b/.envrc @@ -0,0 +1,6 @@ +#!/usr/bin/env bash + +# This file is automatically loaded with `direnv` if allowed. +# It enters you into the venv. + +source .localenv diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..683940d --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +__pycache__ +/data/models/ +/data/archives/ +/experiments/logdir/ +/.env/ +/.direnv/ +*.zip +*.sh +default.yaml # pandoc preview enhanced diff --git a/.localenv b/.localenv new file mode 100644 index 0000000..8fd87dc --- /dev/null +++ b/.localenv @@ -0,0 +1,71 @@ +#!/usr/bin/env bash + +# ======================= +# bootstrap a venv +# ======================= + +LOCAL_ENV_NAME="py310-$(basename $(pwd))" +LOCAL_ENV_DIR="$(pwd)/.env/$LOCAL_ENV_NAME" +mkdir -p "$LOCAL_ENV_DIR" + +# make configs and caches a part of venv +export POETRY_CACHE_DIR="$LOCAL_ENV_DIR/xdg/cache/poetry" +export PIP_CACHE_DIR="$LOCAL_ENV_DIR/xdg/cache/pip" +mkdir -p "$POETRY_CACHE_DIR" "$PIP_CACHE_DIR" + +#export POETRY_VIRTUALENVS_IN_PROJECT=true # store venv in ./.venv/ +#export POETRY_VIRTUALENVS_CREATE=false # install globally +export SETUPTOOLS_USE_DISTUTILS=stdlib # https://github.com/pre-commit/pre-commit/issues/2178#issuecomment-1002163763 +export IFIELD_PRETTY_TRACEBACK=1 +#export SHOW_LOCALS=1 # locals in tracebacks +export PYTHON_KEYRING_BACKEND="keyring.backends.null.Keyring" + +# ensure we have the correct python and poetry. Bootstrap via conda if missing +if ! command -v python310 >/dev/null || ! command -v poetry >/dev/null; then + source .localenv-bootstrap-conda + + if command -v mamba >/dev/null; then + CONDA=mamba + elif command -v conda >/dev/null; then + CONDA=conda + else + >&2 echo "ERROR: 'poetry' nor 'conda'/'mamba' could be found!" + exit 1 + fi + + function verbose { + echo +"$(printf " %q" "$@")" + "$@" + } + + if ! ($CONDA env list | grep -q "^$LOCAL_ENV_NAME "); then + verbose $CONDA create --yes --name "$LOCAL_ENV_NAME" -c conda-forge \ + python==3.10.8 poetry==1.3.1 #python-lsp-server + true + fi + + verbose conda activate "$LOCAL_ENV_NAME" || exit $? + #verbose $CONDA activate "$LOCAL_ENV_NAME" || exit $? + + unset -f verbose +fi + + +# enter poetry venv +# source .envrc +poetry run true # ensure venv exists +#source "$(poetry env info -p)/bin/activate" +export VIRTUAL_ENV=$(poetry env info --path) +export POETRY_ACTIVE=1 +export PATH="$VIRTUAL_ENV/bin":"$PATH" +# NOTE: poetry currently reuses and populates the conda venv. +# See: https://github.com/python-poetry/poetry/issues/1724 + + +# ensure output dirs exist +mkdir -p experiments/logdir + +# first-time-setup poetry +if ! command -v fix-my-functions >/dev/null; then + poetry install +fi diff --git a/.localenv-bootstrap-conda b/.localenv-bootstrap-conda new file mode 100644 index 0000000..d6e52b5 --- /dev/null +++ b/.localenv-bootstrap-conda @@ -0,0 +1,53 @@ +#!/usr/bin/env bash + +# ======================= +# bootstrap a conda venv +# ======================= + +CONDA_ENV_DIR="${LOCAL_ENV_DIR:-$(pwd)/.conda310}" +mkdir -p "$CONDA_ENV_DIR" +#touch "$HOME/.Xauthority" + +MINICONDA_PY310_URL="https://repo.anaconda.com/miniconda/Miniconda3-py310_22.11.1-1-Linux-x86_64.sh" +MINICONDA_PY310_HASH="00938c3534750a0e4069499baf8f4e6dc1c2e471c86a59caa0dd03f4a9269db6" + +# Check if conda is available +if ! command -v conda >/dev/null; then + export PATH="$CONDA_ENV_DIR/conda/bin:$PATH" +fi + +# Check again if conda is available, install miniconda if not +if ! command -v conda >/dev/null; then + (set -e #x + function verbose { + echo +"$(printf " %q" "$@")" + "$@" + } + + if command -v curl >/dev/null; then + verbose curl -sLo "$CONDA_ENV_DIR/miniconda_py310.sh" "$MINICONDA_PY310_URL" + elif command -v wget >/dev/null; then + verbose wget -O "$CONDA_ENV_DIR/miniconda_py310.sh" "$MINICONDA_PY310_URL" + else + echo "ERROR: unable to download miniconda!" + exit 1 + fi + + verbose test "$(sha256sum "$CONDA_ENV_DIR/miniconda_py310.sh")" = "$MINICONDA_PY310_HASH" + verbose chmod +x "$CONDA_ENV_DIR/miniconda_py310.sh" + + verbose "$CONDA_ENV_DIR/miniconda_py310.sh" -b -u -p "$CONDA_ENV_DIR/conda" + verbose rm "$CONDA_ENV_DIR/miniconda_py310.sh" + + eval "$(conda shell.bash hook)" # basically `conda init`, without modifying .bashrc + verbose conda install --yes --name base mamba -c conda-forge + + ) || exit $? +fi + +unset CONDA_ENV_DIR +unset MINICONDA_PY310_URL +unset MINICONDA_PY310_HASH + +# Enter conda environment +eval "$(conda shell.bash hook)" # basically `conda init`, without modifying .bashrc diff --git a/.remoteenv b/.remoteenv new file mode 100644 index 0000000..42519a5 --- /dev/null +++ b/.remoteenv @@ -0,0 +1,29 @@ +#!/usr/bin/env bash +# this file is used by remote-cli + +# Assumes repo is put in a "remotes/name-hash" folder, +# the default behaviour of remote-exec +REMOTES_DIR="$(dirname $(pwd))" +LOCAL_ENV_NAME="py310-$(basename $(pwd))" +LOCAL_ENV_DIR="$REMOTES_DIR/envs/$REMOTE_ENV_NAME" + +#export XDG_CACHE_HOME="$LOCAL_ENV_DIR/xdg/cache" +#export XDG_DATA_HOME="$LOCAL_ENV_DIR/xdg/share" +#export XDG_STATE_HOME="$LOCAL_ENV_DIR/xdg/state" +#mkdir -p "$XDG_CACHE_HOME" "$XDG_DATA_HOME" "$XDG_STATE_HOME" +export XDG_CONFIG_HOME="$LOCAL_ENV_DIR/xdg/config" +mkdir -p "$XDG_CONFIG_HOME" + + +export PYOPENGL_PLATFORM=egl # makes pyrender work headless +#export PYOPENGL_PLATFORM=osmesa # makes pyrender work headless +export SDL_VIDEODRIVER=dummy # pygame + +source .localenv + +# SLURM logs output dir +if command -v sbatch >/dev/null; then + mkdir -p slurm_logs + test -L experiments/logdir/slurm_logs || + ln -s ../../slurm_logs experiments/logdir/ +fi diff --git a/.remoteignore.toml b/.remoteignore.toml new file mode 100644 index 0000000..c8bd856 --- /dev/null +++ b/.remoteignore.toml @@ -0,0 +1,30 @@ +[push] +exclude = [ + "*.egg-info", + "*.pyc", + ".ipynb_checkpoints", + ".mypy_cache", + ".remote.toml", + ".remoteignore.toml", + ".venv", + ".wandb", + "__pycache__", + "data/models", + "docs", + "experiments/logdir", + "poetry.toml", + "slurm_logs", + "tmp", +] +include = [] + +[pull] +exclude = [ + "*", +] +include = [] + +[both] +exclude = [ +] +include = [] diff --git a/README.md b/README.md index 6cc3f36..e01b2b1 100644 --- a/README.md +++ b/README.md @@ -1 +1,127 @@ -This is where the code for the paper _"MARF: The Medial Atom Ray Field Object Representation"_ will be published. +# MARF: The Medial Atom Ray Field Object Representation + +
+ +![](figures/nn-architecture.svg) + +[Publication](https://doi.org/10.1016/j.cag.2023.06.032) | [Arxiv](https://arxiv.org/abs/2307.00037) | [Training data](https://mega.nz/file/9tsz3SbA#V6SIXpCFC4hbqWaFFvKmmS8BKir7rltXuhsqpEpE9wo) | [Network weights](https://mega.nz/file/t01AyTLK#7ZNMNgbqT9x2mhq5dxLuKeKyP7G0slfQX1RaZxifayw) + +
+ +**TL;DR:** We achieve _fast_ surface rendering by predicting _n_ maximally inscribed spherical intersection candidates for each camera ray. + +--- + +## Entering the Virtual Environment + +The environment is defined in `pyproject.toml` using [Poetry](https://github.com/python-poetry/poetry) and reproducibly locked in `poetry.lock`. +We propose three ways to enter the venv: + +```shell +# Requires Python 3.10 and Poetry +poetry install +poetry shell + +# Will bootstrap a Miniconda 3.10 environment into .env/ if needed, then run poetry +source .localenv +``` + + +## Evaluation + +### Pretrained models + +You can download our pre-trained models` from . +It should be unpacked into the root directory, such that the `experiment` folder gets merged. + +### The interactive renderer + +We automatically create experiment names with a schema of `{{model}}-{{experiment-name}}-{{hparams-summary}}-{{date}}-{{random-uid}}`. +You can load experiment weights using either the full path, or just the `random-uid` bit. + +From the `experiments` directory: + +```shell +./marf.py model {{experiment}} viewer +``` + +If you have downloaded our pre-trained network weights, consider trying: + +```shell +./marf.py model nqzh viewer # Stanford Bunny (single-shape) +./marf.py model wznx viewer # Stanford Buddha (single-shape) +./marf.py model mxwd viewer # Stanford Armadillo (single-shape) +./marf.py model camo viewer # Stanford Dragon (single-shape) +./marf.py model ksul viewer # Stanford Lucy (single-shape) +./marf.py model oxrf viewer # COSEG four-legged (multi-shape) +``` + +## Training and Evaluation Data + +You can download a pre-computed archive from . +It should be extracted into the root directory such that a `data` directory is added to the root directory. + +
+ +Optionally, you may compute the data yourself. + + +Single-shape training data: + +```shell +# takes takes about 23 minutes, mainly due to lucy +download-stanford bunny happy_buddha dragon armadillo lucy +preprocess-stanford bunny happy_buddha dragon armadillo lucy \ + --precompute-mesh-sv-scan-uv \ + --compute-miss-distances \ + --fill-missing-uv-points +``` + +Multi-shape training data: + +```shell +# takes takes about 29 minutes +download-coseg four-legged --shapes +preprocess-coseg four-legged \ + --precompute-mesh-sv-scan-uv \ + --compute-miss-distances \ + --fill-missing-uv-points +``` + +Evaluation data: + +```shell +# takes takes about 2 hour 20 minutes, mainly due to lucy +preprocess-stanford bunny happy_buddha dragon armadillo lucy \ + --precompute-mesh-sphere-scan \ + --compute-miss-distances +``` + +```shell +# takes takes about 4 hours +preprocess-coseg four-legged \ + --precompute-mesh-sphere-scan \ + --compute-miss-distances +``` +
+ + +## Training + +Our experiments are defined using YAML config files, optionally templated using Jinja2 as a preprocessor. +These templates accept additional input from the command line in the form of `-Okey=value` options. +Our whole experiment matrix is defined in `marf.yaml.j12`. We select between different experiment groups using `-Omode={single,ablation,multi}`, and which experiment using `-Oselect={{integer}}` + +From the `experiments` directory: + +CPU mode: + +```shell +./marf.py model marf.yaml.j2 -Oexperiment_name=cpu_test -Omode=single -Oselect=0 fit +``` + +GPU mode: + +```shell +./marf.py model marf.yaml.j2 -Oexperiment_name=cpu_test -Omode=single -Oselect=0 fit --accelerator gpu --devices 1 +``` diff --git a/ablation.md b/ablation.md new file mode 100644 index 0000000..34fcb3b --- /dev/null +++ b/ablation.md @@ -0,0 +1,139 @@ +### MARF +- `experiment-stanfordv12-bunny-both2marf-16atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0010-nqzh` +- `experiment-stanfordv12-happy_buddha-both2marf-16atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0312-wznx` +- `experiment-stanfordv12-armadillo-both2marf-16atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-30-1944-mxwd` +- `experiment-stanfordv12-dragon-both2marf-16atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0529-camo` +- `experiment-stanfordv12-lucy-both2marf-16atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0743-ksul` + +### LFN encoding +- `experiment-stanfordv12-dragon-plkr2marf-16atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0539-xjte` +- `experiment-stanfordv12-lucy-plkr2marf-16atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0753-ayvt` +- `experiment-stanfordv12-bunny-plkr2marf-16atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0022-axft` +- `experiment-stanfordv12-happy_buddha-plkr2marf-16atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0322-xfoc` +- `experiment-stanfordv12-armadillo-plkr2marf-16atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-30-2039-vbks` + +### PRIF encoding +- `experiment-stanfordv12-armadillo-prpft2marf-16atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-30-2033-nkxm` +- `experiment-stanfordv12-happy_buddha-prpft2marf-16atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0313-huci` +- `experiment-stanfordv12-dragon-prpft2marf-16atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0537-dxsb` +- `experiment-stanfordv12-bunny-prpft2marf-16atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0011-tzic` +- `experiment-stanfordv12-lucy-prpft2marf-16atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0744-hzvw` + +### No init scheme. +- `experiment-stanfordv12-happy_buddha-both2marf-16atom-50xinscr-10dmiss-nogeom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0444-uohy` +- `experiment-stanfordv12-armadillo-both2marf-16atom-50xinscr-10dmiss-nogeom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-30-2307-wjcf` +- `experiment-stanfordv12-dragon-both2marf-16atom-50xinscr-10dmiss-nogeom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0707-eanc` +- `experiment-stanfordv12-bunny-both2marf-16atom-50xinscr-10dmiss-nogeom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0225-kcfw` +- `experiment-stanfordv12-lucy-both2marf-16atom-50xinscr-10dmiss-nogeom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0852-lkfh` + +### 1 atom candidate +- `experiment-stanfordv12-lucy-both2marf-1atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0755-qzth` +- `experiment-stanfordv12-bunny-both2marf-1atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0027-ycnl` +- `experiment-stanfordv12-armadillo-both2marf-1atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-30-2121-fwvo` +- `experiment-stanfordv12-dragon-both2marf-1atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0541-nvhs` +- `experiment-stanfordv12-happy_buddha-both2marf-1atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0324-cuyw` + +### 4 atom candidates +- `experiment-stanfordv12-armadillo-both2marf-4atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-30-2122-qiwg` +- `experiment-stanfordv12-dragon-both2marf-4atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0544-ihkx` +- `experiment-stanfordv12-lucy-both2marf-4atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0757-jwxm` +- `experiment-stanfordv12-happy_buddha-both2marf-4atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0328-chhs` +- `experiment-stanfordv12-bunny-both2marf-4atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0038-zymb` + +### 8 atom candidates +- `experiment-stanfordv12-bunny-both2marf-8atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0055-ogpd` +- `experiment-stanfordv12-lucy-both2marf-8atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0757-frxb` +- `experiment-stanfordv12-happy_buddha-both2marf-8atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0337-twys` +- `experiment-stanfordv12-dragon-both2marf-8atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0551-bubw` +- `experiment-stanfordv12-armadillo-both2marf-8atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-30-2137-nnlj` + +### 32 atom candidates +- `experiment-stanfordv12-bunny-both2marf-32atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0056-ourc` +- `experiment-stanfordv12-armadillo-both2marf-32atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-30-2141-byaj` +- `experiment-stanfordv12-dragon-both2marf-32atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0554-zobg` +- `experiment-stanfordv12-happy_buddha-both2marf-32atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0337-rmyq` +- `experiment-stanfordv12-lucy-both2marf-32atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0800-lqen` + +### 64 atom candidates +- `experiment-stanfordv12-happy_buddha-both2marf-64atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0339-whcx` +- `experiment-stanfordv12-bunny-both2marf-64atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0058-seen` +- `experiment-stanfordv12-lucy-both2marf-64atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0806-ycxj` +- `experiment-stanfordv12-armadillo-both2marf-64atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-30-2153-wnfq` +- `experiment-stanfordv12-dragon-both2marf-64atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0555-zgcb` + +### No intersection loss +- `experiment-stanfordv12-happy_buddha-both2marf-16atom-50xinscr-10dmiss-geom-0chit-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-1053-ydnh` +- `experiment-stanfordv12-lucy-both2marf-16atom-50xinscr-10dmiss-geom-0chit-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-1111-fawl` +- `experiment-stanfordv12-bunny-both2marf-16atom-50xinscr-10dmiss-geom-0chit-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-1045-umwl` +- `experiment-stanfordv12-dragon-both2marf-16atom-50xinscr-10dmiss-geom-0chit-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-1103-lwmb` +- `experiment-stanfordv12-armadillo-both2marf-16atom-50xinscr-10dmiss-geom-0chit-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-1041-lhcc` + +### No silhouette loss +- `experiment-stanfordv12-armadillo-both2marf-16atom-50xinscr-0dmiss-geom-20chit-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-1042-fsuw` +- `experiment-stanfordv12-bunny-both2marf-16atom-50xinscr-0dmiss-geom-20chit-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-1046-nszw` +- `experiment-stanfordv12-dragon-both2marf-16atom-50xinscr-0dmiss-geom-20chit-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-1111-mlal` +- `experiment-stanfordv12-happy_buddha-both2marf-16atom-50xinscr-0dmiss-geom-20chit-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-1055-cvkg` +- `experiment-stanfordv12-lucy-both2marf-16atom-50xinscr-0dmiss-geom-20chit-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-1114-pdyh` + +### More silhouette loss +- `experiment-stanfordv12-bunny-both2marf-16atom-50xinscr-50dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0157-yekm` +- `experiment-stanfordv12-armadillo-both2marf-16atom-50xinscr-50dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-30-2243-nlrv` +- `experiment-stanfordv12-dragon-both2marf-16atom-50xinscr-50dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0639-yros` +- `experiment-stanfordv12-lucy-both2marf-16atom-50xinscr-50dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0842-xktg` +- `experiment-stanfordv12-happy_buddha-both2marf-16atom-50xinscr-50dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0423-ibxs` + +### No normal loss +- `experiment-stanfordv12-dragon-both2marf-16atom-50xinscr-10dmiss-geom-nocnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0614-ttta` +- `experiment-stanfordv12-bunny-both2marf-16atom-50xinscr-10dmiss-geom-nocnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0106-bnke` +- `experiment-stanfordv12-armadillo-both2marf-16atom-50xinscr-10dmiss-geom-nocnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-30-2154-bxwl` +- `experiment-stanfordv12-lucy-both2marf-16atom-50xinscr-10dmiss-geom-nocnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0811-qqgu` +- `experiment-stanfordv12-happy_buddha-both2marf-16atom-50xinscr-10dmiss-geom-nocnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0357-gwca` + +### No inscription loss +- `experiment-stanfordv12-bunny-both2marf-16atom-noxinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0227-xrqt` +- `experiment-stanfordv12-armadillo-both2marf-16atom-noxinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-30-2312-cgzv` +- `experiment-stanfordv12-happy_buddha-both2marf-16atom-noxinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0452-rerr` +- `experiment-stanfordv12-dragon-both2marf-16atom-noxinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0709-tfgg` +- `experiment-stanfordv12-lucy-both2marf-16atom-noxinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0856-ctvc` + +### More inscription loss +- `experiment-stanfordv12-happy_buddha-both2marf-16atom-250xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0459-kyyh` +- `experiment-stanfordv12-bunny-both2marf-16atom-250xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0243-qqqj` +- `experiment-stanfordv12-armadillo-both2marf-16atom-250xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-30-2336-yclo` +- `experiment-stanfordv12-lucy-both2marf-16atom-250xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0913-mulv` +- `experiment-stanfordv12-dragon-both2marf-16atom-250xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0714-zugg` + +### No maximality reg. +- `experiment-stanfordv12-lucy-both2marf-16atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-0sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0842-cvln` +- `experiment-stanfordv12-happy_buddha-both2marf-16atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-0sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0425-vpen` +- `experiment-stanfordv12-bunny-both2marf-16atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-0sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0207-qpdb` +- `experiment-stanfordv12-armadillo-both2marf-16atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-0sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-30-2251-zqvi` +- `experiment-stanfordv12-dragon-both2marf-16atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-0sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0641-ucdo` + +### More maximality reg. +- `experiment-stanfordv12-dragon-both2marf-16atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-5000sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0659-bqvf` +- `experiment-stanfordv12-armadillo-both2marf-16atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-5000sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-30-2256-escz` +- `experiment-stanfordv12-bunny-both2marf-16atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-5000sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0208-wmvs` +- `experiment-stanfordv12-happy_buddha-both2marf-16atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-5000sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0442-gdah` +- `experiment-stanfordv12-lucy-both2marf-16atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-5000sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0845-halc` + +### No specialization reg. +- `experiment-stanfordv12-lucy-both2marf-16atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-nominatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0913-odyn` +- `experiment-stanfordv12-bunny-both2marf-16atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-nominatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0251-xzig` +- `experiment-stanfordv12-dragon-both2marf-16atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-nominatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0722-gxps` +- `experiment-stanfordv12-armadillo-both2marf-16atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-nominatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-30-2342-zybo` +- `experiment-stanfordv12-happy_buddha-both2marf-16atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-nominatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-10dmv-nocond-100cwu500clr70tvs-2023-05-31-0507-tvlt` + +### No multi-view loss +- `experiment-stanfordv12-bunny-both2marf-16atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-nogradreg-nocond-100cwu500clr70tvs-2023-05-31-0310-wbqj` +- `experiment-stanfordv12-armadillo-both2marf-16atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-nogradreg-nocond-100cwu500clr70tvs-2023-05-30-2357-qnct` +- `experiment-stanfordv12-happy_buddha-both2marf-16atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-nogradreg-nocond-100cwu500clr70tvs-2023-05-31-0527-psnk` +- `experiment-stanfordv12-lucy-both2marf-16atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-nogradreg-nocond-100cwu500clr70tvs-2023-05-31-0927-wxcq` +- `experiment-stanfordv12-dragon-both2marf-16atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-nogradreg-nocond-100cwu500clr70tvs-2023-05-31-0743-pdbc` + +### More multi-view loss +- `experiment-stanfordv12-happy_buddha-both2marf-16atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-20dmv-nocond-100cwu500clr70tvs-2023-05-31-0510-caah` +- `experiment-stanfordv12-dragon-both2marf-16atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-20dmv-nocond-100cwu500clr70tvs-2023-05-31-0726-zkyg` +- `experiment-stanfordv12-bunny-both2marf-16atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-20dmv-nocond-100cwu500clr70tvs-2023-05-31-0254-akbq` +- `experiment-stanfordv12-lucy-both2marf-16atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-20dmv-nocond-100cwu500clr70tvs-2023-05-31-0924-aahb` +- `experiment-stanfordv12-armadillo-both2marf-16atom-50xinscr-10dmiss-geom-25cnrml-8x512fc-leaky_relu-hit-0minatomstdngxp-500sphgrow-10mdrop-layernorm-multi_view-20dmv-nocond-100cwu500clr70tvs-2023-05-30-2352-xlrn` diff --git a/experiments/marf.py b/experiments/marf.py new file mode 100755 index 0000000..73bf151 --- /dev/null +++ b/experiments/marf.py @@ -0,0 +1,624 @@ +#!/usr/bin/env python3 +from abc import ABC, abstractmethod +from argparse import Namespace +from collections import defaultdict +from datetime import datetime +from ifield import logging +from ifield.cli import CliInterface +from ifield.data.common.scan import SingleViewUVScan +from ifield.data.coseg import read as coseg_read +from ifield.data.stanford import read as stanford_read +from ifield.datasets import stanford, coseg, common +from ifield.models import intersection_fields +from ifield.utils.operators import diff +from ifield.viewer.ray_field import ModelViewer +from munch import Munch +from pathlib import Path +from pytorch3d.loss.chamfer import chamfer_distance +from pytorch_lightning.utilities import rank_zero_only +from torch.nn import functional as F +from torch.utils.data import DataLoader, Subset +from tqdm import tqdm +from trimesh import Trimesh +from typing import Union +import builtins +import itertools +import json +import numpy as np +import pytorch_lightning as pl +import rich +import rich.pretty +import statistics +import torch +pl.seed_everything(31337) +torch.set_float32_matmul_precision('medium') + + +IField = intersection_fields.IntersectionFieldAutoDecoderModel # brevity + + +class RayFieldAdDataModuleBase(pl.LightningDataModule, ABC): + @property + @abstractmethod + def observation_ids(self) -> list[str]: + ... + + @abstractmethod + def mk_ad_dataset(self) -> common.AutodecoderDataset: + ... + + @staticmethod + @abstractmethod + def get_trimesh_from_uid(uid) -> Trimesh: + ... + + @staticmethod + @abstractmethod + def get_sphere_scan_from_uid(uid) -> SingleViewUVScan: + ... + + def setup(self, stage=None): + assert stage in ["fit", None] # fit is for train/val, None is for all. "test" not supported ATM + + if not self.hparams.data_dir is None: + coseg.config.DATA_PATH = self.hparams.data_dir + step = self.hparams.step # brevity + + dataset = self.mk_ad_dataset() + n_items_pre_step_mapping = len(dataset) + + if step > 1: + dataset = common.TransformExtendedDataset(dataset) + + for sx in range(step): + for sy in range(step): + def make_slicer(sx, sy, step) -> callable: # the closure is required + if step > 1: + return lambda t: t[sx::step, sy::step] + else: + return lambda t: t + @dataset.map(slicer=make_slicer(sx, sy, step)) + def unpack(sample: tuple[str, SingleViewUVScan], slicer: callable): + scan: SingleViewUVScan = sample[1] + assert not scan.hits.shape[0] % step, f"{scan.hits.shape[0]=} not divisible by {step=}" + assert not scan.hits.shape[1] % step, f"{scan.hits.shape[1]=} not divisible by {step=}" + + return { + "z_uid" : sample[0], + "origins" : scan.cam_pos, + "dirs" : slicer(scan.ray_dirs), + "points" : slicer(scan.points), + "hits" : slicer(scan.hits), + "miss" : slicer(scan.miss), + "normals" : slicer(scan.normals), + "distances" : slicer(scan.distances), + } + + # Split each object into train/val with SampleSplit + n_items = len(dataset) + n_val = int(n_items * self.hparams.val_fraction) + n_train = n_items - n_val + self.generator = torch.Generator().manual_seed(self.hparams.prng_seed) + + # split the dataset such that all steps are in same part + assert n_items == n_items_pre_step_mapping * step * step, (n_items, n_items_pre_step_mapping, step) + indices = [ + i*step*step + sx*step + sy + for i in torch.randperm(n_items_pre_step_mapping, generator=self.generator).tolist() + for sx in range(step) + for sy in range(step) + ] + self.dataset_train = Subset(dataset, sorted(indices[:n_train], key=lambda x: torch.rand(1, generator=self.generator).tolist()[0])) + self.dataset_val = Subset(dataset, sorted(indices[n_train:n_train+n_val], key=lambda x: torch.rand(1, generator=self.generator).tolist()[0])) + + assert len(self.dataset_train) % self.hparams.batch_size == 0 + assert len(self.dataset_val) % self.hparams.batch_size == 0 + + def train_dataloader(self): + return DataLoader(self.dataset_train, + batch_size = self.hparams.batch_size, + drop_last = self.hparams.drop_last, + num_workers = self.hparams.num_workers, + persistent_workers = self.hparams.persistent_workers, + pin_memory = self.hparams.pin_memory, + prefetch_factor = self.hparams.prefetch_factor, + shuffle = self.hparams.shuffle, + generator = self.generator, + ) + + def val_dataloader(self): + return DataLoader(self.dataset_val, + batch_size = self.hparams.batch_size, + drop_last = self.hparams.drop_last, + num_workers = self.hparams.num_workers, + persistent_workers = self.hparams.persistent_workers, + pin_memory = self.hparams.pin_memory, + prefetch_factor = self.hparams.prefetch_factor, + generator = self.generator, + ) + + +class StanfordUVDataModule(RayFieldAdDataModuleBase): + skyward = "+Z" + def __init__(self, + data_dir : Union[str, Path, None] = None, + obj_names : list[str] = ["bunny"], # empty means all + + prng_seed : int = 1337, + step : int = 2, + batch_size : int = 5, + drop_last : bool = False, + num_workers : int = 8, + persistent_workers : bool = True, + pin_memory : int = True, + prefetch_factor : int = 2, + shuffle : bool = True, + val_fraction : float = 0.30, + ): + super().__init__() + if not obj_names: + obj_names = stanford_read.list_object_names() + self.save_hyperparameters() + + @property + def observation_ids(self) -> list[str]: + return self.hparams.obj_names + + def mk_ad_dataset(self) -> common.AutodecoderDataset: + return stanford.AutodecoderSingleViewUVScanDataset( + obj_names = self.hparams.obj_names, + data_path = self.hparams.data_dir, + ) + + @staticmethod + def get_trimesh_from_uid(obj_name) -> Trimesh: + import mesh_to_sdf + mesh = stanford_read.read_mesh(obj_name) + return mesh_to_sdf.scale_to_unit_sphere(mesh) + + @staticmethod + def get_sphere_scan_from_uid(obj_name) -> SingleViewUVScan: + return stanford_read.read_mesh_mesh_sphere_scan(obj_name) + + +class CosegUVDataModule(RayFieldAdDataModuleBase): + skyward = "+Y" + def __init__(self, + data_dir : Union[str, Path, None] = None, + object_sets : tuple[str] = ["tele-aliens"], # empty means all + + prng_seed : int = 1337, + step : int = 2, + batch_size : int = 5, + drop_last : bool = False, + num_workers : int = 8, + persistent_workers : bool = True, + pin_memory : int = True, + prefetch_factor : int = 2, + shuffle : bool = True, + val_fraction : float = 0.30, + ): + super().__init__() + if not object_sets: + object_sets = coseg_read.list_object_sets() + object_sets = tuple(object_sets) + self.save_hyperparameters() + + @property + def observation_ids(self) -> list[str]: + return coseg_read.list_model_id_strings(self.hparams.object_sets) + + def mk_ad_dataset(self) -> common.AutodecoderDataset: + return coseg.AutodecoderSingleViewUVScanDataset( + object_sets = self.hparams.object_sets, + data_path = self.hparams.data_dir, + ) + + @staticmethod + def get_trimesh_from_uid(string_uid): + raise NotImplementedError + + @staticmethod + def get_sphere_scan_from_uid(string_uid) -> SingleViewUVScan: + uid = coseg_read.model_id_string_to_uid(string_uid) + return coseg_read.read_mesh_mesh_sphere_scan(*uid) + + +def mk_cli(args=None) -> CliInterface: + cli = CliInterface( + module_cls = IField, + datamodule_cls = [StanfordUVDataModule, CosegUVDataModule], + workdir = Path(__file__).parent.resolve(), + experiment_name_prefix = "ifield", + ) + cli.trainer_defaults.update(dict( + precision = 16, + min_epochs = 5, + )) + + @cli.register_pre_training_callback + def populate_autodecoder_z_uids(args: Namespace, config: Munch, module: IField, trainer: pl.Trainer, datamodule: RayFieldAdDataModuleBase, logger: logging.Logger): + module.set_observation_ids(datamodule.observation_ids) + rank = getattr(rank_zero_only, "rank", 0) + rich.print(f"[rank {rank}] {len(datamodule.observation_ids) = }") + rich.print(f"[rank {rank}] {len(datamodule.observation_ids) > 1 = }") + rich.print(f"[rank {rank}] {module.is_conditioned = }") + + @cli.register_action(help="Interactive window with direct renderings from the model", args=[ + ("--shading", dict(type=int, default=ModelViewer.vizmodes_shading .index("lambertian"), help=f"Rendering mode. {{{', '.join(f'{i}: {m!r}'for i, m in enumerate(ModelViewer.vizmodes_shading))}}}")), + ("--centroid", dict(type=int, default=ModelViewer.vizmodes_centroids.index("best-centroids-colored"), help=f"Rendering mode. {{{', '.join(f'{i}: {m!r}'for i, m in enumerate(ModelViewer.vizmodes_centroids))}}}")), + ("--spheres", dict(type=int, default=ModelViewer.vizmodes_spheres .index(None), help=f"Rendering mode. {{{', '.join(f'{i}: {m!r}'for i, m in enumerate(ModelViewer.vizmodes_spheres))}}}")), + ("--analytical-normals", dict(action="store_true")), + ("--ground-truth", dict(action="store_true")), + ("--solo-atom",dict(type=int, default=None, help="Rendering mode")), + ("--res", dict(type=int, nargs=2, default=(210, 160), help="Rendering resolution")), + ("--bg", dict(choices=["map", "white", "black"], default="map")), + ("--skyward", dict(type=str, default="+Z", help='one of: "+X", "-X", "+Y", "-Y", ["+Z"], "-Z"')), + ("--scale", dict(type=int, default=3, help="Rendering scale")), + ("--fps", dict(type=int, default=None, help="FPS upper limit")), + ("--cam-state",dict(type=str, default=None, help="json cam state, expored with CTRL+H")), + ("--write", dict(type=Path, default=None, help="Where to write a screenshot.")), + ]) + @torch.no_grad() + def viewer(args: Namespace, config: Munch, model: IField): + datamodule_cls: RayFieldAdDataModuleBase = cli.get_datamodule_cls_from_config(args, config) + + if torch.cuda.is_available() and torch.cuda.device_count() > 0: + model.to("cuda") + viewer = ModelViewer(model, start_uid=next(iter(model.keys())), + name = config.experiment_name, + screenshot_dir = Path(__file__).parent.parent / "images/pygame-viewer", + res = args.res, + skyward = args.skyward, + scale = args.scale, + mesh_gt_getter = datamodule_cls.get_trimesh_from_uid, + ) + viewer.display_mode_shading = args.shading + viewer.display_mode_centroid = args.centroid + viewer.display_mode_spheres = args.spheres + if args.ground_truth: viewer.display_mode_normals = viewer.vizmodes_normals.index("ground_truth") + if args.analytical_normals: viewer.display_mode_normals = viewer.vizmodes_normals.index("analytical") + viewer.atom_index_solo = args.solo_atom + viewer.fps_cap = args.fps + viewer.display_sphere_map_bg = { "map": True, "white": 255, "black": 0 }[args.bg] + if args.cam_state is not None: + viewer.cam_state = json.loads(args.cam_state) + if args.write is None: + viewer.run() + else: + assert args.write.suffix == ".png", args.write.name + viewer.render_headless(args.write, + n_frames = 1, + fps = 1, + state_callback = None, + ) + + @cli.register_action(help="Prerender direct renderings from the model", args=[ + ("output_path",dict(type=Path, help="Where to store the output. We recommend a .mp4 suffix.")), + ("uids", dict(type=str, nargs="*")), + ("--frames", dict(type=int, default=60, help="Number of per interpolation. Default is 60")), + ("--fps", dict(type=int, default=60, help="Default is 60")), + ("--shading", dict(type=int, default=ModelViewer.vizmodes_shading .index("lambertian"), help=f"Rendering mode. {{{', '.join(f'{i}: {m!r}'for i, m in enumerate(ModelViewer.vizmodes_shading))}}}")), + ("--centroid", dict(type=int, default=ModelViewer.vizmodes_centroids.index("best-centroids-colored"), help=f"Rendering mode. {{{', '.join(f'{i}: {m!r}'for i, m in enumerate(ModelViewer.vizmodes_centroids))}}}")), + ("--spheres", dict(type=int, default=ModelViewer.vizmodes_spheres .index(None), help=f"Rendering mode. {{{', '.join(f'{i}: {m!r}'for i, m in enumerate(ModelViewer.vizmodes_spheres))}}}")), + ("--analytical-normals", dict(action="store_true")), + ("--solo-atom",dict(type=int, default=None, help="Rendering mode")), + ("--res", dict(type=int, nargs=2, default=(240, 240), help="Rendering resolution. Default is 240 240")), + ("--bg", dict(choices=["map", "white", "black"], default="map")), + ("--skyward", dict(type=str, default="+Z", help='one of: "+X", "-X", "+Y", "-Y", ["+Z"], "-Z"')), + ("--bitrate", dict(type=str, default="1500k", help="Encoding bitrate. Default is 1500k")), + ("--cam-state",dict(type=str, default=None, help="json cam state, expored with CTRL+H")), + ]) + @torch.no_grad() + def render_video_interpolation(args: Namespace, config: Munch, model: IField, **kw): + if torch.cuda.is_available() and torch.cuda.device_count() > 0: + model.to("cuda") + uids = args.uids or list(model.keys()) + assert len(uids) > 1 + if not args.uids: uids.append(uids[0]) + viewer = ModelViewer(model, uids[0], + name = config.experiment_name, + screenshot_dir = Path(__file__).parent.parent / "images/pygame-viewer", + res = args.res, + skyward = args.skyward, + ) + if args.cam_state is not None: + viewer.cam_state = json.loads(args.cam_state) + viewer.display_mode_shading = args.shading + viewer.display_mode_centroid = args.centroid + viewer.display_mode_spheres = args.spheres + if args.analytical_normals: viewer.display_mode_normals = viewer.vizmodes_normals.index("analytical") + viewer.atom_index_solo = args.solo_atom + viewer.display_sphere_map_bg = { "map": True, "white": 255, "black": 0 }[args.bg] + def state_callback(self: ModelViewer, frame: int): + if frame % args.frames: + self.lambertian_color = (0.8, 0.8, 1.0) + else: + self.lambertian_color = (1.0, 1.0, 1.0) + self.fps = args.frames + idx = frame // args.frames + 1 + if idx != len(uids): + self.current_uid = uids[idx] + print(f"Writing video to {str(args.output_path)!r}...") + viewer.render_headless(args.output_path, + n_frames = args.frames * (len(uids)-1) + 1, + fps = args.fps, + state_callback = state_callback, + bitrate = args.bitrate, + ) + + @cli.register_action(help="Prerender direct renderings from the model", args=[ + ("output_path",dict(type=Path, help="Where to store the output. We recommend a .mp4 suffix.")), + ("--frames", dict(type=int, default=180, help="Number of frames. Default is 180")), + ("--fps", dict(type=int, default=60, help="Default is 60")), + ("--shading", dict(type=int, default=ModelViewer.vizmodes_shading .index("lambertian"), help=f"Rendering mode. {{{', '.join(f'{i}: {m!r}'for i, m in enumerate(ModelViewer.vizmodes_shading))}}}")), + ("--centroid", dict(type=int, default=ModelViewer.vizmodes_centroids.index("best-centroids-colored"), help=f"Rendering mode. {{{', '.join(f'{i}: {m!r}'for i, m in enumerate(ModelViewer.vizmodes_centroids))}}}")), + ("--spheres", dict(type=int, default=ModelViewer.vizmodes_spheres .index(None), help=f"Rendering mode. {{{', '.join(f'{i}: {m!r}'for i, m in enumerate(ModelViewer.vizmodes_spheres))}}}")), + ("--analytical-normals", dict(action="store_true")), + ("--solo-atom",dict(type=int, default=None, help="Rendering mode")), + ("--res", dict(type=int, nargs=2, default=(320, 240), help="Rendering resolution. Default is 320 240")), + ("--bg", dict(choices=["map", "white", "black"], default="map")), + ("--skyward", dict(type=str, default="+Z", help='one of: "+X", "-X", "+Y", "-Y", ["+Z"], "-Z"')), + ("--bitrate", dict(type=str, default="1500k", help="Encoding bitrate. Default is 1500k")), + ("--cam-state",dict(type=str, default=None, help="json cam state, expored with CTRL+H")), + ]) + @torch.no_grad() + def render_video_spin(args: Namespace, config: Munch, model: IField, **kw): + if torch.cuda.is_available() and torch.cuda.device_count() > 0: + model.to("cuda") + viewer = ModelViewer(model, start_uid=next(iter(model.keys())), + name = config.experiment_name, + screenshot_dir = Path(__file__).parent.parent / "images/pygame-viewer", + res = args.res, + skyward = args.skyward, + ) + if args.cam_state is not None: + viewer.cam_state = json.loads(args.cam_state) + viewer.display_mode_shading = args.shading + viewer.display_mode_centroid = args.centroid + viewer.display_mode_spheres = args.spheres + if args.analytical_normals: viewer.display_mode_normals = viewer.vizmodes_normals.index("analytical") + viewer.atom_index_solo = args.solo_atom + viewer.display_sphere_map_bg = { "map": True, "white": 255, "black": 0 }[args.bg] + cam_rot_x_init = viewer.cam_rot_x + def state_callback(self: ModelViewer, frame: int): + self.cam_rot_x = cam_rot_x_init + 3.14 * (frame / args.frames) * 2 + print(f"Writing video to {str(args.output_path)!r}...") + viewer.render_headless(args.output_path, + n_frames = args.frames, + fps = args.fps, + state_callback = state_callback, + bitrate = args.bitrate, + ) + + @cli.register_action(help="foo", args=[ + ("fname", dict(type=Path, help="where to write json")), + ("-t", "--transpose", dict(action="store_true", help="transpose the output")), + ("--single-shape", dict(action="store_true", help="break after first shape")), + ("--batch-size", dict(type=int, default=40_000, help="tradeoff between vram usage and efficiency")), + ("--n-cd", dict(type=int, default=30_000, help="Number of points to use when computing chamfer distance")), + ("--filter-outliers", dict(action="store_true", help="like in PRIF")), + ]) + @torch.enable_grad() + def compute_scores(args: Namespace, config: Munch, model: IField, **kw): + datamodule_cls: RayFieldAdDataModuleBase = cli.get_datamodule_cls_from_config(args, config) + model.eval() + if torch.cuda.is_available() and torch.cuda.device_count() > 0: + model.to("cuda") + + def T(array: np.ndarray, **kw) -> torch.Tensor: + if isinstance(array, torch.Tensor): return array + return torch.tensor(array, device=model.device, dtype=model.dtype if isinstance(array, np.floating) else None, **kw) + + MEDIAL = model.hparams.output_mode == "medial_sphere" + if not MEDIAL: assert model.hparams.output_mode == "orthogonal_plane" + + + uids = sorted(model.keys()) + if args.single_shape: uids = [uids[0]] + rich.print(f"{datamodule_cls.__name__ = }") + rich.print(f"{len(uids) = }") + + # accumulators for IoU and F-Score, CD and COS + + # sum reduction: + n = defaultdict(int) + n_gt_hits = defaultdict(int) + n_gt_miss = defaultdict(int) + n_gt_missing = defaultdict(int) + n_outliers = defaultdict(int) + p_mse = defaultdict(int) + s_mse = defaultdict(int) + cossim_med = defaultdict(int) # medial normals + cossim_jac = defaultdict(int) # jacovian normals + TP,FN,FP,TN = [defaultdict(int) for _ in range(4)] # IoU and f-score + # mean reduction: + cd_dist = {} # chamfer distance + cd_cos_med = {} # chamfer medial normals + cd_cos_jac = {} # chamfer jacovian normals + all_metrics = dict( + n=n, n_gt_hits=n_gt_hits, n_gt_miss=n_gt_miss, n_gt_missing=n_gt_missing, p_mse=p_mse, + cossim_jac=cossim_jac, + TP=TP, FN=FN, FP=FP, TN=TN, cd_dist=cd_dist, + cd_cos_jac=cd_cos_jac, + ) + if MEDIAL: + all_metrics["s_mse"] = s_mse + all_metrics["cossim_med"] = cossim_med + all_metrics["cd_cos_med"] = cd_cos_med + if args.filter_outliers: + all_metrics["n_outliers"] = n_outliers + + t = datetime.now() + for uid in tqdm(uids, desc="Dataset", position=0, leave=True, disable=len(uids)<=1): + sphere_scan_gt = datamodule_cls.get_sphere_scan_from_uid(uid) + + z = model[uid].detach() + + all_intersections = [] + all_medial_normals = [] + all_jacobian_normals = [] + + step = args.batch_size + for i in tqdm(range(0, sphere_scan_gt.hits.shape[0], step), desc=f"Item {uid!r}", position=1, leave=False): + # prepare batch and gt + origins = T(sphere_scan_gt.cam_pos [i:i+step, :], requires_grad = True) + dirs = T(sphere_scan_gt.ray_dirs [i:i+step, :]) + gt_hits = T(sphere_scan_gt.hits [i:i+step]) + gt_miss = T(sphere_scan_gt.miss [i:i+step]) + gt_missing = T(sphere_scan_gt.missing [i:i+step]) + gt_points = T(sphere_scan_gt.points [i:i+step, :]) + gt_normals = T(sphere_scan_gt.normals [i:i+step, :]) + gt_distances = T(sphere_scan_gt.distances[i:i+step]) + + # forward + if MEDIAL: + ( + depths, + silhouettes, + intersections, + medial_normals, + is_intersecting, + sphere_centers, + sphere_radii, + ) = model({ + "origins" : origins, + "dirs" : dirs, + }, z, intersections_only=False, allow_nans=False) + else: + silhouettes = medial_normals = None + intersections, is_intersecting = model({ + "origins" : origins, + "dirs" : dirs, + }, z, normalize_origins = True) + is_intersecting = is_intersecting > 0.5 + jac = diff.jacobian(intersections, origins, detach=True) + + # outlier removal (PRIF) + if args.filter_outliers: + outliers = jac.norm(dim=-2).norm(dim=-1) > 5 + n_outliers[uid] += outliers[is_intersecting].sum().item() + # We count filtered points as misses + is_intersecting &= ~outliers + + model.zero_grad() + jacobian_normals = model.compute_normals_from_intersection_origin_jacobian(jac, dirs) + + all_intersections .append(intersections .detach()[is_intersecting.detach(), :]) + all_medial_normals .append(medial_normals .detach()[is_intersecting.detach(), :]) if MEDIAL else None + all_jacobian_normals.append(jacobian_normals.detach()[is_intersecting.detach(), :]) + + # accumulate metrics + with torch.no_grad(): + n [uid] += dirs.shape[0] + n_gt_hits [uid] += gt_hits.sum().item() + n_gt_miss [uid] += gt_miss.sum().item() + n_gt_missing [uid] += gt_missing.sum().item() + p_mse [uid] += (gt_points [gt_hits, :] - intersections[gt_hits, :]).norm(2, dim=-1).pow(2).sum().item() + if MEDIAL: s_mse [uid] += (gt_distances[gt_miss] - silhouettes [gt_miss] ) .pow(2).sum().item() + if MEDIAL: cossim_med[uid] += (1-F.cosine_similarity(gt_normals[gt_hits, :], medial_normals [gt_hits, :], dim=-1).abs()).sum().item() # to match what pytorch3d does for CD + cossim_jac [uid] += (1-F.cosine_similarity(gt_normals[gt_hits, :], jacobian_normals[gt_hits, :], dim=-1).abs()).sum().item() # to match what pytorch3d does for CD + not_intersecting = ~is_intersecting + TP [uid] += ((gt_hits | gt_missing) & is_intersecting).sum().item() # True Positive + FN [uid] += ((gt_hits | gt_missing) & not_intersecting).sum().item() # False Negative + FP [uid] += (gt_miss & is_intersecting).sum().item() # False Positive + TN [uid] += (gt_miss & not_intersecting).sum().item() # True Negative + + all_intersections = torch.cat(all_intersections, dim=0) + all_medial_normals = torch.cat(all_medial_normals, dim=0) if MEDIAL else None + all_jacobian_normals = torch.cat(all_jacobian_normals, dim=0) + + hits = sphere_scan_gt.hits # brevity + print() + + assert all_intersections.shape[0] >= args.n_cd + idx_cd_pred = torch.randperm(all_intersections.shape[0])[:args.n_cd] + idx_cd_gt = torch.randperm(hits.sum()) [:args.n_cd] + + print("cd... ", end="") + tt = datetime.now() + loss_cd, loss_cos_jac = chamfer_distance( + x = all_intersections [None, :, :][:, idx_cd_pred, :].detach(), + x_normals = all_jacobian_normals [None, :, :][:, idx_cd_pred, :].detach(), + y = T(sphere_scan_gt.points [None, hits, :][:, idx_cd_gt, :]), + y_normals = T(sphere_scan_gt.normals[None, hits, :][:, idx_cd_gt, :]), + batch_reduction = "sum", point_reduction = "sum", + ) + if MEDIAL: _, loss_cos_med = chamfer_distance( + x = all_intersections [None, :, :][:, idx_cd_pred, :].detach(), + x_normals = all_medial_normals [None, :, :][:, idx_cd_pred, :].detach(), + y = T(sphere_scan_gt.points [None, hits, :][:, idx_cd_gt, :]), + y_normals = T(sphere_scan_gt.normals[None, hits, :][:, idx_cd_gt, :]), + batch_reduction = "sum", point_reduction = "sum", + ) + print(datetime.now() - tt) + + cd_dist [uid] = loss_cd.item() + cd_cos_med [uid] = loss_cos_med.item() if MEDIAL else None + cd_cos_jac [uid] = loss_cos_jac.item() + + print() + model.zero_grad(set_to_none=True) + print("Total time:", datetime.now() - t) + print("Time per item:", (datetime.now() - t) / len(uids)) if len(uids) > 1 else None + + sum = lambda *xs: builtins .sum (itertools.chain(*(x.values() for x in xs))) + mean = lambda *xs: statistics.mean (itertools.chain(*(x.values() for x in xs))) + stdev = lambda *xs: statistics.stdev(itertools.chain(*(x.values() for x in xs))) + n_cd = args.n_cd + P = sum(TP)/(sum(TP, FP)) + R = sum(TP)/(sum(TP, FN)) + print(f"{mean(n) = :11.1f} (rays per object)") + print(f"{mean(n_gt_hits) = :11.1f} (gt rays hitting per object)") + print(f"{mean(n_gt_miss) = :11.1f} (gt rays missing per object)") + print(f"{mean(n_gt_missing) = :11.1f} (gt rays unknown per object)") + print(f"{mean(n_outliers) = :11.1f} (gt rays unknown per object)") if args.filter_outliers else None + print(f"{n_cd = :11.0f} (cd rays per object)") + print(f"{mean(n_gt_hits) / mean(n) = :11.8f} (fraction rays hitting per object)") + print(f"{mean(n_gt_miss) / mean(n) = :11.8f} (fraction rays missing per object)") + print(f"{mean(n_gt_missing)/ mean(n) = :11.8f} (fraction rays unknown per object)") + print(f"{mean(n_outliers) / mean(n) = :11.8f} (fraction rays unknown per object)") if args.filter_outliers else None + print(f"{sum(TP)/sum(n) = :11.8f} (total ray TP)") + print(f"{sum(TN)/sum(n) = :11.8f} (total ray TN)") + print(f"{sum(FP)/sum(n) = :11.8f} (total ray FP)") + print(f"{sum(FN)/sum(n) = :11.8f} (total ray FN)") + print(f"{sum(TP, FN, FP)/sum(n) = :11.8f} (total ray union)") + print(f"{sum(TP)/sum(TP, FN, FP) = :11.8f} (total ray IoU)") + print(f"{sum(TP)/(sum(TP, FP)) = :11.8f} -> P (total ray precision)") + print(f"{sum(TP)/(sum(TP, FN)) = :11.8f} -> R (total ray recall)") + print(f"{2*(P*R)/(P+R) = :11.8f} (total ray F-score)") + print(f"{sum(p_mse)/sum(n_gt_hits) = :11.8f} (mean ray intersection mean squared error)") + print(f"{sum(s_mse)/sum(n_gt_miss) = :11.8f} (mean ray silhoutette mean squared error)") + print(f"{sum(cossim_med)/sum(n_gt_hits) = :11.8f} (mean ray medial reduced cosine similarity)") if MEDIAL else None + print(f"{sum(cossim_jac)/sum(n_gt_hits) = :11.8f} (mean ray analytical reduced cosine similarity)") + print(f"{mean(cd_dist) /n_cd * 1e3 = :11.8f} (mean chamfer distance)") + print(f"{mean(cd_cos_med)/n_cd = :11.8f} (mean chamfer reduced medial cossim distance)") if MEDIAL else None + print(f"{mean(cd_cos_jac)/n_cd = :11.8f} (mean chamfer reduced analytical cossim distance)") + print(f"{stdev(cd_dist) /n_cd * 1e3 = :11.8f} (stdev chamfer distance)") if len(cd_dist) > 1 else None + print(f"{stdev(cd_cos_med)/n_cd = :11.8f} (stdev chamfer reduced medial cossim distance)") if len(cd_cos_med) > 1 and MEDIAL else None + print(f"{stdev(cd_cos_jac)/n_cd = :11.8f} (stdev chamfer reduced analytical cossim distance)") if len(cd_cos_jac) > 1 else None + + if args.transpose: + all_metrics, old_metrics = defaultdict(dict), all_metrics + for m, table in old_metrics.items(): + for uid, vals in table.items(): + all_metrics[uid][m] = vals + all_metrics["_hparams"] = dict(n_cd=args.n_cd) + else: + all_metrics["n_cd"] = args.n_cd + + if str(args.fname) == "-": + print("{", ',\n'.join( + f" {json.dumps(k)}: {json.dumps(v)}" + for k, v in all_metrics.items() + ), "}", sep="\n") + else: + args.fname.parent.mkdir(parents=True, exist_ok=True) + with args.fname.open("w") as f: + json.dump(all_metrics, f, indent=2) + + return cli + + +if __name__ == "__main__": + mk_cli().run() diff --git a/experiments/marf.yaml.j2 b/experiments/marf.yaml.j2 new file mode 100755 index 0000000..c12a7f7 --- /dev/null +++ b/experiments/marf.yaml.j2 @@ -0,0 +1,263 @@ +#!/usr/bin/env -S python ./marf.py module +{% do require_defined("select", select, 0, "$SLURM_ARRAY_TASK_ID") %}{# requires jinja2.ext.do #} +{% do require_defined("mode", mode, "single", "ablation", "multi", strict=true, exchaustive=true) %}{# requires jinja2.ext.do #} +{% set counter = itertools.count(start=0, step=1) %} +{% set do_condition = mode == "multi" %} +{% set do_ablation = mode == "ablation" %} + +{% set hp_matrix = namespace() %}{# hyper parameter matrix #} + +{% set hp_matrix.input_mode = [ + "both", + "perp_foot", + "plucker", +] if do_ablation else [ "both" ] %} +{% set hp_matrix.output_mode = ["medial_sphere", "orthogonal_plane"] %}{##} +{% set hp_matrix.output_mode = ["medial_sphere"] %}{##} +{% set hp_matrix.n_atoms = [16, 1, 4, 8, 32, 64] if do_ablation else [16] %}{##} +{% set hp_matrix.normal_coeff = [0.25, 0] if do_ablation else [0.25] %}{##} +{% set hp_matrix.dataset_item = [objname] if objname is defined else (["armadillo", "bunny", "happy_buddha", "dragon", "lucy"] if not do_condition else ["four-legged"]) %}{##} +{% set hp_matrix.test_val_split_frac = [0.7] %}{##} +{% set hp_matrix.lr_coeff = [5] %}{##} +{% set hp_matrix.warmup_epochs = [1] if not do_condition else [0.1] %}{##} +{% set hp_matrix.improve_miss_grads = [True] %}{##} +{% set hp_matrix.normalize_ray_dirs = [True] %}{##} +{% set hp_matrix.intersection_coeff = [2, 0] if do_ablation else [2] %}{##} +{% set hp_matrix.miss_distance_coeff = [1, 0, 5] if do_ablation else [1] %}{##} +{% set hp_matrix.relative_out = [False] %}{##} +{% set hp_matrix.hidden_features = [512] %}{# like deepsdf and prif #} +{% set hp_matrix.hidden_layers = [8] %}{# like deepsdf, nerf, prif #} +{% set hp_matrix.nonlinearity = ["leaky_relu"] %}{##} +{% set hp_matrix.omega = [30] %}{##} +{% set hp_matrix.normalization = ["layernorm"] %}{##} +{% set hp_matrix.dropout_percent = [1] %}{##} +{% set hp_matrix.sphere_grow_reg_coeff = [500, 0, 5000] if do_ablation else [500] %}{##} +{% set hp_matrix.geom_init = [True, False] if do_ablation else [True] %}{##} +{% set hp_matrix.loss_inscription = [50, 0, 250] if do_ablation else [50] %}{##} +{% set hp_matrix.atom_centroid_norm_std_reg_negexp = [0, None] if do_ablation else [0] %}{##} +{% set hp_matrix.curvature_reg_coeff = [0.2] %}{##} +{% set hp_matrix.multi_view_reg_coeff = [1, 2] if do_ablation else [1] %}{##} +{% set hp_matrix.grad_reg = [ "multi_view", "nogradreg" ] if do_ablation else [ "multi_view" ] %} + +{#% for hp in cartesian_hparams(hp_matrix) %}{##} +{% for hp in ablation_hparams(hp_matrix, caartesian_keys=["output_mode", "dataset_item", "nonlinearity", "test_val_split_frac"]) %} + +{% if hp.output_mode == "orthogonal_plane"%} +{% if hp.normal_coeff == 0 %}{% set hp.normal_coeff = 0.25 %} +{% elif hp.normal_coeff == 0.25 %}{% set hp.normal_coeff = 0 %} +{% endif %} +{% if hp.grad_reg == "multi_view" %}{% set hp.grad_reg = "nogradreg" %} +{% elif hp.grad_reg == "nogradreg" %}{% set hp.grad_reg = "multi_view" %} +{% endif %} +{% endif %} + +{# filter bad/uninteresting hparam combos #} +{% if ( hp.nonlinearity != "sine" and hp.omega != 30 ) + or ( hp.nonlinearity == "sine" and hp.normalization in ("layernorm", "layernorm_na") ) + or ( hp.multi_view_reg_coeff != 1 and "multi_view" not in hp.grad_reg ) + or ( "curvature" not in hp.grad_reg and hp.curvature_reg_coeff != 0.2 ) + or ( hp.output_mode == "orthogonal_plane" and hp.input_mode != "both" ) + or ( hp.output_mode == "orthogonal_plane" and hp.atom_centroid_norm_std_reg_negexp != 0 ) + or ( hp.output_mode == "orthogonal_plane" and hp.n_atoms != 16 ) + or ( hp.output_mode == "orthogonal_plane" and hp.sphere_grow_reg_coeff != 500 ) + or ( hp.output_mode == "orthogonal_plane" and hp.loss_inscription != 50 ) + or ( hp.output_mode == "orthogonal_plane" and hp.miss_distance_coeff != 1 ) + or ( hp.output_mode == "orthogonal_plane" and hp.test_val_split_frac != 0.7 ) + or ( hp.output_mode == "orthogonal_plane" and hp.lr_coeff != 5 ) + or ( hp.output_mode == "orthogonal_plane" and not hp.geom_init ) + or ( hp.output_mode == "orthogonal_plane" and not hp.intersection_coeff ) +%} + {% continue %}{# requires jinja2.ext.loopcontrols #} +{% endif %} + +{% set index = next(counter) %} +{% if select is not defined and index > 0 %}---{% endif %} +{% if select is not defined or int(select) == index %} + +trainer: + gradient_clip_val : 1.0 + max_epochs : 200 + min_epochs : 200 + log_every_n_steps : 20 + +{% if not do_condition %} + +StanfordUVDataModule: + obj_names : ["{{ hp.dataset_item }}"] + step : 4 + batch_size : 8 + val_fraction : {{ 1-hp.test_val_split_frac }} + +{% else %}{# if do_condition #} + +CosegUVDataModule: + object_sets : ["{{ hp.dataset_item }}"] + step : 4 + batch_size : 8 + val_fraction : {{ 1-hp.test_val_split_frac }} + +{% endif %}{# if do_condition #} + +logging: + save_dir : logdir + type : tensorboard + project : ifield + +{% autoescape false %} +{% do require_defined("experiment_name", experiment_name, "single-shape" if do_condition else "multi-shape", strict=true) %} +{% set input_mode_abbr = hp.input_mode + .replace("plucker", "plkr") + .replace("perp_foot", "prpft") +%} +{% set output_mode_abbr = hp.output_mode + .replace("medial_sphere", "marf") + .replace("orthogonal_plane", "prif") +%} +experiment_name: experiment-{{ "" if experiment_name is not defined else experiment_name }} +{#--#}-{{ hp.dataset_item }} +{#--#}-{{ input_mode_abbr }}2{{ output_mode_abbr }} +{#--#} +{%- if hp.output_mode == "medial_sphere" -%} + {#--#}-{{ hp.n_atoms }}atom + {#--# }-{{ "rel" if hp.relative_out else "norel" }} + {#--# }-{{ "e" if hp.improve_miss_grads else "0" }}sqrt + {#--#}-{{ int(hp.loss_inscription) if hp.loss_inscription else "no" }}xinscr + {#--#}-{{ int(hp.miss_distance_coeff * 10) }}dmiss + {#--#}-{{ "geom" if hp.geom_init else "nogeom" }} + {#--#}{% if "curvature" in hp.grad_reg %} + {#- -#}-{{ int(hp.curvature_reg_coeff*10) }}crv + {#--#}{%- endif -%} +{%- elif hp.output_mode == "orthogonal_plane" -%} + {#--#} +{%- endif -%} +{#--#}-{{ int(hp.intersection_coeff*10) }}chit +{#--#}-{{ int(hp.normal_coeff*100) or "no" }}cnrml +{#--# }-{{ "do" if hp.normalize_ray_dirs else "no" }}raynorm +{#--#}-{{ hp.hidden_layers }}x{{ hp.hidden_features }}fc +{#--#}-{{ hp.nonlinearity or "linear" }} +{#--#} +{%- if hp.nonlinearity == "sine" -%} + {#--#}-{{ hp.omega }}omega + {#--#} +{%- endif -%} +{%- if hp.output_mode == "medial_sphere" -%} + {#--#}-{{ str(hp.atom_centroid_norm_std_reg_negexp).replace(*"-n") if hp.atom_centroid_norm_std_reg_negexp is not none else 'no' }}minatomstdngxp + {#--#}-{{ hp.sphere_grow_reg_coeff }}sphgrow + {#--#} +{%- endif -%} +{#--#}-{{ int(hp.dropout_percent*10) }}mdrop +{#--#}-{{ hp.normalization or "nonorm" }} +{#--#}-{{ hp.grad_reg }} +{#--#}{% if "multi_view" in hp.grad_reg %} +{#- -#}-{{ int(hp.multi_view_reg_coeff*10) }}dmv +{#--#}{%- endif -%} +{#--#}-{{ "concat" if do_condition else "nocond" }} +{#--#}-{{ int(hp.warmup_epochs*100) }}cwu{{ int(hp.lr_coeff*100) }}clr{{ int(hp.test_val_split_frac*100) }}tvs +{#--#}-{{ gen_run_uid(4) }} # select with --Oselect={{ index }} +{#--#} +{##} + +{% endautoescape %} +IntersectionFieldAutoDecoderModel: + _extra: # used for easier introspection with jq + dataset_item: {{ hp.dataset_item | to_json}} + dataset_test_val_frac: {{ hp.test_val_split_frac }} + select: {{ index }} + + input_mode : {{ hp.input_mode }} # in {plucker, perp_foot, both} + output_mode : {{ hp.output_mode }} # in {medial_sphere, orthogonal_plane} + #latent_features : 256 # int + #latent_features : 128 # int + latent_features : 16 # int + hidden_features : {{ hp.hidden_features }} # int + hidden_layers : {{ hp.hidden_layers }} # int + + improve_miss_grads : {{ bool(hp.improve_miss_grads) | to_json }} + normalize_ray_dirs : {{ bool(hp.normalize_ray_dirs) | to_json }} + + loss_intersection : {{ hp.intersection_coeff }} + loss_intersection_l2 : 0 + loss_intersection_proj : 0 + loss_intersection_proj_l2 : 0 + + loss_normal_cossim : {{ hp.normal_coeff }} * EaseSin(85, 15) + loss_normal_euclid : 0 + loss_normal_cossim_proj : 0 + loss_normal_euclid_proj : 0 + +{% if "multi_view" in hp.grad_reg %} + loss_multi_view_reg : 0.1 * {{ hp.multi_view_reg_coeff }} * Linear(50) +{% else %} + loss_multi_view_reg : 0 +{% endif %} + +{% if hp.output_mode == "orthogonal_plane" %} + + loss_hit_cross_entropy : 1 + +{% elif hp.output_mode == "medial_sphere" %} + + loss_hit_nodistance_l1 : 0 + loss_hit_nodistance_l2 : 100 * {{ hp.miss_distance_coeff }} + loss_miss_distance_l1 : 0 + loss_miss_distance_l2 : 10 * {{ hp.miss_distance_coeff }} + + loss_inscription_hits : {{ 0.4 * hp.loss_inscription }} + loss_inscription_miss : 0 + loss_inscription_hits_l2 : 0 + loss_inscription_miss_l2 : {{ 6 * hp.loss_inscription }} + + loss_sphere_grow_reg : 1e-6 * {{ hp.sphere_grow_reg_coeff }} # constant + loss_atom_centroid_norm_std_reg: (0.09*(1-Linear(40)) + 0.01) * {{ 10**(-hp.atom_centroid_norm_std_reg_negexp) if hp.atom_centroid_norm_std_reg_negexp is not none else 0 }} + +{% else %}{#endif hp.output_mode == "medial_sphere" #} + THIS IS INVALID YAML +{% endif %} + + loss_embedding_norm : 0.01**2 * Linear(30, 0.1) + + opt_learning_rate : {{ hp.lr_coeff }} * 10**(-4-0.5*EaseSin(170, 30)) # layernorm + opt_warmup : {{ hp.warmup_epochs }} + opt_weight_decay : 5e-6 # float + +{% if hp.output_mode == "medial_sphere" %} + + # MedialAtomNet: + n_atoms : {{ hp.n_atoms }} # int + {% if hp.geom_init %} + final_init_wrr: [0.05, 0.6, 0.1] + {% else %} + final_init_wrr: null + {% endif %} + +{% endif %} + + + # FCBlock: + normalization : {{ hp.normalization or "null" }} # in {null, layernorm, layernorm_na, weightnorm} + nonlinearity : {{ hp.nonlinearity or "null" }} # in {null, relu, leaky_relu, silu, softplus, elu, selu, sine, sigmoid, tanh } + {% set middle = 1 + hp.hidden_layers // 2 + (hp.hidden_layers % 2) %}{##} + concat_skipped_layers : [{{ middle }}, -1] +{% if do_condition %} + concat_conditioned_layers : [0, {{ middle }}] +{% else %} + concat_conditioned_layers : [] +{% endif %} + + # FCLayer: + negative_slope : 0.01 # float + omega_0 : {{ hp.omega }} # float + residual_mode : null # in {null, identity} + +{% endif %}{# -Oselect #} + + +{% endfor %} + + +{% set index = next(counter) %} +# number of possible -Oselect: {{ index }}, from 0 to {{ index-1 }} +# local: for select in {0..{{ index-1 }}}; do python ... -Omode={{ mode }} -Oselect=$select ... ; done +# local: for select in {0..{{ index-1 }}}; do python -O {{ argv[0] }} model marf.yaml.j2 -Omode={{ mode }} -Oselect=$select -Oexperiment_name='{{ experiment_name }}' fit --accelerator gpu ; done +# slurm: sbatch --array=0-{{ index-1 }} runcommand.slurm python ... -Omode={{ mode }} -Oselect=\$SLURM_ARRAY_TASK_ID ... +# slurm: sbatch --array=0-{{ index-1 }} runcommand.slurm python -O {{ argv[0] }} model marf.yaml.j2 -Omode={{ mode }} -Oselect=\$SLURM_ARRAY_TASK_ID -Oexperiment_name='{{ experiment_name }}' fit --accelerator gpu --devices -1 --strategy ddp diff --git a/experiments/summary.py b/experiments/summary.py new file mode 100755 index 0000000..7cbaae8 --- /dev/null +++ b/experiments/summary.py @@ -0,0 +1,849 @@ +#!/usr/bin/env python +from concurrent.futures import ThreadPoolExecutor, Future, ProcessPoolExecutor +from functools import partial +from more_itertools import first, last, tail +from munch import Munch, DefaultMunch, munchify, unmunchify +from pathlib import Path +from statistics import mean, StatisticsError +from mpl_toolkits.axes_grid1 import make_axes_locatable +from typing import Iterable, Optional, Literal +from math import isnan +import json +import stat +import matplotlib +import matplotlib.colors as mcolors +import matplotlib.pyplot as plt +import os, os.path +import re +import shlex +import time +import itertools +import shutil +import subprocess +import sys +import traceback +import typer +import warnings +import yaml +import tempfile + +EXPERIMENTS = Path(__file__).resolve() +LOGDIR = EXPERIMENTS / "logdir" +TENSORBOARD = LOGDIR / "tensorboard" +SLURM_LOGS = LOGDIR / "slurm_logs" +CACHED_SUMMARIES = LOGDIR / "cached_summaries" +COMPUTED_SCORES = LOGDIR / "computed_scores" + +MISSING = object() + +class SafeLoaderIgnoreUnknown(yaml.SafeLoader): + def ignore_unknown(self, node): + return None +SafeLoaderIgnoreUnknown.add_constructor(None, SafeLoaderIgnoreUnknown.ignore_unknown) + +def camel_to_snake_case(text: str, sep: str = "_", join_abbreviations: bool = False) -> str: + parts = ( + part.lower() + for part in re.split(r'(?=[A-Z])', text) + if part + ) + if join_abbreviations: # this operation is not reversible + parts = list(parts) + if len(parts) > 1: + for i, (a, b) in list(enumerate(zip(parts[:-1], parts[1:])))[::-1]: + if len(a) == len(b) == 1: + parts[i] = parts[i] + parts.pop(i+1) + return sep.join(parts) + +def flatten_dict(data: dict, key_mapper: callable = lambda x: x) -> dict: + if not any(isinstance(val, dict) for val in data.values()): + return data + else: + return { + k: v + for k, v in data.items() + if not isinstance(v, dict) + } | { + f"{key_mapper(p)}/{k}":v + for p,d in data.items() + if isinstance(d, dict) + for k,v in d.items() + } + +def parse_jsonl(data: str) -> Iterable[dict]: + yield from map(json.loads, (line for line in data.splitlines() if line.strip())) + +def read_jsonl(path: Path) -> Iterable[dict]: + with path.open("r") as f: + data = f.read() + yield from parse_jsonl(data) + +def get_experiment_paths(filter: str | None, assert_dumped = False) -> Iterable[Path]: + for path in TENSORBOARD.iterdir(): + if filter is not None and not re.search(filter, path.name): continue + if not path.is_dir(): continue + + if not (path / "hparams.yaml").is_file(): + warnings.warn(f"Missing hparams: {path}") + continue + if not any(path.glob("events.out.tfevents.*")): + warnings.warn(f"Missing tfevents: {path}") + continue + + if __debug__ and assert_dumped: + assert (path / "scalars/epoch.json").is_file(), path + assert (path / "scalars/IntersectionFieldAutoDecoderModel.validation_step/loss.json").is_file(), path + assert (path / "scalars/IntersectionFieldAutoDecoderModel.training_step/loss.json").is_file(), path + + yield path + +def dump_pl_tensorboard_hparams(experiment: Path): + with (experiment / "hparams.yaml").open() as f: + hparams = yaml.load(f, Loader=SafeLoaderIgnoreUnknown) + + shebang = None + with (experiment / "config.yaml").open("w") as f: + raw_yaml = hparams.get('_pickled_cli_args', {}).get('_raw_yaml', "").replace("\n\r", "\n") + if raw_yaml.startswith("#!"): # preserve shebang + shebang, _, raw_yaml = raw_yaml.partition("\n") + f.write(f"{shebang}\n") + f.write(f"# {' '.join(map(shlex.quote, hparams.get('_pickled_cli_args', {}).get('sys_argv', ['None'])))}\n\n") + f.write(raw_yaml) + if shebang is not None: + os.chmod(experiment / "config.yaml", (experiment / "config.yaml").stat().st_mode | stat.S_IXUSR) + print(experiment / "config.yaml", "written!", file=sys.stderr) + + with (experiment / "environ.yaml").open("w") as f: + yaml.safe_dump(hparams.get('_pickled_cli_args', {}).get('host', {}).get('environ'), f) + print(experiment / "environ.yaml", "written!", file=sys.stderr) + + with (experiment / "repo.patch").open("w") as f: + f.write(hparams.get('_pickled_cli_args', {}).get('host', {}).get('vcs', "None")) + print(experiment / "repo.patch", "written!", file=sys.stderr) + +def dump_simple_tf_events_to_jsonl(output_dir: Path, *tf_files: Path): + from google.protobuf.json_format import MessageToDict + import tensorboard.backend.event_processing.event_accumulator + s, l = {}, [] # reused sentinels + + #resource.setrlimit(resource.RLIMIT_NOFILE, (2**16,-1)) + file_handles = {} + try: + for tffile in tf_files: + loader = tensorboard.backend.event_processing.event_file_loader.LegacyEventFileLoader(str(tffile)) + for event in loader.Load(): + for summary in MessageToDict(event).get("summary", s).get("value", l): + if "simpleValue" in summary: + tag = summary["tag"] + if tag not in file_handles: + fname = output_dir / f"{tag}.json" + print(f"Opening {str(fname)!r}...", file=sys.stderr) + fname.parent.mkdir(parents=True, exist_ok=True) + file_handles[tag] = fname.open("w") # ("a") + val = summary["simpleValue"] + data = json.dumps({ + "step" : event.step, + "value" : float(val) if isinstance(val, str) else val, + "wall_time" : event.wall_time, + }) + file_handles[tag].write(f"{data}\n") + finally: + if file_handles: + print("Closing json files...", file=sys.stderr) + for k, v in file_handles.items(): + v.close() + + +NO_FILTER = { + "__uid", + "_minutes", + "_epochs", + "_hp_nonlinearity", + "_val_uloss_intersection", + "_val_uloss_normal_cossim", + "_val_uloss_intersection", +} +def filter_jsonl_columns(data: Iterable[dict | None], no_filter=NO_FILTER) -> list[dict]: + def merge_siren_omega(data: dict) -> dict: + return { + key: ( + f"{val}-{data.get('hp_omega_0', 'ERROR')}" + if (key.removeprefix("_"), val) == ("hp_nonlinearity", "sine") else + val + ) + for key, val in data.items() + if key != "hp_omega_0" + } + + def remove_uninteresting_cols(rows: list[dict]) -> Iterable[dict]: + unique_vals = {} + def register_val(key, val): + unique_vals.setdefault(key, set()).add(repr(val)) + return val + + whitelisted = { + key + for row in rows + for key, val in row.items() + if register_val(key, val) and val not in ("None", "0", "0.0") + } + for key in unique_vals: + for row in rows: + if key not in row: + unique_vals[key].add(MISSING) + for key, vals in unique_vals.items(): + if key not in whitelisted: continue + if len(vals) == 1: + whitelisted.remove(key) + + whitelisted.update(no_filter) + + yield from ( + { + key: val + for key, val in row.items() + if key in whitelisted + } + for row in rows + ) + + def pessemize_types(rows: list[dict]) -> Iterable[dict]: + types = {} + order = (str, float, int, bool, tuple, type(None)) + for row in rows: + for key, val in row.items(): + if isinstance(val, list): val = tuple(val) + assert type(val) in order, (type(val), val) + index = order.index(type(val)) + types[key] = min(types.get(key, 999), index) + + yield from ( + { + key: order[types[key]](val) if val is not None else None + for key, val in row.items() + } + for row in rows + ) + + data = (row for row in data if row is not None) + data = map(partial(flatten_dict, key_mapper=camel_to_snake_case), data) + data = map(merge_siren_omega, data) + data = remove_uninteresting_cols(list(data)) + data = pessemize_types(list(data)) + + return data + +PlotMode = Literal["stackplot", "lineplot"] + +def plot_losses(experiments: list[Path], mode: PlotMode, write: bool = False, dump: bool = False, training: bool = False, unscaled: bool = False, force=True): + def get_losses(experiment: Path, training: bool = True, unscaled: bool = False) -> Iterable[Path]: + if not training and unscaled: + return experiment.glob("scalars/*.validation_step/unscaled_loss_*.json") + elif not training and not unscaled: + return experiment.glob("scalars/*.validation_step/loss_*.json") + elif training and unscaled: + return experiment.glob("scalars/*.training_step/unscaled_loss_*.json") + elif training and not unscaled: + return experiment.glob("scalars/*.training_step/loss_*.json") + + print("Mapping colors...") + configurations = [ + dict(unscaled=unscaled, training=training), + ] if not write else [ + dict(unscaled=False, training=False), + dict(unscaled=False, training=True), + dict(unscaled=True, training=False), + dict(unscaled=True, training=True), + ] + legends = set( + f"""{ + loss.parent.name.split(".", 1)[0] + }.{ + loss.name.removesuffix(loss.suffix).removeprefix("unscaled_") + }""" + for experiment in experiments + for kw in configurations + for loss in get_losses(experiment, **kw) + ) + colormap = dict(zip( + sorted(legends), + itertools.cycle(mcolors.TABLEAU_COLORS), + )) + + def mkplot(experiment: Path, training: bool = True, unscaled: bool = False) -> tuple[bool, str]: + label = f"{'unscaled' if unscaled else 'scaled'} {'training' if training else 'validation'}" + if write: + old_savefig_fname = experiment / f"{label.replace(' ', '-')}-{mode}.png" + savefig_fname = experiment / "plots" / f"{label.replace(' ', '-')}-{mode}.png" + savefig_fname.parent.mkdir(exist_ok=True, parents=True) + if old_savefig_fname.is_file(): + old_savefig_fname.rename(savefig_fname) + if savefig_fname.is_file() and not force: + return True, "savefig_fname already exists" + + # Get and sort data + losses = {} + for loss in get_losses(experiment, training=training, unscaled=unscaled): + model = loss.parent.name.split(".", 1)[0] + name = loss.name.removesuffix(loss.suffix).removeprefix("unscaled_") + losses[f"{model}.{name}"] = (loss, list(read_jsonl(loss))) + losses = dict(sorted(losses.items())) # sort keys + if not losses: + return True, "no losses" + + # unwrap + steps = [i["step"] for i in first(losses.values())[1]] + values = [ + [i["value"] if not isnan(i["value"]) else 0 for i in data] + for name, (scalar, data) in losses.items() + ] + + # normalize + if mode == "stackplot": + totals = list(map(sum, zip(*values))) + values = [ + [i / t for i, t in zip(data, totals)] + for data in values + ] + + print(experiment.name, label) + fig, ax = plt.subplots(figsize=(16, 12)) + + if mode == "stackplot": + ax.stackplot(steps, values, + colors = list(map(colormap.__getitem__, losses.keys())), + labels = list( + label.split(".", 1)[1].removeprefix("loss_") + for label in losses.keys() + ), + ) + ax.set_xlim(0, steps[-1]) + ax.set_ylim(0, 1) + ax.invert_yaxis() + + elif mode == "lineplot": + for data, color, label in zip( + values, + map(colormap.__getitem__, losses.keys()), + list(losses.keys()), + ): + ax.plot(steps, data, + color = color, + label = label, + ) + ax.set_xlim(0, steps[-1]) + + else: + raise ValueError(f"{mode=}") + + ax.legend() + ax.set_title(f"{label} loss\n{experiment.name}") + ax.set_xlabel("Step") + ax.set_ylabel("loss%") + + if mode == "stackplot": + ax2 = make_axes_locatable(ax).append_axes("bottom", 0.8, pad=0.05, sharex=ax) + ax2.stackplot( steps, totals ) + + for tl in ax.get_xticklabels(): tl.set_visible(False) + + fig.tight_layout() + + if write: + fig.savefig(savefig_fname, dpi=300) + print(savefig_fname) + plt.close(fig) + + return False, None + + print("Plotting...") + if write: + matplotlib.use('agg') # fixes "WARNING: QApplication was not created in the main() thread." + any_error = False + if write: + with ThreadPoolExecutor(max_workers=None) as pool: + futures = [ + (experiment, pool.submit(mkplot, experiment, **kw)) + for experiment in experiments + for kw in configurations + ] + else: + def mkfuture(item): + f = Future() + f.set_result(item) + return f + futures = [ + (experiment, mkfuture(mkplot(experiment, **kw))) + for experiment in experiments + for kw in configurations + ] + + for experiment, future in futures: + try: + err, msg = future.result() + except Exception: + traceback.print_exc(file=sys.stderr) + any_error = True + continue + if err: + print(f"{msg}: {experiment.name}") + any_error = True + continue + + if not any_error and not write: # show in main thread + plt.show() + elif not write: + print("There were errors, will not show figure...", file=sys.stderr) + + + +# ========= + +app = typer.Typer(no_args_is_help=True, add_completion=False) + +@app.command(help="Dump simple tensorboard events to json and extract some pytorch lightning hparams") +def tf_dump(tfevent_files: list[Path], j: int = typer.Option(1, "-j"), force: bool = False): + # expand to all tfevents files (there may be more than one) + tfevent_files = sorted(set([ + tffile + for tffile in tfevent_files + if tffile.name.startswith("events.out.tfevents.") + ] + [ + tffile + for experiment_dir in tfevent_files + if experiment_dir.is_dir() + for tffile in experiment_dir.glob("events.out.tfevents.*") + ] + [ + tffile + for hparam_file in tfevent_files + if hparam_file.name in ("hparams.yaml", "config.yaml") + for tffile in hparam_file.parent.glob("events.out.tfevents.*") + ])) + + # filter already dumped + if not force: + tfevent_files = [ + tffile + for tffile in tfevent_files + if not ( + (tffile.parent / "scalars/epoch.json").is_file() + and + tffile.stat().st_mtime < (tffile.parent / "scalars/epoch.json").stat().st_mtime + ) + ] + + if not tfevent_files: + raise typer.BadParameter("Nothing to be done, consider --force") + + jobs = {} + for tffile in tfevent_files: + if not tffile.is_file(): + print("ERROR: file not found:", tffile, file=sys.stderr) + continue + output_dir = tffile.parent / "scalars" + jobs.setdefault(output_dir, []).append(tffile) + with ProcessPoolExecutor() as p: + for experiment in set(tffile.parent for tffile in tfevent_files): + p.submit(dump_pl_tensorboard_hparams, experiment) + for output_dir, tffiles in jobs.items(): + p.submit(dump_simple_tf_events_to_jsonl, output_dir, *tffiles) + +@app.command(help="Propose experiment regexes") +def propose(cmd: str = typer.Argument("summary"), null: bool = False): + def get(): + for i in TENSORBOARD.iterdir(): + if not i.is_dir(): continue + if not (i / "hparams.yaml").is_file(): continue + prefix, name, *hparams, year, month, day, hhmm, uid = i.name.split("-") + yield f"{name}.*-{year}-{month}-{day}" + proposals = sorted(set(get()), key=lambda x: x.split(".*-", 1)[1]) + print("\n".join( + f"{'>/dev/null ' if null else ''}{sys.argv[0]} {cmd or 'summary'} {shlex.quote(i)}" + for i in proposals + )) + +@app.command("list", help="List used experiment regexes") +def list_cached_summaries(cmd: str = typer.Argument("summary")): + if not CACHED_SUMMARIES.is_dir(): + cached = [] + else: + cached = [ + i.name.removesuffix(".jsonl") + for i in CACHED_SUMMARIES.iterdir() + if i.suffix == ".jsonl" + if i.is_file() and i.stat().st_size + ] + def order(key: str) -> list[str]: + return re.sub(r'[^0-9\-]', '', key.split(".*")[-1]).strip("-").split("-") + [key] + + print("\n".join( + f"{sys.argv[0]} {cmd or 'summary'} {shlex.quote(i)}" + for i in sorted(cached, key=order) + )) + +@app.command(help="Precompute the summary of a experiment regex") +def compute_summary(filter: str, force: bool = False, dump: bool = False, no_cache: bool = False): + cache = CACHED_SUMMARIES / f"{filter}.jsonl" + if cache.is_file() and cache.stat().st_size: + if not force: + raise FileExistsError(cache) + + def mk_summary(path: Path) -> dict | None: + cache = path / "train_summary.json" + if cache.is_file() and cache.stat().st_size and cache.stat().st_mtime > (path/"scalars/epoch.json").stat().st_mtime: + with cache.open() as f: + return json.load(f) + else: + with (path / "hparams.yaml").open() as f: + hparams = munchify(yaml.load(f, Loader=SafeLoaderIgnoreUnknown), factory=partial(DefaultMunch, None)) + config = hparams._pickled_cli_args._raw_yaml + config = munchify(yaml.load(config, Loader=SafeLoaderIgnoreUnknown), factory=partial(DefaultMunch, None)) + + try: + train_loss = list(read_jsonl(path / "scalars/IntersectionFieldAutoDecoderModel.training_step/loss.json")) + val_loss = list(read_jsonl(path / "scalars/IntersectionFieldAutoDecoderModel.validation_step/loss.json")) + except: + traceback.print_exc(file=sys.stderr) + return None + + out = Munch() + out.uid = path.name.rsplit("-", 1)[-1] + out.name = path.name + out.date = "-".join(path.name.split("-")[-5:-1]) + out.epochs = int(last(read_jsonl(path / "scalars/epoch.json"))["value"]) + out.steps = val_loss[-1]["step"] + out.gpu = hparams._pickled_cli_args.host.gpus[1][1] + + if val_loss[-1]["wall_time"] - val_loss[0]["wall_time"] > 0: + out.batches_per_second = val_loss[-1]["step"] / (val_loss[-1]["wall_time"] - val_loss[0]["wall_time"]) + else: + out.batches_per_second = 0 + + out.minutes = (val_loss[-1]["wall_time"] - train_loss[0]["wall_time"]) / 60 + + if (path / "scalars/PsutilMonitor/gpu.00.memory.used.json").is_file(): + max(i["value"] for i in read_jsonl(path / "scalars/PsutilMonitor/gpu.00.memory.used.json")) + + for metric_path in (path / "scalars/IntersectionFieldAutoDecoderModel.validation_step").glob("*.json"): + if not metric_path.is_file() or not metric_path.stat().st_size: continue + + metric_name = metric_path.name.removesuffix(".json") + metric_data = read_jsonl(metric_path) + try: + out[f"val_{metric_name}"] = mean(i["value"] for i in tail(5, metric_data)) + except StatisticsError: + out[f"val_{metric_name}"] = float('nan') + + for metric_path in (path / "scalars/IntersectionFieldAutoDecoderModel.training_step").glob("*.json"): + if not any(i in metric_path.name for i in ("miss_radius_grad", "sphere_center_grad", "loss_tangential_reg", "multi_view")): continue + if not metric_path.is_file() or not metric_path.stat().st_size: continue + + metric_name = metric_path.name.removesuffix(".json") + metric_data = read_jsonl(metric_path) + try: + out[f"train_{metric_name}"] = mean(i["value"] for i in tail(5, metric_data)) + except StatisticsError: + out[f"train_{metric_name}"] = float('nan') + + out.hostname = hparams._pickled_cli_args.host.hostname + + for key, val in config.IntersectionFieldAutoDecoderModel.items(): + if isinstance(val, dict): + out.update({f"hp_{key}_{k}": v for k, v in val.items()}) + elif isinstance(val, float | int | str | bool | None): + out[f"hp_{key}"] = val + + with cache.open("w") as f: + json.dump(unmunchify(out), f) + + return dict(out) + + experiments = list(get_experiment_paths(filter, assert_dumped=not dump)) + if not experiments: + raise typer.BadParameter("No matching experiment") + if dump: + try: + tf_dump(experiments) # force=force_dump) + except typer.BadParameter: + pass + + # does literally nothing, thanks GIL + with ThreadPoolExecutor() as p: + results = list(p.map(mk_summary, experiments)) + + if any(result is None for result in results): + if all(result is None for result in results): + print("No summary succeeded", file=sys.stderr) + raise typer.Exit(exit_code=1) + warnings.warn("Some summaries failed:\n" + "\n".join( + str(experiment) + for result, experiment in zip(results, experiments) + if result is None + )) + + summaries = "\n".join( map(json.dumps, results) ) + if not no_cache: + cache.parent.mkdir(parents=True, exist_ok=True) + with cache.open("w") as f: + f.write(summaries) + return summaries + +@app.command(help="Show the summary of a experiment regex, precompute it if needed") +def summary(filter: Optional[str] = typer.Argument(None), force: bool = False, dump: bool = False, all: bool = False): + if filter is None: + return list_cached_summaries("summary") + + def key_mangler(key: str) -> str: + for pattern, sub in ( + (r'^val_unscaled_loss_', r'val_uloss_'), + (r'^train_unscaled_loss_', r'train_uloss_'), + (r'^val_loss_', r'val_sloss_'), + (r'^train_loss_', r'train_sloss_'), + ): + key = re.sub(pattern, sub, key) + + return key + + cache = CACHED_SUMMARIES / f"{filter}.jsonl" + if force or not (cache.is_file() and cache.stat().st_size): + compute_summary(filter, force=force, dump=dump) + assert cache.is_file() and cache.stat().st_size, (cache, cache.stat()) + + if os.isatty(0) and os.isatty(1) and shutil.which("vd"): + rows = read_jsonl(cache) + rows = ({key_mangler(k): v for k, v in row.items()} if row is not None else None for row in rows) + if not all: + rows = filter_jsonl_columns(rows) + rows = ({k: v for k, v in row.items() if not k.startswith(("val_sloss_", "train_sloss_"))} for row in rows) + data = "\n".join(map(json.dumps, rows)) + subprocess.run(["vd", + #"--play", EXPERIMENTS / "set-key-columns.vd", + "-f", "jsonl" + ], input=data, text=True, check=True) + else: + with cache.open() as f: + print(f.read()) + +@app.command(help="Filter uninteresting keys from jsonl stdin") +def filter_cols(): + rows = map(json.loads, (line for line in sys.stdin.readlines() if line.strip())) + rows = filter_jsonl_columns(rows) + print(*map(json.dumps, rows), sep="\n") + +@app.command(help="Run a command for each experiment matched by experiment regex") +def exec(filter: str, cmd: list[str], j: int = typer.Option(1, "-j"), dumped: bool = False, undumped: bool = False): + # inspired by fd / gnu parallel + def populate_cmd(experiment: Path, cmd: Iterable[str]) -> Iterable[str]: + any = False + for i in cmd: + if i == "{}": + any = True + yield str(experiment / "hparams.yaml") + elif i == "{//}": + any = True + yield str(experiment) + else: + yield i + if not any: + yield str(experiment / "hparams.yaml") + + with ThreadPoolExecutor(max_workers=j or None) as p: + results = p.map(subprocess.run, ( + list(populate_cmd(experiment, cmd)) + for experiment in get_experiment_paths(filter) + if not dumped or (experiment / "scalars/epoch.json").is_file() + if not undumped or not (experiment / "scalars/epoch.json").is_file() + )) + + if any(i.returncode for i in results): + return typer.Exit(1) + +@app.command(help="Show stackplot of experiment loss") +def stackplot(filter: str, write: bool = False, dump: bool = False, training: bool = False, unscaled: bool = False, force: bool = False): + experiments = list(get_experiment_paths(filter, assert_dumped=not dump)) + if not experiments: + raise typer.BadParameter("No match") + if dump: + try: + tf_dump(experiments) + except typer.BadParameter: + pass + + plot_losses(experiments, + mode = "stackplot", + write = write, + dump = dump, + training = training, + unscaled = unscaled, + force = force, + ) + +@app.command(help="Show stackplot of experiment loss") +def lineplot(filter: str, write: bool = False, dump: bool = False, training: bool = False, unscaled: bool = False, force: bool = False): + experiments = list(get_experiment_paths(filter, assert_dumped=not dump)) + if not experiments: + raise typer.BadParameter("No match") + if dump: + try: + tf_dump(experiments) + except typer.BadParameter: + pass + + plot_losses(experiments, + mode = "lineplot", + write = write, + dump = dump, + training = training, + unscaled = unscaled, + force = force, + ) + +@app.command(help="Open tensorboard for the experiments matching the regex") +def tensorboard(filter: Optional[str] = typer.Argument(None), watch: bool = False): + if filter is None: + return list_cached_summaries("tensorboard") + experiments = list(get_experiment_paths(filter, assert_dumped=False)) + if not experiments: + raise typer.BadParameter("No match") + + with tempfile.TemporaryDirectory(suffix=f"ifield-{filter}") as d: + treefarm = Path(d) + with ThreadPoolExecutor(max_workers=2) as p: + for experiment in experiments: + (treefarm / experiment.name).symlink_to(experiment) + + cmd = ["tensorboard", "--logdir", d] + print("+", *map(shlex.quote, cmd), file=sys.stderr) + tensorboard = p.submit(subprocess.run, cmd, check=True) + if not watch: + tensorboard.result() + + else: + all_experiments = set(get_experiment_paths(None, assert_dumped=False)) + while not tensorboard.done(): + time.sleep(10) + new_experiments = set(get_experiment_paths(None, assert_dumped=False)) - all_experiments + if new_experiments: + for experiment in new_experiments: + print(f"Adding {experiment.name!r}...", file=sys.stderr) + (treefarm / experiment.name).symlink_to(experiment) + all_experiments.update(new_experiments) + +@app.command(help="Compute evaluation metrics") +def metrics(filter: Optional[str] = typer.Argument(None), dump: bool = False, dry: bool = False, prefix: Optional[str] = typer.Option(None), derive: bool = False, each: bool = False, no_total: bool = False): + if filter is None: + return list_cached_summaries("metrics --derive") + experiments = list(get_experiment_paths(filter, assert_dumped=False)) + if not experiments: + raise typer.BadParameter("No match") + if dump: + try: + tf_dump(experiments) + except typer.BadParameter: + pass + + def run(*cmd): + if prefix is not None: + cmd = [*shlex.split(prefix), *cmd] + if dry: + print(*map(shlex.quote, map(str, cmd))) + else: + print("+", *map(shlex.quote, map(str, cmd))) + subprocess.run(cmd) + + for experiment in experiments: + if no_total: continue + if not (experiment / "compute-scores/metrics.json").is_file(): + run( + "python", "./marf.py", "module", "--best", experiment / "hparams.yaml", + "compute-scores", experiment / "compute-scores/metrics.json", + "--transpose", + ) + if not (experiment / "compute-scores/metrics-last.json").is_file(): + run( + "python", "./marf.py", "module", "--last", experiment / "hparams.yaml", + "compute-scores", experiment / "compute-scores/metrics-last.json", + "--transpose", + ) + if "2prif-" not in experiment.name: continue + if not (experiment / "compute-scores/metrics-sans_outliers.json").is_file(): + run( + "python", "./marf.py", "module", "--best", experiment / "hparams.yaml", + "compute-scores", experiment / "compute-scores/metrics-sans_outliers.json", + "--transpose", "--filter-outliers" + ) + if not (experiment / "compute-scores/metrics-last-sans_outliers.json").is_file(): + run( + "python", "./marf.py", "module", "--last", experiment / "hparams.yaml", + "compute-scores", experiment / "compute-scores/metrics-last-sans_outliers.json", + "--transpose", "--filter-outliers" + ) + + if dry: return + if prefix is not None: + print("prefix was used, assuming a job scheduler was used, will not print scores.", file=sys.stderr) + return + + metrics = [ + *(experiment / "compute-scores/metrics.json" for experiment in experiments), + *(experiment / "compute-scores/metrics-last.json" for experiment in experiments), + *(experiment / "compute-scores/metrics-sans_outliers.json" for experiment in experiments if "2prif-" in experiment.name), + *(experiment / "compute-scores/metrics-last-sans_outliers.json" for experiment in experiments if "2prif-" in experiment.name), + ] + if not no_total: + assert all(metric.exists() for metric in metrics) + else: + metrics = (metric for metric in metrics if metric.exists()) + + out = [] + for metric in metrics: + experiment = metric.parent.parent.name + is_last = metric.name in ("metrics-last.json", "metrics-last-sans_outliers.json") + with metric.open() as f: + data = json.load(f) + + if derive: + derived = {} + objs = [i for i in data.keys() if i != "_hparams"] + for obj in (objs if each else []) + [None]: + if obj is None: + d = DefaultMunch(0) + for obj in objs: + for k, v in data[obj].items(): + d[k] += v + obj = "_all_" + n_cd = data["_hparams"]["n_cd"] * len(objs) + n_emd = data["_hparams"]["n_emd"] * len(objs) + else: + d = munchify(data[obj]) + n_cd = data["_hparams"]["n_cd"] + n_emd = data["_hparams"]["n_emd"] + + precision = d.TP / (d.TP + d.FP) + recall = d.TP / (d.TP + d.FN) + derived[obj] = dict( + filtered = d.n_outliers / d.n if "n_outliers" in d else None, + iou = d.TP / (d.TP + d.FN + d.FP), + precision = precision, + recall = recall, + f_score = 2 * (precision * recall) / (precision + recall), + cd = d.cd_dist / n_cd, + emd = d.emd / n_emd, + cos_med = 1 - (d.cd_cos_med / n_cd) if "cd_cos_med" in d else None, + cos_jac = 1 - (d.cd_cos_jac / n_cd), + ) + data = derived if each else derived["_all_"] + + data["uid"] = experiment.rsplit("-", 1)[-1] + data["experiment_name"] = experiment + data["is_last"] = is_last + + out.append(json.dumps(data)) + + if derive and not each and os.isatty(0) and os.isatty(1) and shutil.which("vd"): + subprocess.run(["vd", "-f", "jsonl"], input="\n".join(out), text=True, check=True) + else: + print("\n".join(out)) + +if __name__ == "__main__": + app() diff --git a/figures/nn-architecture.svg b/figures/nn-architecture.svg new file mode 100644 index 0000000..8112a36 --- /dev/null +++ b/figures/nn-architecture.svg @@ -0,0 +1,822 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ifield/__init__.py b/ifield/__init__.py new file mode 100644 index 0000000..0dc46c4 --- /dev/null +++ b/ifield/__init__.py @@ -0,0 +1,57 @@ +def setup_print_hooks(): + import os + if not os.environ.get("IFIELD_PRETTY_TRACEBACK", None): + return + + from rich.traceback import install + from rich.console import Console + import warnings, sys + + if not os.isatty(2): + # https://github.com/Textualize/rich/issues/1809 + os.environ.setdefault("COLUMNS", "120") + + install( + show_locals = bool(os.environ.get("SHOW_LOCALS", "")), + width = None, + ) + + # custom warnings + # https://github.com/Textualize/rich/issues/433 + + from rich.traceback import install + from rich.console import Console + import warnings, sys + + + def showwarning(message, category, filename, lineno, file=None, line=None): + msg = warnings.WarningMessage(message, category, filename, lineno, file, line) + + if file is None: + file = sys.stderr + if file is None: + # sys.stderr is None when run with pythonw.exe: + # warnings get lost + return + text = warnings._formatwarnmsg(msg) + if file.isatty(): + Console(file=file, stderr=True).print(text) + else: + try: + file.write(text) + except OSError: + # the file (probably stderr) is invalid - this warning gets lost. + pass + warnings.showwarning = showwarning + + def warning_no_src_line(message, category, filename, lineno, file=None, line=None): + if (file or sys.stderr) is not None: + if (file or sys.stderr).isatty(): + if file is None or file is sys.stderr: + return f"[yellow]{category.__name__}[/yellow]: {message}\n ({filename}:{lineno})" + return f"{category.__name__}: {message} ({filename}:{lineno})\n" + warnings.formatwarning = warning_no_src_line + + +setup_print_hooks() +del setup_print_hooks diff --git a/ifield/cli.py b/ifield/cli.py new file mode 100644 index 0000000..51999d0 --- /dev/null +++ b/ifield/cli.py @@ -0,0 +1,1006 @@ +from . import logging, param +from .utils import helpers +from .utils.helpers import camel_to_snake_case +from argparse import ArgumentParser, _SubParsersAction, Namespace +from contextlib import contextmanager +from datetime import datetime +from functools import partial +from munch import Munch, munchify +from pathlib import Path +from pytorch_lightning.utilities.exceptions import MisconfigurationException +from serve_me_once import serve_once_in_background, gen_random_port +from torch import nn +from tqdm import tqdm +from typing import Optional, Callable, TypeVar, Union, Any +import argparse, collections, copy +import inspect, io, os, platform, psutil, pygments, pygments.lexers, pygments.formatters +import pytorch_lightning as pl, re, rich, rich.pretty, shlex, shutil, string, subprocess, sys, textwrap +import traceback, time, torch, torchviz, urllib.parse, warnings, webbrowser, yaml + + +CONSOLE = rich.console.Console(width=None if os.isatty(1) else 140) +torch.set_printoptions(threshold=200) + +# https://gist.github.com/pypt/94d747fe5180851196eb#gistcomment-3595282 +#class UniqueKeyYAMLLoader(yaml.SafeLoader): +class UniqueKeyYAMLLoader(yaml.Loader): + def construct_mapping(self, node, deep=False): + mapping = set() + for key_node, value_node in node.value: + key = self.construct_object(key_node, deep=deep) + if key in mapping: + raise KeyError(f"Duplicate {key!r} key found in YAML.") + mapping.add(key) + return super().construct_mapping(node, deep) + +# load scientific notation correctly as floats and not as strings +# basically, support for the to_json filter in jinja +# https://stackoverflow.com/a/30462009 +# https://github.com/yaml/pyyaml/issues/173 +UniqueKeyYAMLLoader.add_implicit_resolver( + u'tag:yaml.org,2002:float', + re.compile(u'''^(?: + [-+]?(?:[0-9][0-9_]*)\\.[0-9_]*(?:[eE][-+]?[0-9]+)? + |[-+]?(?:[0-9][0-9_]*)(?:[eE][-+]?[0-9]+) + |\\.[0-9_]+(?:[eE][-+][0-9]+)? + |[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]* + |[-+]?\\.(?:inf|Inf|INF) + |\\.(?:nan|NaN|NAN))$''', re.X), + list(u'-+0123456789.')) + +class IgnorantActionsContainer(argparse._ActionsContainer): + """ + Ignores conflicts with + Must be enabled with ArgumentParser(conflict_handler="ignore") + """ + # https://stackoverflow.com/a/71782808 + def _handle_conflict_ignore(self, action, conflicting_actions): + pass +argparse.ArgumentParser.__bases__ = (argparse._AttributeHolder, IgnorantActionsContainer) +argparse._ArgumentGroup.__bases__ = (IgnorantActionsContainer,) + +@contextmanager +def ignore_action_container_conflicts(parser: Union[argparse.ArgumentParser, argparse._ArgumentGroup]): + old = parser.conflict_handler + parser.conflict_handler = "ignore" + yield + parser.conflict_handler = old + +def _print_with_syntax_highlighting(language, string, indent=""): + if os.isatty(1): + string = pygments.highlight(string, + lexer = pygments.lexers.get_lexer_by_name(language), + formatter = pygments.formatters.Terminal256Formatter(style="monokai"), + ) + if indent: + string = textwrap.indent(string, indent) + print(string) + +def print_column_dict(data: dict, n_columns: int = 2, prefix: str=" "): + small = {k: v for k, v in data.items() if not isinstance(v, dict) and len(repr(v)) <= 40} + wide = {k: v for k, v in data.items() if not isinstance(v, dict) and len(repr(v)) > 40} + dicts = {k: v for k, v in data.items() if isinstance(v, dict)} + kw = dict( + crop = False, + overflow = "ignore", + ) + if small: + CONSOLE.print(helpers.columnize_dict(small, prefix=prefix, n_columns=n_columns, sep=" "), **kw) + key_len = max(map(len, map(repr, wide.keys()))) if wide else 0 + for key, val in wide.items(): + CONSOLE.print(f"{prefix}{repr(key).ljust(key_len)} : {val!r},", **kw) + for key, val in dicts.items(): + CONSOLE.print(f"{prefix}{key!r}: {{", **kw) + print_column_dict(val, n_columns=n_columns, prefix=prefix+" ") + CONSOLE.print(f"{prefix}}},", **kw) + + +M = TypeVar("M", bound=nn.Module) +DM = TypeVar("DM", bound=pl.LightningDataModule) +FitHook = Callable[[Namespace, Munch, M, pl.Trainer, DM, logging.Logger], None] + +class CliInterface: + trainer_defaults: dict + + def __init__(self, *, module_cls: type[M], workdir: Path, datamodule_cls: Union[list[type[DM]], type[DM], None] = None, experiment_name_prefix = "experiment"): + self.module_cls = module_cls + self.datamodule_cls = [datamodule_cls] if not isinstance(datamodule_cls, list) and datamodule_cls is not None else datamodule_cls + self.workdir = workdir + self.experiment_name_prefix = experiment_name_prefix + + self.trainer_defaults = dict( + enable_model_summary = False, + ) + + self.pre_fit_handlers: list[FitHook] = [] + self.post_fit_handlers: list[FitHook] = [] + + self._registered_actions : dict[str, tuple[Callable[M, None], list, dict, Optional[callable]]] = {} + self._included_in_config_template : dict[str, tuple[callable, dict]] = {} + + self.register_action(_func=self.repr, help="Print str(module).", args=[]) + self.register_action(_func=self.yaml, help="Print evaluated config.", args=[]) + self.register_action(_func=self.hparams, help="Print hparams, like during training.", args=[]) + self.register_action(_func=self.dot, help="Print graphviz graph of computation graph.", args=[ + ("-e", "--eval", dict(action="store_true")), + ("-f", "--filter", dict(action="store_true")), + ]) + self.register_action(_func=self.jit, help="Print a TorchScript graph of the model", args=[]) + self.register_action(_func=self.trace, help="Dump a TorchScript trace of the model.", args=[ + ("output_file", dict(type=Path, + help="Path to write the .pt file. Use \"-\" to instead open the trace in Netron.app")), + ]) + self.register_action(_func=self.onnx, help="Dump a ONNX trace of the model.", args=[ + ("output_file", dict(type=Path, + help="Path to write the .onnx file. Use \"-\" to instead open the onnx in Netron.app")), + ]) + + if self.datamodule_cls: + names = [i.__name__ for i in self.datamodule_cls] + names_snake = [datamodule_name_to_snake_case(i) for i in names] + assert len(names) == len(set(names)),\ + f"Datamodule names are not unique: {names!r}" + assert len(names) == len(set(names_snake)),\ + f"Datamodule snake-names are not unique: {names_snake!r}" + + self.register_action(_func=self.test_dataloader, + help="Benchmark the speed of the dataloader", + args=[ + ("datamodule", dict(type=str, default=None, nargs='?', choices=names_snake, + help="Which dataloader to test. Defaults to the first one found in config.")), + ("--limit-cores", dict(type=int, default=None, + help="Limits the cpu affinity to N cores. Perfect to simulate a SLURM environ.")), + ("--profile", dict(type=Path, default=None, + help="Profile using cProfile, marshaling the result to a .prof or .log file.")), + ("-n", "--n-rounds", dict(type=int, default=3, + help="Number of times to read the dataloader.")), + ], + conflict_handler = "ignore" if len(self.datamodule_cls) > 1 else "error", + add_argparse_args=[i.add_argparse_args for i in self.datamodule_cls], + ) + + + # decorator + def register_pre_training_callback(self, func: FitHook): + self.pre_fit_handlers.append(func) + return func + + # decorator + def register_post_training_callback(self, func: FitHook): + self.post_fit_handlers.append(func) + return func + + # decorator + def register_action(self, *, + help : str, + args : list[tuple[Any, ..., dict]] = [], + _func : Optional[Callable[[Namespace, Munch, M], None]] = None, + add_argparse_args : Union[list[Callable[[ArgumentParser], ArgumentParser]], Callable[[ArgumentParser], ArgumentParser], None] = None, + **kw, + ): + def wrapper(action: Callable[[Namespace, Munch, M], None]): + cli_name = action.__name__.lower().replace("_", "-") + self._registered_actions[cli_name] = ( + action, + args, + kw | {"help": help}, + add_argparse_args, + ) + return action + if _func is not None: # shortcut + return wrapper(_func) + else: + return wrapper + + def make_parser(self, + parser : ArgumentParser = None, + subparsers : _SubParsersAction = None, + add_trainer : bool = False, + ) -> tuple[ArgumentParser, _SubParsersAction, _SubParsersAction]: + if parser is None: + parser = ArgumentParser() + if subparsers is None: + subparsers = parser.add_subparsers(dest="mode", required=True) + + parser.add_argument("-pm", "--post-mortem", action="store_true", + help="Start a debugger if a uncaught exception is thrown.") + + # Template generation and exploration + parser_template = subparsers.add_parser("template", + help="Generate or evaluate a config template") + if 1: # fold me + parser_mode_mutex = parser_template.add_mutually_exclusive_group()#(required=True) + parser_mode_mutex.add_argument("-e", "--evaluate", metavar="TEMPLATE", type=Path, + help="Read jinja2 yaml config template file, then evaluate and print it.") + parser_mode_mutex.add_argument("-p", "--parse", metavar="TEMPLATE", type=Path, + help="Read jinja2 yaml config template file, then evaluate, parse and print it.") + + def pair(data: str) -> tuple[str, str]: + key, sep, value = data.partition("=") + if not sep: + if key in os.environ: + value = os.environ[key] + else: + raise ValueError(f"the variable {key!r} was not given any value, and none was found in the environment.") + elif "$" in value: + value = string.Template(value).substitute(os.environ) + return (key, value) + parser_template.add_argument("-O", dest="jinja2_variables", action="append", type=pair, + help="Variable available as string in the jinja2. (a=b). b will be expanded as an" + " env var if prefixed with $, or set equal to the env var a if =b is omitted.") + + parser_template.add_argument("-s", "--strict", action="store_true", + help="Enable {% do require_defined(\"var\",var) %}".replace("%", "%%")) + parser_template.add_argument("-d", "--defined-only", action="store_true", + help="Disallow any use of undefined variables") + + + # Load a module + parser_module = subparsers.add_parser("module", aliases=["model"], + help="Load a config template, evaluate it and use the resulting module") + if 1: # fold me + parser_module.add_argument("module_file", type=Path, + help="Jinja2 yaml config template or pytorch-lightning .ckpt file.") + parser_module.add_argument("-O", dest="jinja2_variables", action="append", type=pair, + help="Variable available as string in the jinja2. (a=b). b will be expanded as an" + " env var if prefixed with $, or set equal to the env var a if =b is omitted.") + parser_module.add_argument("--last", action="store_true", + help="if multiple ckpt match, prefer the last one") + parser_module.add_argument("--best", action="store_true", + help="if multiple ckpt match, prefer the best one") + + parser_module.add_argument("--add-shape-prehook", action="store_true", + help="Add a forward hook which prints the tensor shapes of all inputs, but not the outputs.") + parser_module.add_argument("--add-shape-hook", action="store_true", + help="Add a forward hook which prints the tensor shapes of all inputs AND outputs.") + parser_module.add_argument("--add-oob-hook", action="store_true", + help="Add a forward hook checking for INF and NaN values in inputs or outputs.") + parser_module.add_argument("--add-oob-hook-input", action="store_true", + help="Add a forward hook checking for INF and NaN values in inputs.") + parser_module.add_argument("--add-oob-hook-output", action="store_true", + help="Add a forward hook checking for INF and NaN values in outputs.") + + + module_actions_subparser = parser_module.add_subparsers(dest="action", required=True) + + # add pluggables + for name, (action, args, kw, add_argparse_args) in self._registered_actions.items(): + action_parser = module_actions_subparser.add_parser(name, **kw) + if add_argparse_args is not None and add_argparse_args: + for func in add_argparse_args if isinstance(add_argparse_args, list) else [add_argparse_args]: + action_parser = func(action_parser) + for *a, kw in args: + action_parser.add_argument(*a, **kw) + + # Module: train or test + if self.datamodule_cls: + parser_trainer = module_actions_subparser.add_parser("fit", aliases=["test"], + help="Train/fit or evaluate the module with train/val or test data.") + + # pl.Trainer + parser_trainer = pl.Trainer.add_argparse_args(parser_trainer) + + # datamodule + parser_trainer.add_argument("datamodule", type=str, default=None, nargs='?', + choices=[datamodule_name_to_snake_case(i) for i in self.datamodule_cls], + help="Which dataloader to test. Defaults to the first one found in config.") + if len(self.datamodule_cls) > 1: + # check that none of the datamodules conflict with trainer or module + for datamodule_cls in self.datamodule_cls: + datamodule_cls.add_argparse_args(copy.deepcopy(parser_trainer)) # will raise on conflict + # Merge the datamodule options, the above sanity check makes it "okay" + with ignore_action_container_conflicts(parser_trainer): + for datamodule_cls in self.datamodule_cls: + parser_trainer = datamodule_cls.add_argparse_args(parser_trainer) + + # defaults and jinja template + self._included_in_config_template.clear() + remove_options_from_parser(parser_trainer, "--logger") + parser_trainer.set_defaults(**self.trainer_defaults) + self.add_to_jinja_template("trainer", pl.Trainer, defaults=self.trainer_defaults, exclude_list={ + # not yaml friendly, already covered anyway: + "logger", + "plugins", + "callbacks", + # deprecated or covered by callbacks: + "stochastic_weight_avg", + "enable_model_summary", + "track_grad_norm", + "log_gpu_memory", + }) + for datamodule_cls in self.datamodule_cls: + self.add_to_jinja_template(datamodule_cls.__name__, datamodule_cls, + comment=f"select with {datamodule_name_to_snake_case(datamodule_cls)!r}")#, commented=False) + self.add_to_jinja_template("logging", logging, save_dir = "logdir", commented=False) + + return parser, subparsers, module_actions_subparser + + def add_to_jinja_template(self, name: str, func: callable, **kwargs): + """ + Basically a call to `make_jinja_template`. + Will ensure the keys are present in the output from `from_argparse_args`. + """ + self._included_in_config_template[name] = (func, dict(commented=True) | kwargs) + + def make_jinja_template(self) -> str: + return "\n".join([ + f'#!/usr/bin/env -S python {sys.argv[0]} module', + r'{% do require_defined("select", select, 0, "$SLURM_ARRAY_TASK_ID") %}{# requires jinja2.ext.do #}', + r"{% set counter = itertools.count(start=0, step=1) %}", + r"", + r"{% set hp_matrix = namespace() %}{# hyper parameter matrix #}", + r"{% set hp_matrix.my_hparam = [0] %}{##}", + r"", + r"{% for hp in cartesian_hparams(hp_matrix) %}{##}", + r"{#% for hp in ablation_hparams(hp_matrix, caartesian_keys=[]) %}{##}", + r"", + r"{% set index = next(counter) %}", + r"{% if select is not defined and index > 0 %}---{% endif %}", + r"{% if select is not defined or int(select) == index %}", + r"", + *[ + func.make_jinja_template(name=name, **kwargs) + if hasattr(func, "make_jinja_template") else + param.make_jinja_template(func, name=name, **kwargs) + for name, (func, kwargs) in self._included_in_config_template.items() + ], + r"{% autoescape false %}", + r'{% do require_defined("experiment_name", experiment_name, "test", strict=true) %}', + f"experiment_name: { self.experiment_name_prefix }-{{{{ experiment_name }}}}", + r'{#--#}-{{ hp.my_hparam }}', + r'{#--#}-{{ gen_run_uid(4) }} # select with -Oselect={{ index }}', + r"{% endautoescape %}", + self.module_cls.make_jinja_template(), + r"{% endif %}{# -Oselect #}", + r"", + r"{% endfor %}", + r"", + r"{% set index = next(counter) %}", + r"# number of possible 'select': {{ index }}, from 0 to {{ index-1 }}", + r"# local: for select in {0..{{ index-1 }}}; do python ... -Oselect=$select ... ; done", + r"# local: for select in {0..{{ index-1 }}}; do python -O {{ argv[0] }} model marf.yaml.j2 -Oselect=$select -Oexperiment_name='{{ experiment_name }}' fit --accelerator gpu ; done", + r"# slurm: sbatch --array=0-{{ index-1 }} runcommand.slurm python ... -Oselect=\$SLURM_ARRAY_TASK_ID ...", + r"# slurm: sbatch --array=0-{{ index-1 }} runcommand.slurm python -O {{ argv[0] }} model this-file.yaml.j2 -Oselect=\$SLURM_ARRAY_TASK_ID -Oexperiment_name='{{ experiment_name }}' fit --accelerator gpu --devices -1 --strategy ddp" + ]) + + def run(self, args=None, args_hook: Optional[Callable[[ArgumentParser, _SubParsersAction, _SubParsersAction], None]] = None): + parser, mode_subparser, action_subparser = self.make_parser() + if args_hook is not None: + args_hook(parser, mode_subparser, action_subparser) + args = parser.parse_args(args) # may exit + if os.isatty(0) and args.post_mortem: + warnings.warn("post-mortem debugging is enabled without any TTY attached. Will be ignored.") + if args.post_mortem and os.isatty(0): + try: + self.handle_args(args) + except Exception: + # print exception + sys.excepthook(*sys.exc_info()) + # debug + *debug_module, debug_func = os.environ.get("PYTHONBREAKPOINT", "pdb.set_trace").split(".") + __import__(".".join(debug_module)).post_mortem() + exit(1) + else: + self.handle_args(args) + + def handle_args(self, args: Namespace): + """ + May call exit() + """ + if args.mode == "template": + + if args.evaluate or args.parse: + template_file = args.evaluate or args.parse + env = param.make_jinja_env(globals=param.make_jinja_globals(enable_require_defined=args.strict), allow_undef=not args.defined_only) + if str(template_file) == "-": + template = env.from_string(sys.stdin.read(), globals=dict(args.jinja2_variables or [])) + else: + template = env.get_template(str(template_file.absolute()), globals=dict(args.jinja2_variables or [])) + config_yaml = param.squash_newlines(template.render())#.lstrip("\n").rstrip() + if args.evaluate: + _print_with_syntax_highlighting("yaml+jinja", config_yaml) + else: + config = yaml.load(config_yaml, UniqueKeyYAMLLoader) + CONSOLE.print(config) + + else: + _print_with_syntax_highlighting("yaml+jinja", self.make_jinja_template()) + + elif args.mode in ("module", "model"): + + module: nn.Module + + if not args.module_file.is_file(): + matches = [*Path("logdir/tensorboard").rglob(f"*-{args.module_file}/checkpoints/*.ckpt")] + if len(matches) == 1: + args.module_file, = matches + elif len(matches) > 1: + if (args.last or args.best) and len(set(match.parent.parent.name for match in matches)) == 1: + if args.last: + args.module_file, = (match for match in matches if match.name == "last.ckpt") + elif args.best: + args.module_file, = (match for match in matches if match.name.startswith("epoch=")) + else: + assert False + else: + raise ValueError("uid matches multiple paths:\n"+"\n".join(map(str, matches))) + else: + raise ValueError("path does not exist, and is not a uid") + + # load module from cli args + if args.module_file.suffix == ".ckpt": # from checkpoint + # load from checkpoint + rich.print(f"Loading module from {str(args.module_file)!r}...", file=sys.stderr) + module = self.module_cls.load_from_checkpoint(args.module_file) + + if (args.module_file.parent.parent / "hparams.yaml").is_file(): + with (args.module_file.parent.parent / "hparams.yaml").open() as f: + config_yaml = yaml.load(f.read(), UniqueKeyYAMLLoader)["_pickled_cli_args"]["_raw_yaml"] + else: + with (args.module_file.parent.parent / "config.yaml").open() as f: + config_yaml = f.read() + + config = munchify(yaml.load(config_yaml, UniqueKeyYAMLLoader) | {"_raw_yaml": config_yaml}) + + else: # from yaml + + # read, evaluate and parse config + if args.module_file.suffix == ".j2" or str(args.module_file) == "-": + env = param.make_jinja_env() + if str(args.module_file) == "-": + template = env.from_string(sys.stdin.read(), globals=dict(args.jinja2_variables or [])) + else: # jinja+yaml file + template = env.get_template(str(args.module_file.absolute()), globals=dict(args.jinja2_variables or [])) + config_yaml = param.squash_newlines(template.render()).lstrip("\n").rstrip() + else: # yaml file (the git diffs in _pickled_cli_args may trigger jinja's escape sequences) + with args.module_file.open() as f: + config_yaml = f.read().lstrip("\n").rstrip() + + config = yaml.load(config_yaml, UniqueKeyYAMLLoader) + + if "_pickled_cli_args" in config: # hparams.yaml in tensorboard logdir + config_yaml = config["_pickled_cli_args"]["_raw_yaml"] + config = yaml.load(config_yaml, UniqueKeyYAMLLoader) + + from_checkpoint: Optional[Path] = None + if (args.module_file.parent / "checkpoints").glob("*.ckpt"): + checkpoints_fnames = list((args.module_file.parent / "checkpoints").glob("*.ckpt")) + if len(checkpoints_fnames) == 1: + from_checkpoint = checkpoints_fnames[0] + elif args.last: + from_checkpoint, = (i for i in checkpoints_fnames if i.name == "last.ckpt") + elif args.best: + from_checkpoint, = (i for i in checkpoints_fnames if i.name.startswith("epoch=")) + elif len(checkpoints_fnames) > 1: + rich.print(f"[yellow]WARNING:[/] {str(args.module_file.parent / 'checkpoints')!r} contains more than one checkpoint, unable to automatically load one.", file=sys.stderr) + + config = munchify(config | {"_raw_yaml": config_yaml}) + + # Ensure date and uid to experiment name, allowing for reruns and organization + assert config.experiment_name + assert re.match(r'^.*-[0-9]{4}-[0-9]{2}-[0-9]{2}-[0-9]{4}-[a-z]{4}$', config.experiment_name),\ + config.experiment_name + + # init the module + if from_checkpoint: + rich.print(f"Loading module from {str(from_checkpoint)!r}...", file=sys.stderr) + module = self.module_cls.load_from_checkpoint(from_checkpoint) + else: + module = self.module_cls(**{k:v for k, v in config[self.module_cls.__name__].items() if k != "_extra"}) + + # optional debugging forward hooks + + if args.add_shape_hook or args.add_shape_prehook: + def shape_forward_hook(is_prehook: bool, name: str, module: nn.Module, input, output=None): + def tensor_to_shape(val): + if isinstance(val, torch.Tensor): + return tuple(val.shape) + elif isinstance(val, (str, float, int)) or val is None: + return 1 + else: + assert 0, (val, name) + with torch.no_grad(): + rich.print( + f"{name}.forward({helpers.map_tree(tensor_to_shape, input)})" + if is_prehook else + f"{name}.forward({helpers.map_tree(tensor_to_shape, input)})" + f" -> {helpers.map_tree(tensor_to_shape, output)}" + , file=sys.stderr) + + for submodule_name, submodule in module.named_modules(): + if submodule_name: + submodule_name = f"{module.__class__.__qualname__}.{submodule_name}" + else: + submodule_name = f"{module.__class__.__qualname__}" + if args.add_shape_prehook: + submodule.register_forward_pre_hook(partial(shape_forward_hook, True, submodule_name)) + if args.add_shape_hook: + submodule.register_forward_hook(partial(shape_forward_hook, False, submodule_name)) + + if args.add_oob_hook or args.add_oob_hook_input or args.add_oob_hook_output: + def oob_forward_hook(name: str, module: nn.Module, input, output): + def raise_if_oob(key, val): + if isinstance(val, collections.abc.Mapping): + for k, subval in val.items(): + raise_if_oob(f"{key}[{k!r}]", subval) + elif isinstance(val, (tuple, list)): + for i, subval in enumerate(val): + raise_if_oob(f"{key}[{i}]", subval) + elif isinstance(val, torch.Tensor): + assert not torch.isinf(val).any(), \ + f"INFs found in {key}" + assert not val.isnan().any(), \ + f"NaNs found in {key}" + elif isinstance(val, (str, float, int)): + pass + elif val is None: + warnings.warn(f"None found in {key}") + else: + assert False, val + with torch.no_grad(): + if args.add_oob_hook or args.add_oob_hook_input: + raise_if_oob(f"{name}.forward input", input) + if args.add_oob_hook or args.add_oob_hook_output: + raise_if_oob(f"{name}.forward output", output) + + for submodule_name, submodule in module.named_modules(): + submodule.register_forward_hook(partial(oob_forward_hook, + f"{module.__class__.__qualname__}.{submodule_name}" + if submodule_name else + f"{module.__class__.__qualname__}" + )) + + # Ensure all the top-level config keys are there + for key in self._included_in_config_template.keys(): + if key in (i.__name__ for i in self.datamodule_cls): + continue + if key not in config or config[key] is None: + config[key] = {} + + # Run registered action + if args.action in self._registered_actions: + action, *_ = self._registered_actions[args.action] + action(args, config, module) + elif args.action in ("fit", "test") and self.datamodule_cls is not None: + self.fit(args, config, module) + else: + raise ValueError(f"{args.mode=}, {args.action=}") + + else: + raise ValueError(f"{args.mode=}") + + def get_datamodule_cls_from_config(self, args: Namespace, config: Munch) -> DM: + assert self.datamodule_cls + cli = getattr(args, "datamodule", None) + datamodule_cls: pl.LightningDataModule + if cli is not None: + datamodule_cls, = (i for i in self.datamodule_cls if datamodule_name_to_snake_case(i) == cli) + else: + datamodules = { + cls.__name__: cls + for cls in self.datamodule_cls + } + for key in config.keys(): + if key in datamodules: + datamodule_cls = datamodules[key] + break + else: + datamodule_cls = self.datamodule_cls[0] + warnings.warn(f"None of the following datamodules were found in config: {set(datamodules.keys())!r}. {datamodule_cls.__name__!r} was chosen as the default.") + + return datamodule_cls + + def init_datamodule_cls_from_config(self, args: Namespace, config: Munch) -> DM: + datamodule_cls = self.get_datamodule_cls_from_config(args, config) + return datamodule_cls.from_argparse_args(args, **(config.get(datamodule_cls.__name__) or {})) + + + # Module actions + + def repr(self, args: Namespace, config: Munch, module: M): + rich.print(module) + + def yaml(self, args: Namespace, config: Munch, module: M): + _print_with_syntax_highlighting("yaml+jinja", config["_raw_yaml"]) + + def dot(self, args: Namespace, config: Munch, module: M): + module.train(not args.eval) + assert not args.filter, "not implemented! pipe it through examples/scripts/filter_dot.py in the meanwhile" + + example_input_array = module.example_input_array + assert example_input_array is not None, f"{module.__class__.__qualname__}.example_input_array=None" + assert isinstance(example_input_array, (tuple, dict, torch.Tensor)), type(example_input_array) + + def set_requires_grad(val): + if isinstance(val, torch.Tensor): + val.requires_grad = True + return val + + with torch.enable_grad(): + outputs = module(*helpers.map_tree(set_requires_grad, example_input_array)) + + dot = torchviz.make_dot(outputs, params=dict(module.named_parameters()), show_attrs=False, show_saved=False) + _print_with_syntax_highlighting("dot", str(dot)) + + def jit(self, args: Namespace, config: Munch, module: M): + example_input_array = module.example_input_array + assert example_input_array is not None, f"{module.__class__.__qualname__}.example_input_array=None" + assert isinstance(example_input_array, (tuple, dict, torch.Tensor)), type(example_input_array) + trace = torch.jit.trace_module(module, {"forward": example_input_array}) + _print_with_syntax_highlighting("python", str(trace.inlined_graph)) + + def trace(self, args: Namespace, config: Munch, module: M): + if isinstance(module, pl.LightningModule): + trace = module.to_torchscript(method="trace") + else: + example_input_array = module.example_input_array + assert example_input_array is not None, f"{module.__class__.__qualname__}.example_input_array is None" + assert isinstance(module, torch.Module) + trace = torch.jit.trace_module(module, {"forward": example_input_array}) + + use_netron = str(args.output_file) == "-" + trace_f = io.BytesIO() if use_netron else args.output_file + + torch.jit.save(trace, trace_f) + + if use_netron: + open_in_netron(f"{self.module_cls.__name__}.pt", trace_f.getvalue()) + + def onnx(self, args: Namespace, config: Munch, module: M): + example_input_array = module.example_input_array + assert example_input_array is not None, f"{module.__class__.__qualname__}.example_input_array=None" + assert isinstance(example_input_array, (tuple, dict, torch.Tensor)), type(example_input_array) + + use_netron = str(args.output_file) == "-" + onnx_f = io.BytesIO() if use_netron else args.output_file + + torch.onnx.export(module, + tuple(example_input_array), + onnx_f, + export_params = True, + opset_version = 17, + do_constant_folding = True, + input_names = ["input"], + output_names = ["output"], + dynamic_axes = { + "input" : {0 : "batch_size"}, + "output" : {0 : "batch_size"}, + }, + ) + + if use_netron: + open_in_netron(f"{self.module_cls.__name__}.onnx", onnx_f.getvalue()) + + def hparams(self, args: Namespace, config: Munch, module: M): + assert isinstance(module, self.module_cls) + print(f"{self.module_cls.__qualname__} hparams:") + print_column_dict(map_type_to_repr(module.hparams, nn.Module, lambda t: f"{t.__class__.__qualname__}"), 3) + + + def fit(self, args: Namespace, config: Munch, module: M): + is_rank_zero = pl.utilities.rank_zero_only.rank == 0 + + metric_prefix = f"{module.__class__.__name__}.validation_step/" + + pl_callbacks = [ + pl.callbacks.LearningRateMonitor(log_momentum=True), + pl.callbacks.EarlyStopping(monitor=metric_prefix+getattr(module, "metric_early_stop", "loss"), patience=200, check_on_train_epoch_end=False, verbose=True), + pl.callbacks.ModelCheckpoint(monitor=metric_prefix+getattr(module, "metric_best_model", "loss"), mode="min", save_top_k=1, save_last=True), + logging.ModelOutputMonitor(), + logging.EpochTimeMonitor(), + (pl.callbacks.RichModelSummary if os.isatty(1) else pl.callbacks.ModelSummary)(max_depth=30), + logging.PsutilMonitor(), + ] + if os.isatty(1): + pl_callbacks.append( pl.callbacks.RichProgressBar() ) + + trainer: pl.Trainer + logger = logging.make_logger(config.experiment_name, config.trainer.get("default_root_dir", args.default_root_dir or self.workdir), **config.logging) + trainer = pl.Trainer.from_argparse_args(args, logger=logger, callbacks=pl_callbacks, **config.trainer) + + datamodule = self.init_datamodule_cls_from_config(args, config) + + for f in self.pre_fit_handlers: + print(f"pre-train hook {f.__name__!r}...") + f(args, config, module, trainer, datamodule, logger) + + # print and log hparams/config + if 1: # fold me + if is_rank_zero: + CONSOLE.print(f"Experiment name: {config.experiment_name!r}", soft_wrap=False, crop=False, no_wrap=False, overflow="ignore") + + # parser.args and sys.argv + pickled_cli_args = dict( + sys_argv = sys.argv, + parser_args = args.__dict__, + config = config.copy(), + _raw_yaml = config["_raw_yaml"], + ) + del pickled_cli_args["config"]["_raw_yaml"] + for k,v in pickled_cli_args["parser_args"].items(): + if isinstance(v, Path): + pickled_cli_args["parser_args"][k] = str(v) + + # trainer + params_trainer = inspect.signature(pl.Trainer.__init__).parameters + trainer_hparams = vars(pl.Trainer.parse_argparser(args)) + trainer_hparams = { name: trainer_hparams[name] for name in params_trainer if name in trainer_hparams } + if is_rank_zero: + print("pl.Trainer hparams:") + print_column_dict(trainer_hparams, 3) + pickled_cli_args.update(trainer_hparams=trainer_hparams) + + # module + assert isinstance(module, self.module_cls) + if is_rank_zero: + print(f"{self.module_cls.__qualname__} hparams:") + print_column_dict(map_type_to_repr(module.hparams, nn.Module, lambda t: f"{t.__class__.__qualname__}"), 3) + pickled_cli_args.update(module_hparams={ + k : v + for k, v in module.hparams.items() + if k != "_raw_yaml" + }) + + # module extra state, like autodecoder uids + for submodule_name, submodule in module.named_modules(): + if not submodule_name: + submodule_name = module.__class__.__qualname__ + else: + submodule_name = module.__class__.__qualname__ + "." + submodule_name + try: + state = submodule.get_extra_state() + except RuntimeError: + continue + if "extra_state" not in pickled_cli_args: + pickled_cli_args["extra_state"] = {} + pickled_cli_args["extra_state"][submodule_name] = state + + # datamodule + if self.datamodule_cls: + assert datamodule is not None and any(isinstance(datamodule, i) for i in self.datamodule_cls), datamodule + for datamodule_cls in self.datamodule_cls: + params_d = inspect.signature(datamodule_cls.__init__).parameters + assert {"self"} == set(params_trainer).intersection(params_d), \ + f"trainer and datamodule has overlapping params: {set(params_trainer).intersection(params_d) - {'self'}}" + + if is_rank_zero: + print(f"{datamodule.__class__.__qualname__} hparams:") + print_column_dict(datamodule.hparams) + pickled_cli_args.update(datamodule_hparams=dict(datamodule.hparams)) + + # logger + if logger is not None: + print(f"{logger.__class__.__qualname__} hparams:") + print_column_dict(config.logging) + pickled_cli_args.update(logger_hparams = {"_class": logger.__class__.__name__} | config.logging) + + # host info + def cmd(cmd: Union[str, list[str]]) -> str: + if isinstance(cmd, str): + cmd = shlex.split(cmd) + if shutil.which(cmd[0]): + try: + return subprocess.run(cmd, + capture_output=True, + check=True, + text=True, + ).stdout.strip() + except subprocess.CalledProcessError as e: + warnings.warn(f"{e.__class__.__name__}: {e}") + return f"{e.__class__.__name__}: {e}\n{e.output = }\n{e.stderr = }" + else: + warnings.warn(f"command {cmd[0]!r} not found") + return f"*command {cmd[0]!r} not found*" + + pickled_cli_args.update(host = dict( + platform = textwrap.dedent(f""" + {platform.architecture() = } + {platform.java_ver() = } + {platform.libc_ver() = } + {platform.mac_ver() = } + {platform.machine() = } + {platform.node() = } + {platform.platform() = } + {platform.processor() = } + {platform.python_branch() = } + {platform.python_build() = } + {platform.python_compiler() = } + {platform.python_implementation() = } + {platform.python_revision() = } + {platform.python_version() = } + {platform.release() = } + {platform.system() = } + {platform.uname() = } + {platform.version() = } + """.rstrip()).lstrip(), + cuda = dict( + gpus = [ + torch.cuda.get_device_name(i) + for i in range(torch.cuda.device_count()) + ], + available = torch.cuda.is_available(), + version = torch.version.cuda, + ), + hostname = cmd("hostname --fqdn"), + cwd = os.getcwd(), + date = datetime.now().astimezone().isoformat(), + date_utc = datetime.utcnow().isoformat(), + ifconfig = cmd("ifconfig"), + lspci = cmd("lspci"), + lsusb = cmd("lsusb"), + lsblk = cmd("lsblk"), + mount = cmd("mount"), + environ = os.environ.copy(), + vcs = f"commit {cmd('git rev-parse HEAD')}\n{cmd('git status')}\n{cmd('git diff --stat --patch HEAD')}", + venv_pip = cmd("pip list --format=freeze"), + venv_conda = cmd("conda list"), + venv_poetry = cmd("poetry show -t"), + gpus = [i.split(", ") for i in cmd("nvidia-smi --query-gpu=index,name,memory.total,driver_version,uuid --format=csv").splitlines()], + )) + + if logger is not None: + logging.log_config(logger, _pickled_cli_args=pickled_cli_args) + + warnings.filterwarnings(action="ignore", category=torch.jit.TracerWarning) + + if __debug__ and is_rank_zero: + warnings.warn("You're running python with assertions active. Enable optimizations with `python -O` for improved performance.") + + # train + + t_begin = datetime.now() + if args.action == "fit": + trainer.fit(module, datamodule) + elif args.action == "test": + trainer.test(module, datamodule) + else: + raise ValueError(f"{args.mode=}, {args.action=}") + + if not is_rank_zero: + return + + t_end = datetime.now() + print(f"Training time: {t_end - t_begin}") + + for f in self.post_fit_handlers: + print(f"post-train hook {f.__name__!r}...") + try: + f(args, config, module, trainer, datamodule, logger) + except Exception: + traceback.print_exc() + + rich.print(f"Experiment name: {config.experiment_name!r}") + rich.print(f"Best model path: {helpers.make_relative(trainer.checkpoint_callback.best_model_path).__str__()!r}") + rich.print(f"Last model path: {helpers.make_relative(trainer.checkpoint_callback.last_model_path).__str__()!r}") + + def test_dataloader(self, args: Namespace, config: Munch, module: M): + # limit CPU affinity + if args.limit_cores is not None: + # https://stackoverflow.com/a/40856471 + p = psutil.Process() + assert len(p.cpu_affinity()) >= args.limit_cores + cpus = list(range(args.limit_cores)) + p.cpu_affinity(cpus) + print("Process limited to CPUs", cpus) + + datamodule = self.init_datamodule_cls_from_config(args, config) + + # setup + rich.print(f"Setup {datamodule.__class__.__qualname__}...") + datamodule.prepare_data() + datamodule.setup("fit") + try: + train = datamodule.train_dataloader() + except (MisconfigurationException, NotImplementedError): + train = None + try: + val = datamodule.val_dataloader() + except (MisconfigurationException, NotImplementedError): + val = None + try: + test = datamodule.test_dataloader() + except (MisconfigurationException, NotImplementedError): + test = None + + # inspect + rich.print("batch[0] = ", end="") + rich.pretty.pprint( + map_type_to_repr( + next(iter(train)), + torch.Tensor, + lambda x: f"Tensor(..., shape={x.shape}, dtype={x.dtype}, device={x.device})", + ), + indent_guides = False, + ) + + if args.profile is not None: + import cProfile + profile = cProfile.Profile() + profile.enable() + + # measure + n_train, td_train = 0, 0 + n_val, td_val = 0, 0 + n_test, td_test = 0, 0 + try: + for i in range(args.n_rounds): + print(f"Round {i+1} of {args.n_rounds}") + if train is not None: + epoch = time.perf_counter_ns() + n_train += sum(1 for _ in tqdm(train, desc=f"train {i+1}/{args.n_rounds}")) + td_train += time.perf_counter_ns() - epoch + if val is not None: + epoch = time.perf_counter_ns() + n_val += sum(1 for _ in tqdm(val, desc=f"val {i+1}/{args.n_rounds}")) + td_val += time.perf_counter_ns() - epoch + if test is not None: + epoch = time.perf_counter_ns() + n_test += sum(1 for _ in tqdm(test, desc=f"train {i+1}/{args.n_rounds}")) + td_test += time.perf_counter_ns() - epoch + except KeyboardInterrupt: + rich.print("Recieved a `KeyboardInterrupt`...") + + if args.profile is not None: + profile.disable() + if args.profile != "-": + profile.dump_stats(args.profile) + profile.print_stats("tottime") + + # summary + for label, data, n, td in [ + ("train", train, n_train, td_train), + ("val", val, n_val, td_val), + ("test", test, n_test, td_test), + ]: + if not n: continue + if data is not None: + print(f"{label}:", + f" - per epoch: {td / args.n_rounds * 1e-9 :11.6f} s", + f" - per batch: {td / n * 1e-9 :11.6f} s", + f" - batches/s: {n / (td * 1e-9):11.6f}", + sep="\n") + + datamodule.teardown("fit") + + + +# helpers: + +def open_in_netron(filename: str, data: bytes, *, timeout: float = 10): + # filename is only used to determine the filetype + url = serve_once_in_background( + data, + mime_type = "application/octet-stream", + timeout = timeout, + port = gen_random_port(), + ) + url = f"https://netron.app/?url={urllib.parse.quote(url)}{filename}" + print("Open in Netron:", url) + webbrowser.get("firefox").open_new_tab(url) + if timeout: + time.sleep(timeout) + +def remove_options_from_parser(parser: ArgumentParser, *options: str): + options = set(options) + # https://stackoverflow.com/questions/32807319/disable-remove-argument-in-argparse/36863647#36863647 + for action in parser._actions: + if action.option_strings: + option = action.option_strings[0] + if option in options: + parser._handle_conflict_resolve(None, [(option, action)]) + +def map_type_to_repr(batch, type_match: type, repr_func: callable): + def mapper(value): + if isinstance(value, type_match): + return helpers.CustomRepr(repr_func(value)) + else: + return value + return helpers.map_tree(mapper, batch) + +def datamodule_name_to_snake_case(datamodule: Union[str, type[DM]]) -> str: + if not isinstance(datamodule, str): + datamodule = datamodule.__name__ + datamodule = datamodule.replace("DataModule", "Datamodule") + if datamodule != "Datamodule": + datamodule = datamodule.removesuffix("Datamodule") + return camel_to_snake_case(datamodule, sep="-", join_abbreviations=True) diff --git a/ifield/cli_utils.py b/ifield/cli_utils.py new file mode 100644 index 0000000..bd50bdd --- /dev/null +++ b/ifield/cli_utils.py @@ -0,0 +1,174 @@ +#!/usr/bin/env python3 +from .data.common.scan import SingleViewScan, SingleViewUVScan +from datetime import datetime +import re +import click +import gzip +import h5py as h5 +import matplotlib.pyplot as plt +import numpy as np +import pyrender +import trimesh +import trimesh.transformations as T + +__doc__ = """ +Here are a bunch of helper scripts exposed as cli command by poetry +""" + + +# these entrypoints are exposed by poetry as shell commands + +@click.command() +@click.argument("h5file") +@click.argument("key", default="") +def show_h5_items(h5file: str, key: str): + "Show contents of HDF5 dataset" + f = h5.File(h5file, "r") + if not key: + mlen = max(map(len, f.keys())) + for i in sorted(f.keys()): + print(i.ljust(mlen), ":", + str (f[i].dtype).ljust(10), + repr(f[i].shape).ljust(16), + "mean:", f[i][:].mean() + ) + else: + if not f[key].shape: + print(f[key].value) + else: + print(f[key][:]) + + +@click.command() +@click.argument("h5file") +@click.argument("key", default="") +def show_h5_img(h5file: str, key: str): + "Show a 2D HDF5 dataset as an image" + f = h5.File(h5file, "r") + if not key: + mlen = max(map(len, f.keys())) + for i in sorted(f.keys()): + print(i.ljust(mlen), ":", str(f[i].dtype).ljust(10), f[i].shape) + else: + plt.imshow(f[key]) + plt.show() + + +@click.command() +@click.argument("h5file") +@click.option("--force-distances", is_flag=True, help="Always show miss distances.") +@click.option("--uv", is_flag=True, help="Load as UV scan cloud and convert it.") +@click.option("--show-unit-sphere", is_flag=True, help="Show the unit sphere.") +@click.option("--missing", is_flag=True, help="Show miss points that are not hits nor misses as purple.") +def show_h5_scan_cloud( + h5file : str, + force_distances : bool = False, + uv : bool = False, + missing : bool = False, + show_unit_sphere = False, + ): + "Show a SingleViewScan HDF5 dataset" + print("Reading data...") + t = datetime.now() + if uv: + scan = SingleViewUVScan.from_h5_file(h5file) + if missing and scan.any_missing: + if not scan.has_missing: + scan.fill_missing_points() + points_missing = scan.points[scan.missing] + else: + missing = False + if not scan.is_single_view: + scan.cam_pos = None + scan = scan.to_scan() + else: + scan = SingleViewScan.from_h5_file(h5file) + if missing: + uvscan = scan.to_uv_scan() + if scan.any_missing: + uvscan.fill_missing_points() + points_missing = uvscan.points[uvscan.missing] + else: + missing = False + print("loadtime: ", datetime.now() - t) + + if force_distances and not scan.has_miss_distances: + print("Computing miss distances...") + scan.compute_miss_distances() + use_miss_distances = force_distances + print("Constructing scene...") + if not scan.has_colors: + scan.colors_hit = np.zeros_like(scan.points_hit) + scan.colors_miss = np.zeros_like(scan.points_miss) + scan.colors_hit [:] = ( 31/255, 119/255, 180/255) + scan.colors_miss[:] = (243/255, 156/255, 18/255) + use_miss_distances = True + if scan.has_miss_distances and use_miss_distances: + sdm = scan.distances_miss / scan.distances_miss.max() + sdm = sdm[..., None] + scan.colors_miss \ + = np.array([0.8, 0, 0])[None, :] * sdm \ + + np.array([0, 1, 0.2])[None, :] * (1-sdm) + + + scene = pyrender.Scene() + + scene.add(pyrender.Mesh.from_points(scan.points_hit, colors=scan.colors_hit, normals=scan.normals_hit)) + scene.add(pyrender.Mesh.from_points(scan.points_miss, colors=scan.colors_miss)) + + if missing: + scene.add(pyrender.Mesh.from_points(points_missing, colors=(np.array((0xff, 0x00, 0xff))/255)[None, :].repeat(points_missing.shape[0], axis=0))) + + # camera: + if not scan.points_cam is None: + camera_mesh = trimesh.creation.uv_sphere(radius=scan.points_hit_std.max()*0.2) + camera_mesh.visual.vertex_colors = [0.0, 0.8, 0.0] + tfs = np.tile(np.eye(4), (len(scan.points_cam), 1, 1)) + tfs[:,:3,3] = scan.points_cam + scene.add(pyrender.Mesh.from_trimesh(camera_mesh, poses=tfs)) + + # UV sphere: + if show_unit_sphere: + unit_sphere_mesh = trimesh.creation.uv_sphere(radius=1) + unit_sphere_mesh.invert() + unit_sphere_mesh.visual.vertex_colors = [0.8, 0.8, 0.0] + scene.add(pyrender.Mesh.from_trimesh(unit_sphere_mesh, poses=np.eye(4)[None, ...])) + + print("Launch!") + viewer = pyrender.Viewer(scene, use_raymond_lighting=True, point_size=2) + + +@click.command() +@click.argument("meshfile") +@click.option('--aabb', is_flag=True) +@click.option('--z-skyward', is_flag=True) +def show_model( + meshfile : str, + aabb : bool, + z_skyward : bool, + ): + "Show a 3D model with pyrender, supports .gz suffix" + if meshfile.endswith(".gz"): + with gzip.open(meshfile, "r") as f: + mesh = trimesh.load(f, file_type=meshfile.split(".", 1)[1].removesuffix(".gz")) + else: + mesh = trimesh.load(meshfile) + + if isinstance(mesh, trimesh.Scene): + mesh = mesh.dump(concatenate=True) + + if aabb: + from .data.common.mesh import rotate_to_closest_axis_aligned_bounds + mesh.apply_transform(rotate_to_closest_axis_aligned_bounds(mesh, fail_ok=True)) + + if z_skyward: + mesh.apply_transform(T.rotation_matrix(np.pi/2, (1, 0, 0))) + + print( + *(i.strip() for i in pyrender.Viewer.__doc__.splitlines() if re.search(r"- ``[a-z0-9]``: ", i)), + sep="\n" + ) + + scene = pyrender.Scene() + scene.add(pyrender.Mesh.from_trimesh(mesh)) + pyrender.Viewer(scene, use_raymond_lighting=True) diff --git a/ifield/data/__init__.py b/ifield/data/__init__.py new file mode 100644 index 0000000..dd50c82 --- /dev/null +++ b/ifield/data/__init__.py @@ -0,0 +1,3 @@ +__doc__ = """ +Submodules to read and process datasets +""" diff --git a/ifield/data/common/__init__.py b/ifield/data/common/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ifield/data/common/download.py b/ifield/data/common/download.py new file mode 100644 index 0000000..3f583e8 --- /dev/null +++ b/ifield/data/common/download.py @@ -0,0 +1,90 @@ +from ...utils.helpers import make_relative +from pathlib import Path +from tqdm import tqdm +from typing import Union, Optional +import io +import os +import json +import requests + +PathLike = Union[os.PathLike, str] + +__doc__ = """ +Here are some helper functions for processing data. +""" + +def check_url(url): # HTTP HEAD + return requests.head(url).ok + +def download_stream( + url : str, + file_object, + block_size : int = 1024, + silent : bool = False, + label : Optional[str] = None, + ): + resp = requests.get(url, stream=True) + total_size = int(resp.headers.get("content-length", 0)) + if not silent: + progress_bar = tqdm(total=total_size , unit="iB", unit_scale=True, desc=label) + + for chunk in resp.iter_content(block_size): + if not silent: + progress_bar.update(len(chunk)) + file_object.write(chunk) + + if not silent: + progress_bar.close() + if total_size != 0 and progress_bar.n != total_size: + print("ERROR, something went wrong") + +def download_data( + url : str, + block_size : int = 1024, + silent : bool = False, + label : Optional[str] = None, + ) -> bytearray: + f = io.BytesIO() + download_stream(url, f, block_size=block_size, silent=silent, label=label) + f.seek(0) + return bytearray(f.read()) + +def download_file( + url : str, + fname : Union[Path, str], + block_size : int = 1024, + silent = False, + ): + if not isinstance(fname, Path): + fname = Path(fname) + with fname.open("wb") as f: + download_stream(url, f, block_size=block_size, silent=silent, label=make_relative(fname, Path.cwd()).name) + +def is_downloaded( + target_dir : PathLike, + url : str, + *, + add : bool = False, + dbfiles : Union[list[PathLike], PathLike], + ): + if not isinstance(target_dir, os.PathLike): + target_dir = Path(target_dir) + if not isinstance(dbfiles, list): + dbfiles = [dbfiles] + if not dbfiles: + raise ValueError("'dbfiles' empty") + downloaded = set() + for dbfile_fname in dbfiles: + dbfile_fname = target_dir / dbfile_fname + if dbfile_fname.is_file(): + with open(dbfile_fname, "r") as f: + downloaded.update(json.load(f)["downloaded"]) + + if add and url not in downloaded: + downloaded.add(url) + with open(dbfiles[0], "w") as f: + data = {"downloaded": sorted(downloaded)} + json.dump(data, f, indent=2, sort_keys=True) + return True + + return url in downloaded diff --git a/ifield/data/common/h5_dataclasses.py b/ifield/data/common/h5_dataclasses.py new file mode 100644 index 0000000..c7cd46f --- /dev/null +++ b/ifield/data/common/h5_dataclasses.py @@ -0,0 +1,370 @@ +#!/usr/bin/env python3 +from abc import abstractmethod, ABCMeta +from collections import namedtuple +from pathlib import Path +import copy +import dataclasses +import functools +import h5py as h5 +import hdf5plugin +import numpy as np +import operator +import os +import sys +import typing + +__all__ = [ + "DataclassMeta", + "Dataclass", + "H5Dataclass", + "H5Array", + "H5ArrayNoSlice", +] + +T = typing.TypeVar("T") +NoneType = type(None) +PathLike = typing.Union[os.PathLike, str] +H5Array = typing._alias(np.ndarray, 0, inst=False, name="H5Array") +H5ArrayNoSlice = typing._alias(np.ndarray, 0, inst=False, name="H5ArrayNoSlice") + +DataclassField = namedtuple("DataclassField", [ + "name", + "type", + "is_optional", + "is_array", + "is_sliceable", + "is_prefix", +]) + +def strip_optional(val: type) -> type: + if typing.get_origin(val) is typing.Union: + union = set(typing.get_args(val)) + if len(union - {NoneType}) == 1: + val, = union - {NoneType} + else: + raise TypeError(f"Non-'typing.Optional' 'typing.Union' is not supported: {typing._type_repr(val)!r}") + return val + +def is_array(val, *, _inner=False): + """ + Hacky way to check if a value or type is an array. + The hack omits having to depend on large frameworks such as pytorch or pandas + """ + val = strip_optional(val) + if val is H5Array or val is H5ArrayNoSlice: + return True + + if typing._type_repr(val) in ( + "numpy.ndarray", + "torch.Tensor", + ): + return True + if not _inner: + return is_array(type(val), _inner=True) + return False + +def prod(numbers: typing.Iterable[T], initial: typing.Optional[T] = None) -> T: + if initial is not None: + return functools.reduce(operator.mul, numbers, initial) + else: + return functools.reduce(operator.mul, numbers) + +class DataclassMeta(type): + def __new__( + mcls, + name : str, + bases : tuple[type, ...], + attrs : dict[str, typing.Any], + **kwargs, + ): + cls = super().__new__(mcls, name, bases, attrs, **kwargs) + if sys.version_info[:2] >= (3, 10) and not hasattr(cls, "__slots__"): + cls = dataclasses.dataclass(slots=True)(cls) + else: + cls = dataclasses.dataclass(cls) + return cls + +class DataclassABCMeta(DataclassMeta, ABCMeta): + pass + +class Dataclass(metaclass=DataclassMeta): + def __getitem__(self, key: str) -> typing.Any: + if key in self.keys(): + return getattr(self, key) + raise KeyError(key) + + def __setitem__(self, key: str, value: typing.Any): + if key in self.keys(): + return setattr(self, key, value) + raise KeyError(key) + + def keys(self) -> typing.KeysView: + return self.as_dict().keys() + + def values(self) -> typing.ValuesView: + return self.as_dict().values() + + def items(self) -> typing.ItemsView: + return self.as_dict().items() + + def as_dict(self, properties_to_include: set[str] = None, **kw) -> dict[str, typing.Any]: + out = dataclasses.asdict(self, **kw) + for name in (properties_to_include or []): + out[name] = getattr(self, name) + return out + + def as_tuple(self, properties_to_include: list[str]) -> tuple: + out = dataclasses.astuple(self) + if not properties_to_include: + return out + else: + return ( + *out, + *(getattr(self, name) for name in properties_to_include), + ) + + def copy(self: T, *, deep=True) -> T: + return (copy.deepcopy if deep else copy.copy)(self) + +class H5Dataclass(Dataclass): + # settable with class params: + _prefix : str = dataclasses.field(init=False, repr=False, default="") + _n_pages : int = dataclasses.field(init=False, repr=False, default=10) + _require_all : bool = dataclasses.field(init=False, repr=False, default=False) + + def __init_subclass__(cls, + prefix : typing.Optional[str] = None, + n_pages : typing.Optional[int] = None, + require_all : typing.Optional[bool] = None, + **kw, + ): + super().__init_subclass__(**kw) + assert dataclasses.is_dataclass(cls) + if prefix is not None: cls._prefix = prefix + if n_pages is not None: cls._n_pages = n_pages + if require_all is not None: cls._require_all = require_all + + @classmethod + def _get_fields(cls) -> typing.Iterable[DataclassField]: + for field in dataclasses.fields(cls): + if not field.init: + continue + assert field.name not in ("_prefix", "_n_pages", "_require_all"), ( + f"{field.name!r} can not be in {cls.__qualname__}.__init__.\n" + "Set it with dataclasses.field(default=YOUR_VALUE, init=False, repr=False)" + ) + if isinstance(field.type, str): + raise TypeError("Type hints are strings, perhaps avoid using `from __future__ import annotations`") + + type_inner = strip_optional(field.type) + is_prefix = typing.get_origin(type_inner) is dict and typing.get_args(type_inner)[:1] == (str,) + field_type = typing.get_args(type_inner)[1] if is_prefix else field.type + if field.default is None or typing.get_origin(field.type) is typing.Union and NoneType in typing.get_args(field.type): + field_type = typing.Optional[field_type] + + yield DataclassField( + name = field.name, + type = strip_optional(field_type), + is_optional = typing.get_origin(field_type) is typing.Union and NoneType in typing.get_args(field_type), + is_array = is_array(field_type), + is_sliceable = is_array(field_type) and strip_optional(field_type) is not H5ArrayNoSlice, + is_prefix = is_prefix, + ) + + @classmethod + def from_h5_file(cls : type[T], + fname : typing.Union[PathLike, str], + *, + page : typing.Optional[int] = None, + n_pages : typing.Optional[int] = None, + read_slice : slice = slice(None), + require_even_pages : bool = True, + ) -> T: + if not isinstance(fname, Path): + fname = Path(fname) + if n_pages is None: + n_pages = cls._n_pages + if not fname.exists(): + raise FileNotFoundError(str(fname)) + if not h5.is_hdf5(fname): + raise TypeError(f"Not a HDF5 file: {str(fname)!r}") + + # if this class has no fields, print a example class: + if not any(field.init for field in dataclasses.fields(cls)): + with h5.File(fname, "r") as f: + klen = max(map(len, f.keys())) + example_cls = f"\nclass {cls.__name__}(Dataclass, require_all=True):\n" + "\n".join( + f" {k.ljust(klen)} : " + + ( + "H5Array" if prod(v.shape, 1) > 1 else ( + "float" if issubclass(v.dtype.type, np.floating) else ( + "int" if issubclass(v.dtype.type, np.integer) else ( + "bool" if issubclass(v.dtype.type, np.bool_) else ( + "typing.Any" + ))))).ljust(14 + 1) + + f" #{repr(v).split(':', 1)[1].removesuffix('>')}" + for k, v in f.items() + ) + raise NotImplementedError(f"{cls!r} has no fields!\nPerhaps try the following:{example_cls}") + + fields_consumed = set() + + def make_kwarg( + file : h5.File, + keys : typing.KeysView, + field : DataclassField, + ) -> tuple[str, typing.Any]: + if field.is_optional: + if field.name not in keys: + return field.name, None + if field.is_sliceable: + if page is not None: + n_items = int(f[cls._prefix + field.name].shape[0]) + page_len = n_items // n_pages + modulus = n_items % n_pages + if modulus: page_len += 1 # round up + if require_even_pages and modulus: + raise ValueError(f"Field {field.name!r} {tuple(f[cls._prefix + field.name].shape)} is not cleanly divisible into {n_pages} pages") + this_slice = slice( + start = page_len * page, + stop = page_len * (page+1), + step = read_slice.step, # inherit step + ) + else: + this_slice = read_slice + else: + this_slice = slice(None) # read all + + # array or scalar? + def read_dataset(var): + # https://docs.h5py.org/en/stable/high/dataset.html#reading-writing-data + if field.is_array: + return var[this_slice] + if var.shape == (1,): + return var[0] + else: + return var[()] + + if field.is_prefix: + fields_consumed.update( + key + for key in keys if key.startswith(f"{cls._prefix}{field.name}_") + ) + return field.name, { + key.removeprefix(f"{cls._prefix}{field.name}_") : read_dataset(file[key]) + for key in keys if key.startswith(f"{cls._prefix}{field.name}_") + } + else: + fields_consumed.add(cls._prefix + field.name) + return field.name, read_dataset(file[cls._prefix + field.name]) + + with h5.File(fname, "r") as f: + keys = f.keys() + init_dict = dict( make_kwarg(f, keys, i) for i in cls._get_fields() ) + + try: + out = cls(**init_dict) + except Exception as e: + class_attrs = set(field.name for field in dataclasses.fields(cls)) + file_attr = set(init_dict.keys()) + raise e.__class__(f"{e}. {class_attrs=}, {file_attr=}, diff={class_attrs.symmetric_difference(file_attr)}") from e + + if cls._require_all: + fields_not_consumed = set(keys) - fields_consumed + if fields_not_consumed: + raise ValueError(f"Not all HDF5 fields consumed: {fields_not_consumed!r}") + + return out + + def to_h5_file(self, + fname : PathLike, + mkdir : bool = False, + ): + if not isinstance(fname, Path): + fname = Path(fname) + if not fname.parent.is_dir(): + if mkdir: + fname.parent.mkdir(parents=True) + else: + raise NotADirectoryError(fname.parent) + + with h5.File(fname, "w") as f: + for field in type(self)._get_fields(): + if field.is_optional and getattr(self, field.name) is None: + continue + value = getattr(self, field.name) + if field.is_array: + if any(type(i) is not np.ndarray for i in (value.values() if field.is_prefix else [value])): + raise TypeError( + "When dumping a H5Dataclass, make sure the array fields are " + f"numpy arrays (the type of {field.name!r} is {typing._type_repr(type(value))}).\n" + "Example: h5dataclass.map_arrays(torch.Tensor.numpy)" + ) + else: + pass + + def write_value(key: str, value: typing.Any): + if field.is_array: + f.create_dataset(key, data=value, **hdf5plugin.LZ4()) + else: + f.create_dataset(key, data=value) + + if field.is_prefix: + for k, v in value.items(): + write_value(self._prefix + field.name + "_" + k, v) + else: + write_value(self._prefix + field.name, value) + + def map_arrays(self: T, func: typing.Callable[[H5Array], H5Array], do_copy: bool = False) -> T: + if do_copy: # shallow + self = self.copy(deep=False) + for field in type(self)._get_fields(): + if field.is_optional and getattr(self, field.name) is None: + continue + if field.is_prefix and field.is_array: + setattr(self, field.name, { + k : func(v) + for k, v in getattr(self, field.name).items() + }) + elif field.is_array: + setattr(self, field.name, func(getattr(self, field.name))) + + return self + + def astype(self: T, t: type, do_copy: bool = False, convert_nonfloats: bool = False) -> T: + return self.map_arrays(lambda x: x.astype(t) if convert_nonfloats or not np.issubdtype(x.dtype, int) else x) + + def copy(self: T, *, deep=True) -> T: + out = super().copy(deep=deep) + if not deep: + for field in type(self)._get_fields(): + if field.is_prefix: + out[field.name] = copy.copy(field.name) + return out + + @property + def shape(self) -> dict[str, tuple[int, ...]]: + return { + key: value.shape + for key, value in self.items() + if hasattr(value, "shape") + } + +class TransformableDataclassMixin(metaclass=DataclassABCMeta): + + @abstractmethod + def transform(self: T, mat4: np.ndarray, inplace=False) -> T: + ... + + def transform_to(self: T, name: str, inverse_name: str = None, *, inplace=False) -> T: + mtx = self.transforms[name] + out = self.transform(mtx, inplace=inplace) + out.transforms.pop(name) # consumed + + inv = np.linalg.inv(mtx) + for key in list(out.transforms.keys()): # maintain the other transforms + out.transforms[key] = out.transforms[key] @ inv + if inverse_name is not None: # store inverse + out.transforms[inverse_name] = inv + + return out diff --git a/ifield/data/common/mesh.py b/ifield/data/common/mesh.py new file mode 100644 index 0000000..fc5a6bc --- /dev/null +++ b/ifield/data/common/mesh.py @@ -0,0 +1,48 @@ +from math import pi +from trimesh import Trimesh +import numpy as np +import os +import trimesh +import trimesh.transformations as T + +DEBUG = bool(os.environ.get("IFIELD_DEBUG", "")) + +__doc__ = """ +Here are some helper functions for processing data. +""" + +def rotate_to_closest_axis_aligned_bounds( + mesh : Trimesh, + order_axes : bool = True, + fail_ok : bool = True, + ) -> np.ndarray: + to_origin_mat4, extents = trimesh.bounds.oriented_bounds(mesh, ordered=not order_axes) + to_aabb_rot_mat4 = T.euler_matrix(*T.decompose_matrix(to_origin_mat4)[3]) + + if not order_axes: + return to_aabb_rot_mat4 + + v = pi / 4 * 1.01 # tolerance + v2 = pi / 2 + + faces = ( + (0, 0), + (1, 0), + (2, 0), + (3, 0), + (0, 1), + (0,-1), + ) + orientations = [ # 6 faces x 4 rotations per face + (f[0] * v2, f[1] * v2, i * v2) + for i in range(4) + for f in faces] + + for x, y, z in orientations: + mat4 = T.euler_matrix(x, y, z) @ to_aabb_rot_mat4 + ai, aj, ak = T.euler_from_matrix(mat4) + if abs(ai) <= v and abs(aj) <= v and abs(ak) <= v: + return mat4 + + if fail_ok: return to_aabb_rot_mat4 + raise Exception("Unable to orient mesh") diff --git a/ifield/data/common/points.py b/ifield/data/common/points.py new file mode 100644 index 0000000..58cb9da --- /dev/null +++ b/ifield/data/common/points.py @@ -0,0 +1,297 @@ +from __future__ import annotations +from ...utils.helpers import compose +from functools import reduce, lru_cache +from math import ceil +from typing import Iterable +import numpy as np +import operator + +__doc__ = """ +Here are some helper functions for processing data. +""" + + +def img2col(img: np.ndarray, psize: int) -> np.ndarray: + # based of ycb_generate_point_cloud.py provided by YCB + + n_channels = 1 if len(img.shape) == 2 else img.shape[0] + n_channels, rows, cols = (1,) * (3 - len(img.shape)) + img.shape + + # pad the image + img_pad = np.zeros(( + n_channels, + int(ceil(1.0 * rows / psize) * psize), + int(ceil(1.0 * cols / psize) * psize), + )) + img_pad[:, 0:rows, 0:cols] = img + + # allocate output buffer + final = np.zeros(( + img_pad.shape[1], + img_pad.shape[2], + n_channels, + psize, + psize, + )) + + for c in range(n_channels): + for x in range(psize): + for y in range(psize): + img_shift = np.vstack(( + img_pad[c, x:], + img_pad[c, :x])) + img_shift = np.column_stack(( + img_shift[:, y:], + img_shift[:, :y])) + final[x::psize, y::psize, c] = np.swapaxes( + img_shift.reshape( + int(img_pad.shape[1] / psize), psize, + int(img_pad.shape[2] / psize), psize), + 1, + 2) + + # crop output and unwrap axes with size==1 + return np.squeeze(final[ + 0:rows - psize + 1, + 0:cols - psize + 1]) + +def filter_depth_discontinuities(depth_map: np.ndarray, filt_size = 7, thresh = 1000) -> np.ndarray: + """ + Removes data close to discontinuities, with size filt_size. + """ + # based of ycb_generate_point_cloud.py provided by YCB + + # Ensure that filter sizes are okay + assert filt_size % 2, "Can only use odd filter sizes." + + # Compute discontinuities + offset = int(filt_size - 1) // 2 + patches = 1.0 * img2col(depth_map, filt_size) + mids = patches[:, :, offset, offset] + mins = np.min(patches, axis=(2, 3)) + maxes = np.max(patches, axis=(2, 3)) + + discont = np.maximum( + np.abs(mins - mids), + np.abs(maxes - mids)) + mark = discont > thresh + + # Account for offsets + final_mark = np.zeros(depth_map.shape, dtype=np.uint16) + final_mark[offset:offset + mark.shape[0], + offset:offset + mark.shape[1]] = mark + + return depth_map * (1 - final_mark) + +def reorient_depth_map( + depth_map : np.ndarray, + rgb_map : np.ndarray, + depth_mat3 : np.ndarray, # 3x3 intrinsic camera matrix + depth_vec5 : np.ndarray, # 5 distortion parameters (k1, k2, p1, p2, k3) + rgb_mat3 : np.ndarray, # 3x3 intrinsic camera matrix + rgb_vec5 : np.ndarray, # 5 distortion parameters (k1, k2, p1, p2, k3) + ir_to_rgb_mat4 : np.ndarray, # extrinsic transformation matrix from depth to rgb camera viewpoint + rgb_mask_map : np.ndarray = None, + _output_points = False, # retval (H, W) if false else (N, XYZRGB) + _output_hits_uvs = False, # retval[1] is dtype=bool of hits shaped like depth_map + ) -> np.ndarray: + + """ + Corrects depth_map to be from the same view as the rgb_map, with the same dimensions. + If _output_points is True, the points returned are in the rgb camera space. + """ + # based of ycb_generate_point_cloud.py provided by YCB + # now faster AND more easy on the GIL + + height_old, width_old, *_ = depth_map.shape + height, width, *_ = rgb_map.shape + + + d_cx, r_cx = depth_mat3[0, 2], rgb_mat3[0, 2] # optical center + d_cy, r_cy = depth_mat3[1, 2], rgb_mat3[1, 2] + d_fx, r_fx = depth_mat3[0, 0], rgb_mat3[0, 0] # focal length + d_fy, r_fy = depth_mat3[1, 1], rgb_mat3[1, 1] + d_k1, d_k2, d_p1, d_p2, d_k3 = depth_vec5 + c_k1, c_k2, c_p1, c_p2, c_k3 = rgb_vec5 + + # make a UV grid over depth_map + u, v = np.meshgrid( + np.arange(width_old), + np.arange(height_old), + ) + + # compute xyz coordinates for all depths + xyz_depth = np.stack(( + (u - d_cx) / d_fx, + (v - d_cy) / d_fy, + depth_map, + np.ones(depth_map.shape) + )).reshape((4, -1)) + xyz_depth = xyz_depth[:, xyz_depth[2] != 0] + + # undistort depth coordinates + d_x, d_y = xyz_depth[:2] + r = np.linalg.norm(xyz_depth[:2], axis=0) + xyz_depth[0, :] \ + = d_x / (1 + d_k1*r**2 + d_k2*r**4 + d_k3*r**6) \ + - (2*d_p1*d_x*d_y + d_p2*(r**2 + 2*d_x**2)) + xyz_depth[1, :] \ + = d_y / (1 + d_k1*r**2 + d_k2*r**4 + d_k3*r**6) \ + - (d_p1*(r**2 + 2*d_y**2) + 2*d_p2*d_x*d_y) + + # unproject x and y + xyz_depth[0, :] *= xyz_depth[2, :] + xyz_depth[1, :] *= xyz_depth[2, :] + + # convert depths to RGB camera viewpoint + xyz_rgb = ir_to_rgb_mat4 @ xyz_depth + + # project depths to RGB canvas + rgb_z_inv = 1 / xyz_rgb[2] # perspective correction + rgb_uv = np.stack(( + xyz_rgb[0] * rgb_z_inv * r_fx + r_cx + 0.5, + xyz_rgb[1] * rgb_z_inv * r_fy + r_cy + 0.5, + )).astype(np.int) + + # mask of the rgb_xyz values within view of rgb_map + mask = reduce(operator.and_, [ + rgb_uv[0] >= 0, + rgb_uv[1] >= 0, + rgb_uv[0] < width, + rgb_uv[1] < height, + ]) + if rgb_mask_map is not None: + mask[mask] &= rgb_mask_map[ + rgb_uv[1, mask], + rgb_uv[0, mask]] + + if not _output_points: # output image + output = np.zeros((height, width), dtype=depth_map.dtype) + output[ + rgb_uv[1, mask], + rgb_uv[0, mask], + ] = xyz_rgb[2, mask] + + else: # output pointcloud + rgbs = rgb_map[ # lookup rgb values using rgb_uv + rgb_uv[1, mask], + rgb_uv[0, mask]] + output = np.stack(( + xyz_rgb[0, mask], # x + xyz_rgb[1, mask], # y + xyz_rgb[2, mask], # z + rgbs[:, 0], # r + rgbs[:, 1], # g + rgbs[:, 2], # b + )).T + + # output for realsies + if not _output_hits_uvs: #raw + return output + else: # with hit mask + uv = np.zeros((height, width), dtype=bool) + # filter points overlapping in the depth map + uv_indices = ( + rgb_uv[1, mask], + rgb_uv[0, mask], + ) + _, chosen = np.unique( uv_indices[0] << 32 | uv_indices[1], return_index=True ) + output = output[chosen, :] + uv[uv_indices] = True + return output, uv + +def join_rgb_and_depth_to_points(*a, **kw) -> np.ndarray: + return reorient_depth_map(*a, _output_points=True, **kw) + +@compose(np.array) # block lru cache mutation +@lru_cache(maxsize=1) +@compose(list) +def generate_equidistant_sphere_points( + n : int, + centroid : np.ndarray = (0, 0, 0), + radius : float = 1, + compute_sphere_coordinates : bool = False, + compute_normals : bool = False, + shift_theta : bool = False, + ) -> Iterable[tuple[float, ...]]: + # Deserno M. How to generate equidistributed points on the surface of a sphere + # https://www.cmu.edu/biolphys/deserno/pdf/sphere_equi.pdf + + if compute_sphere_coordinates and compute_normals: + raise ValueError( + "'compute_sphere_coordinates' and 'compute_normals' are mutually exclusive" + ) + + n_count = 0 + a = 4 * np.pi / n + d = np.sqrt(a) + n_theta = round(np.pi / d) + d_theta = np.pi / n_theta + d_phi = a / d_theta + + for i in range(0, n_theta): + theta = np.pi * (i + 0.5) / n_theta + n_phi = round(2 * np.pi * np.sin(theta) / d_phi) + + for j in range(0, n_phi): + phi = 2 * np.pi * j / n_phi + + if compute_sphere_coordinates: # (theta, phi) + yield ( + theta if shift_theta else theta - 0.5*np.pi, + phi, + ) + elif compute_normals: # (x, y, z, nx, ny, nz) + yield ( + centroid[0] + radius * np.sin(theta) * np.cos(phi), + centroid[1] + radius * np.sin(theta) * np.sin(phi), + centroid[2] + radius * np.cos(theta), + np.sin(theta) * np.cos(phi), + np.sin(theta) * np.sin(phi), + np.cos(theta), + ) + else: # (x, y, z) + yield ( + centroid[0] + radius * np.sin(theta) * np.cos(phi), + centroid[1] + radius * np.sin(theta) * np.sin(phi), + centroid[2] + radius * np.cos(theta), + ) + n_count += 1 + + +def generate_random_sphere_points( + n : int, + centroid : np.ndarray = (0, 0, 0), + radius : float = 1, + compute_sphere_coordinates : bool = False, + compute_normals : bool = False, + shift_theta : bool = False, # depends on convention + ) -> np.ndarray: + if compute_sphere_coordinates and compute_normals: + raise ValueError( + "'compute_sphere_coordinates' and 'compute_normals' are mutually exclusive" + ) + + theta = np.arcsin(np.random.uniform(-1, 1, n)) # inverse transform sampling + phi = np.random.uniform(0, 2*np.pi, n) + + if compute_sphere_coordinates: # (theta, phi) + return np.stack(( + theta if not shift_theta else 0.5*np.pi + theta, + phi, + ), axis=1) + elif compute_normals: # (x, y, z, nx, ny, nz) + return np.stack(( + centroid[0] + radius * np.cos(theta) * np.cos(phi), + centroid[1] + radius * np.cos(theta) * np.sin(phi), + centroid[2] + radius * np.sin(theta), + np.cos(theta) * np.cos(phi), + np.cos(theta) * np.sin(phi), + np.sin(theta), + ), axis=1) + else: # (x, y, z) + return np.stack(( + centroid[0] + radius * np.cos(theta) * np.cos(phi), + centroid[1] + radius * np.cos(theta) * np.sin(phi), + centroid[2] + radius * np.sin(theta), + ), axis=1) diff --git a/ifield/data/common/processing.py b/ifield/data/common/processing.py new file mode 100644 index 0000000..f884685 --- /dev/null +++ b/ifield/data/common/processing.py @@ -0,0 +1,85 @@ +from .h5_dataclasses import H5Dataclass +from datetime import datetime, timedelta +from pathlib import Path +from typing import Hashable, Optional, Callable +import os + +DEBUG = bool(os.environ.get("IFIELD_DEBUG", "")) + +__doc__ = """ +Here are some helper functions for processing data. +""" + +# multiprocessing does not work due to my rediculous use of closures, which seemingly cannot be pickled +# paralelize it in the shell instead + +def precompute_data( + computer : Callable[[Hashable], Optional[H5Dataclass]], + identifiers : list[Hashable], + output_paths : list[Path], + page : tuple[int, int] = (0, 1), + *, + force : bool = False, + debug : bool = False, + ): + """ + precomputes data and stores them as HDF5 datasets using `.to_file(path: Path)` + """ + + page, n_pages = page + assert len(identifiers) == len(output_paths) + + total = len(identifiers) + identifier_max_len = max(map(len, map(str, identifiers))) + t_epoch = None + def log(state: str, is_start = False): + nonlocal t_epoch + if is_start: t_epoch = datetime.now() + td = timedelta(0) if is_start else datetime.now() - t_epoch + print(" - " + f"{str(index+1).rjust(len(str(total)))}/{total}: " + f"{str(identifier).ljust(identifier_max_len)} @ {td}: {state}" + ) + + print(f"precompute_data(computer={computer.__module__}.{computer.__qualname__}, identifiers=..., force={force}, page={page})") + t_begin = datetime.now() + failed = [] + + # pagination + page_size = total // n_pages + bool(total % n_pages) + jobs = list(zip(identifiers, output_paths))[page_size*page : page_size*(page+1)] + + for index, (identifier, output_path) in enumerate(jobs, start=page_size*page): + if not force and output_path.exists() and output_path.stat().st_size > 0: + continue + + log("compute", is_start=True) + + # compute + try: + res = computer(identifier) + except Exception as e: + failed.append(identifier) + log(f"failed compute: {e.__class__.__name__}: {e}") + if DEBUG or debug: raise e + continue + if res is None: + failed.append(identifier) + log("no result") + continue + + # write to file + try: + output_path.parent.mkdir(parents=True, exist_ok=True) + res.to_h5_file(output_path) + except Exception as e: + failed.append(identifier) + log(f"failed write: {e.__class__.__name__}: {e}") + if output_path.is_file(): output_path.unlink() # cleanup + if DEBUG or debug: raise e + continue + + log("done") + + print("precompute_data finished in", datetime.now() - t_begin) + print("failed:", failed or None) diff --git a/ifield/data/common/scan.py b/ifield/data/common/scan.py new file mode 100644 index 0000000..0dc6782 --- /dev/null +++ b/ifield/data/common/scan.py @@ -0,0 +1,768 @@ +from ...utils.helpers import compose +from . import points +from .h5_dataclasses import H5Dataclass, H5Array, H5ArrayNoSlice, TransformableDataclassMixin +from methodtools import lru_cache +from sklearn.neighbors import BallTree +import faiss +from trimesh import Trimesh +from typing import Iterable +from typing import Optional, TypeVar +import mesh_to_sdf +import mesh_to_sdf.scan as sdf_scan +import numpy as np +import trimesh +import trimesh.transformations as T +import warnings + +__doc__ = """ +Here are some helper types for data. +""" + +_T = TypeVar("T") + +class InvalidateLRUOnWriteMixin: + def __setattr__(self, key, value): + if not key.startswith("__wire|"): + for attr in dir(self): + if attr.startswith("__wire|"): + getattr(self, attr).cache_clear() + return super().__setattr__(key, value) +def lru_property(func): + return lru_cache(maxsize=1)(property(func)) + +class SingleViewScan(H5Dataclass, TransformableDataclassMixin, InvalidateLRUOnWriteMixin, require_all=True): + points_hit : H5ArrayNoSlice # (N, 3) + normals_hit : Optional[H5ArrayNoSlice] # (N, 3) + points_miss : H5ArrayNoSlice # (M, 3) + distances_miss : Optional[H5ArrayNoSlice] # (M) + colors_hit : Optional[H5ArrayNoSlice] # (N, 3) + colors_miss : Optional[H5ArrayNoSlice] # (M, 3) + uv_hits : Optional[H5ArrayNoSlice] # (H, W) dtype=bool + uv_miss : Optional[H5ArrayNoSlice] # (H, W) dtype=bool (the reason we store both is due to missing data depth sensor data or filtered backfaces) + cam_pos : H5ArrayNoSlice # (3) + cam_mat4 : Optional[H5ArrayNoSlice] # (4, 4) + proj_mat4 : Optional[H5ArrayNoSlice] # (4, 4) + transforms : dict[str, H5ArrayNoSlice] # a map of 4x4 transformation matrices + + def transform(self: _T, mat4: np.ndarray, inplace=False) -> _T: + scale_xyz = mat4[:3, :3].sum(axis=0) # https://math.stackexchange.com/a/1463487 + assert all(scale_xyz - scale_xyz[0] < 1e-8), f"differenty scaled axes: {scale_xyz}" + + out = self if inplace else self.copy(deep=False) + out.points_hit = T.transform_points(self.points_hit, mat4) + out.normals_hit = T.transform_points(self.normals_hit, mat4) if self.normals_hit is not None else None + out.points_miss = T.transform_points(self.points_miss, mat4) + out.distances_miss = self.distances_miss * scale_xyz + out.cam_pos = T.transform_points(self.points_cam, mat4)[-1] + out.cam_mat4 = (mat4 @ self.cam_mat4) if self.cam_mat4 is not None else None + out.proj_mat4 = (mat4 @ self.proj_mat4) if self.proj_mat4 is not None else None + return out + + def compute_miss_distances(self: _T, *, copy: bool = False, deep: bool = False) -> _T: + assert not self.has_miss_distances + if not self.is_hitting: + raise ValueError("No hits to compute the ray distance towards") + + out = self.copy(deep=deep) if copy else self + out.distances_miss \ + = distance_from_rays_to_point_cloud( + ray_origins = out.points_cam, + ray_dirs = out.ray_dirs_miss, + points = out.points_hit, + ).astype(out.points_cam.dtype) + + return out + + @lru_property + def points(self) -> np.ndarray: # (N+M+1, 3) + return np.concatenate(( + self.points_hit, + self.points_miss, + self.points_cam, + )) + + @lru_property + def uv_points(self) -> np.ndarray: # (N+M+1, 3) + if not self.has_uv: raise ValueError + out = np.full((*self.uv_hits.shape, 3), np.nan, dtype=self.points_hit.dtype) + out[self.uv_hits, :] = self.points_hit + out[self.uv_miss, :] = self.points_miss + return out + + @lru_property + def uv_normals(self) -> np.ndarray: # (N+M+1, 3) + if not self.has_uv: raise ValueError + out = np.full((*self.uv_hits.shape, 3), np.nan, dtype=self.normals_hit.dtype) + out[self.uv_hits, :] = self.normals_hit + return out + + @lru_property + def points_cam(self) -> Optional[np.ndarray]: # (1, 3) + if self.cam_pos is None: return None + return self.cam_pos[None, :] + + @lru_property + def points_hit_centroid(self) -> np.ndarray: + return self.points_hit.mean(axis=0) + + @lru_property + def points_hit_std(self) -> np.ndarray: + return self.points_hit.std(axis=0) + + @lru_property + def is_hitting(self) -> bool: + return len(self.points_hit) > 0 + + @lru_property + def is_empty(self) -> bool: + return not (len(self.points_hit) or len(self.points_miss)) + + @lru_property + def has_colors(self) -> bool: + return self.colors_hit is not None or self.colors_miss is not None + + @lru_property + def has_normals(self) -> bool: + return self.normals_hit is not None + + @lru_property + def has_uv(self) -> bool: + return self.uv_hits is not None + + @lru_property + def has_miss_distances(self) -> bool: + return self.distances_miss is not None + + @lru_property + def xyzrgb_hit(self) -> np.ndarray: # (N, 6) + if self.colors_hit is None: raise ValueError + return np.concatenate([self.points_hit, self.colors_hit], axis=1) + + @lru_property + def xyzrgb_miss(self) -> np.ndarray: # (M, 6) + if self.colors_miss is None: raise ValueError + return np.concatenate([self.points_miss, self.colors_miss], axis=1) + + @lru_property + def ray_dirs_hit(self) -> np.ndarray: # (N, 3) + out = self.points_hit - self.points_cam + out /= np.linalg.norm(out, axis=-1)[:, None] # normalize + return out + + @lru_property + def ray_dirs_miss(self) -> np.ndarray: # (N, 3) + out = self.points_miss - self.points_cam + out /= np.linalg.norm(out, axis=-1)[:, None] # normalize + return out + + @classmethod + def from_mesh_single_view(cls, mesh: Trimesh, *, compute_miss_distances: bool = False, **kw) -> "SingleViewScan": + if "phi" not in kw and not "theta" in kw: + kw["theta"], kw["phi"] = points.generate_random_sphere_points(1, compute_sphere_coordinates=True)[0] + scan = sample_single_view_scan_from_mesh(mesh, **kw) + if compute_miss_distances and scan.is_hitting: + scan.compute_miss_distances() + return scan + + def to_uv_scan(self) -> "SingleViewUVScan": + return SingleViewUVScan.from_scan(self) + + @classmethod + def from_uv_scan(self, uvscan: "SingleViewUVScan") -> "SingleViewUVScan": + return uvscan.to_scan() + +# The same, but with support for pagination (should have been this way since the start...) +class SingleViewUVScan(H5Dataclass, TransformableDataclassMixin, InvalidateLRUOnWriteMixin, require_all=True): + # B may be (N) or (H, W), the latter may be flattened + hits : H5Array # (*B) dtype=bool + miss : H5Array # (*B) dtype=bool (the reason we store both is due to missing data depth sensor data or filtered backface hits) + points : H5Array # (*B, 3) on far plane if miss, NaN if neither hit or miss + normals : Optional[H5Array] # (*B, 3) NaN if not hit + colors : Optional[H5Array] # (*B, 3) + distances : Optional[H5Array] # (*B) NaN if not miss + cam_pos : Optional[H5ArrayNoSlice] # (3) or (*B, 3) + cam_mat4 : Optional[H5ArrayNoSlice] # (4, 4) + proj_mat4 : Optional[H5ArrayNoSlice] # (4, 4) + transforms : dict[str, H5ArrayNoSlice] # a map of 4x4 transformation matrices + + @classmethod + def from_scan(cls, scan: SingleViewScan): + if not scan.has_uv: + raise ValueError("Scan cloud has no UV data") + hits, miss = scan.uv_hits, scan.uv_miss + dtype = scan.points_hit.dtype + assert hits.ndim in (1, 2), hits.ndim + assert hits.shape == miss.shape, (hits.shape, miss.shape) + + points = np.full((*hits.shape, 3), np.nan, dtype=dtype) + points[hits, :] = scan.points_hit + points[miss, :] = scan.points_miss + + normals = None + if scan.has_normals: + normals = np.full((*hits.shape, 3), np.nan, dtype=dtype) + normals[hits, :] = scan.normals_hit + + distances = None + if scan.has_miss_distances: + distances = np.full(hits.shape, np.nan, dtype=dtype) + distances[miss] = scan.distances_miss + + colors = None + if scan.has_colors: + colors = np.full((*hits.shape, 3), np.nan, dtype=dtype) + if scan.colors_hit is not None: + colors[hits, :] = scan.colors_hit + if scan.colors_miss is not None: + colors[miss, :] = scan.colors_miss + + return cls( + hits = hits, + miss = miss, + points = points, + normals = normals, + colors = colors, + distances = distances, + cam_pos = scan.cam_pos, + cam_mat4 = scan.cam_mat4, + proj_mat4 = scan.proj_mat4, + transforms = scan.transforms, + ) + + def to_scan(self) -> "SingleViewScan": + if not self.is_single_view: raise ValueError + return SingleViewScan( + points_hit = self.points [self.hits, :], + points_miss = self.points [self.miss, :], + normals_hit = self.normals [self.hits, :] if self.has_normals else None, + distances_miss = self.distances[self.miss] if self.has_miss_distances else None, + colors_hit = self.colors [self.hits, :] if self.has_colors else None, + colors_miss = self.colors [self.miss, :] if self.has_colors else None, + uv_hits = self.hits, + uv_miss = self.miss, + cam_pos = self.cam_pos, + cam_mat4 = self.cam_mat4, + proj_mat4 = self.proj_mat4, + transforms = self.transforms, + ) + + def to_mesh(self) -> trimesh.Trimesh: + faces: list[(tuple[int, int],)*3] = [] + for x in range(self.hits.shape[0]-1): + for y in range(self.hits.shape[1]-1): + c11 = x, y + c12 = x, y+1 + c22 = x+1, y+1 + c21 = x+1, y + + n = sum(map(self.hits.__getitem__, (c11, c12, c22, c21))) + if n == 3: + faces.append((*filter(self.hits.__getitem__, (c11, c12, c22, c21)),)) + elif n == 4: + faces.append((c11, c12, c22)) + faces.append((c11, c22, c21)) + xy2idx = {c:i for i, c in enumerate(set(k for j in faces for k in j))} + assert self.colors is not None + return trimesh.Trimesh( + vertices = [self.points[i] for i in xy2idx.keys()], + vertex_colors = [self.colors[i] for i in xy2idx.keys()] if self.colors is not None else None, + faces = [tuple(xy2idx[i] for i in face) for face in faces], + ) + + def transform(self: _T, mat4: np.ndarray, inplace=False) -> _T: + scale_xyz = mat4[:3, :3].sum(axis=0) # https://math.stackexchange.com/a/1463487 + assert all(scale_xyz - scale_xyz[0] < 1e-8), f"differenty scaled axes: {scale_xyz}" + + unflat = self.hits.shape + flat = np.product(unflat) + + out = self if inplace else self.copy(deep=False) + out.points = T.transform_points(self.points .reshape((*flat, 3)), mat4).reshape((*unflat, 3)) + out.normals = T.transform_points(self.normals.reshape((*flat, 3)), mat4).reshape((*unflat, 3)) if self.normals_hit is not None else None + out.distances = self.distances_miss * scale_xyz + out.cam_pos = T.transform_points(self.cam_pos[None, ...], mat4)[0] + out.cam_mat4 = (mat4 @ self.cam_mat4) if self.cam_mat4 is not None else None + out.proj_mat4 = (mat4 @ self.proj_mat4) if self.proj_mat4 is not None else None + return out + + def compute_miss_distances(self: _T, *, copy: bool = False, deep: bool = False, surface_points: Optional[np.ndarray] = None) -> _T: + assert not self.has_miss_distances + + shape = self.hits.shape + + out = self.copy(deep=deep) if copy else self + out.distances = np.zeros(shape, dtype=self.points.dtype) + if self.is_hitting: + out.distances[self.miss] \ + = distance_from_rays_to_point_cloud( + ray_origins = self.cam_pos_unsqueezed_miss, + ray_dirs = self.ray_dirs_miss, + points = surface_points if surface_points is not None else self.points[self.hits], + ) + + return out + + def fill_missing_points(self: _T, *, copy: bool = False, deep: bool = False) -> _T: + """ + Fill in missing points as hitting the far plane. + """ + if not self.is_2d: + raise ValueError("Cannot fill missing points for non-2d scan!") + if not self.is_single_view: + raise ValueError("Cannot fill missing points for non-single-view scans!") + if self.cam_mat4 is None: + raise ValueError("cam_mat4 is None") + if self.proj_mat4 is None: + raise ValueError("proj_mat4 is None") + + uv = np.argwhere(self.missing).astype(self.points.dtype) + uv[:, 0] /= (self.missing.shape[1] - 1) / 2 + uv[:, 1] /= (self.missing.shape[0] - 1) / 2 + uv -= 1 + uv = np.stack(( + uv[:, 1], + -uv[:, 0], + np.ones(uv.shape[0]), # far clipping plane + np.ones(uv.shape[0]), # homogeneous coordinate + ), axis=-1) + uv = uv @ (self.cam_mat4 @ np.linalg.inv(self.proj_mat4)).T + + out = self.copy(deep=deep) if copy else self + out.points[self.missing, :] = uv[:, :3] / uv[:, 3][:, None] + return out + + @lru_property + def is_hitting(self) -> bool: + return np.any(self.hits) + + @lru_property + def has_colors(self) -> bool: + return not self.colors is None + + @lru_property + def has_normals(self) -> bool: + return not self.normals is None + + @lru_property + def has_miss_distances(self) -> bool: + return not self.distances is None + + @lru_property + def any_missing(self) -> bool: + return np.any(self.missing) + + @lru_property + def has_missing(self) -> bool: + return self.any_missing and not np.any(np.isnan(self.points[self.missing])) + + @lru_property + def cam_pos_unsqueezed(self) -> H5Array: + if self.cam_pos.ndim != 1: + return self.cam_pos + else: + cam_pos = self.cam_pos + for _ in range(self.hits.ndim): + cam_pos = cam_pos[None, ...] + return cam_pos + + @lru_property + def cam_pos_unsqueezed_hit(self) -> H5Array: + if self.cam_pos.ndim != 1: + return self.cam_pos[self.hits, :] + else: + return self.cam_pos[None, :] + + @lru_property + def cam_pos_unsqueezed_miss(self) -> H5Array: + if self.cam_pos.ndim != 1: + return self.cam_pos[self.miss, :] + else: + return self.cam_pos[None, :] + + @lru_property + def ray_dirs(self) -> H5Array: + return (self.points - self.cam_pos_unsqueezed) * (1 / self.depths[..., None]) + + @lru_property + def ray_dirs_hit(self) -> H5Array: + out = self.points[self.hits, :] - self.cam_pos_unsqueezed_hit + out /= np.linalg.norm(out, axis=-1)[..., None] # normalize + return out + + @lru_property + def ray_dirs_miss(self) -> H5Array: + out = self.points[self.miss, :] - self.cam_pos_unsqueezed_miss + out /= np.linalg.norm(out, axis=-1)[..., None] # normalize + return out + + @lru_property + def depths(self) -> H5Array: + return np.linalg.norm(self.points - self.cam_pos_unsqueezed, axis=-1) + + @lru_property + def missing(self) -> H5Array: + return ~(self.hits | self.miss) + + @classmethod + def from_mesh_single_view(cls, mesh: Trimesh, *, compute_miss_distances: bool = False, **kw) -> "SingleViewUVScan": + if "phi" not in kw and not "theta" in kw: + kw["theta"], kw["phi"] = points.generate_random_sphere_points(1, compute_sphere_coordinates=True)[0] + scan = sample_single_view_scan_from_mesh(mesh, **kw).to_uv_scan() + if compute_miss_distances: + scan.compute_miss_distances() + assert scan.is_2d + return scan + + @classmethod + def from_mesh_sphere_view(cls, mesh: Trimesh, *, compute_miss_distances: bool = False, **kw) -> "SingleViewUVScan": + scan = sample_sphere_view_scan_from_mesh(mesh, **kw) + if compute_miss_distances: + surface_points = None + if scan.hits.sum() > mesh.vertices.shape[0]: + surface_points = mesh.vertices.astype(scan.points.dtype) + if not kw.get("no_unit_sphere", False): + translation, scale = compute_unit_sphere_transform(mesh, dtype=scan.points.dtype) + surface_points = (surface_points + translation) * scale + scan.compute_miss_distances(surface_points=surface_points) + assert scan.is_flat + return scan + + def flatten_and_permute_(self: _T, copy=False) -> _T: # inplace by default + n_items = np.product(self.hits.shape) + permutation = np.random.permutation(n_items) + + out = self.copy(deep=False) if copy else self + out.hits = out.hits .reshape((n_items, ))[permutation] + out.miss = out.miss .reshape((n_items, ))[permutation] + out.points = out.points .reshape((n_items, 3))[permutation, :] + out.normals = out.normals .reshape((n_items, 3))[permutation, :] if out.has_normals else None + out.colors = out.colors .reshape((n_items, 3))[permutation, :] if out.has_colors else None + out.distances = out.distances.reshape((n_items, ))[permutation] if out.has_miss_distances else None + return out + + @property + def is_single_view(self) -> bool: + return np.product(self.cam_pos.shape[:-1]) == 1 if not self.cam_pos is None else True + + @property + def is_flat(self) -> bool: + return len(self.hits.shape) == 1 + + @property + def is_2d(self) -> bool: + return len(self.hits.shape) == 2 + + +# transforms can be found in pytorch3d.transforms and in open3d +# and in trimesh.transformations + +def sample_single_view_scans_from_mesh( + mesh : Trimesh, + *, + n_batches : int, + scan_resolution : int = 400, + compute_normals : bool = False, + fov : float = 1.0472, # 60 degrees in radians, vertical field of view. + camera_distance : float = 2, + no_filter_backhits : bool = False, + ) -> Iterable[SingleViewScan]: + + normalized_mesh_cache = [] + + for _ in range(n_batches): + theta, phi = points.generate_random_sphere_points(1, compute_sphere_coordinates=True)[0] + + yield sample_single_view_scan_from_mesh( + mesh = mesh, + phi = phi, + theta = theta, + _mesh_is_normalized = False, + scan_resolution = scan_resolution, + compute_normals = compute_normals, + fov = fov, + camera_distance = camera_distance, + no_filter_backhits = no_filter_backhits, + _mesh_cache = normalized_mesh_cache, + ) + +def sample_single_view_scan_from_mesh( + mesh : Trimesh, + *, + phi : float, + theta : float, + scan_resolution : int = 200, + compute_normals : bool = False, + fov : float = 1.0472, # 60 degrees in radians, vertical field of view. + camera_distance : float = 2, + no_filter_backhits : bool = False, + no_unit_sphere : bool = False, + dtype : type = np.float32, + _mesh_cache : Optional[list] = None, # provide a list if mesh is reused + ) -> SingleViewScan: + + # scale and center to unit sphere + is_cache = isinstance(_mesh_cache, list) + if is_cache and _mesh_cache and _mesh_cache[0] is mesh: + _, mesh, translation, scale = _mesh_cache + else: + if is_cache: + if _mesh_cache: + _mesh_cache.clear() + _mesh_cache.append(mesh) + translation, scale = compute_unit_sphere_transform(mesh) + mesh = mesh_to_sdf.scale_to_unit_sphere(mesh) + if is_cache: + _mesh_cache.extend((mesh, translation, scale)) + + z_near = 1 + z_far = 3 + cam_mat4 = sdf_scan.get_camera_transform_looking_at_origin(phi, theta, camera_distance=camera_distance) + cam_pos = cam_mat4 @ np.array([0, 0, 0, 1]) + + scan = sdf_scan.Scan(mesh, + camera_transform = cam_mat4, + resolution = scan_resolution, + calculate_normals = compute_normals, + fov = fov, + z_near = z_near, + z_far = z_far, + no_flip_backfaced_normals = True + ) + + # all the scan rays that hit the far plane, based on sdf_scan.Scan.__init__ + misses = np.argwhere(scan.depth_buffer == 0) + points_miss = np.ones((misses.shape[0], 4)) + points_miss[:, [1, 0]] = misses.astype(float) / (scan_resolution -1) * 2 - 1 + points_miss[:, 1] *= -1 + points_miss[:, 2] = 1 # far plane in clipping space + points_miss = points_miss @ (cam_mat4 @ np.linalg.inv(scan.projection_matrix)).T + points_miss /= points_miss[:, 3][:, np.newaxis] + points_miss = points_miss[:, :3] + + uv_hits = scan.depth_buffer != 0 + uv_miss = ~uv_hits + + if not no_filter_backhits: + if not compute_normals: + raise ValueError("not `no_filter_backhits` requires `compute_normals`") + # inner product + mask = np.einsum('ij,ij->i', scan.points - cam_pos[:3][None, :], scan.normals) < 0 + scan.points = scan.points [mask, :] + scan.normals = scan.normals[mask, :] + uv_hits[uv_hits] = mask + + transforms = {} + + # undo unit-sphere transform + if no_unit_sphere: + scan.points = scan.points * (1 / scale) - translation + points_miss = points_miss * (1 / scale) - translation + cam_pos[:3] = cam_pos[:3] * (1 / scale) - translation + cam_mat4[:3, :] *= 1 / scale + cam_mat4[:3, 3] -= translation + + transforms["unit_sphere"] = T.scale_and_translate(scale=scale, translate=translation) + transforms["model"] = np.eye(4) + else: + transforms["model"] = np.linalg.inv(T.scale_and_translate(scale=scale, translate=translation)) + transforms["unit_sphere"] = np.eye(4) + + return SingleViewScan( + normals_hit = scan.normals .astype(dtype), + points_hit = scan.points .astype(dtype), + points_miss = points_miss .astype(dtype), + distances_miss = None, + colors_hit = None, + colors_miss = None, + uv_hits = uv_hits .astype(bool), + uv_miss = uv_miss .astype(bool), + cam_pos = cam_pos[:3] .astype(dtype), + cam_mat4 = cam_mat4 .astype(dtype), + proj_mat4 = scan.projection_matrix .astype(dtype), + transforms = {k:v.astype(dtype) for k, v in transforms.items()}, + ) + +def sample_sphere_view_scan_from_mesh( + mesh : Trimesh, + *, + sphere_points : int = 4000, # resulting rays are n*(n-1) + compute_normals : bool = False, + no_filter_backhits : bool = False, + no_unit_sphere : bool = False, + no_permute : bool = False, + dtype : type = np.float32, + **kw, + ) -> SingleViewUVScan: + translation, scale = compute_unit_sphere_transform(mesh, dtype=dtype) + + # get unit-sphere points, then transform to model space + two_sphere = generate_equidistant_sphere_rays(sphere_points, **kw).astype(dtype) # (n*(n-1), 2, 3) + two_sphere = two_sphere / scale - translation # we transform after cache lookup + + if mesh.ray.__class__.__module__.split(".")[-1] != "ray_pyembree": + warnings.warn("Pyembree not found, the ray-tracing will be SLOW!") + + ( + locations, + index_ray, + index_tri, + ) = mesh.ray.intersects_location( + two_sphere[:, 0, :], + two_sphere[:, 1, :] - two_sphere[:, 0, :], # direction, not target coordinate + multiple_hits=False, + ) + + + if compute_normals: + location_normals = mesh.face_normals[index_tri] + + batch = two_sphere.shape[:1] + hits = np.zeros((*batch,), dtype=np.bool) + miss = np.ones((*batch,), dtype=np.bool) + cam_pos = two_sphere[:, 0, :] + intersections = two_sphere[:, 1, :] # far-plane, effectively + normals = np.zeros((*batch, 3), dtype=dtype) + + index_ray_front = index_ray + if not no_filter_backhits: + if not compute_normals: + raise ValueError("not `no_filter_backhits` requires `compute_normals`") + mask = ((intersections[index_ray] - cam_pos[index_ray]) * location_normals).sum(axis=-1) <= 0 + index_ray_front = index_ray[mask] + + + hits[index_ray_front] = True + miss[index_ray] = False + intersections[index_ray] = locations + normals[index_ray] = location_normals + + + if not no_permute: + assert len(batch) == 1, batch + permutation = np.random.permutation(*batch) + hits = hits [permutation] + miss = miss [permutation] + intersections = intersections[permutation, :] + normals = normals [permutation, :] + cam_pos = cam_pos [permutation, :] + + # apply unit sphere transform + if not no_unit_sphere: + intersections = (intersections + translation) * scale + cam_pos = (cam_pos + translation) * scale + + return SingleViewUVScan( + hits = hits, + miss = miss, + points = intersections, + normals = normals, + colors = None, # colors + distances = None, + cam_pos = cam_pos, + cam_mat4 = None, + proj_mat4 = None, + transforms = {}, + ) + +def distance_from_rays_to_point_cloud( + ray_origins : np.ndarray, # (*A, 3) + ray_dirs : np.ndarray, # (*A, 3) + points : np.ndarray, # (*B, 3) + dirs_normalized : bool = False, + n_steps : int = 40, + ) -> np.ndarray: # (A) + + # anything outside of this volume will never constribute to the result + max_norm = max( + np.linalg.norm(ray_origins, axis=-1).max(), + np.linalg.norm(points, axis=-1).max(), + ) * 1.02 + + if not dirs_normalized: + ray_dirs = ray_dirs / np.linalg.norm(ray_dirs, axis=-1)[..., None] + + + # deal with single-view clouds + if ray_origins.shape != ray_dirs.shape: + ray_origins = np.broadcast_to(ray_origins, ray_dirs.shape) + + n_points = np.product(points.shape[:-1]) + use_faiss = n_points > 160000*4 + if not use_faiss: + index = BallTree(points) + else: + # http://ann-benchmarks.com/index.html + assert np.issubdtype(points.dtype, np.float32) + assert np.issubdtype(ray_origins.dtype, np.float32) + assert np.issubdtype(ray_dirs.dtype, np.float32) + index = faiss.index_factory(points.shape[-1], "NSG32,Flat") # https://github.com/facebookresearch/faiss/wiki/The-index-factory + + index.nprobe = 5 # 10 # default is 1 + index.train(points) + index.add(points) + + if not use_faiss: + min_d, min_n = index.query(ray_origins, k=1, return_distance=True) + else: + min_d, min_n = index.search(ray_origins, k=1) + min_d = np.sqrt(min_d) + acc_d = min_d.copy() + + for step in range(1, n_steps+1): + query_points = ray_origins + acc_d * ray_dirs + if max_norm is not None: + qmask = np.linalg.norm(query_points, axis=-1) < max_norm + if not qmask.any(): break + query_points = query_points[qmask] + else: + qmask = slice(None) + if not use_faiss: + current_d, current_n = index.query(query_points, k=1, return_distance=True) + else: + current_d, current_n = index.search(query_points, k=1) + current_d = np.sqrt(current_d) + if max_norm is not None: + min_d[qmask] = np.minimum(current_d, min_d[qmask]) + new_min_mask = min_d[qmask] == current_d + qmask2 = qmask.copy() + qmask2[qmask2] = new_min_mask[..., 0] + min_n[qmask2] = current_n[new_min_mask[..., 0]] + acc_d[qmask] += current_d * 0.25 + else: + np.minimum(current_d, min_d, out=min_d) + new_min_mask = min_d == current_d + min_n[new_min_mask] = current_n[new_min_mask] + acc_d += current_d * 0.25 + + closest_points = points[min_n[:, 0], :] # k=1 + distances = np.linalg.norm(np.cross(closest_points - ray_origins, ray_dirs, axis=-1), axis=-1) + return distances + +# helpers + +@compose(np.array) # make copy to avoid lru cache mutation +@lru_cache(maxsize=1) +def generate_equidistant_sphere_rays(n : int, **kw) -> np.ndarray: # output (n*n(-1)) rays, n may be off + sphere_points = points.generate_equidistant_sphere_points(n=n, **kw) + + indices = np.indices((len(sphere_points),))[0] # (N) + # cartesian product + cprod = np.transpose([np.tile(indices, len(indices)), np.repeat(indices, len(indices))]) # (N**2, 2) + # filter repeated combinations + permutations = cprod[cprod[:, 0] != cprod[:, 1], :] # (N*(N-1), 2) + # lookup sphere points + two_sphere = sphere_points[permutations, :] # (N*(N-1), 2, 3) + + return two_sphere + +def compute_unit_sphere_transform(mesh: Trimesh, *, dtype=type) -> tuple[np.ndarray, float]: + """ + returns translation and scale which mesh_to_sdf applies to meshes before computing their SDF cloud + """ + # the transformation applied by mesh_to_sdf.scale_to_unit_sphere(mesh) + translation = -mesh.bounding_box.centroid + scale = 1 / np.max(np.linalg.norm(mesh.vertices + translation, axis=1)) + if dtype is not None: + translation = translation.astype(dtype) + scale = scale .astype(dtype) + return translation, scale diff --git a/ifield/data/common/types.py b/ifield/data/common/types.py new file mode 100644 index 0000000..3da8d31 --- /dev/null +++ b/ifield/data/common/types.py @@ -0,0 +1,6 @@ +__doc__ = """ +Some helper types. +""" + +class MalformedMesh(Exception): + pass diff --git a/ifield/data/config.py b/ifield/data/config.py new file mode 100644 index 0000000..16cb0a9 --- /dev/null +++ b/ifield/data/config.py @@ -0,0 +1,28 @@ +from ..utils.helpers import make_relative +from pathlib import Path +from typing import Optional +import os +import warnings + + +def data_path_get(dataset_name: str, no_warn: bool = False) -> Path: + dataset_envvar = f"IFIELD_DATA_MODELS_{dataset_name.replace(*'-_').upper()}" + if dataset_envvar in os.environ: + data_path = Path(os.environ[dataset_envvar]) + elif "IFIELD_DATA_MODELS" in os.environ: + data_path = Path(os.environ["IFIELD_DATA_MODELS"]) / dataset_name + else: + data_path = Path(__file__).resolve().parent.parent.parent / "data" / "models" / dataset_name + if not data_path.is_dir() and not no_warn: + warnings.warn(f"{make_relative(data_path, Path.cwd()).__str__()!r} is not a directory!") + return data_path + +def data_path_persist(dataset_name: Optional[str], path: os.PathLike) -> os.PathLike: + "Persist the datapath, ensuring subprocesses also will use it. The path passes through." + + if dataset_name is None: + os.environ["IFIELD_DATA_MODELS"] = str(path) + else: + os.environ[f"IFIELD_DATA_MODELS_{dataset_name.replace(*'-_').upper()}"] = str(path) + + return path diff --git a/ifield/data/coseg/__init__.py b/ifield/data/coseg/__init__.py new file mode 100644 index 0000000..2ecc7c8 --- /dev/null +++ b/ifield/data/coseg/__init__.py @@ -0,0 +1,56 @@ +from ..config import data_path_get, data_path_persist +from collections import namedtuple +import os + + +# Data source: +# http://irc.cs.sdu.edu.cn/~yunhai/public_html/ssl/ssd.htm + +__ALL__ = ["config", "Model", "MODELS"] + +Archive = namedtuple("Archive", "url fname download_size_str") + +@(lambda x: x()) # singleton +class config: + DATA_PATH = property( + doc = """ + Path to the dataset. The following envvars override it: + ${IFIELD_DATA_MODELS}/coseg + ${IFIELD_DATA_MODELS_COSEG} + """, + fget = lambda self: data_path_get ("coseg"), + fset = lambda self, path: data_path_persist("coseg", path), + ) + + @property + def IS_DOWNLOADED_DB(self) -> list[os.PathLike]: + return [ + self.DATA_PATH / "downloaded.json", + ] + + SHAPES: dict[str, Archive] = { + "candelabra" : Archive("http://irc.cs.sdu.edu.cn/~yunhai/public_html/ssl/data/Candelabra/shapes.zip", "candelabra-shapes.zip", "3,3M"), + "chair" : Archive("http://irc.cs.sdu.edu.cn/~yunhai/public_html/ssl/data/Chair/shapes.zip", "chair-shapes.zip", "3,2M"), + "four-legged" : Archive("http://irc.cs.sdu.edu.cn/~yunhai/public_html/ssl/data/Four-legged/shapes.zip", "four-legged-shapes.zip", "2,9M"), + "goblets" : Archive("http://irc.cs.sdu.edu.cn/~yunhai/public_html/ssl/data/Goblets/shapes.zip", "goblets-shapes.zip", "500K"), + "guitars" : Archive("http://irc.cs.sdu.edu.cn/~yunhai/public_html/ssl/data/Guitars/shapes.zip", "guitars-shapes.zip", "1,9M"), + "lampes" : Archive("http://irc.cs.sdu.edu.cn/~yunhai/public_html/ssl/data/Lampes/shapes.zip", "lampes-shapes.zip", "2,4M"), + "vases" : Archive("http://irc.cs.sdu.edu.cn/~yunhai/public_html/ssl/data/Vases/shapes.zip", "vases-shapes.zip", "5,5M"), + "irons" : Archive("http://irc.cs.sdu.edu.cn/~yunhai/public_html/ssl/data/Irons/shapes.zip", "irons-shapes.zip", "1,2M"), + "tele-aliens" : Archive("http://irc.cs.sdu.edu.cn/~yunhai/public_html/ssl/data/Tele-aliens/shapes.zip", "tele-aliens-shapes.zip", "15M"), + "large-vases" : Archive("http://irc.cs.sdu.edu.cn/~yunhai/public_html/ssl/data/Large-Vases/shapes.zip", "large-vases-shapes.zip", "6,2M"), + "large-chairs": Archive("http://irc.cs.sdu.edu.cn/~yunhai/public_html/ssl/data/Large-Chairs/shapes.zip", "large-chairs-shapes.zip", "14M"), + } + GROUND_TRUTHS: dict[str, Archive] = { + "candelabra" : Archive("http://irc.cs.sdu.edu.cn/~yunhai/public_html/ssl/data/Candelabra/gt.zip", "candelabra-gt.zip", "68K"), + "chair" : Archive("http://irc.cs.sdu.edu.cn/~yunhai/public_html/ssl/data/Chair/gt.zip", "chair-gt.zip", "20K"), + "four-legged" : Archive("http://irc.cs.sdu.edu.cn/~yunhai/public_html/ssl/data/Four-legged/gt.zip", "four-legged-gt.zip", "24K"), + "goblets" : Archive("http://irc.cs.sdu.edu.cn/~yunhai/public_html/ssl/data/Goblets/gt.zip", "goblets-gt.zip", "4,0K"), + "guitars" : Archive("http://irc.cs.sdu.edu.cn/~yunhai/public_html/ssl/data/Guitars/gt.zip", "guitars-gt.zip", "12K"), + "lampes" : Archive("http://irc.cs.sdu.edu.cn/~yunhai/public_html/ssl/data/Lampes/gt.zip", "lampes-gt.zip", "60K"), + "vases" : Archive("http://irc.cs.sdu.edu.cn/~yunhai/public_html/ssl/data/Vases/gt.zip", "vases-gt.zip", "40K"), + "irons" : Archive("http://irc.cs.sdu.edu.cn/~yunhai/public_html/ssl/data/Irons/gt.zip", "irons-gt.zip", "8,0K"), + "tele-aliens" : Archive("http://irc.cs.sdu.edu.cn/~yunhai/public_html/ssl/data/Tele-aliens/gt.zip", "tele-aliens-gt.zip", "72K"), + "large-vases" : Archive("http://irc.cs.sdu.edu.cn/~yunhai/public_html/ssl/data/Large-Vases/gt.zip", "large-vases-gt.zip", "68K"), + "large-chairs": Archive("http://irc.cs.sdu.edu.cn/~yunhai/public_html/ssl/data/Large-Chairs/gt.zip", "large-chairs-gt.zip", "116K"), + } diff --git a/ifield/data/coseg/download.py b/ifield/data/coseg/download.py new file mode 100644 index 0000000..47a4c3e --- /dev/null +++ b/ifield/data/coseg/download.py @@ -0,0 +1,135 @@ +#!/usr/bin/env python3 +from . import config +from ...utils.helpers import make_relative +from ..common import download +from pathlib import Path +from textwrap import dedent +import argparse +import io +import zipfile + + + +def is_downloaded(*a, **kw): + return download.is_downloaded(*a, dbfiles=config.IS_DOWNLOADED_DB, **kw) + +def download_and_extract(target_dir: Path, url_dict: dict[str, str], *, force=False, silent=False) -> bool: + target_dir.mkdir(parents=True, exist_ok=True) + + ret = False + for url, fname in url_dict.items(): + if not force: + if is_downloaded(target_dir, url): continue + if not download.check_url(url): + print("ERROR:", url) + continue + ret = True + + if force or not (target_dir / "archives" / fname).is_file(): + + data = download.download_data(url, silent=silent, label=fname) + assert url.endswith(".zip") + + print("writing...") + + (target_dir / "archives").mkdir(parents=True, exist_ok=True) + with (target_dir / "archives" / fname).open("wb") as f: + f.write(data) + del data + + print(f"extracting {fname}...") + + with zipfile.ZipFile(target_dir / "archives" / fname, 'r') as f: + f.extractall(target_dir / Path(fname).stem.removesuffix("-shapes").removesuffix("-gt")) + + is_downloaded(target_dir, url, add=True) + + return ret + +def make_parser() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser(description=dedent(""" + Download The COSEG Shape Dataset. + More info: http://irc.cs.sdu.edu.cn/~yunhai/public_html/ssl/ssd.htm + + Example: + + download-coseg --shapes chairs + """), formatter_class=argparse.RawTextHelpFormatter) + + arg = parser.add_argument + + arg("sets", nargs="*", default=[], + help="Which set to download, defaults to none.") + arg("--all", action="store_true", + help="Download all sets") + arg("--dir", default=str(config.DATA_PATH), + help=f"The target directory. Default is {make_relative(config.DATA_PATH, Path.cwd()).__str__()!r}") + + arg("--shapes", action="store_true", + help="Download the 3d shapes for each chosen set") + arg("--gts", action="store_true", + help="Download the ground-truth segmentation data for each chosen set") + + arg("--list", action="store_true", + help="Lists all the sets") + arg("--list-urls", action="store_true", + help="Lists the urls to download") + arg("--list-sizes", action="store_true", + help="Lists the download size of each set") + arg("--silent", action="store_true", + help="") + arg("--force", action="store_true", + help="Download again even if already downloaded") + + return parser + +# entrypoint +def cli(parser=make_parser()): + args = parser.parse_args() + + assert set(config.SHAPES.keys()) == set(config.GROUND_TRUTHS.keys()) + + set_names = sorted(set(args.sets)) + if args.all: + assert not set_names, "--all is mutually exclusive from manually selected sets" + set_names = sorted(config.SHAPES.keys()) + + if args.list: + print(*config.SHAPES.keys(), sep="\n") + exit() + + if args.list_sizes: + print(*(f"{set_name:<15}{config.SHAPES[set_name].download_size_str}" for set_name in (set_names or config.SHAPES.keys())), sep="\n") + exit() + + try: + url_dict \ + = {config.SHAPES[set_name].url : config.SHAPES[set_name].fname for set_name in set_names if args.shapes} \ + | {config.GROUND_TRUTHS[set_name].url : config.GROUND_TRUTHS[set_name].fname for set_name in set_names if args.gts} + except KeyError: + print("Error: unrecognized object name:", *set(set_names).difference(config.SHAPES.keys()), sep="\n") + exit(1) + + if not url_dict: + if set_names and not (args.shapes or args.gts): + print("Error: Provide at least one of --shapes of --gts") + else: + print("Error: No object set was selected for download!") + exit(1) + + if args.list_urls: + print(*url_dict.keys(), sep="\n") + exit() + + print("Download start") + any_downloaded = download_and_extract( + target_dir = Path(args.dir), + url_dict = url_dict, + force = args.force, + silent = args.silent, + ) + if not any_downloaded: + print("Everything has already been downloaded, skipping.") + +if __name__ == "__main__": + cli() diff --git a/ifield/data/coseg/preprocess.py b/ifield/data/coseg/preprocess.py new file mode 100644 index 0000000..65b0b70 --- /dev/null +++ b/ifield/data/coseg/preprocess.py @@ -0,0 +1,137 @@ +#!/usr/bin/env python3 +import os; os.environ.setdefault("PYOPENGL_PLATFORM", "egl") +from . import config, read +from ...utils.helpers import make_relative +from pathlib import Path +from textwrap import dedent +import argparse + + +def make_parser() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser(description=dedent(""" + Preprocess the COSEG dataset. Depends on `download-coseg --shapes ...` having been run. + """), formatter_class=argparse.RawTextHelpFormatter) + + arg = parser.add_argument # brevity + + arg("items", nargs="*", default=[], + help="Which object-set[/model-id] to process, defaults to all downloaded. Format: OBJECT-SET[/MODEL-ID]") + arg("--dir", default=str(config.DATA_PATH), + help=f"The target directory. Default is {make_relative(config.DATA_PATH, Path.cwd()).__str__()!r}") + arg("--force", action="store_true", + help="Overwrite existing files") + arg("--list-models", action="store_true", + help="List the downloaded models available for preprocessing") + arg("--list-object-sets", action="store_true", + help="List the downloaded object-sets available for preprocessing") + arg("--list-pages", type=int, default=None, + help="List the downloaded models available for preprocessing, paginated into N pages.") + arg("--page", nargs=2, type=int, default=[0, 1], + help="Subset of parts to compute. Use to parallelize. (page, total), page is 0 indexed") + + arg2 = parser.add_argument_group("preprocessing targets").add_argument # brevity + arg2("--precompute-mesh-sv-scan-clouds", action="store_true", + help="Compute single-view hit+miss point clouds from 100 synthetic scans.") + arg2("--precompute-mesh-sv-scan-uvs", action="store_true", + help="Compute single-view hit+miss UV clouds from 100 synthetic scans.") + arg2("--precompute-mesh-sphere-scan", action="store_true", + help="Compute a sphere-view hit+miss cloud cast from n to n unit sphere points.") + + arg3 = parser.add_argument_group("modifiers").add_argument # brevity + arg3("--n-sphere-points", type=int, default=4000, + help="The number of unit-sphere points to sample rays from. Final result: n*(n-1).") + arg3("--compute-miss-distances", action="store_true", + help="Compute the distance to the nearest hit for each miss in the hit+miss clouds.") + arg3("--fill-missing-uv-points", action="store_true", + help="TODO") + arg3("--no-filter-backhits", action="store_true", + help="Do not filter scan hits on backside of mesh faces.") + arg3("--no-unit-sphere", action="store_true", + help="Do not center the objects to the unit sphere.") + arg3("--convert-ok", action="store_true", + help="Allow reusing point clouds for uv clouds and vice versa. (does not account for other hparams)") + arg3("--debug", action="store_true", + help="Abort on failiure.") + + return parser + +# entrypoint +def cli(parser=make_parser()): + args = parser.parse_args() + if not any(getattr(args, k) for k in dir(args) if k.startswith("precompute_")) and not (args.list_models or args.list_object_sets or args.list_pages): + parser.error("no preprocessing target selected") # exits + + config.DATA_PATH = Path(args.dir) + + object_sets = [i for i in args.items if "/" not in i] + models = [i.split("/") for i in args.items if "/" in i] + + # convert/expand synsets to models + # they are mutually exclusive + if object_sets: assert not models + if models: assert not object_sets + if not models: + models = read.list_model_ids(tuple(object_sets) or None) + + if args.list_models: + try: + print(*(f"{object_set_id}/{model_id}" for object_set_id, model_id in models), sep="\n") + except BrokenPipeError: + pass + parser.exit() + + if args.list_object_sets: + try: + print(*sorted(set(object_set_id for object_set_id, model_id in models)), sep="\n") + except BrokenPipeError: + pass + parser.exit() + + if args.list_pages is not None: + try: + print(*( + f"--page {i} {args.list_pages} {object_set_id}/{model_id}" + for object_set_id, model_id in models + for i in range(args.list_pages) + ), sep="\n") + except BrokenPipeError: + pass + parser.exit() + + if args.precompute_mesh_sv_scan_clouds: + read.precompute_mesh_scan_point_clouds( + models, + compute_miss_distances = args.compute_miss_distances, + no_filter_backhits = args.no_filter_backhits, + no_unit_sphere = args.no_unit_sphere, + convert_ok = args.convert_ok, + page = args.page, + force = args.force, + debug = args.debug, + ) + if args.precompute_mesh_sv_scan_uvs: + read.precompute_mesh_scan_uvs( + models, + compute_miss_distances = args.compute_miss_distances, + fill_missing_points = args.fill_missing_uv_points, + no_filter_backhits = args.no_filter_backhits, + no_unit_sphere = args.no_unit_sphere, + convert_ok = args.convert_ok, + page = args.page, + force = args.force, + debug = args.debug, + ) + if args.precompute_mesh_sphere_scan: + read.precompute_mesh_sphere_scan( + models, + sphere_points = args.n_sphere_points, + compute_miss_distances = args.compute_miss_distances, + no_filter_backhits = args.no_filter_backhits, + no_unit_sphere = args.no_unit_sphere, + page = args.page, + force = args.force, + debug = args.debug, + ) + +if __name__ == "__main__": + cli() diff --git a/ifield/data/coseg/read.py b/ifield/data/coseg/read.py new file mode 100644 index 0000000..1e3dd6e --- /dev/null +++ b/ifield/data/coseg/read.py @@ -0,0 +1,290 @@ +from . import config +from ..common import points +from ..common import processing +from ..common.scan import SingleViewScan, SingleViewUVScan +from ..common.types import MalformedMesh +from functools import lru_cache +from typing import Optional, Iterable +import numpy as np +import trimesh +import trimesh.transformations as T + +__doc__ = """ +Here are functions for reading and preprocessing coseg benchmark data + +There are essentially a few sets per object: + "img" - meaning the RGBD images (none found in coseg) + "mesh_scans" - meaning synthetic scans of a mesh +""" + +MESH_TRANSFORM_SKYWARD = T.rotation_matrix(np.pi/2, (1, 0, 0)) # rotate to be upright in pyrender +MESH_POSE_CORRECTIONS = { # to gain a shared canonical orientation + ("four-legged", 381): T.rotation_matrix( -1*np.pi/2, (0, 0, 1)), + ("four-legged", 382): T.rotation_matrix( 1*np.pi/2, (0, 0, 1)), + ("four-legged", 383): T.rotation_matrix( -1*np.pi/2, (0, 0, 1)), + ("four-legged", 384): T.rotation_matrix( -1*np.pi/2, (0, 0, 1)), + ("four-legged", 385): T.rotation_matrix( -1*np.pi/2, (0, 0, 1)), + ("four-legged", 386): T.rotation_matrix( 1*np.pi/2, (0, 0, 1)), + ("four-legged", 387): T.rotation_matrix(-0.2*np.pi/2, (0, 1, 0))@T.rotation_matrix(1*np.pi/2, (0, 0, 1)), + ("four-legged", 388): T.rotation_matrix( -1*np.pi/2, (0, 0, 1)), + ("four-legged", 389): T.rotation_matrix( -1*np.pi/2, (0, 0, 1)), + ("four-legged", 390): T.rotation_matrix( 0*np.pi/2, (0, 0, 1)), + ("four-legged", 391): T.rotation_matrix( 0*np.pi/2, (0, 0, 1)), + ("four-legged", 392): T.rotation_matrix( -1*np.pi/2, (0, 0, 1)), + ("four-legged", 393): T.rotation_matrix( 0*np.pi/2, (0, 0, 1)), + ("four-legged", 394): T.rotation_matrix( -1*np.pi/2, (0, 0, 1)), + ("four-legged", 395): T.rotation_matrix(-0.2*np.pi/2, (0, 1, 0))@T.rotation_matrix(1*np.pi/2, (0, 0, 1)), + ("four-legged", 396): T.rotation_matrix( 1*np.pi/2, (0, 0, 1)), + ("four-legged", 397): T.rotation_matrix( 0*np.pi/2, (0, 0, 1)), + ("four-legged", 398): T.rotation_matrix( -1*np.pi/2, (0, 0, 1)), + ("four-legged", 399): T.rotation_matrix( 0*np.pi/2, (0, 0, 1)), + ("four-legged", 400): T.rotation_matrix( 0*np.pi/2, (0, 0, 1)), +} + + +ModelUid = tuple[str, int] + +@lru_cache(maxsize=1) +def list_object_sets() -> list[str]: + return sorted( + object_set.name + for object_set in config.DATA_PATH.iterdir() + if (object_set / "shapes").is_dir() and object_set.name != "archive" + ) + +@lru_cache(maxsize=1) +def list_model_ids(object_sets: Optional[tuple[str]] = None) -> list[ModelUid]: + return sorted( + (object_set.name, int(model.stem)) + for object_set in config.DATA_PATH.iterdir() + if (object_set / "shapes").is_dir() and object_set.name != "archive" and (object_sets is None or object_set.name in object_sets) + for model in (object_set / "shapes").iterdir() + if model.is_file() and model.suffix == ".off" + ) + +def list_model_id_strings(object_sets: Optional[tuple[str]] = None) -> list[str]: + return [model_uid_to_string(object_set_id, model_id) for object_set_id, model_id in list_model_ids(object_sets)] + +def model_uid_to_string(object_set_id: str, model_id: int) -> str: + return f"{object_set_id}-{model_id}" + +def model_id_string_to_uid(model_string_uid: str) -> ModelUid: + object_set, split, model = model_string_uid.rpartition("-") + assert split == "-" + return (object_set, int(model)) + +@lru_cache(maxsize=1) +def list_mesh_scan_sphere_coords(n_poses: int = 50) -> list[tuple[float, float]]: # (theta, phi) + return points.generate_equidistant_sphere_points(n_poses, compute_sphere_coordinates=True) + +def mesh_scan_identifier(*, phi: float, theta: float) -> str: + return ( + f"{'np'[theta>=0]}{abs(theta):.2f}" + f"{'np'[phi >=0]}{abs(phi) :.2f}" + ).replace(".", "d") + +@lru_cache(maxsize=1) +def list_mesh_scan_identifiers(n_poses: int = 50) -> list[str]: + out = [ + mesh_scan_identifier(phi=phi, theta=theta) + for theta, phi in list_mesh_scan_sphere_coords(n_poses) + ] + assert len(out) == len(set(out)) + return out + +# === + +def read_mesh(object_set_id: str, model_id: int) -> trimesh.Trimesh: + path = config.DATA_PATH / object_set_id / "shapes" / f"{model_id}.off" + if not path.is_file(): + raise FileNotFoundError(f"{path = }") + try: + mesh = trimesh.load(path, force="mesh") + except Exception as e: + raise MalformedMesh(f"Trimesh raised: {e.__class__.__name__}: {e}") from e + + pose = MESH_POSE_CORRECTIONS.get((object_set_id, int(model_id))) + mesh.apply_transform(pose @ MESH_TRANSFORM_SKYWARD if pose is not None else MESH_TRANSFORM_SKYWARD) + return mesh + +# === single-view scan clouds + +def compute_mesh_scan_point_cloud( + object_set_id : str, + model_id : int, + phi : float, + theta : float, + *, + compute_miss_distances : bool = False, + fill_missing_points : bool = False, + compute_normals : bool = True, + convert_ok : bool = False, + **kw, + ) -> SingleViewScan: + + if convert_ok: + try: + return read_mesh_scan_uv(object_set_id, model_id, phi=phi, theta=theta).to_scan() + except FileNotFoundError: + pass + + mesh = read_mesh(object_set_id, model_id) + scan = SingleViewScan.from_mesh_single_view(mesh, + phi = phi, + theta = theta, + compute_normals = compute_normals, + **kw, + ) + if compute_miss_distances: + scan.compute_miss_distances() + if fill_missing_points: + scan.fill_missing_points() + + return scan + +def precompute_mesh_scan_point_clouds(models: Iterable[ModelUid], *, n_poses: int = 50, page: tuple[int, int] = (0, 1), force = False, debug = False, **kw): + "precomputes all single-view scan clouds and stores them as HDF5 datasets" + cam_poses = list_mesh_scan_sphere_coords(n_poses=n_poses) + pose_identifiers = list_mesh_scan_identifiers (n_poses=n_poses) + assert len(cam_poses) == len(pose_identifiers) + paths = list_mesh_scan_point_cloud_h5_fnames(models, pose_identifiers, n_poses=n_poses) + mlen_syn = max(len(object_set_id) for object_set_id, model_id in models) + mlen_mod = max(len(str(model_id)) for object_set_id, model_id in models) + pretty_identifiers = [ + f"{object_set_id.ljust(mlen_syn)} @ {str(model_id).ljust(mlen_mod)} @ {i:>5} @ ({itentifier}: {theta:.2f}, {phi:.2f})" + for object_set_id, model_id in models + for i, (itentifier, (theta, phi)) in enumerate(zip(pose_identifiers, cam_poses)) + ] + mesh_cache = [] + def computer(pretty_identifier: str) -> SingleViewScan: + object_set_id, model_id, index, _ = map(str.strip, pretty_identifier.split("@")) + theta, phi = cam_poses[int(index)] + return compute_mesh_scan_point_cloud(object_set_id, int(model_id), phi=phi, theta=theta, _mesh_cache=mesh_cache, **kw) + return processing.precompute_data(computer, pretty_identifiers, paths, page=page, force=force, debug=debug) + +def read_mesh_scan_point_cloud(object_set_id: str, model_id: int, *, identifier: str = None, phi: float = None, theta: float = None) -> SingleViewScan: + if identifier is None: + if phi is None or theta is None: + raise ValueError("Provide either phi+theta or an identifier!") + identifier = mesh_scan_identifier(phi=phi, theta=theta) + file = config.DATA_PATH / object_set_id / "uv_scan_clouds" / f"{model_id}_normalized_{identifier}.h5" + return SingleViewScan.from_h5_file(file) + +def list_mesh_scan_point_cloud_h5_fnames(models: Iterable[ModelUid], identifiers: Optional[Iterable[str]] = None, **kw): + if identifiers is None: + identifiers = list_mesh_scan_identifiers(**kw) + return [ + config.DATA_PATH / object_set_id / "uv_scan_clouds" / f"{model_id}_normalized_{identifier}.h5" + for object_set_id, model_id in models + for identifier in identifiers + ] + + +# === single-view UV scan clouds + +def compute_mesh_scan_uv( + object_set_id : str, + model_id : int, + phi : float, + theta : float, + *, + compute_miss_distances : bool = False, + fill_missing_points : bool = False, + compute_normals : bool = True, + convert_ok : bool = False, + **kw, + ) -> SingleViewUVScan: + + if convert_ok: + try: + return read_mesh_scan_point_cloud(object_set_id, model_id, phi=phi, theta=theta).to_uv_scan() + except FileNotFoundError: + pass + + mesh = read_mesh(object_set_id, model_id) + scan = SingleViewUVScan.from_mesh_single_view(mesh, + phi = phi, + theta = theta, + compute_normals = compute_normals, + **kw, + ) + if compute_miss_distances: + scan.compute_miss_distances() + if fill_missing_points: + scan.fill_missing_points() + + return scan + +def precompute_mesh_scan_uvs(models: Iterable[ModelUid], *, n_poses: int = 50, page: tuple[int, int] = (0, 1), force = False, debug = False, **kw): + "precomputes all single-view scan clouds and stores them as HDF5 datasets" + cam_poses = list_mesh_scan_sphere_coords(n_poses=n_poses) + pose_identifiers = list_mesh_scan_identifiers (n_poses=n_poses) + assert len(cam_poses) == len(pose_identifiers) + paths = list_mesh_scan_uv_h5_fnames(models, pose_identifiers, n_poses=n_poses) + mlen_syn = max(len(object_set_id) for object_set_id, model_id in models) + mlen_mod = max(len(str(model_id)) for object_set_id, model_id in models) + pretty_identifiers = [ + f"{object_set_id.ljust(mlen_syn)} @ {str(model_id).ljust(mlen_mod)} @ {i:>5} @ ({itentifier}: {theta:.2f}, {phi:.2f})" + for object_set_id, model_id in models + for i, (itentifier, (theta, phi)) in enumerate(zip(pose_identifiers, cam_poses)) + ] + mesh_cache = [] + def computer(pretty_identifier: str) -> SingleViewUVScan: + object_set_id, model_id, index, _ = map(str.strip, pretty_identifier.split("@")) + theta, phi = cam_poses[int(index)] + return compute_mesh_scan_uv(object_set_id, int(model_id), phi=phi, theta=theta, _mesh_cache=mesh_cache, **kw) + return processing.precompute_data(computer, pretty_identifiers, paths, page=page, force=force, debug=debug) + +def read_mesh_scan_uv(object_set_id: str, model_id: int, *, identifier: str = None, phi: float = None, theta: float = None) -> SingleViewUVScan: + if identifier is None: + if phi is None or theta is None: + raise ValueError("Provide either phi+theta or an identifier!") + identifier = mesh_scan_identifier(phi=phi, theta=theta) + file = config.DATA_PATH / object_set_id / "uv_scan_clouds" / f"{model_id}_normalized_{identifier}.h5" + + return SingleViewUVScan.from_h5_file(file) + +def list_mesh_scan_uv_h5_fnames(models: Iterable[ModelUid], identifiers: Optional[Iterable[str]] = None, **kw): + if identifiers is None: + identifiers = list_mesh_scan_identifiers(**kw) + return [ + config.DATA_PATH / object_set_id / "uv_scan_clouds" / f"{model_id}_normalized_{identifier}.h5" + for object_set_id, model_id in models + for identifier in identifiers + ] + + +# === sphere-view (UV) scan clouds + +def compute_mesh_sphere_scan( + object_set_id : str, + model_id : int, + *, + compute_normals : bool = True, + **kw, + ) -> SingleViewUVScan: + mesh = read_mesh(object_set_id, model_id) + scan = SingleViewUVScan.from_mesh_sphere_view(mesh, + compute_normals = compute_normals, + **kw, + ) + return scan + +def precompute_mesh_sphere_scan(models: Iterable[ModelUid], *, page: tuple[int, int] = (0, 1), force: bool = False, debug: bool = False, n_points: int = 4000, **kw): + "precomputes all sphere scan clouds and stores them as HDF5 datasets" + paths = list_mesh_sphere_scan_h5_fnames(models) + identifiers = [model_uid_to_string(*i) for i in models] + def computer(identifier: str) -> SingleViewScan: + object_set_id, model_id = model_id_string_to_uid(identifier) + return compute_mesh_sphere_scan(object_set_id, model_id, **kw) + return processing.precompute_data(computer, identifiers, paths, page=page, force=force, debug=debug) + +def read_mesh_mesh_sphere_scan(object_set_id: str, model_id: int) -> SingleViewUVScan: + file = config.DATA_PATH / object_set_id / "sphere_scan_clouds" / f"{model_id}_normalized.h5" + return SingleViewUVScan.from_h5_file(file) + +def list_mesh_sphere_scan_h5_fnames(models: Iterable[ModelUid]) -> list[str]: + return [ + config.DATA_PATH / object_set_id / "sphere_scan_clouds" / f"{model_id}_normalized.h5" + for object_set_id, model_id in models + ] diff --git a/ifield/data/stanford/__init__.py b/ifield/data/stanford/__init__.py new file mode 100644 index 0000000..56ddf54 --- /dev/null +++ b/ifield/data/stanford/__init__.py @@ -0,0 +1,76 @@ +from ..config import data_path_get, data_path_persist +from collections import namedtuple +import os + + +# Data source: +# http://graphics.stanford.edu/data/3Dscanrep/ + +__ALL__ = ["config", "Model", "MODELS"] + +@(lambda x: x()) # singleton +class config: + DATA_PATH = property( + doc = """ + Path to the dataset. The following envvars override it: + ${IFIELD_DATA_MODELS}/stanford + ${IFIELD_DATA_MODELS_STANFORD} + """, + fget = lambda self: data_path_get ("stanford"), + fset = lambda self, path: data_path_persist("stanford", path), + ) + + @property + def IS_DOWNLOADED_DB(self) -> list[os.PathLike]: + return [ + self.DATA_PATH / "downloaded.json", + ] + + Model = namedtuple("Model", "url mesh_fname download_size_str") + MODELS: dict[str, Model] = { + "bunny": Model( + "http://graphics.stanford.edu/pub/3Dscanrep/bunny.tar.gz", + "bunny/reconstruction/bun_zipper.ply", + "4.89M", + ), + "drill_bit": Model( + "http://graphics.stanford.edu/pub/3Dscanrep/drill.tar.gz", + "drill/reconstruction/drill_shaft_vrip.ply", + "555k", + ), + "happy_buddha": Model( + # religious symbol + "http://graphics.stanford.edu/pub/3Dscanrep/happy/happy_recon.tar.gz", + "happy_recon/happy_vrip.ply", + "14.5M", + ), + "dragon": Model( + # symbol of Chinese culture + "http://graphics.stanford.edu/pub/3Dscanrep/dragon/dragon_recon.tar.gz", + "dragon_recon/dragon_vrip.ply", + "11.2M", + ), + "armadillo": Model( + "http://graphics.stanford.edu/pub/3Dscanrep/armadillo/Armadillo.ply.gz", + "armadillo.ply.gz", + "3.87M", + ), + "lucy": Model( + # Christian angel + "http://graphics.stanford.edu/data/3Dscanrep/lucy.tar.gz", + "lucy.ply", + "322M", + ), + "asian_dragon": Model( + # symbol of Chinese culture + "http://graphics.stanford.edu/data/3Dscanrep/xyzrgb/xyzrgb_dragon.ply.gz", + "xyzrgb_dragon.ply.gz", + "70.5M", + ), + "thai_statue": Model( + # Hindu religious significance + "http://graphics.stanford.edu/data/3Dscanrep/xyzrgb/xyzrgb_statuette.ply.gz", + "xyzrgb_statuette.ply.gz", + "106M", + ), + } diff --git a/ifield/data/stanford/download.py b/ifield/data/stanford/download.py new file mode 100644 index 0000000..5307ec0 --- /dev/null +++ b/ifield/data/stanford/download.py @@ -0,0 +1,129 @@ +#!/usr/bin/env python3 +from . import config +from ...utils.helpers import make_relative +from ..common import download +from pathlib import Path +from textwrap import dedent +from typing import Iterable +import argparse +import io +import tarfile + + +def is_downloaded(*a, **kw): + return download.is_downloaded(*a, dbfiles=config.IS_DOWNLOADED_DB, **kw) + +def download_and_extract(target_dir: Path, url_list: Iterable[str], *, force=False, silent=False) -> bool: + target_dir.mkdir(parents=True, exist_ok=True) + + ret = False + for url in url_list: + if not force: + if is_downloaded(target_dir, url): continue + if not download.check_url(url): + print("ERROR:", url) + continue + ret = True + + data = download.download_data(url, silent=silent, label=str(Path(url).name)) + + print("extracting...") + if url.endswith(".ply.gz"): + fname = target_dir / "meshes" / url.split("/")[-1].lower() + fname.parent.mkdir(parents=True, exist_ok=True) + with fname.open("wb") as f: + f.write(data) + elif url.endswith(".tar.gz"): + with tarfile.open(fileobj=io.BytesIO(data)) as tar: + for member in tar.getmembers(): + if not member.isfile(): continue + if member.name.startswith("/"): continue + if member.name.startswith("."): continue + if Path(member.name).name.startswith("."): continue + tar.extract(member, target_dir / "meshes") + del tar + else: + raise NotImplementedError(f"Extraction for {str(Path(url).name)} unknown") + + is_downloaded(target_dir, url, add=True) + del data + + return ret + +def make_parser() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser(description=dedent(""" + Download The Stanford 3D Scanning Repository models. + More info: http://graphics.stanford.edu/data/3Dscanrep/ + + Example: + + download-stanford bunny + """), formatter_class=argparse.RawTextHelpFormatter) + + arg = parser.add_argument + + arg("objects", nargs="*", default=[], + help="Which objects to download, defaults to none.") + arg("--all", action="store_true", + help="Download all objects") + arg("--dir", default=str(config.DATA_PATH), + help=f"The target directory. Default is {make_relative(config.DATA_PATH, Path.cwd()).__str__()!r}") + + arg("--list", action="store_true", + help="Lists all the objects") + arg("--list-urls", action="store_true", + help="Lists the urls to download") + arg("--list-sizes", action="store_true", + help="Lists the download size of each model") + arg("--silent", action="store_true", + help="") + arg("--force", action="store_true", + help="Download again even if already downloaded") + + return parser + +# entrypoint +def cli(parser=make_parser()): + args = parser.parse_args() + + obj_names = sorted(set(args.objects)) + if args.all: + assert not obj_names + obj_names = sorted(config.MODELS.keys()) + if not obj_names and args.list_urls: config.MODELS.keys() + + if args.list: + print(*config.MODELS.keys(), sep="\n") + exit() + + if args.list_sizes: + print(*(f"{obj_name:<15}{config.MODELS[obj_name].download_size_str}" for obj_name in (obj_names or config.MODELS.keys())), sep="\n") + exit() + + try: + url_list = [config.MODELS[obj_name].url for obj_name in obj_names] + except KeyError: + print("Error: unrecognized object name:", *set(obj_names).difference(config.MODELS.keys()), sep="\n") + exit(1) + + if not url_list: + print("Error: No object set was selected for download!") + exit(1) + + if args.list_urls: + print(*url_list, sep="\n") + exit() + + + print("Download start") + any_downloaded = download_and_extract( + target_dir = Path(args.dir), + url_list = url_list, + force = args.force, + silent = args.silent, + ) + if not any_downloaded: + print("Everything has already been downloaded, skipping.") + +if __name__ == "__main__": + cli() diff --git a/ifield/data/stanford/preprocess.py b/ifield/data/stanford/preprocess.py new file mode 100644 index 0000000..b7363f7 --- /dev/null +++ b/ifield/data/stanford/preprocess.py @@ -0,0 +1,118 @@ +#!/usr/bin/env python3 +import os; os.environ.setdefault("PYOPENGL_PLATFORM", "egl") +from . import config, read +from ...utils.helpers import make_relative +from pathlib import Path +from textwrap import dedent +import argparse + + + +def make_parser() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser(description=dedent(""" + Preprocess the Stanford models. Depends on `download-stanford` having been run. + """), formatter_class=argparse.RawTextHelpFormatter) + + arg = parser.add_argument # brevity + + arg("objects", nargs="*", default=[], + help="Which objects to process, defaults to all downloaded") + arg("--dir", default=str(config.DATA_PATH), + help=f"The target directory. Default is {make_relative(config.DATA_PATH, Path.cwd()).__str__()!r}") + arg("--force", action="store_true", + help="Overwrite existing files") + arg("--list", action="store_true", + help="List the downloaded models available for preprocessing") + arg("--list-pages", type=int, default=None, + help="List the downloaded models available for preprocessing, paginated into N pages.") + arg("--page", nargs=2, type=int, default=[0, 1], + help="Subset of parts to compute. Use to parallelize. (page, total), page is 0 indexed") + + arg2 = parser.add_argument_group("preprocessing targets").add_argument # brevity + arg2("--precompute-mesh-sv-scan-clouds", action="store_true", + help="Compute single-view hit+miss point clouds from 100 synthetic scans.") + arg2("--precompute-mesh-sv-scan-uvs", action="store_true", + help="Compute single-view hit+miss UV clouds from 100 synthetic scans.") + arg2("--precompute-mesh-sphere-scan", action="store_true", + help="Compute a sphere-view hit+miss cloud cast from n to n unit sphere points.") + + arg3 = parser.add_argument_group("ray-scan modifiers").add_argument # brevity + arg3("--n-sphere-points", type=int, default=4000, + help="The number of unit-sphere points to sample rays from. Final result: n*(n-1).") + arg3("--compute-miss-distances", action="store_true", + help="Compute the distance to the nearest hit for each miss in the hit+miss clouds.") + arg3("--fill-missing-uv-points", action="store_true", + help="TODO") + arg3("--no-filter-backhits", action="store_true", + help="Do not filter scan hits on backside of mesh faces.") + arg3("--no-unit-sphere", action="store_true", + help="Do not center the objects to the unit sphere.") + arg3("--convert-ok", action="store_true", + help="Allow reusing point clouds for uv clouds and vice versa. (does not account for other hparams)") + arg3("--debug", action="store_true", + help="Abort on failiure.") + + arg5 = parser.add_argument_group("Shared modifiers").add_argument # brevity + arg5("--scan-resolution", type=int, default=400, + help="The resolution of the depth map rendered to sample points. Becomes x*x") + + return parser + +# entrypoint +def cli(parser: argparse.ArgumentParser = make_parser()): + args = parser.parse_args() + if not any(getattr(args, k) for k in dir(args) if k.startswith("precompute_")) and not (args.list or args.list_pages): + parser.error("no preprocessing target selected") # exits + + config.DATA_PATH = Path(args.dir) + obj_names = args.objects or read.list_object_names() + + if args.list: + print(*obj_names, sep="\n") + parser.exit() + + if args.list_pages is not None: + print(*( + f"--page {i} {args.list_pages} {obj_name}" + for obj_name in obj_names + for i in range(args.list_pages) + ), sep="\n") + parser.exit() + + if args.precompute_mesh_sv_scan_clouds: + read.precompute_mesh_scan_point_clouds( + obj_names, + compute_miss_distances = args.compute_miss_distances, + no_filter_backhits = args.no_filter_backhits, + no_unit_sphere = args.no_unit_sphere, + convert_ok = args.convert_ok, + page = args.page, + force = args.force, + debug = args.debug, + ) + if args.precompute_mesh_sv_scan_uvs: + read.precompute_mesh_scan_uvs( + obj_names, + compute_miss_distances = args.compute_miss_distances, + fill_missing_points = args.fill_missing_uv_points, + no_filter_backhits = args.no_filter_backhits, + no_unit_sphere = args.no_unit_sphere, + convert_ok = args.convert_ok, + page = args.page, + force = args.force, + debug = args.debug, + ) + if args.precompute_mesh_sphere_scan: + read.precompute_mesh_sphere_scan( + obj_names, + sphere_points = args.n_sphere_points, + compute_miss_distances = args.compute_miss_distances, + no_filter_backhits = args.no_filter_backhits, + no_unit_sphere = args.no_unit_sphere, + page = args.page, + force = args.force, + debug = args.debug, + ) + +if __name__ == "__main__": + cli() diff --git a/ifield/data/stanford/read.py b/ifield/data/stanford/read.py new file mode 100644 index 0000000..ae6c67b --- /dev/null +++ b/ifield/data/stanford/read.py @@ -0,0 +1,251 @@ +from . import config +from ..common import points +from ..common import processing +from ..common.scan import SingleViewScan, SingleViewUVScan +from ..common.types import MalformedMesh +from functools import lru_cache, wraps +from typing import Optional, Iterable +from pathlib import Path +import gzip +import numpy as np +import trimesh +import trimesh.transformations as T + +__doc__ = """ +Here are functions for reading and preprocessing shapenet benchmark data + +There are essentially a few sets per object: + "img" - meaning the RGBD images (none found in stanford) + "mesh_scans" - meaning synthetic scans of a mesh +""" + +MESH_TRANSFORM_SKYWARD = T.rotation_matrix(np.pi/2, (1, 0, 0)) +MESH_TRANSFORM_CANONICAL = { # to gain a shared canonical orientation + "armadillo" : T.rotation_matrix(np.pi, (0, 0, 1)) @ MESH_TRANSFORM_SKYWARD, + "asian_dragon" : T.rotation_matrix(-np.pi/2, (0, 0, 1)) @ MESH_TRANSFORM_SKYWARD, + "bunny" : MESH_TRANSFORM_SKYWARD, + "dragon" : MESH_TRANSFORM_SKYWARD, + "drill_bit" : MESH_TRANSFORM_SKYWARD, + "happy_buddha" : MESH_TRANSFORM_SKYWARD, + "lucy" : T.rotation_matrix(np.pi, (0, 0, 1)), + "thai_statue" : MESH_TRANSFORM_SKYWARD, +} + +def list_object_names() -> list[str]: + # downloaded only: + return [ + i for i, v in config.MODELS.items() + if (config.DATA_PATH / "meshes" / v.mesh_fname).is_file() + ] + +@lru_cache(maxsize=1) +def list_mesh_scan_sphere_coords(n_poses: int = 50) -> list[tuple[float, float]]: # (theta, phi) + return points.generate_equidistant_sphere_points(n_poses, compute_sphere_coordinates=True)#, shift_theta=True + +def mesh_scan_identifier(*, phi: float, theta: float) -> str: + return ( + f"{'np'[theta>=0]}{abs(theta):.2f}" + f"{'np'[phi >=0]}{abs(phi) :.2f}" + ).replace(".", "d") + +@lru_cache(maxsize=1) +def list_mesh_scan_identifiers(n_poses: int = 50) -> list[str]: + out = [ + mesh_scan_identifier(phi=phi, theta=theta) + for theta, phi in list_mesh_scan_sphere_coords(n_poses) + ] + assert len(out) == len(set(out)) + return out + +# === + +@lru_cache(maxsize=1) +def read_mesh(obj_name: str) -> trimesh.Trimesh: + path = config.DATA_PATH / "meshes" / config.MODELS[obj_name].mesh_fname + if not path.exists(): + raise FileNotFoundError(f"{obj_name = } -> {str(path) = }") + try: + if path.suffixes[-1] == ".gz": + with gzip.open(path, "r") as f: + mesh = trimesh.load(f, file_type="".join(path.suffixes[:-1])[1:]) + else: + mesh = trimesh.load(path) + except Exception as e: + raise MalformedMesh(f"Trimesh raised: {e.__class__.__name__}: {e}") from e + + # rotate to be upright in pyrender + mesh.apply_transform(MESH_TRANSFORM_CANONICAL.get(obj_name, MESH_TRANSFORM_SKYWARD)) + + return mesh + +# === single-view scan clouds + +def compute_mesh_scan_point_cloud( + obj_name : str, + *, + phi : float, + theta : float, + compute_miss_distances : bool = False, + compute_normals : bool = True, + convert_ok : bool = False, # this does not respect the other hparams + **kw, + ) -> SingleViewScan: + + if convert_ok: + try: + return read_mesh_scan_uv(obj_name, phi=phi, theta=theta).to_scan() + except FileNotFoundError: + pass + + mesh = read_mesh(obj_name) + return SingleViewScan.from_mesh_single_view(mesh, + phi = phi, + theta = theta, + compute_normals = compute_normals, + compute_miss_distances = compute_miss_distances, + **kw, + ) + +def precompute_mesh_scan_point_clouds(obj_names, *, page: tuple[int, int] = (0, 1), force: bool = False, debug: bool = False, n_poses: int = 50, **kw): + "precomputes all single-view scan clouds and stores them as HDF5 datasets" + cam_poses = list_mesh_scan_sphere_coords(n_poses) + pose_identifiers = list_mesh_scan_identifiers (n_poses) + assert len(cam_poses) == len(pose_identifiers) + paths = list_mesh_scan_point_cloud_h5_fnames(obj_names, pose_identifiers) + mlen = max(map(len, config.MODELS.keys())) + pretty_identifiers = [ + f"{obj_name.ljust(mlen)} @ {i:>5} @ ({itentifier}: {theta:.2f}, {phi:.2f})" + for obj_name in obj_names + for i, (itentifier, (theta, phi)) in enumerate(zip(pose_identifiers, cam_poses)) + ] + mesh_cache = [] + @wraps(compute_mesh_scan_point_cloud) + def computer(pretty_identifier: str) -> SingleViewScan: + obj_name, index, _ = map(str.strip, pretty_identifier.split("@")) + theta, phi = cam_poses[int(index)] + return compute_mesh_scan_point_cloud(obj_name, phi=phi, theta=theta, _mesh_cache=mesh_cache, **kw) + return processing.precompute_data(computer, pretty_identifiers, paths, page=page, force=force, debug=debug) + +def read_mesh_scan_point_cloud(obj_name, *, identifier: str = None, phi: float = None, theta: float = None) -> SingleViewScan: + if identifier is None: + if phi is None or theta is None: + raise ValueError("Provide either phi+theta or an identifier!") + identifier = mesh_scan_identifier(phi=phi, theta=theta) + file = config.DATA_PATH / "clouds" / obj_name / f"mesh_scan_{identifier}_clouds.h5" + if not file.exists(): raise FileNotFoundError(str(file)) + return SingleViewScan.from_h5_file(file) + +def list_mesh_scan_point_cloud_h5_fnames(obj_names: Iterable[str], identifiers: Optional[Iterable[str]] = None, **kw) -> list[Path]: + if identifiers is None: + identifiers = list_mesh_scan_identifiers(**kw) + return [ + config.DATA_PATH / "clouds" / obj_name / f"mesh_scan_{identifier}_clouds.h5" + for obj_name in obj_names + for identifier in identifiers + ] + +# === single-view UV scan clouds + +def compute_mesh_scan_uv( + obj_name : str, + *, + phi : float, + theta : float, + compute_miss_distances : bool = False, + fill_missing_points : bool = False, + compute_normals : bool = True, + convert_ok : bool = False, + **kw, + ) -> SingleViewUVScan: + + if convert_ok: + try: + return read_mesh_scan_point_cloud(obj_name, phi=phi, theta=theta).to_uv_scan() + except FileNotFoundError: + pass + + mesh = read_mesh(obj_name) + scan = SingleViewUVScan.from_mesh_single_view(mesh, + phi = phi, + theta = theta, + compute_normals = compute_normals, + **kw, + ) + if compute_miss_distances: + scan.compute_miss_distances() + if fill_missing_points: + scan.fill_missing_points() + + return scan + +def precompute_mesh_scan_uvs(obj_names, *, page: tuple[int, int] = (0, 1), force: bool = False, debug: bool = False, n_poses: int = 50, **kw): + "precomputes all single-view scan clouds and stores them as HDF5 datasets" + cam_poses = list_mesh_scan_sphere_coords(n_poses) + pose_identifiers = list_mesh_scan_identifiers (n_poses) + assert len(cam_poses) == len(pose_identifiers) + paths = list_mesh_scan_uv_h5_fnames(obj_names, pose_identifiers) + mlen = max(map(len, config.MODELS.keys())) + pretty_identifiers = [ + f"{obj_name.ljust(mlen)} @ {i:>5} @ ({itentifier}: {theta:.2f}, {phi:.2f})" + for obj_name in obj_names + for i, (itentifier, (theta, phi)) in enumerate(zip(pose_identifiers, cam_poses)) + ] + mesh_cache = [] + @wraps(compute_mesh_scan_uv) + def computer(pretty_identifier: str) -> SingleViewScan: + obj_name, index, _ = map(str.strip, pretty_identifier.split("@")) + theta, phi = cam_poses[int(index)] + return compute_mesh_scan_uv(obj_name, phi=phi, theta=theta, _mesh_cache=mesh_cache, **kw) + return processing.precompute_data(computer, pretty_identifiers, paths, page=page, force=force, debug=debug) + +def read_mesh_scan_uv(obj_name, *, identifier: str = None, phi: float = None, theta: float = None) -> SingleViewUVScan: + if identifier is None: + if phi is None or theta is None: + raise ValueError("Provide either phi+theta or an identifier!") + identifier = mesh_scan_identifier(phi=phi, theta=theta) + file = config.DATA_PATH / "clouds" / obj_name / f"mesh_scan_{identifier}_uv.h5" + if not file.exists(): raise FileNotFoundError(str(file)) + return SingleViewUVScan.from_h5_file(file) + +def list_mesh_scan_uv_h5_fnames(obj_names: Iterable[str], identifiers: Optional[Iterable[str]] = None, **kw) -> list[Path]: + if identifiers is None: + identifiers = list_mesh_scan_identifiers(**kw) + return [ + config.DATA_PATH / "clouds" / obj_name / f"mesh_scan_{identifier}_uv.h5" + for obj_name in obj_names + for identifier in identifiers + ] + +# === sphere-view (UV) scan clouds + +def compute_mesh_sphere_scan( + obj_name : str, + *, + compute_normals : bool = True, + **kw, + ) -> SingleViewUVScan: + mesh = read_mesh(obj_name) + scan = SingleViewUVScan.from_mesh_sphere_view(mesh, + compute_normals = compute_normals, + **kw, + ) + return scan + +def precompute_mesh_sphere_scan(obj_names, *, page: tuple[int, int] = (0, 1), force: bool = False, debug: bool = False, n_points: int = 4000, **kw): + "precomputes all single-view scan clouds and stores them as HDF5 datasets" + paths = list_mesh_sphere_scan_h5_fnames(obj_names) + @wraps(compute_mesh_sphere_scan) + def computer(obj_name: str) -> SingleViewScan: + return compute_mesh_sphere_scan(obj_name, **kw) + return processing.precompute_data(computer, obj_names, paths, page=page, force=force, debug=debug) + +def read_mesh_mesh_sphere_scan(obj_name) -> SingleViewUVScan: + file = config.DATA_PATH / "clouds" / obj_name / "mesh_sphere_scan.h5" + if not file.exists(): raise FileNotFoundError(str(file)) + return SingleViewUVScan.from_h5_file(file) + +def list_mesh_sphere_scan_h5_fnames(obj_names: Iterable[str]) -> list[Path]: + return [ + config.DATA_PATH / "clouds" / obj_name / "mesh_sphere_scan.h5" + for obj_name in obj_names + ] diff --git a/ifield/datasets/__init__.py b/ifield/datasets/__init__.py new file mode 100644 index 0000000..f9c3db4 --- /dev/null +++ b/ifield/datasets/__init__.py @@ -0,0 +1,3 @@ +__doc__ = """ +Submodules defining various `torch.utils.data.Dataset` +""" diff --git a/ifield/datasets/common.py b/ifield/datasets/common.py new file mode 100644 index 0000000..0e60162 --- /dev/null +++ b/ifield/datasets/common.py @@ -0,0 +1,196 @@ +from ..data.common.h5_dataclasses import H5Dataclass, PathLike +from torch.utils.data import Dataset, IterableDataset +from typing import Any, Iterable, Hashable, TypeVar, Iterator, Callable +from functools import partial, lru_cache +import inspect + + +T = TypeVar("T") +T_H5 = TypeVar("T_H5", bound=H5Dataclass) + + +class TransformableDatasetMixin: + def __init_subclass__(cls): + if getattr(cls, "_transformable_mixin_no_override_getitem", False): + pass + elif issubclass(cls, Dataset): + if cls.__getitem__ is not cls._transformable_mixin_getitem_wrapper: + cls._transformable_mixin_inner_getitem = cls.__getitem__ + cls.__getitem__ = cls._transformable_mixin_getitem_wrapper + elif issubclass(cls, IterableDataset): + if cls.__iter__ is not cls._transformable_mixin_iter_wrapper: + cls._transformable_mixin_inner_iter = cls.__iter__ + cls.__iter__ = cls._transformable_mixin_iter_wrapper + else: + raise TypeError(f"{cls.__name__!r} is neither a Dataset nor a IterableDataset!") + + def __init__(self, *a, **kw): + super().__init__(*a, **kw) + self._transforms = [] + + # works as a decorator + def map(self: T, func: callable = None, /, args=[], **kw) -> T: + def wrapper(func) -> T: + if args or kw: + func = partial(func, *args, **kw) + self._transforms.append(func) + return self + + if func is None: + return wrapper + else: + return wrapper(func) + + + def _transformable_mixin_getitem_wrapper(self, index: int): + if not self._transforms: + out = self._transformable_mixin_inner_getitem(index) # (TransformableDatasetMixin, no transforms) + else: + out = self._transformable_mixin_inner_getitem(index) # (TransformableDatasetMixin, has transforms) + for f in self._transforms: + out = f(out) # (TransformableDatasetMixin) + return out + + def _transformable_mixin_iter_wrapper(self): + if not self._transforms: + out = self._transformable_mixin_inner_iter() # (TransformableDatasetMixin, no transforms) + else: + out = self._transformable_mixin_inner_iter() # (TransformableDatasetMixin, has transforms) + for f in self._transforms: + out = map(f, out) # (TransformableDatasetMixin) + return out + + +class TransformedDataset(Dataset, TransformableDatasetMixin): + # used to wrap an another dataset + def __init__(self, dataset: Dataset, transforms: Iterable[callable]): + super().__init__() + self.dataset = dataset + for i in transforms: + self.map(i) + + def __len__(self): + return len(self.dataset) + + def __getitem__(self, index: int): + return self.dataset[index] # (TransformedDataset) + + +class TransformExtendedDataset(Dataset, TransformableDatasetMixin): + _transformable_mixin_no_override_getitem = True + def __init__(self, dataset: Dataset): + super().__init__() + self.dataset = dataset + + def __len__(self): + return len(self.dataset) * len(self._transforms) + + def __getitem__(self, index: int): + n = len(self._transforms) + assert n > 0, f"{len(self._transforms) = }" + + item = index // n + transform = self._transforms[index % n] + return transform(self.dataset[item]) + + +class CachedDataset(Dataset): + # used to wrap an another dataset + def __init__(self, dataset: Dataset, cache_size: int | None): + super().__init__() + self.dataset = dataset + if cache_size is not None and cache_size > 0: + self.cached_getter = lru_cache(cache_size, self.dataset.__getitem__) + else: + self.cached_getter = self.dataset.__getitem__ + + def __len__(self): + return len(self.dataset) + + def __getitem__(self, index: int): + return self.cached_getter(index) + + +class AutodecoderDataset(Dataset, TransformableDatasetMixin): + def __init__(self, + keys : Iterable[Hashable], + dataset : Dataset, + ): + super().__init__() + self.ad_mapping = list(keys) + self.dataset = dataset + if len(self.ad_mapping) != len(dataset): + raise ValueError(f"__len__ mismatch between keys and dataset: {len(self.ad_mapping)} != {len(dataset)}") + + def __len__(self) -> int: + return len(self.dataset) + + def __getitem__(self, index: int) -> tuple[Hashable, Any]: + return self.ad_mapping[index], self.dataset[index] # (AutodecoderDataset) + + def keys(self) -> list[Hashable]: + return self.ad_mapping + + def values(self) -> Iterator: + return iter(self.dataset) + + def items(self) -> Iterable[tuple[Hashable, Any]]: + return zip(self.ad_mapping, self.dataset) + + +class FunctionDataset(Dataset, TransformableDatasetMixin): + def __init__(self, + getter : Callable[[Hashable], T], + keys : list[Hashable], + cache_size : int | None = None, + ): + super().__init__() + if cache_size is not None and cache_size > 0: + getter = lru_cache(cache_size)(getter) + self.getter = getter + self.keys = keys + + def __len__(self) -> int: + return len(self.keys) + + def __getitem__(self, index: int) -> T: + return self.getter(self.keys[index]) + +class H5Dataset(FunctionDataset): + def __init__(self, + h5_dataclass_cls : type[T_H5], + fnames : list[PathLike], + **kw, + ): + super().__init__( + getter = h5_dataclass_cls.from_h5_file, + keys = fnames, + **kw, + ) + +class PaginatedH5Dataset(Dataset, TransformableDatasetMixin): + def __init__(self, + h5_dataclass_cls : type[T_H5], + fnames : list[PathLike], + n_pages : int = 10, + require_even_pages : bool = True, + ): + super().__init__() + self.h5_dataclass_cls = h5_dataclass_cls + self.fnames = fnames + self.n_pages = n_pages + self.require_even_pages = require_even_pages + + def __len__(self) -> int: + return len(self.fnames) * self.n_pages + + def __getitem__(self, index: int) -> T_H5: + item = index // self.n_pages + page = index % self.n_pages + + return self.h5_dataclass_cls.from_h5_file( # (PaginatedH5Dataset) + fname = self.fname[item], + page = page, + n_pages = self.n_pages, + require_even_pages = self.require_even_pages, + ) diff --git a/ifield/datasets/coseg.py b/ifield/datasets/coseg.py new file mode 100644 index 0000000..a5d76f9 --- /dev/null +++ b/ifield/datasets/coseg.py @@ -0,0 +1,40 @@ +from . import common +from ..data.coseg import config +from ..data.coseg import read +from ..data.common import scan +from typing import Iterable, Optional, Union +import os + + +class SingleViewUVScanDataset(common.H5Dataset): + def __init__(self, + object_sets : tuple[str], + identifiers : Optional[Iterable[str]] = None, + data_path : Union[str, os.PathLike, None] = None, + ): + if not object_sets: + raise ValueError("'object_sets' cannot be empty!") + if identifiers is None: + identifiers = read.list_mesh_scan_identifiers() + if data_path is not None: + config.DATA_PATH = data_path + models = read.list_model_ids(object_sets) + fnames = read.list_mesh_scan_uv_h5_fnames(models, identifiers) + super().__init__( + h5_dataclass_cls = scan.SingleViewUVScan, + fnames = fnames, + ) + +class AutodecoderSingleViewUVScanDataset(common.AutodecoderDataset): + def __init__(self, + object_sets : tuple[str], + identifiers : Optional[Iterable[str]] = None, + data_path : Union[str, os.PathLike, None] = None, + ): + if identifiers is None: + identifiers = read.list_mesh_scan_identifiers() + # here do this step first, such that all the duplicate strings reference the same object + super().__init__( + keys = [key for key in read.list_model_id_strings(object_sets) for _ in range(len(identifiers))], + dataset = SingleViewUVScanDataset(object_sets, identifiers, data_path=data_path), + ) diff --git a/ifield/datasets/stanford.py b/ifield/datasets/stanford.py new file mode 100644 index 0000000..2b6f92b --- /dev/null +++ b/ifield/datasets/stanford.py @@ -0,0 +1,64 @@ +from . import common +from ..data.stanford import config +from ..data.stanford import read +from ..data.common import scan +from typing import Iterable, Optional, Union +import os + + +class SingleViewUVScanDataset(common.H5Dataset): + def __init__(self, + obj_names : Iterable[str], + identifiers : Optional[Iterable[str]] = None, + data_path : Union[str, os.PathLike, None] = None, + ): + if not obj_names: + raise ValueError("'obj_names' cannot be empty!") + if identifiers is None: + identifiers = read.list_mesh_scan_identifiers() + if data_path is not None: + config.DATA_PATH = data_path + fnames = read.list_mesh_scan_uv_h5_fnames(obj_names, identifiers) + super().__init__( + h5_dataclass_cls = scan.SingleViewUVScan, + fnames = fnames, + ) + +class AutodecoderSingleViewUVScanDataset(common.AutodecoderDataset): + def __init__(self, + obj_names : Iterable[str], + identifiers : Optional[Iterable[str]] = None, + data_path : Union[str, os.PathLike, None] = None, + ): + if identifiers is None: + identifiers = read.list_mesh_scan_identifiers() + super().__init__( + keys = [obj_name for obj_name in obj_names for _ in range(len(identifiers))], + dataset = SingleViewUVScanDataset(obj_names, identifiers, data_path=data_path), + ) + + +class SphereScanDataset(common.H5Dataset): + def __init__(self, + obj_names : Iterable[str], + data_path : Union[str, os.PathLike, None] = None, + ): + if not obj_names: + raise ValueError("'obj_names' cannot be empty!") + if data_path is not None: + config.DATA_PATH = data_path + fnames = read.list_mesh_sphere_scan_h5_fnames(obj_names) + super().__init__( + h5_dataclass_cls = scan.SingleViewUVScan, + fnames = fnames, + ) + +class AutodecoderSphereScanDataset(common.AutodecoderDataset): + def __init__(self, + obj_names : Iterable[str], + data_path : Union[str, os.PathLike, None] = None, + ): + super().__init__( + keys = obj_names, + dataset = SphereScanDataset(obj_names, data_path=data_path), + ) diff --git a/ifield/logging.py b/ifield/logging.py new file mode 100644 index 0000000..fcf2c41 --- /dev/null +++ b/ifield/logging.py @@ -0,0 +1,258 @@ +from . import param +from dataclasses import dataclass +from pathlib import Path +from pytorch_lightning.utilities import rank_zero_only +from pytorch_lightning.utilities.exceptions import MisconfigurationException +from typing import Union, Literal, Optional, TypeVar +import concurrent.futures +import psutil +import pytorch_lightning as pl +import statistics +import threading +import time +import torch +import yaml + +# from https://github.com/yaml/pyyaml/issues/240#issuecomment-1018712495 +def str_presenter(dumper, data): + """configures yaml for dumping multiline strings + Ref: https://stackoverflow.com/questions/8640959/how-can-i-control-what-scalar-form-pyyaml-uses-for-my-data""" + if len(data.splitlines()) > 1: # check for multiline string + return dumper.represent_scalar('tag:yaml.org,2002:str', data, style='|') + return dumper.represent_scalar('tag:yaml.org,2002:str', data) +yaml.add_representer(str, str_presenter) + + +LoggerStr = Literal[ + #"csv", + "tensorboard", + #"mlflow", + #"comet", + #"neptune", + #"wandb", + None] +try: + Logger = TypeVar("L", bound=pl.loggers.Logger) +except AttributeError: + Logger = TypeVar("L", bound=pl.loggers.base.LightningLoggerBase) + +def make_logger( + experiment_name : str, + default_root_dir : Union[str, Path], # from pl.Trainer + save_dir : Union[str, Path], + type : LoggerStr = "tensorboard", + project : str = "ifield", + ) -> Optional[Logger]: + if type is None: + return None + elif type == "tensorboard": + return pl.loggers.TensorBoardLogger( + name = "tensorboard", + save_dir = Path(default_root_dir) / save_dir, + version = experiment_name, + log_graph = True, + ) + raise ValueError(f"make_logger({type=})") + +def make_jinja_template(*, save_dir: Union[None, str, Path], **kw) -> str: + return param.make_jinja_template(make_logger, + defaults = dict( + save_dir = save_dir, + ), + exclude_list = { + "experiment_name", + "default_root_dir", + }, + **({"name": "logging"} | kw), + ) + +def get_checkpoints(experiment_name, default_root_dir, save_dir, type, project) -> list[Path]: + if type is None: + return None + if type == "tensorboard": + folder = Path(default_root_dir) / save_dir / "tensorboard" / experiment_name + return folder.glob("*.ckpt") + if type == "mlflow": + raise NotImplementedError(f"{type=}") + if type == "wandb": + raise NotImplementedError(f"{type=}") + raise ValueError(f"get_checkpoint({type=})") + + +def log_config(_logger: Logger, **kwargs: Union[str, dict, list, int, float]): + assert isinstance(_logger, pl.loggers.Logger) \ + or isinstance(_logger, pl.loggers.base.LightningLoggerBase), _logger + + _logger: pl.loggers.TensorBoardLogger + _logger.log_hyperparams(params=kwargs) + +@dataclass +class ModelOutputMonitor(pl.callbacks.Callback): + log_training : bool = True + log_validation : bool = True + + def setup(self, trainer: pl.Trainer, pl_module: pl.LightningModule, stage: Optional[str] = None) -> None: + if not trainer.loggers: + raise MisconfigurationException(f"Cannot use {self._class__.__name__} callback with Trainer that has no logger.") + + @staticmethod + def _log_outputs(trainer: pl.Trainer, pl_module: pl.LightningModule, outputs, fname: str): + if outputs is None: + return + elif isinstance(outputs, list) or isinstance(outputs, tuple): + outputs = { + f"loss[{i}]": v + for i, v in enumerate(outputs) + } + elif isinstance(outputs, torch.Tensor): + outputs = { + "loss": outputs, + } + elif isinstance(outputs, dict): + pass + else: + raise ValueError + sep = trainer.logger.group_separator + pl_module.log_dict({ + f"{pl_module.__class__.__qualname__}.{fname}{sep}{k}": + float(v.item()) if isinstance(v, torch.Tensor) else float(v) + for k, v in outputs.items() + }, sync_dist=True) + + def on_train_batch_end(self, trainer: pl.Trainer, pl_module: pl.LightningModule, outputs, batch, batch_idx, unused=0): + if self.log_training: + self._log_outputs(trainer, pl_module, outputs, "training_step") + + def on_validation_batch_end(self, trainer: pl.Trainer, pl_module: pl.LightningModule, outputs, batch, batch_idx, dataloader_idx=0): + if self.log_validation: + self._log_outputs(trainer, pl_module, outputs, "validation_step") + +class EpochTimeMonitor(pl.callbacks.Callback): + __slots__ = [ + "epoch_start", + "epoch_start_train", + "epoch_start_validation", + "epoch_start_test", + "epoch_start_predict", + ] + + def setup(self, trainer: pl.Trainer, pl_module: pl.LightningModule, stage: Optional[str] = None) -> None: + if not trainer.loggers: + raise MisconfigurationException(f"Cannot use {self._class__.__name__} callback with Trainer that has no logger.") + + + @rank_zero_only + def on_train_epoch_start(self, trainer: pl.Trainer, pl_module: pl.LightningModule): + self.epoch_start_train = time.time() + + @rank_zero_only + def on_validation_epoch_start(self, trainer: pl.Trainer, pl_module: pl.LightningModule): + self.epoch_start_validation = time.time() + + @rank_zero_only + def on_test_epoch_start(self, trainer: pl.Trainer, pl_module: pl.LightningModule): + self.epoch_start_test = time.time() + + @rank_zero_only + def on_predict_epoch_start(self, trainer: pl.Trainer, pl_module: pl.LightningModule): + self.epoch_start_predict = time.time() + + @rank_zero_only + def on_train_epoch_end(self, trainer: pl.Trainer, pl_module: pl.LightningModule): + t = time.time() - self.epoch_start_train + del self.epoch_start_train + sep = trainer.logger.group_separator + trainer.logger.log_metrics({f"{self.__class__.__qualname__}{sep}epoch_train_time" : t}, step=trainer.global_step) + + @rank_zero_only + def on_validation_epoch_end(self, trainer: pl.Trainer, pl_module: pl.LightningModule): + t = time.time() - self.epoch_start_validation + del self.epoch_start_validation + sep = trainer.logger.group_separator + trainer.logger.log_metrics({f"{self.__class__.__qualname__}{sep}epoch_validation_time" : t}, step=trainer.global_step) + + @rank_zero_only + def on_test_epoch_end(self, trainer: pl.Trainer, pl_module: pl.LightningModule): + t = time.time() - self.epoch_start_test + del self.epoch_start_validation + sep = trainer.logger.group_separator + trainer.logger.log_metrics({f"{self.__class__.__qualname__}{sep}epoch_test_time" : t}, step=trainer.global_step) + + @rank_zero_only + def on_predict_epoch_end(self, trainer: pl.Trainer, pl_module: pl.LightningModule): + t = time.time() - self.epoch_start_predict + del self.epoch_start_validation + sep = trainer.logger.group_separator + trainer.logger.log_metrics({f"{self.__class__.__qualname__}{sep}epoch_predict_time" : t}, step=trainer.global_step) + +@dataclass +class PsutilMonitor(pl.callbacks.Callback): + sample_rate : float = 0.2 # times per second + + _should_stop = False + + @rank_zero_only + def on_fit_start(self, trainer: pl.Trainer, pl_module: pl.LightningModule): + if not trainer.loggers: + raise MisconfigurationException(f"Cannot use {self._class__.__name__} callback with Trainer that has no logger.") + assert not hasattr(self, "_thread") + + self._should_stop = False + self._thread = threading.Thread( + target = self.thread_target, + name = self.thread_target.__qualname__, + args = [trainer], + daemon=True, + ) + self._thread.start() + + @rank_zero_only + def on_fit_end(self, trainer: pl.Trainer, pl_module: pl.LightningModule): + assert getattr(self, "_thread", None) is not None + self._should_stop = True + del self._thread + + def thread_target(self, trainer: pl.Trainer): + uses_gpu = isinstance(trainer.accelerator, (pl.accelerators.GPUAccelerator, pl.accelerators.CUDAAccelerator)) + gpu_ids = trainer.device_ids + + prefix = f"{self.__class__.__qualname__}{trainer.logger.group_separator}" + + while not self._should_stop: + step = trainer.global_step + p = psutil.Process() + + meminfo = p.memory_info() + rss_ram = meminfo.rss / 1024**2 # MB + vms_ram = meminfo.vms / 1024**2 # MB + + util_per_cpu = psutil.cpu_percent(percpu=True) + + util_per_cpu = [util_per_cpu[i] for i in p.cpu_affinity()] + util_total = statistics.mean(util_per_cpu) + + if uses_gpu: + with concurrent.futures.ThreadPoolExecutor() as e: + if hasattr(pl.accelerators, "cuda"): + gpu_stats = e.map(pl.accelerators.cuda.get_nvidia_gpu_stats, gpu_ids) + else: + gpu_stats = e.map(pl.accelerators.gpu.get_nvidia_gpu_stats, gpu_ids) + trainer.logger.log_metrics({ + f"{prefix}ram.rss" : rss_ram, + f"{prefix}ram.vms" : vms_ram, + f"{prefix}cpu.total" : util_total, + **{ f"{prefix}cpu.{i:03}.utilization" : stat for i, stat in enumerate(util_per_cpu) }, + **{ + f"{prefix}gpu.{gpu_idx:02}.{key.split(' ',1)[0]}" : stat + for gpu_idx, stats in zip(gpu_ids, gpu_stats) + for key, stat in stats.items() + }, + }, step = step) + else: + trainer.logger.log_metrics({ + f"{prefix}cpu.total" : util_total, + **{ f"{prefix}cpu.{i:03}.utilization" : stat for i, stat in enumerate(util_per_cpu) }, + }, step = step) + + time.sleep(1 / self.sample_rate) + print("DAEMON END") diff --git a/ifield/models/__init__.py b/ifield/models/__init__.py new file mode 100644 index 0000000..3771d5e --- /dev/null +++ b/ifield/models/__init__.py @@ -0,0 +1,3 @@ +__doc__ = """ +Contains Pytorch Models +""" diff --git a/ifield/models/conditioning.py b/ifield/models/conditioning.py new file mode 100644 index 0000000..d8821f2 --- /dev/null +++ b/ifield/models/conditioning.py @@ -0,0 +1,159 @@ +from abc import ABC, abstractmethod +from torch import nn, Tensor +from torch.nn.modules.module import _EXTRA_STATE_KEY_SUFFIX +from typing import Hashable, Union, Optional, KeysView, ValuesView, ItemsView, Any, Sequence +import torch + + +class RequiresConditioner(nn.Module, ABC): # mixin + + @property + @abstractmethod + def n_latent_features(self) -> int: + "This should provide the width of the conditioning feature vector" + ... + + @property + @abstractmethod + def latent_embeddings_init_std(self) -> float: + "This should provide the standard deviation to initialize the latent features with. DeepSDF uses 0.01." + ... + + @property + @abstractmethod + def latent_embeddings() -> Optional[Tensor]: + """This property should return a tensor cotnaining all stored embeddings, for use in computing auto-decoder losses""" + ... + + @abstractmethod + def encode(self, batch: Any, batch_idx: int, optimizer_idx: int) -> Tensor: + "This should, given a training batch, return the encoded conditioning vector" + ... + + +class AutoDecoderModuleMixin(RequiresConditioner, ABC): + """ + Populates dunder methods making it behave as a mapping. + The mapping indexes into a stored set of learnable embedding vectors. + + Based on the auto-decoder architecture of + J.J. Park, P. Florence, J. Straub, R. Newcombe, S. Lovegrove, DeepSDF: + Learning Continuous Signed Distance Functions for Shape Representation, in: + 2019 IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR), + IEEE, Long Beach, CA, USA, 2019: pp. 165–174. + https://doi.org/10.1109/CVPR.2019.00025. + """ + + _autodecoder_mapping: dict[Hashable, int] + autodecoder_embeddings: nn.Parameter + + def __init__(self, *a, **kw): + super().__init__(*a, **kw) + + @self._register_load_state_dict_pre_hook + def hook(state_dict, prefix, local_metadata, strict, missing_keys, unexpected_keys, error_msgs): + if f"{prefix}_autodecoder_mapping" in state_dict: + state_dict[f"{prefix}{_EXTRA_STATE_KEY_SUFFIX}"] = state_dict.pop(f"{prefix}_autodecoder_mapping") + + class ICanBeLoadedFromCheckpointsAndChangeShapeStopBotheringMePyTorchAndSitInTheCornerIKnowWhatIAmDoing(nn.UninitializedParameter): + def copy_(self, other): + self.materialize(other.shape, other.device, other.dtype) + return self.copy_(other) + self.autodecoder_embeddings = ICanBeLoadedFromCheckpointsAndChangeShapeStopBotheringMePyTorchAndSitInTheCornerIKnowWhatIAmDoing() + + # nn.Module interface + + def get_extra_state(self): + return { + "ad_uids": getattr(self, "_autodecoder_mapping", {}), + } + + def set_extra_state(self, obj): + if "ad_uids" not in obj: # backward compat + self._autodecoder_mapping = obj + else: + self._autodecoder_mapping = obj["ad_uids"] + + # RequiresConditioner interface + + @property + def latent_embeddings(self) -> Tensor: + return self.autodecoder_embeddings + + # my interface + + def set_observation_ids(self, z_uids: set[Hashable]): + assert self.latent_embeddings_init_std is not None, f"{self.__module__}.{self.__class__.__qualname__}.latent_embeddings_init_std" + assert self.n_latent_features is not None, f"{self.__module__}.{self.__class__.__qualname__}.n_latent_features" + assert self.latent_embeddings_init_std > 0, self.latent_embeddings_init_std + assert self.n_latent_features > 0, self.n_latent_features + + self._autodecoder_mapping = { + k: i + for i, k in enumerate(sorted(set(z_uids))) + } + + if not len(z_uids) == len(self._autodecoder_mapping): + raise ValueError(f"Observation identifiers are not unique! {z_uids = }") + + self.autodecoder_embeddings = nn.Parameter( + torch.Tensor(len(self._autodecoder_mapping), self.n_latent_features) + .normal_(mean=0, std=self.latent_embeddings_init_std) + .to(self.device, self.dtype) + ) + + def add_key(self, z_uid: Hashable, z: Optional[Tensor] = None): + if z_uid in self._autodecoder_mapping: + raise ValueError(f"Observation identifier {z_uid!r} not unique!") + + self._autodecoder_mapping[z_uid] = len(self._autodecoder_mapping) + self.autodecoder_embeddings + raise NotImplementedError + + def __delitem__(self, z_uid: Hashable): + i = self._autodecoder_mapping.pop(z_uid) + for k, v in list(self._autodecoder_mapping.items()): + if v > i: + self._autodecoder_mapping[k] -= 1 + + with torch.no_grad(): + self.autodecoder_embeddings = nn.Parameter(torch.cat(( + self.autodecoder_embeddings.detach()[:i, :], + self.autodecoder_embeddings.detach()[i+1:, :], + ), dim=0)) + + def __contains__(self, z_uid: Hashable) -> bool: + return z_uid in self._autodecoder_mapping + + def __getitem__(self, z_uids: Union[Hashable, Sequence[Hashable]]) -> Tensor: + if isinstance(z_uids, tuple) or isinstance(z_uids, list): + key = tuple(map(self._autodecoder_mapping.__getitem__, z_uids)) + else: + key = self._autodecoder_mapping[z_uids] + return self.autodecoder_embeddings[key, :] + + def __iter__(self): + return self._autodecoder_mapping.keys() + + def keys(self) -> KeysView[Hashable]: + """ + lists the identifiers of each code + """ + return self._autodecoder_mapping.keys() + + def values(self) -> ValuesView[Tensor]: + return list(self.autodecoder_embeddings) + + def items(self) -> ItemsView[Hashable, Tensor]: + """ + lists all the learned codes / latent vectors with their identifiers as keys + """ + return { + k : self.autodecoder_embeddings[i] + for k, i in self._autodecoder_mapping.items() + }.items() + +class EncoderModuleMixin(RequiresConditioner, ABC): + @property + def latent_embeddings(self) -> None: + return None diff --git a/ifield/models/intersection_fields.py b/ifield/models/intersection_fields.py new file mode 100644 index 0000000..06a086d --- /dev/null +++ b/ifield/models/intersection_fields.py @@ -0,0 +1,589 @@ +from .. import param +from ..modules.dtype import DtypeMixin +from ..utils import geometry +from ..utils.helpers import compose +from ..utils.loss import Schedulable, ensure_schedulables, HParamSchedule, HParamScheduleBase, Linear +from ..utils.operators import diff +from .conditioning import RequiresConditioner, AutoDecoderModuleMixin +from .medial_atoms import MedialAtomNet +from .orthogonal_plane import OrthogonalPlaneNet +from pytorch_lightning.utilities.exceptions import MisconfigurationException +from torch import Tensor +from torch.nn import functional as F +from typing import TypedDict, Literal, Union, Hashable, Optional +import pytorch_lightning as pl +import torch +import os + +LOG_ALL_METRICS = bool(int(os.environ.get("IFIELD_LOG_ALL_METRICS", "1"))) + +if __debug__: + def broadcast_tensors(*tensors: torch.Tensor) -> list[torch.Tensor]: + try: + return torch.broadcast_tensors(*tensors) + except RuntimeError as e: + shapes = ", ".join(f"{chr(c)}.size={tuple(t.shape)}" for c, t in enumerate(tensors, ord("a"))) + raise ValueError(f"Could not broadcast tensors {shapes}.\n{str(e)}") +else: + broadcast_tensors = torch.broadcast_tensors + + +class ForwardDepthMapsBatch(TypedDict): + cam2world : Tensor # (B, 4, 4) + uv : Tensor # (B, H, W) + intrinsics : Tensor # (B, 3, 3) + +class ForwardScanRaysBatch(TypedDict): + origins : Tensor # (B, H, W, 3) or (B, 3) + dirs : Tensor # (B, H, W, 3) + +class LossBatch(TypedDict): + hits : Tensor # (B, H, W) dtype=bool + miss : Tensor # (B, H, W) dtype=bool + depths : Tensor # (B, H, W) + normals : Tensor # (B, H, W, 3) NaN if not hit + distances : Tensor # (B, H, W, 1) NaN if not miss + +class LabeledBatch(TypedDict): + z_uid : list[Hashable] + +ForwardBatch = Union[ForwardDepthMapsBatch, ForwardScanRaysBatch] +TrainingBatch = Union[ForwardBatch, LossBatch, LabeledBatch] + + +IntersectionMode = Literal[ + "medial_sphere", + "orthogonal_plane", +] + +class IntersectionFieldModel(pl.LightningModule, RequiresConditioner, DtypeMixin): + net: Union[MedialAtomNet, OrthogonalPlaneNet] + + @ensure_schedulables + def __init__(self, + # mode + input_mode : geometry.RayEmbedding = "plucker", + output_mode : IntersectionMode = "medial_sphere", + + # network + latent_features : int = 256, + hidden_features : int = 512, + hidden_layers : int = 8, + improve_miss_grads: bool = True, + normalize_ray_dirs: bool = False, # the dataset is usually already normalized, but this could still be important for backprop + + # orthogonal plane + loss_hit_cross_entropy : Schedulable = 1.0, + + # medial atoms + loss_intersection : Schedulable = 1, + loss_intersection_l2 : Schedulable = 0, + loss_intersection_proj : Schedulable = 0, + loss_intersection_proj_l2 : Schedulable = 0, + loss_normal_cossim : Schedulable = 0.25, # supervise target normal cosine similarity + loss_normal_euclid : Schedulable = 0, # supervise target normal l2 distance + loss_normal_cossim_proj : Schedulable = 0, # supervise target normal cosine similarity + loss_normal_euclid_proj : Schedulable = 0, # supervise target normal l2 distance + loss_hit_nodistance_l1 : Schedulable = 0, # constrain no miss distance for hits + loss_hit_nodistance_l2 : Schedulable = 32, # constrain no miss distance for hits + loss_miss_distance_l1 : Schedulable = 0, # supervise target miss distance for misses + loss_miss_distance_l2 : Schedulable = 0, # supervise target miss distance for misses + loss_inscription_hits : Schedulable = 0, # Penalize atom candidates using the supervision data of a different ray + loss_inscription_hits_l2: Schedulable = 0, # Penalize atom candidates using the supervision data of a different ray + loss_inscription_miss : Schedulable = 0, # Penalize atom candidates using the supervision data of a different ray + loss_inscription_miss_l2: Schedulable = 0, # Penalize atom candidates using the supervision data of a different ray + loss_sphere_grow_reg : Schedulable = 0, # maximialize sphere size + loss_sphere_grow_reg_hit: Schedulable = 0, # maximialize sphere size + loss_embedding_norm : Schedulable = "0.01**2 * Linear(15)", # DeepSDF schedules over 150 epochs. DeepSDF use 0.01**2, irobot uses 0.04**2 + loss_multi_view_reg : Schedulable = 0, # minimize gradient w.r.t. delta ray dir, when ray origin = intersection + loss_atom_centroid_norm_std_reg : Schedulable = 0, # minimize per-atom centroid std + + # optimization + opt_learning_rate : Schedulable = 1e-5, + opt_weight_decay : float = 0, + opt_warmup : float = 0, + **kw, + ): + super().__init__() + opt_warmup = Linear(opt_warmup) + opt_warmup._param_name = "opt_warmup" + self.save_hyperparameters() + + + if "half" in input_mode: + assert output_mode == "medial_sphere" and kw.get("n_atoms", 1) > 1 + + assert output_mode in ["medial_sphere", "orthogonal_plane"] + assert opt_weight_decay >= 0, opt_weight_decay + + if output_mode == "orthogonal_plane": + self.net = OrthogonalPlaneNet( + in_features = self.n_input_embedding_features, + hidden_layers = hidden_layers, + hidden_features = hidden_features, + latent_features = latent_features, + **kw, + ) + elif output_mode == "medial_sphere": + self.net = MedialAtomNet( + in_features = self.n_input_embedding_features, + hidden_layers = hidden_layers, + hidden_features = hidden_features, + latent_features = latent_features, + **kw, + ) + + def on_fit_start(self): + if __debug__: + for k, v in self.hparams.items(): + if isinstance(v, HParamScheduleBase): + v.assert_positive(self.trainer.max_epochs) + + @property + def n_input_embedding_features(self) -> int: + return geometry.ray_input_embedding_length(self.hparams.input_mode) + + @property + def n_latent_features(self) -> int: + return self.hparams.latent_features + + @property + def latent_embeddings_init_std(self) -> float: + return 0.01 + + @property + def is_conditioned(self): + return self.net.is_conditioned + + @property + def is_double_backprop(self) -> bool: + return self.is_double_backprop_origins or self.is_double_backprop_dirs + + @property + def is_double_backprop_origins(self) -> bool: + prif = self.hparams.output_mode == "orthogonal_plane" + return prif and self.hparams.loss_normal_cossim + + @property + def is_double_backprop_dirs(self) -> bool: + return self.hparams.loss_multi_view_reg + + @classmethod + @compose("\n".join) + def make_jinja_template(cls, *, exclude_list: set[str] = {}, top_level: bool = True, **kw) -> str: + yield param.make_jinja_template(cls, top_level=top_level, **kw) + yield MedialAtomNet.make_jinja_template(top_level=False, exclude_list={ + "in_features", + "hidden_layers", + "hidden_features", + "latent_features", + }) + + def batch2rays(self, batch: ForwardBatch) -> tuple[Tensor, Tensor]: + if "uv" in batch: + raise NotImplementedError + assert not (self.hparams.loss_multi_view_reg and self.training) + ray_origins, \ + ray_dirs, \ + = geometry.camera_uv_to_rays( + cam2world = batch["cam2world"], + uv = batch["uv"], + intrinsics = batch["intrinsics"], + ) + else: + ray_origins = batch["points" if self.hparams.loss_multi_view_reg and self.training else "origins"] + ray_dirs = batch["dirs"] + return ray_origins, ray_dirs + + def forward(self, + batch : ForwardBatch, + z : Optional[Tensor] = None, # latent code + *, + return_input : bool = False, + allow_nans : bool = False, # in output + **kw, + ) -> tuple[torch.Tensor, ...]: + ( + ray_origins, # (B, 3) + ray_dirs, # (B, H, W, 3) + ) = self.batch2rays(batch) + + # Ensure rays are normalized + # NOTICE: this is slow, make sure to train with optimizations! + assert ray_dirs.detach().norm(dim=-1).allclose(torch.ones(ray_dirs.shape[:-1], **self.device_and_dtype)),\ + ray_dirs.detach().norm(dim=-1) + + if ray_origins.ndim + 2 == ray_dirs.ndim: + ray_origins = ray_origins[..., None, None, :] + + ray_origins, ray_dirs = broadcast_tensors(ray_origins, ray_dirs) + + if self.is_double_backprop and self.training: + if self.is_double_backprop_dirs: + ray_dirs.requires_grad = True + if self.is_double_backprop_origins: + ray_origins.requires_grad = True + assert ray_origins.requires_grad or ray_dirs.requires_grad + + input = geometry.ray_input_embedding( + ray_origins, ray_dirs, + mode = self.hparams.input_mode, + normalize_dirs = self.hparams.normalize_ray_dirs, + is_training = self.training, + ) + assert not input.detach().isnan().any() + + predictions = self.net(input, z) + + intersections = self.net.compute_intersections( + ray_origins, ray_dirs, predictions, + allow_nans = allow_nans and not self.training, **kw + ) + if return_input: + return ray_origins, ray_dirs, input, intersections + else: + return intersections + + def training_step(self, batch: TrainingBatch, batch_idx: int, *, is_validation=False) -> Tensor: + z = self.encode(batch) if self.is_conditioned else None + assert self.is_conditioned or len(set(batch["z_uid"])) <= 1, \ + f"Network is unconditioned, but the batch has multiple uids: {set(batch['z_uid'])!r}" + + # unpack + target_hits = batch["hits"] # (B, H, W) dtype=bool + target_miss = batch["miss"] # (B, H, W) dtype=bool + target_points = batch["points"] # (B, H, W, 3) + target_normals = batch["normals"] # (B, H, W, 3) NaN if not hit + target_distances = batch["distances"] # (B, H, W) NaN if not miss + assert not target_normals [target_hits].isnan().any() + assert not target_distances[target_miss].isnan().any() + target_normals[target_normals.isnan()] = 0 + assert not target_normals .isnan().any() + + # make z fit batch scheme + if z is not None: + z = z[..., None, None, :] + + losses = {} + metrics = {} + zeros = torch.zeros_like(target_distances) + + if self.hparams.output_mode == "medial_sphere": + assert isinstance(self.net, MedialAtomNet) + ray_origins, ray_dirs, plucker, ( + depths, # (...) float, projection if not hit + silhouettes, # (...) float + intersections, # (..., 3) float, projection or NaN if not hit + intersection_normals, # (..., 3) float, rejection or NaN if not hit + is_intersecting, # (...) bool, true if hit + sphere_centers, # (..., 3) network output + sphere_radii, # (...) network output + + atom_indices, + all_intersections, # (..., N_ATOMS) float, projection or NaN if not hit + all_intersection_normals, # (..., N_ATOMS, 3) float, rejection or NaN if not hit + all_depths, # (..., N_ATOMS) float, projection if not hit + all_silhouettes, # (..., N_ATOMS, 3) float, projection or NaN if not hit + all_is_intersecting, # (..., N_ATOMS) bool, true if hit + all_sphere_centers, # (..., N_ATOMS, 3) network output + all_sphere_radii, # (..., N_ATOMS) network output + ) = self(batch, z, + intersections_only = False, + return_all_atoms = True, + allow_nans = False, + return_input = True, + improve_miss_grads = True, + ) + + # target hit supervision + if (__debug__ or LOG_ALL_METRICS) or self.hparams.loss_intersection: # scores true hits + losses["loss_intersection"] = ( + (target_points - intersections).norm(dim=-1) + ).where(target_hits & is_intersecting, zeros).mean() + if (__debug__ or LOG_ALL_METRICS) or self.hparams.loss_intersection_l2: # scores true hits + losses["loss_intersection_l2"] = ( + (target_points - intersections).pow(2).sum(dim=-1) + ).where(target_hits & is_intersecting, zeros).mean() + if (__debug__ or LOG_ALL_METRICS) or self.hparams.loss_intersection_proj: # scores misses as if they were hits, using the projection + losses["loss_intersection_proj"] = ( + (target_points - intersections).norm(dim=-1) + ).where(target_hits, zeros).mean() + if (__debug__ or LOG_ALL_METRICS) or self.hparams.loss_intersection_proj_l2: # scores misses as if they were hits, using the projection + losses["loss_intersection_proj_l2"] = ( + (target_points - intersections).pow(2).sum(dim=-1) + ).where(target_hits, zeros).mean() + + # target hit normal supervision + if (__debug__ or LOG_ALL_METRICS) or self.hparams.loss_normal_cossim: # scores true hits + losses["loss_normal_cossim"] = ( + 1 - torch.cosine_similarity(target_normals, intersection_normals, dim=-1) + ).where(target_hits & is_intersecting, zeros).mean() + if (__debug__ or LOG_ALL_METRICS) or self.hparams.loss_normal_euclid: # scores true hits + losses["loss_normal_euclid"] = ( + (target_normals - intersection_normals).norm(dim=-1) + ).where(target_hits & is_intersecting, zeros).mean() + if (__debug__ or LOG_ALL_METRICS) or self.hparams.loss_normal_cossim_proj: # scores misses as if they were hits + losses["loss_normal_cossim_proj"] = ( + 1 - torch.cosine_similarity(target_normals, intersection_normals, dim=-1) + ).where(target_hits, zeros).mean() + if (__debug__ or LOG_ALL_METRICS) or self.hparams.loss_normal_euclid_proj: # scores misses as if they were hits + losses["loss_normal_euclid_proj"] = ( + (target_normals - intersection_normals).norm(dim=-1) + ).where(target_hits, zeros).mean() + + # target sufficient hit radius + if (__debug__ or LOG_ALL_METRICS) or self.hparams.loss_hit_nodistance_l1: # ensures hits become hits, instead of relying on the projection being right + losses["loss_hit_nodistance_l1"] = ( + silhouettes + ).where(target_hits & (silhouettes > 0), zeros).mean() + if (__debug__ or LOG_ALL_METRICS) or self.hparams.loss_hit_nodistance_l2: # ensures hits become hits, instead of relying on the projection being right + losses["loss_hit_nodistance_l2"] = ( + silhouettes + ).where(target_hits & (silhouettes > 0), zeros).pow(2).mean() + + # target miss supervision + if (__debug__ or LOG_ALL_METRICS) or self.hparams.loss_miss_distance_l1: # only positive misses reinforcement + losses["loss_miss_distance_l1"] = ( + target_distances - silhouettes + ).where(target_miss, zeros).abs().mean() + if (__debug__ or LOG_ALL_METRICS) or self.hparams.loss_miss_distance_l2: # only positive misses reinforcement + losses["loss_miss_distance_l2"] = ( + target_distances - silhouettes + ).where(target_miss, zeros).pow(2).mean() + + # incentivise maximal spheres + if (__debug__ or LOG_ALL_METRICS) or self.hparams.loss_sphere_grow_reg: # all atoms + losses["loss_sphere_grow_reg"] = ((all_sphere_radii.detach() + 1) - all_sphere_radii).abs().mean() + if (__debug__ or LOG_ALL_METRICS) or self.hparams.loss_sphere_grow_reg_hit: # true hits only + losses["loss_sphere_grow_reg_hit"] = ((sphere_radii.detach() + 1) - sphere_radii).where(target_hits & is_intersecting, zeros).abs().mean() + + # spherical latent prior + if (__debug__ or LOG_ALL_METRICS) or self.hparams.loss_embedding_norm: + losses["loss_embedding_norm"] = self.latent_embeddings.norm(dim=-1).mean() + + + is_grad_enabled = torch.is_grad_enabled() + + # multi-view regularization: atom should not change when view changes + if self.hparams.loss_multi_view_reg and is_grad_enabled: + assert ray_dirs.requires_grad, ray_dirs + assert plucker.requires_grad, plucker + assert intersections.grad_fn is not None + assert intersection_normals.grad_fn is not None + + *center_grads, radii_grads = diff.gradients( + sphere_centers[..., 0], + sphere_centers[..., 1], + sphere_centers[..., 2], + sphere_radii, + wrt=ray_dirs, + ) + + losses["loss_multi_view_reg"] = ( + sum( + i.pow(2).sum(dim=-1) + for i in center_grads + ).where(target_hits & is_intersecting, zeros).mean() + + + radii_grads.pow(2).sum(dim=-1) + .where(target_hits & is_intersecting, zeros).mean() + ) + + # minimize the volume spanned by each atom + if self.hparams.loss_atom_centroid_norm_std_reg and self.net.n_atoms > 1: + assert len(all_sphere_centers.shape) == 5, all_sphere_centers.shape + losses["loss_atom_centroid_norm_std_reg"] \ + = (( + all_sphere_centers + - all_sphere_centers + .mean(dim=(1, 2), keepdim=True) + ).pow(2).sum(dim=-1) - 0.05**2).clamp(0, None).mean() + + # prif is l1, LSMAT is l2 + if (__debug__ or LOG_ALL_METRICS) or self.hparams.loss_inscription_hits or self.hparams.loss_inscription_miss or self.hparams.loss_inscription_hits_l2 or self.hparams.loss_inscription_miss_l2: + b = target_hits.shape[0] # number of objects + n = target_hits.shape[1:].numel() # rays per object + perm = torch.randperm(n, device=self.device) # ray2ray permutation + flatten = dict(start_dim=1, end_dim=len(target_hits.shape) - 1) + + ( + inscr_sphere_center_projs, # (b, n, n_atoms, 3) + inscr_intersections_near, # (b, n, n_atoms, 3) + inscr_intersections_far, # (b, n, n_atoms, 3) + inscr_is_intersecting, # (b, n, n_atoms) dtype=bool + ) = geometry.ray_sphere_intersect( + ray_origins.flatten(**flatten)[:, perm, None, :], + ray_dirs .flatten(**flatten)[:, perm, None, :], + all_sphere_centers.flatten(**flatten), + all_sphere_radii .flatten(**flatten), + return_parts = True, + allow_nans = False, + improve_miss_grads = self.hparams.improve_miss_grads, + ) + assert inscr_sphere_center_projs.shape == (b, n, self.net.n_atoms, 3), \ + (inscr_sphere_center_projs.shape, (b, n, self.net.n_atoms, 3)) + inscr_silhouettes = ( + inscr_sphere_center_projs - all_sphere_centers.flatten(**flatten) + ).norm(dim=-1) - all_sphere_radii.flatten(**flatten) + + loss_inscription_hits = ( + ( + (inscr_intersections_near - target_points.flatten(**flatten)[:, perm, None, :]) + * ray_dirs.flatten(**flatten)[:, perm, None, :] + ).sum(dim=-1) + ).where(target_hits.flatten(**flatten)[:, perm, None] & inscr_is_intersecting, + torch.zeros(inscr_intersections_near.shape[:-1], **self.device_and_dtype), + ).clamp(None, 0) + loss_inscription_miss = ( + inscr_silhouettes - target_distances.flatten(**flatten)[:, perm, None] + ).where(target_miss.flatten(**flatten)[:, perm, None], + torch.zeros_like(inscr_silhouettes) + ).clamp(None, 0) + + if (__debug__ or LOG_ALL_METRICS) or self.hparams.loss_inscription_hits: + losses["loss_inscription_hits"] = loss_inscription_hits.neg().mean() + if (__debug__ or LOG_ALL_METRICS) or self.hparams.loss_inscription_miss: + losses["loss_inscription_miss"] = loss_inscription_miss.neg().mean() + if (__debug__ or LOG_ALL_METRICS) or self.hparams.loss_inscription_hits_l2: + losses["loss_inscription_hits_l2"] = loss_inscription_hits.pow(2).mean() + if (__debug__ or LOG_ALL_METRICS) or self.hparams.loss_inscription_miss_l2: + losses["loss_inscription_miss_l2"] = loss_inscription_miss.pow(2).mean() + + # metrics + metrics["iou"] = ( + ((~target_miss) & is_intersecting.detach()).sum() / + ((~target_miss) | is_intersecting.detach()).sum() + ) + metrics["radii"] = sphere_radii.detach().mean() # with the constant applied pressure, we need to measure it this way instead + + elif self.hparams.output_mode == "orthogonal_plane": + assert isinstance(self.net, OrthogonalPlaneNet) + ray_origins, ray_dirs, input_embedding, ( + intersections, # (..., 3) dtype=float + is_intersecting, # (...) dtype=float + ) = self(batch, z, return_input=True, normalize_origins=True) + + if (__debug__ or LOG_ALL_METRICS) or self.hparams.loss_intersection: + losses["loss_intersection"] = ( + (intersections - target_points).norm(dim=-1) + ).where(target_hits, zeros).mean() + if (__debug__ or LOG_ALL_METRICS) or self.hparams.loss_intersection_l2: + losses["loss_intersection_l2"] = ( + (intersections - target_points).pow(2).sum(dim=-1) + ).where(target_hits, zeros).mean() + + if (__debug__ or LOG_ALL_METRICS) or self.hparams.loss_hit_cross_entropy: + losses["loss_hit_cross_entropy"] = ( + F.binary_cross_entropy_with_logits(is_intersecting, (~target_miss).to(self.dtype)) + ).mean() + + if self.hparams.loss_normal_cossim and torch.is_grad_enabled(): + jac = diff.jacobian(intersections, ray_origins) + intersection_normals = self.compute_normals_from_intersection_origin_jacobian(jac, ray_dirs) + losses["loss_normal_cossim"] = ( + 1 - torch.cosine_similarity(target_normals, intersection_normals, dim=-1) + ).where(target_hits, zeros).mean() + + if self.hparams.loss_normal_euclid and torch.is_grad_enabled(): + jac = diff.jacobian(intersections, ray_origins) + intersection_normals = self.compute_normals_from_intersection_origin_jacobian(jac, ray_dirs) + losses["loss_normal_euclid"] = ( + (target_normals - intersection_normals).norm(dim=-1) + ).where(target_hits, zeros).mean() + + if self.hparams.loss_multi_view_reg and torch.is_grad_enabled(): + assert ray_dirs .requires_grad, ray_dirs + assert intersections.grad_fn is not None + grads = diff.gradients( + intersections[..., 0], + intersections[..., 1], + intersections[..., 2], + wrt=ray_dirs, + ) + losses["loss_multi_view_reg"] = sum( + i.pow(2).sum(dim=-1) + for i in grads + ).where(target_hits, zeros).mean() + + metrics["iou"] = ( + ((~target_miss) & (is_intersecting>0.5).detach()).sum() / + ((~target_miss) | (is_intersecting>0.5).detach()).sum() + ) + else: + raise NotImplementedError(self.hparams.output_mode) + + # output losses and metrics + + # apply scaling: + losses_unscaled = losses.copy() # shallow copy + for k in list(losses.keys()): + assert losses[k].numel() == 1, f"losses[{k!r}] shape: {losses[k].shape}" + val_schedule: HParamSchedule = self.hparams[k] + val = val_schedule.get(self) + if val == 0: + if (__debug__ or LOG_ALL_METRICS) and val_schedule.is_const: + del losses[k] # it was only added for unscaled logging, do not backprop + else: + losses[k] = 0 + elif val != 1: + losses[k] = losses[k] * val + + if not losses: + raise MisconfigurationException("no loss was computed") + + losses["loss"] = sum(losses.values()) * self.hparams.opt_warmup.get(self) + losses.update({f"unscaled_{k}": v.detach() for k, v in losses_unscaled.items()}) + losses.update({f"metric_{k}": v.detach() for k, v in metrics.items()}) + return losses + + + # used by pl.callbacks.EarlyStopping, via cli.py + @property + def metric_early_stop(self): return ( + "unscaled_loss_intersection_proj" + if self.hparams.output_mode == "medial_sphere" else + "unscaled_loss_intersection" + ) + + def validation_step(self, batch: TrainingBatch, batch_idx: int) -> dict[str, Tensor]: + losses = self.training_step(batch, batch_idx, is_validation=True) + return losses + + def configure_optimizers(self): + adam = torch.optim.Adam(self.parameters(), + lr=1 if not self.hparams.opt_learning_rate.is_const else self.hparams.opt_learning_rate.get_train_value(0), + weight_decay=self.hparams.opt_weight_decay) + schedules = [] + if not self.hparams.opt_learning_rate.is_const: + schedules = [ + torch.optim.lr_scheduler.LambdaLR(adam, + lambda epoch: self.hparams.opt_learning_rate.get_train_value(epoch), + ), + ] + return [adam], schedules + + @property + def example_input_array(self) -> tuple[dict[str, Tensor], Tensor]: + return ( + { # see self.batch2rays + "origins" : torch.zeros(1, 3), # most commonly used + "points" : torch.zeros(1, 3), # used if self.training and self.hparams.loss_multi_view_reg + "dirs" : torch.ones(1, 3) * torch.rsqrt(torch.tensor(3)), + }, + torch.ones(1, self.hparams.latent_features), + ) + + @staticmethod + def compute_normals_from_intersection_origin_jacobian(origin_jac: Tensor, ray_dirs: Tensor) -> Tensor: + normals = sum(( + torch.cross(origin_jac[..., 0], origin_jac[..., 1], dim=-1) * -ray_dirs[..., [2]], + torch.cross(origin_jac[..., 1], origin_jac[..., 2], dim=-1) * -ray_dirs[..., [0]], + torch.cross(origin_jac[..., 2], origin_jac[..., 0], dim=-1) * -ray_dirs[..., [1]], + )) + return normals / normals.norm(dim=-1, keepdim=True) + + +class IntersectionFieldAutoDecoderModel(IntersectionFieldModel, AutoDecoderModuleMixin): + def encode(self, batch: LabeledBatch) -> Tensor: + assert not isinstance(self.trainer.strategy, pl.strategies.DataParallelStrategy) + return self[batch["z_uid"]] # [N, Z_n] diff --git a/ifield/models/medial_atoms.py b/ifield/models/medial_atoms.py new file mode 100644 index 0000000..3f9b8dc --- /dev/null +++ b/ifield/models/medial_atoms.py @@ -0,0 +1,186 @@ +from .. import param +from ..modules import fc +from ..data.common import points +from ..utils import geometry +from ..utils.helpers import compose +from textwrap import indent, dedent +from torch import nn, Tensor +from typing import Optional +import torch +import warnings + +# generalize this into a HypoHyperConcat net? ConditionedNet? +class MedialAtomNet(nn.Module): + def __init__(self, + in_features : int, + latent_features : int, + hidden_features : int, + hidden_layers : int, + n_atoms : int = 1, + final_init_wrr : tuple[float, float] | None = (0.05, 0.6, 0.1), + **kw, + ): + super().__init__() + assert n_atoms >= 1, n_atoms + self.n_atoms = n_atoms + + self.fc = fc.FCBlock( + in_features = in_features, + hidden_layers = hidden_layers, + hidden_features = hidden_features, + out_features = n_atoms * 4, # n_atoms * (x, y, z, r) + outermost_linear = True, + latent_features = latent_features, + **kw, + ) + + if final_init_wrr is not None: + with torch.no_grad(): + w, r1, r2 = final_init_wrr + if w != 1: self.fc[-1].linear.weight *= w + dtype = self.fc[-1].linear.bias.dtype + self.fc[-1].linear.bias[..., [4*n+i for n in range(n_atoms) for i in range(3)]] = torch.tensor(points.generate_random_sphere_points(n_atoms, radius=r1), dtype=dtype).flatten() + self.fc[-1].linear.bias[..., 3::4] = r2 + + @property + def is_conditioned(self): + return self.fc.is_conditioned + + @classmethod + @compose("\n".join) + def make_jinja_template(cls, *, exclude_list: set[str] = {}, top_level: bool = True, **kw) -> str: + yield param.make_jinja_template(cls, top_level=top_level, exclude_list=exclude_list, **kw) + yield fc.FCBlock.make_jinja_template(top_level=False, exclude_list={ + "in_features", + "hidden_layers", + "hidden_features", + "out_features", + "outermost_linear", + "latent_features", + }) + + def forward(self, x: Tensor, z: Optional[Tensor] = None): + if __debug__ and self.is_conditioned and z is None: + warnings.warn(f"{self.__class__.__qualname__} is conditioned, but the forward pass was not supplied with a conditioning tensor.") + return self.fc(x, z) + + def compute_intersections(self, + ray_origins : Tensor, # (..., 3) + ray_dirs : Tensor, # (..., 3) + medial_atoms : Tensor, # (..., 4*self.n_atoms) + *, + intersections_only : bool = True, + return_all_atoms : bool = False, # only applies if intersections_only=False + allow_nans : bool = True, + improve_miss_grads : bool = False, + ) -> tuple[(Tensor,)*5]: + assert ray_origins.shape[:-1] == ray_dirs.shape[:-1] == medial_atoms.shape[:-1], \ + (ray_origins.shape, ray_dirs.shape, medial_atoms.shape) + assert medial_atoms.shape[-1] % 4 == 0, \ + medial_atoms.shape + assert ray_origins.shape[-1] == ray_dirs.shape[-1] == 3, \ + (ray_origins.shape, ray_dirs.shape) + + #n_atoms = medial_atoms.shape[-1] // 4 + n_atoms = medial_atoms.shape[-1] >> 2 + + # reshape (..., n_atoms * d) to (..., n_atoms, d) + medial_atoms = medial_atoms.view(*medial_atoms.shape[:-1], n_atoms, 4) + ray_origins = ray_origins.unsqueeze(-2).broadcast_to([*ray_origins.shape[:-1], n_atoms, 3]) + ray_dirs = ray_dirs .unsqueeze(-2).broadcast_to([*ray_dirs .shape[:-1], n_atoms, 3]) + + # unpack atoms + sphere_centers = medial_atoms[..., :3] + sphere_radii = medial_atoms[..., 3].abs() + + assert not ray_origins .detach().isnan().any() + assert not ray_dirs .detach().isnan().any() + assert not sphere_centers.detach().isnan().any() + assert not sphere_radii .detach().isnan().any() + + # compute intersections + ( + sphere_center_projs, # (..., 3) + intersections_near, # (..., 3) + intersections_far, # (..., 3) + is_intersecting, # (...) bool + ) = geometry.ray_sphere_intersect( + ray_origins, + ray_dirs, + sphere_centers, + sphere_radii, + return_parts = True, + allow_nans = allow_nans, + improve_miss_grads = improve_miss_grads, + ) + + # early return + if intersections_only and n_atoms == 1: + return intersections_near.squeeze(-2), is_intersecting.squeeze(-1) + + # compute how close each hit and miss are + depths = ((intersections_near - ray_origins) * ray_dirs).sum(-1) + silhouettes = torch.linalg.norm(sphere_center_projs - sphere_centers, dim=-1) - sphere_radii + + if return_all_atoms: + intersections_near_all = intersections_near + depths_all = depths + silhouettes_all = silhouettes + is_intersecting_all = is_intersecting + sphere_centers_all = sphere_centers + sphere_radii_all = sphere_radii + + # collapse n_atoms + if n_atoms > 1: + atom_indices = torch.where(is_intersecting.any(dim=-1, keepdim=True), + torch.where(is_intersecting, depths.detach(), depths.detach()+100).argmin(dim=-1, keepdim=True), + silhouettes.detach().argmin(dim=-1, keepdim=True), + ) + + intersections_near = intersections_near.take_along_dim(atom_indices[..., None], -2).squeeze(-2) + depths = depths .take_along_dim(atom_indices, -1).squeeze(-1) + silhouettes = silhouettes .take_along_dim(atom_indices, -1).squeeze(-1) + is_intersecting = is_intersecting .take_along_dim(atom_indices, -1).squeeze(-1) + sphere_centers = sphere_centers .take_along_dim(atom_indices[..., None], -2).squeeze(-2) + sphere_radii = sphere_radii .take_along_dim(atom_indices, -1).squeeze(-1) + else: + atom_indices = None + intersections_near = intersections_near.squeeze(-2) + depths = depths .squeeze(-1) + silhouettes = silhouettes .squeeze(-1) + is_intersecting = is_intersecting .squeeze(-1) + sphere_centers = sphere_centers .squeeze(-2) + sphere_radii = sphere_radii .squeeze(-1) + + # early return + if intersections_only: + return intersections_near, is_intersecting + + # compute sphere normals + intersection_normals = intersections_near - sphere_centers + intersection_normals = intersection_normals / (intersection_normals.norm(dim=-1)[..., None] + 1e-9) + + if return_all_atoms: + intersection_normals_all = intersections_near_all - sphere_centers_all + intersection_normals_all = intersection_normals_all / (intersection_normals_all.norm(dim=-1)[..., None] + 1e-9) + + + return ( + depths, # (...) valid if hit, based on 'intersections' + silhouettes, # (...) always valid + intersections_near, # (..., 3) valid if hit, projection if not + intersection_normals, # (..., 3) valid if hit, rejection if not + is_intersecting, # (...) dtype=bool + sphere_centers, # (..., 3) network output + sphere_radii, # (...) network output + *(() if not return_all_atoms else ( + + atom_indices, + intersections_near_all, # (..., N_ATOMS) valid if hit, based on 'intersections' + intersection_normals_all, # (..., N_ATOMS, 3) valid if hit, rejection if not + depths_all, # (..., N_ATOMS) always valid + silhouettes_all, # (..., N_ATOMS, 3) valid if hit, projection if not + is_intersecting_all, # (..., N_ATOMS) dtype=bool + sphere_centers_all, # (..., N_ATOMS, 3) network output + sphere_radii_all, # (..., N_ATOMS) network output + ))) diff --git a/ifield/models/orthogonal_plane.py b/ifield/models/orthogonal_plane.py new file mode 100644 index 0000000..4c2b885 --- /dev/null +++ b/ifield/models/orthogonal_plane.py @@ -0,0 +1,101 @@ +from .. import param +from ..modules import fc +from ..utils import geometry +from ..utils.helpers import compose +from textwrap import indent, dedent +from torch import nn, Tensor +from typing import Optional +import warnings + +class OrthogonalPlaneNet(nn.Module): + """ + + """ + + def __init__(self, + in_features : int, + latent_features : int, + hidden_features : int, + hidden_layers : int, + **kw, + ): + super().__init__() + + self.fc = fc.FCBlock( + in_features = in_features, + hidden_layers = hidden_layers, + hidden_features = hidden_features, + out_features = 2, # (plane_offset, is_intersecting) + outermost_linear = True, + latent_features = latent_features, + **kw, + ) + + @property + def is_conditioned(self): + return self.fc.is_conditioned + + @classmethod + @compose("\n".join) + def make_jinja_template(cls, *, exclude_list: set[str] = {}, top_level: bool = True, **kw) -> str: + yield param.make_jinja_template(cls, top_level=top_level, exclude_list=exclude_list, **kw) + yield param.make_jinja_template(fc.FCBlock, top_level=False, exclude_list={ + "in_features", + "hidden_layers", + "hidden_features", + "out_features", + "outermost_linear", + }) + + def forward(self, x: Tensor, z: Optional[Tensor] = None) -> Tensor: + if __debug__ and self.is_conditioned and z is None: + warnings.warn(f"{self.__class__.__qualname__} is conditioned, but the forward pass was not supplied with a conditioning tensor.") + return self.fc(x, z) + + @staticmethod + def compute_intersections( + ray_origins : Tensor, # (..., 3) + ray_dirs : Tensor, # (..., 3) + predictions : Tensor, # (..., 2) + *, + normalize_origins = True, + return_signed_displacements = False, + allow_nans = False, # MARF compat + atom_random_prob = None, # MARF compat + atom_dropout_prob = None, # MARF compat + ) -> tuple[(Tensor,)*5]: + assert ray_origins.shape[:-1] == ray_dirs.shape[:-1] == predictions.shape[:-1], \ + (ray_origins.shape, ray_dirs.shape, predictions.shape) + assert predictions.shape[-1] == 2, \ + predictions.shape + + assert not allow_nans + + if normalize_origins: + ray_origins = geometry.project_point_on_ray(0, ray_origins, ray_dirs) + + # unpack predictions + signed_displacements = predictions[..., 0] + is_intersecting = predictions[..., 1] + + # compute intersections + intersections = ray_origins - signed_displacements[..., None] * ray_dirs + + return ( + intersections, + is_intersecting, + *((signed_displacements,) if return_signed_displacements else ()), + ) + + + + +OrthogonalPlaneNet.__doc__ = __doc__ = f""" +{dedent(OrthogonalPlaneNet.__doc__).strip()} + +# Config template: + +```yaml +{OrthogonalPlaneNet.make_jinja_template()} +``` +""" diff --git a/ifield/modules/__init__.py b/ifield/modules/__init__.py new file mode 100644 index 0000000..0ee5155 --- /dev/null +++ b/ifield/modules/__init__.py @@ -0,0 +1,3 @@ +__doc__ = """ +Contains Pytorch Modules +""" diff --git a/ifield/modules/dtype.py b/ifield/modules/dtype.py new file mode 100644 index 0000000..b109149 --- /dev/null +++ b/ifield/modules/dtype.py @@ -0,0 +1,22 @@ +import pytorch_lightning as pl + + +class DtypeMixin: + def __init_subclass__(cls): + assert issubclass(cls, pl.LightningModule), \ + f"{cls.__name__!r} is not a subclass of 'pytorch_lightning.LightningModule'!" + + @property + def device_and_dtype(self) -> dict: + """ + Examples: + ``` + torch.tensor(1337, **self.device_and_dtype) + some_tensor.to(**self.device_and_dtype) + ``` + """ + + return { + "dtype": self.dtype, + "device": self.device, + } diff --git a/ifield/modules/fc.py b/ifield/modules/fc.py new file mode 100644 index 0000000..73345aa --- /dev/null +++ b/ifield/modules/fc.py @@ -0,0 +1,424 @@ +from . import siren +from .. import param +from ..utils.helpers import compose, run_length_encode, MetaModuleProxy +from collections import OrderedDict +from pytorch_lightning.core.mixins import HyperparametersMixin +from torch import nn, Tensor +from torch.nn.utils.weight_norm import WeightNorm +from torchmeta.modules import MetaModule, MetaSequential +from typing import Iterable, Literal, Optional, Union, Callable +import itertools +import math +import torch + +__doc__ = """ +`fc` is short for "Fully Connected" +""" + +def broadcast_tensors_except(*tensors: Tensor, dim: int) -> list[Tensor]: + if dim == -1: + shapes = [ i.shape[:dim] for i in tensors ] + else: + shapes = [ (*i.shape[:dim], i.shape[dim+1:]) for i in tensors ] + target_shape = list(torch.broadcast_shapes(*shapes)) + if dim == -1: + target_shape.append(-1) + elif dim < 0: + target_shape.insert(dim+1, -1) + else: + target_shape.insert(dim, -1) + + return [ i.broadcast_to(target_shape) for i in tensors ] + + +EPS = 1e-8 + +Nonlinearity = Literal[ + None, + "relu", + "leaky_relu", + "silu", + "softplus", + "elu", + "selu", + "sine", + "sigmoid", + "tanh", +] + +Normalization = Literal[ + None, + "batchnorm", + "batchnorm_na", + "layernorm", + "layernorm_na", + "weightnorm", +] + +class ReprHyperparametersMixin(HyperparametersMixin): + def extra_repr(self): + this = ", ".join(f"{k}={v!r}" for k, v in self.hparams.items()) + rest = super().extra_repr() + if rest: + return f"{this}, {rest}" + else: + return this + +class MultilineReprHyperparametersMixin(HyperparametersMixin): + def extra_repr(self): + items = [f"{k}={v!r}" for k, v in self.hparams.items()] + this = "\n".join( + ", ".join(filter(bool, i)) + "," + for i in itertools.zip_longest(items[0::3], items[1::3], items[2::3]) + ) + rest = super().extra_repr() + if rest: + return f"{this}, {rest}" + else: + return this + + +class BatchLinear(nn.Linear): + """ + A linear (meta-)layer that can deal with batched weight matrices and biases, + as for instance output by a hypernetwork. + """ + __doc__ = nn.Linear.__doc__ + _meta_forward_pre_hooks = None + + def register_forward_pre_hook(self, hook: Callable) -> torch.utils.hooks.RemovableHandle: + if not isinstance(hook, WeightNorm): + return super().register_forward_pre_hook(hook) + + if self._meta_forward_pre_hooks is None: + self._meta_forward_pre_hooks = OrderedDict() + + handle = torch.utils.hooks.RemovableHandle(self._meta_forward_pre_hooks) + self._meta_forward_pre_hooks[handle.id] = hook + return handle + + def forward(self, input: Tensor, params: Optional[dict[str, Tensor]]=None): + if params is None or not isinstance(self, MetaModule): + params = OrderedDict(self.named_parameters()) + if self._meta_forward_pre_hooks is not None: + proxy = MetaModuleProxy(self, params) + for hook in self._meta_forward_pre_hooks.values(): + hook(proxy, [input]) + + weight = params["weight"] + bias = params.get("bias", None) + + # transpose weights + weight = weight.permute(*range(len(weight.shape) - 2), -1, -2) # does not jit + + output = input.unsqueeze(-2).matmul(weight).squeeze(-2) + + if bias is not None: + output = output + bias + + return output + + +class MetaBatchLinear(BatchLinear, MetaModule): + pass + + +class CallbackConcatLayer(nn.Module): + "A tricky way to enable skip connections in sequentials models" + def __init__(self, tensor_getter: Callable[[], tuple[Tensor, ...]]): + super().__init__() + self.tensor_getter = tensor_getter + + def forward(self, x): + ys = self.tensor_getter() + return torch.cat(broadcast_tensors_except(x, *ys, dim=-1), dim=-1) + + +class ResidualSkipConnectionEndLayer(nn.Module): + """ + Residual skip connections that can be added to a nn.Sequential + """ + + class ResidualSkipConnectionStartLayer(nn.Module): + def __init__(self): + super().__init__() + self._stored_tensor = None + + def forward(self, x): + assert self._stored_tensor is None + self._stored_tensor = x + return x + + def get(self): + assert self._stored_tensor is not None + x = self._stored_tensor + self._stored_tensor = None + return x + + def __init__(self): + super().__init__() + self._stored_tensor = None + self._start = self.ResidualSkipConnectionStartLayer() + + def forward(self, x): + skip = self._start.get() + return x + skip + + @property + def start(self) -> ResidualSkipConnectionStartLayer: + return self._start + + @property + def end(self) -> "ResidualSkipConnectionEndLayer": + return self + + +ResidualMode = Literal[ + None, + "identity", +] + +class FCLayer(MultilineReprHyperparametersMixin, MetaSequential): + """ + A single fully connected (FC) layer + """ + + def __init__(self, + in_features : int, + out_features : int, + *, + nonlinearity : Nonlinearity = "relu", + normalization : Normalization = None, + is_first : bool = False, # used for SIREN initialization + is_final : bool = False, # used for fan_out init + dropout_prob : float = 0.0, + negative_slope : float = 0.01, # only for nonlinearity="leaky_relu", default is normally 0.01 + omega_0 : float = 30, # only for nonlinearity="sine" + residual_mode : ResidualMode = None, + _no_meta : bool = False, # set to true in hypernetworks + **_ + ): + super().__init__() + self.save_hyperparameters() + + # improve repr + if nonlinearity != "leaky_relu": + self.hparams.pop("negative_slope") + if nonlinearity != "sine": + self.hparams.pop("omega_0") + + Linear = nn.Linear if _no_meta else MetaBatchLinear + + def make_layer() -> Iterable[nn.Module]: + # residual start + if residual_mode is not None: + residual_layer = ResidualSkipConnectionEndLayer() + yield "res_a", residual_layer.start + + linear = Linear(in_features, out_features) + + # initialize + if nonlinearity in {"relu", "leaky_relu", "silu", "softplus"}: + nn.init.kaiming_uniform_(linear.weight, a=negative_slope, nonlinearity=nonlinearity, mode="fan_in" if not is_final else "fan_out") + elif nonlinearity == "elu": + nn.init.normal_(linear.weight, std=math.sqrt(1.5505188080679277) / math.sqrt(linear.weight.size(-1))) + elif nonlinearity == "selu": + nn.init.normal_(linear.weight, std=1 / math.sqrt(linear.weight.size(-1))) + elif nonlinearity == "sine": + siren.init_weights_(linear, omega_0, is_first) + elif nonlinearity in {"sigmoid", "tanh"}: + nn.init.xavier_normal_(linear.weight) + elif nonlinearity is None: + pass # this is effectively uniform(-1/sqrt(in_features), 1/sqrt(in_features)) + else: + raise NotImplementedError(nonlinearity) + + # linear + normalize + if normalization is None: + yield "linear", linear + elif normalization == "batchnorm": + yield "linear", linear + yield "norm", nn.BatchNorm1d(out_features, affine=True) + elif normalization == "batchnorm_na": + yield "linear", linear + yield "norm", nn.BatchNorm1d(out_features, affine=False) + elif normalization == "layernorm": + yield "linear", linear + yield "norm", nn.LayerNorm([out_features], elementwise_affine=True) + elif normalization == "layernorm_na": + yield "linear", linear + yield "norm", nn.LayerNorm([out_features], elementwise_affine=False) + elif normalization == "weightnorm": + yield "linear", nn.utils.weight_norm(linear) + else: + raise NotImplementedError(normalization) + + # activation + inplace = False + if nonlinearity is None : pass + elif nonlinearity == "relu" : yield nonlinearity, nn.ReLU(inplace=inplace) + elif nonlinearity == "leaky_relu" : yield nonlinearity, nn.LeakyReLU(negative_slope=negative_slope, inplace=inplace) + elif nonlinearity == "silu" : yield nonlinearity, nn.SiLU(inplace=inplace) + elif nonlinearity == "softplus" : yield nonlinearity, nn.Softplus() + elif nonlinearity == "elu" : yield nonlinearity, nn.ELU(inplace=inplace) + elif nonlinearity == "selu" : yield nonlinearity, nn.SELU(inplace=inplace) + elif nonlinearity == "sine" : yield nonlinearity, siren.Sine(omega_0) + elif nonlinearity == "sigmoid" : yield nonlinearity, nn.Sigmoid() + elif nonlinearity == "tanh" : yield nonlinearity, nn.Tanh() + else : raise NotImplementedError(f"{nonlinearity=}") + + # dropout + if dropout_prob > 0: + if nonlinearity == "selu": + yield "adropout", nn.AlphaDropout(p=dropout_prob) + else: + yield "dropout", nn.Dropout(p=dropout_prob) + + # residual end + if residual_mode is not None: + yield "res_b", residual_layer.end + + for name, module in make_layer(): + self.add_module(name.replace("-", "_"), module) + + @property + def nonlinearity(self) -> Optional[nn.Module]: + "alias to the activation function submodule" + if self.hparams.nonlinearity is None: + return None + return getattr(self, self.hparams.nonlinearity.replace("-", "_")) + + def initialize_weights(): + raise NotImplementedError + + +class FCBlock(MultilineReprHyperparametersMixin, MetaSequential): + """ + A block of FC layers + """ + def __init__(self, + in_features : int, + hidden_features : int, + hidden_layers : int, + out_features : int, + normalization : Normalization = None, + nonlinearity : Nonlinearity = "relu", + dropout_prob : float = 0.0, + outermost_linear : bool = True, # whether last linear is nonlinear + latent_features : Optional[int] = None, + concat_skipped_layers : Union[list[int], bool] = [], + concat_conditioned_layers : Union[list[int], bool] = [], + **kw, + ): + super().__init__() + self.save_hyperparameters() + + if isinstance(concat_skipped_layers, bool): + concat_skipped_layers = list(range(hidden_layers+2)) if concat_skipped_layers else [] + if isinstance(concat_conditioned_layers, bool): + concat_conditioned_layers = list(range(hidden_layers+2)) if concat_conditioned_layers else [] + if len(concat_conditioned_layers) != 0 and latent_features is None: + raise ValueError("Layers marked to be conditioned without known number of latent features") + concat_skipped_layers = [i if i >= 0 else hidden_layers+2-abs(i) for i in concat_skipped_layers] + concat_conditioned_layers = [i if i >= 0 else hidden_layers+2-abs(i) for i in concat_conditioned_layers] + self._concat_x_layers: frozenset[int] = frozenset(concat_skipped_layers) + self._concat_z_layers: frozenset[int] = frozenset(concat_conditioned_layers) + if len(self._concat_x_layers) != len(concat_skipped_layers): + raise ValueError(f"Duplicates found in {concat_skipped_layers = }") + if len(self._concat_z_layers) != len(concat_conditioned_layers): + raise ValueError(f"Duplicates found in {concat_conditioned_layers = }") + if not all(isinstance(i, int) for i in self._concat_x_layers): + raise TypeError(f"Expected only integers in {concat_skipped_layers = }") + if not all(isinstance(i, int) for i in self._concat_z_layers): + raise TypeError(f"Expected only integers in {concat_conditioned_layers = }") + + def make_layers() -> Iterable[nn.Module]: + def make_concat_layer(*idxs: int) -> int: + x_condition_this_layer = any(idx in self._concat_x_layers for idx in idxs) + z_condition_this_layer = any(idx in self._concat_z_layers for idx in idxs) + if x_condition_this_layer and z_condition_this_layer: + yield CallbackConcatLayer(lambda: (self._current_x, self._current_z)) + elif x_condition_this_layer: + yield CallbackConcatLayer(lambda: (self._current_x,)) + elif z_condition_this_layer: + yield CallbackConcatLayer(lambda: (self._current_z,)) + + return in_features*x_condition_this_layer + (latent_features or 0)*z_condition_this_layer + + added = yield from make_concat_layer(0) + + yield FCLayer( + in_features = in_features + added, + out_features = hidden_features, + nonlinearity = nonlinearity, + normalization = normalization, + dropout_prob = dropout_prob, + is_first = True, + is_final = False, + **kw, + ) + + for i in range(hidden_layers): + added = yield from make_concat_layer(i+1) + + yield FCLayer( + in_features = hidden_features + added, + out_features = hidden_features, + nonlinearity = nonlinearity, + normalization = normalization, + dropout_prob = dropout_prob, + is_first = False, + is_final = False, + **kw, + ) + + added = yield from make_concat_layer(hidden_layers+1) + + nl = nonlinearity + + yield FCLayer( + in_features = hidden_features + added, + out_features = out_features, + nonlinearity = None if outermost_linear else nl, + normalization = None if outermost_linear else normalization, + dropout_prob = 0.0 if outermost_linear else dropout_prob, + is_first = False, + is_final = True, + **kw, + ) + + for i, module in enumerate(make_layers()): + self.add_module(str(i), module) + + @property + def is_conditioned(self) -> bool: + "Whether z is used or not" + return bool(self._concat_z_layers) + + @classmethod + @compose("\n".join) + def make_jinja_template(cls, *, exclude_list: set[str] = {}, top_level: bool = True, **kw) -> str: + @compose(" ".join) + def as_jexpr(values: Union[list[int]]): + yield "{{" + for val, count in run_length_encode(values): + yield f"[{val!r}]*{count!r}" + yield "}}" + yield param.make_jinja_template(cls, top_level=top_level, exclude_list=exclude_list) + yield param.make_jinja_template(FCLayer, top_level=False, exclude_list=exclude_list | { + "in_features", + "out_features", + "nonlinearity", + "normalization", + "dropout_prob", + "is_first", + "is_final", + }) + + def forward(self, input: Tensor, z: Optional[Tensor] = None, *, params: Optional[dict[str, Tensor]]=None): + assert not self.is_conditioned or z is not None + if z is not None and z.ndim < input.ndim: + z = z[(*(None,)*(input.ndim - z.ndim), ...)] + self._current_x = input + self._current_z = z + return super().forward(input, params=params) diff --git a/ifield/modules/siren.py b/ifield/modules/siren.py new file mode 100644 index 0000000..0df337e --- /dev/null +++ b/ifield/modules/siren.py @@ -0,0 +1,25 @@ +from math import sqrt +from torch import nn +import torch + +class Sine(nn.Module): + def __init__(self, omega_0: float): + super().__init__() + self.omega_0 = omega_0 + + def forward(self, input): + if self.omega_0 == 1: + return torch.sin(input) + else: + return torch.sin(input * self.omega_0) + + +def init_weights_(module: nn.Linear, omega_0: float, is_first: bool = True): + assert isinstance(module, nn.Linear), module + with torch.no_grad(): + mag = ( + 1 / module.in_features + if is_first else + sqrt(6 / module.in_features) / omega_0 + ) + module.weight.uniform_(-mag, mag) diff --git a/ifield/param.py b/ifield/param.py new file mode 100644 index 0000000..4298048 --- /dev/null +++ b/ifield/param.py @@ -0,0 +1,231 @@ +from .utils.helpers import compose, elementwise_max +from datetime import datetime +from torch import nn +from typing import Any, Literal, Iterable, Union, Callable, Optional +import inspect +import jinja2 +import json +import os +import random +import re +import shlex +import string +import sys +import time +import typing +import warnings +import yaml + +_UNDEFINED = " I AM UNDEFINED " + +def _yaml_encode_value(val) -> str: + if isinstance(val, tuple): + val = list(val) + elif isinstance(val, set): + val = list(val) + if isinstance(val, list): + return json.dumps(val) + elif isinstance(val, dict): + return json.dumps(val) + else: + return yaml.dump(val).removesuffix("\n...\n").rstrip("\n") + +def _raise(val: Union[Exception, str]): + if isinstance(val, str): + val = jinja2.TemplateError(val) + raise val + +def make_jinja_globals(*, enable_require_defined: bool) -> dict: + import builtins + import functools + import itertools + import operator + import json + + def require_defined(name, value, *defaults, failed: bool = False, strict: bool=False, exchaustive=False): + if not defaults: + raise ValueError("`require_defined` requires at least one valid value provided") + if jinja2.is_undefined(value): + assert value._undefined_name == name, \ + f"Name mismatch: {value._undefined_name=}, {name=}" + if failed or jinja2.is_undefined(value): + if enable_require_defined or strict: + raise ValueError( + f"Required variable {name!r} " + f"is {'incorrect' if failed else 'undefined'}! " + f"Try providing:\n" + "\n".join( + f"-O{shlex.quote(name)}={shlex.quote(str(default))}" + for default in defaults + ) + ) + else: + warnings.warn( + f"Required variable {name!r} " + f"is {'incorrect' if failed else 'undefined'}! " + f"Try providing:\n" + "\n".join( + f"-O{shlex.quote(name)}={shlex.quote(str(default))}" + for default in defaults + ) + ) + if exchaustive and not jinja2.is_undefined(value) and value not in defaults: + raise ValueError( + f"Variable {name!r} not in list of allowed values: {defaults!r}" + ) + + def gen_run_uid(n: int, _choice = random.Random(time.time_ns()).choice): + """ + generates a UID for the experiment run, nice for regexes, grepping and timekeeping. + """ + # we have _choice, since most likely, pl.seed_everything has been run by this point + # we store it as a default parameter to reuse it, on the off-chance of two calls to this function being run withion the same ns + code = ''.join(_choice(string.ascii_lowercase) for _ in range(n)) + return f"{datetime.now():%Y-%m-%d-%H%M}-{code}" + return f"{datetime.now():%Y%m%d-%H%M}-{code}" + + def cartesian_hparams(_map=None, **kw: dict[str, list]) -> Iterable[jinja2.utils.Namespace]: + "Use this to bypass the common error 'SyntaxError: too many statically nested blocks'" + if isinstance(_map, jinja2.utils.Namespace): + kw = _map._Namespace__attrs | kw + elif isinstance(_map, dict): + kw = _map._Namespace__attrs | kw + keys, vals = zip(*kw.items()) + for i in itertools.product(*vals): + yield jinja2.utils.Namespace(zip(keys, i)) + + def ablation_hparams(_map=None, *, caartesian_keys: list[str] = None, **kw: dict[str, list]) -> Iterable[jinja2.utils.Namespace]: + "Use this to bypass the common error 'SyntaxError: too many statically nested blocks'" + if isinstance(_map, jinja2.utils.Namespace): + kw = _map._Namespace__attrs | kw + elif isinstance(_map, dict): + kw = _map._Namespace__attrs | kw + keys = list(kw.keys()) + + caartesian_keys = [k for k in keys if k in caartesian_keys] if caartesian_keys else [] + ablation_keys = [k for k in keys if k not in caartesian_keys] + caartesian_vals = list(map(kw.__getitem__, caartesian_keys)) + ablation_vals = list(map(kw.__getitem__, ablation_keys)) + + for base_vals in itertools.product(*caartesian_vals): + base = list(itertools.chain(zip(caartesian_keys, base_vals), zip(ablation_keys, [i[0] for i in ablation_vals]))) + yield jinja2.utils.Namespace(base) + for ablation_key, ablation_val in zip(ablation_keys, ablation_vals): + for val in ablation_val[1:]: + yield jinja2.utils.Namespace(base, **{ablation_key: val}) # ablation variation + + return { + **locals(), + **vars(builtins), + "argv": sys.argv, + "raise": _raise, + } + +def make_jinja_env(globals = make_jinja_globals(enable_require_defined=True), allow_undef=False) -> jinja2.Environment: + env = jinja2.Environment( + loader = jinja2.FileSystemLoader([os.getcwd(), "/"], followlinks=True), + autoescape = False, + trim_blocks = True, + lstrip_blocks = True, + undefined = jinja2.Undefined if allow_undef else jinja2.StrictUndefined, + extensions = [ + "jinja2.ext.do", # statements with side-effects + "jinja2.ext.loopcontrols", # break and continue + ], + ) + env.globals.update(globals) + env.filters.update({ + "defined": lambda x: _raise(f"{x._undefined_name!r} is not defined!") if jinja2.is_undefined(x) else x, + "repr": repr, + "to_json": json.dumps, + "bool": lambda x: json.dumps(bool(x)), + "int": lambda x: json.dumps(int(x)), + "float": lambda x: json.dumps(float(x)), + "str": lambda x: json.dumps(str(x)), + }) + return env + +def list_func_params(func: callable, exclude_list: set[str], defaults: dict={}) -> Iterable[tuple[str, Any, str]]: + signature = inspect.signature(func) + for i, (k, v) in enumerate(signature.parameters.items()): + if not i and k in {"self", "cls"}: + continue + if k in exclude_list: + continue + if k.startswith("_"): + continue + if v.kind is v.VAR_POSITIONAL or v.kind is v.VAR_KEYWORD: + continue + has_default = not defaults.get(k, v.default) is v.empty + has_annotation = not v.annotation is v.empty + allowed_literals = f"{{{', '.join(map(_yaml_encode_value, typing.get_args(v.annotation)))}}}" \ + if typing.get_origin(v.annotation) is Literal else None + + assert has_annotation, f"param {k!r} has no type annotation" + yield ( + k, + defaults.get(k, v.default) if has_default else _UNDEFINED, + f"in {allowed_literals}" if allowed_literals else typing._type_repr(v.annotation), + ) + +@compose("\n".join) +def make_jinja_template( + network_cls: nn.Module, + *, + exclude_list: set[str] = set(), + defaults: dict[str, Any]={}, + top_level: bool = True, + commented: bool = False, + name=None, + comment: Optional[str] = None, + special_encoders: dict[str, Callable[[Any], str]]={}, + ) -> str: + c = "#" if commented else "" + if name is None: + name = network_cls.__name__ + + if comment is not None: + if "\n" in comment: + raise ValueError("newline in jinja template comment is not allowed") + + hparams = [*list_func_params(network_cls, exclude_list, defaults=defaults)] + if not hparams: + if top_level: + yield f"{name}:" + else: + yield f" # {name}:" + return + + + encoded_hparams = [ + (key, _yaml_encode_value(value) if value is not _UNDEFINED else "", comment) + if key not in special_encoders else + (key, special_encoders[key](value) if value is not _UNDEFINED else "", comment) + for key, value, comment in hparams + ] + + ml_key, ml_value = elementwise_max( + ( + len(key), + len(value), + ) + for key, value, comment in encoded_hparams + ) + + if top_level: + yield f"{name}:" if not comment else f"{name}: # {comment}" + else: + yield f" # {name}:" if not comment else f" # {name}: # {comment}" + + for key, value, comment in encoded_hparams: + if key in exclude_list: + continue + pad_key = ml_key - len(key) + pad_value = ml_value - len(value) + + yield f" {c}{key}{' '*pad_key} : {value}{' '*pad_value} # {comment}" + + yield "" + +# helpers: + +def squash_newlines(data: str) -> str: + return re.sub(r'\n\n\n+', '\n\n', data) diff --git a/ifield/utils/__init__.py b/ifield/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ifield/utils/geometry.py b/ifield/utils/geometry.py new file mode 100644 index 0000000..a3e1f69 --- /dev/null +++ b/ifield/utils/geometry.py @@ -0,0 +1,197 @@ +from torch import Tensor +from torch.nn import functional as F +from typing import Optional, Literal +import torch +from .helpers import compose + + +def get_ray_origins(cam2world: Tensor): + return cam2world[..., :3, 3] + +def camera_uv_to_rays( + cam2world : Tensor, + uv : Tensor, + intrinsics : Tensor, + ) -> tuple[Tensor, Tensor]: + """ + Computes rays and origins from batched cam2world & intrinsics matrices, as well as pixel coordinates + cam2world: (..., 4, 4) + intrinsics: (..., 3, 3) + uv: (..., n, 2) + """ + ray_dirs = get_ray_directions(uv, cam2world=cam2world, intrinsics=intrinsics) + ray_origins = get_ray_origins(cam2world) + ray_origins = ray_origins[..., None, :].expand([*uv.shape[:-1], 3]) + return ray_origins, ray_dirs + +RayEmbedding = Literal[ + "plucker", # LFN + "perp_foot", # PRIF + "both", +] + +@compose(torch.cat, dim=-1) +@compose(tuple) +def ray_input_embedding(ray_origins: Tensor, ray_dirs: Tensor, mode: RayEmbedding = "plucker", normalize_dirs=False, is_training=False): + """ + Computes the plucker coordinates / perpendicular foot from ray origins and directions, appending it to direction + """ + assert ray_origins.shape[-1] == ray_dirs.shape[-1] == 3, \ + f"{ray_dirs.shape = }, {ray_origins.shape = }" + + if normalize_dirs: + ray_dirs = ray_dirs / ray_dirs.norm(dim=-1, keepdim=True) + + yield ray_dirs + + do_moment = mode in ("plucker", "both") + do_perp_feet = mode in ("perp_foot", "both") + assert do_moment or do_perp_feet + + moment = torch.cross(ray_origins, ray_dirs, dim=-1) + if do_moment: + yield moment + + if do_perp_feet: + perp_feet = torch.cross(ray_dirs, moment, dim=-1) + yield perp_feet + +def ray_input_embedding_length(mode: RayEmbedding = "plucker") -> int: + do_moment = mode in ("plucker", "both") + do_perp_feet = mode in ("perp_foot", "both") + assert do_moment or do_perp_feet + + out = 3 # ray_dirs + if do_moment: + out += 3 # moment + if do_perp_feet: + out += 3 # perp foot + return out + +def parse_intrinsics(intrinsics, return_dict=False): + fx = intrinsics[..., 0, 0:1] + fy = intrinsics[..., 1, 1:2] + cx = intrinsics[..., 0, 2:3] + cy = intrinsics[..., 1, 2:3] + if return_dict: + return {"fx": fx, "fy": fy, "cx": cx, "cy": cy} + else: + return fx, fy, cx, cy + +def expand_as(x, y): + if len(x.shape) == len(y.shape): + return x + + for i in range(len(y.shape) - len(x.shape)): + x = x.unsqueeze(-1) + + return x + +def lift(x, y, z, intrinsics, homogeneous=False): + """ + + :param self: + :param x: Shape (batch_size, num_points) + :param y: + :param z: + :param intrinsics: + :return: + """ + fx, fy, cx, cy = parse_intrinsics(intrinsics) + + x_lift = (x - expand_as(cx, x)) / expand_as(fx, x) * z + y_lift = (y - expand_as(cy, y)) / expand_as(fy, y) * z + + if homogeneous: + return torch.stack((x_lift, y_lift, z, torch.ones_like(z).to(x.device)), dim=-1) + else: + return torch.stack((x_lift, y_lift, z), dim=-1) + +def project(x, y, z, intrinsics): + """ + + :param self: + :param x: Shape (batch_size, num_points) + :param y: + :param z: + :param intrinsics: + :return: + """ + fx, fy, cx, cy = parse_intrinsics(intrinsics) + + x_proj = expand_as(fx, x) * x / z + expand_as(cx, x) + y_proj = expand_as(fy, y) * y / z + expand_as(cy, y) + + return torch.stack((x_proj, y_proj, z), dim=-1) + +def world_from_xy_depth(xy, depth, cam2world, intrinsics): + batch_size, *_ = cam2world.shape + + x_cam = xy[..., 0] + y_cam = xy[..., 1] + z_cam = depth + + pixel_points_cam = lift(x_cam, y_cam, z_cam, intrinsics=intrinsics, homogeneous=True) + world_coords = torch.einsum("b...ij,b...kj->b...ki", cam2world, pixel_points_cam)[..., :3] + + return world_coords + +def project_point_on_ray(projection_point, ray_origin, ray_dir): + dot = torch.einsum("...j,...j", projection_point-ray_origin, ray_dir) + return ray_origin + dot[..., None] * ray_dir + +def get_ray_directions( + xy : Tensor, # (..., N, 2) + cam2world : Tensor, # (..., 4, 4) + intrinsics : Tensor, # (..., 3, 3) + ): + z_cam = torch.ones(xy.shape[:-1]).to(xy.device) + pixel_points = world_from_xy_depth(xy, z_cam, intrinsics=intrinsics, cam2world=cam2world) # (batch, num_samples, 3) + + cam_pos = cam2world[..., :3, 3] + ray_dirs = pixel_points - cam_pos[..., None, :] # (batch, num_samples, 3) + ray_dirs = F.normalize(ray_dirs, dim=-1) + return ray_dirs + +def ray_sphere_intersect( + ray_origins : Tensor, # (..., 3) + ray_dirs : Tensor, # (..., 3) + sphere_centers : Optional[Tensor] = None, # (..., 3) + sphere_radii : Optional[Tensor] = 1, # (...) + *, + return_parts : bool = False, + allow_nans : bool = True, + improve_miss_grads : bool = False, + ) -> tuple[Tensor, ...]: + if improve_miss_grads: assert not allow_nans, "improve_miss_grads does not work with allow_nans" + if sphere_centers is None: + ray_origins_centered = ray_origins #- torch.zeros_like(ray_origins) + else: + ray_origins_centered = ray_origins - sphere_centers + + ray_dir_dot_origins = (ray_dirs * ray_origins_centered).sum(dim=-1, keepdim=True) + discriminants2 = ray_dir_dot_origins**2 - ((ray_origins_centered * ray_origins_centered).sum(dim=-1) - sphere_radii**2)[..., None] + if not allow_nans or return_parts: + is_intersecting = discriminants2 > 0 + if allow_nans: + discriminants = torch.sqrt(discriminants2) + else: + discriminants = torch.sqrt(torch.where(is_intersecting, discriminants2, + discriminants2 - discriminants2.detach() + 0.001 + if improve_miss_grads else + torch.zeros_like(discriminants2) + )) + assert not discriminants.detach().isnan().any() # slow, use optimizations! + + if not return_parts: + return ( + ray_origins + ray_dirs * (- ray_dir_dot_origins - discriminants), + ray_origins + ray_dirs * (- ray_dir_dot_origins + discriminants), + ) + else: + return ( + ray_origins + ray_dirs * (- ray_dir_dot_origins), + ray_origins + ray_dirs * (- ray_dir_dot_origins - discriminants), + ray_origins + ray_dirs * (- ray_dir_dot_origins + discriminants), + is_intersecting.squeeze(-1), + ) diff --git a/ifield/utils/helpers.py b/ifield/utils/helpers.py new file mode 100644 index 0000000..0e119a9 --- /dev/null +++ b/ifield/utils/helpers.py @@ -0,0 +1,205 @@ +from functools import wraps, reduce, partial +from itertools import zip_longest, groupby +from pathlib import Path +from typing import Iterable, TypeVar, Callable, Union, Optional, Mapping, Hashable +import collections +import operator +import re + +Numeric = Union[int, float, complex] +T = TypeVar("T") +S = TypeVar("S") + +# decorator +def compose(outer_func: Callable[[..., S], T], *outer_a, **outer_kw) -> Callable[..., T]: + def wrapper(inner_func: Callable[..., S]): + @wraps(inner_func) + def wrapped(*a, **kw): + return outer_func(*outer_a, inner_func(*a, **kw), **outer_kw) + return wrapped + return wrapper + +def compose_star(outer_func: Callable[[..., S], T], *outer_a, **outer_kw) -> Callable[..., T]: + def wrapper(inner_func: Callable[..., S]): + @wraps(inner_func) + def wrapped(*a, **kw): + return outer_func(*outer_a, *inner_func(*a, **kw), **outer_kw) + return wrapped + return wrapper + + +# itertools + +def elementwise_max(iterable: Iterable[Iterable[T]]) -> Iterable[T]: + return reduce(lambda xs, ys: [*map(max, zip(xs, ys))], iterable) + +def prod(numbers: Iterable[T], initial: Optional[T] = None) -> T: + if initial is not None: + return reduce(operator.mul, numbers, initial) + else: + return reduce(operator.mul, numbers) + +def run_length_encode(data: Iterable[T]) -> Iterable[tuple[T, int]]: + return ( + (x, len(y)) + for x, y in groupby(data) + ) + + +# text conversion + +def camel_to_snake_case(text: str, sep: str = "_", join_abbreviations: bool = False) -> str: + parts = ( + part.lower() + for part in re.split(r'(?=[A-Z])', text) + if part + ) + if join_abbreviations: + parts = list(parts) + if len(parts) > 1: + for i, (a, b) in list(enumerate(zip(parts[:-1], parts[1:])))[::-1]: + if len(a) == len(b) == 1: + parts[i] = parts[i] + parts.pop(i+1) + return sep.join(parts) + +def snake_to_camel_case(text: str) -> str: + return "".join( + part.captialize() + for part in text.split("_") + if part + ) + + +# textwrap + +def columnize_dict(data: dict, n_columns=2, prefix="", sep=" ") -> str: + sub = (len(data) + 1) // n_columns + return reduce(partial(columnize, sep=sep), + ( + columnize( + "\n".join([f"{'' if n else prefix}{i!r}" for i in data.keys() ][n*sub : (n+1)*sub]), + "\n".join([f": {i!r}," for i in data.values()][n*sub : (n+1)*sub]), + ) + for n in range(n_columns) + ) + ) + +def columnize(left: str, right: str, prefix="", sep=" ") -> str: + left = left .split("\n") + right = right.split("\n") + width = max(map(len, left)) if left else 0 + return "\n".join( + f"{prefix}{a.ljust(width)}{sep}{b}" + if b else + f"{prefix}{a}" + for a, b in zip_longest(left, right, fillvalue="") + ) + + +# pathlib + +def make_relative(path: Union[Path, str], parent: Path = None) -> Path: + if isinstance(path, str): + path = Path(path) + if parent is None: + parent = Path.cwd() + try: + return path.relative_to(parent) + except ValueError: + pass + try: + return ".." / path.relative_to(parent.parent) + except ValueError: + pass + return path + + +# dictionaries + +def update_recursive(target: dict, source: dict): + """ Update two config dictionaries recursively. """ + for k, v in source.items(): + if isinstance(v, dict): + if k not in target: + target[k] = type(target)() + update_recursive(target[k], v) + else: + target[k] = v + +def map_tree(func: Callable[[T], S], val: Union[Mapping[Hashable, T], tuple[T, ...], list[T], T]) -> Union[Mapping[Hashable, S], tuple[S, ...], list[S], S]: + if isinstance(val, collections.abc.Mapping): + return { + k: map_tree(func, subval) + for k, subval in val.items() + } + elif isinstance(val, tuple): + return tuple( + map_tree(func, subval) + for subval in val + ) + elif isinstance(val, list): + return [ + map_tree(func, subval) + for subval in val + ] + else: + return func(val) + +def flatten_tree(val, *, sep=".", prefix=None): + if isinstance(val, collections.abc.Mapping): + return { + k: v + for subkey, subval in val.items() + for k, v in flatten_tree(subval, sep=sep, prefix=f"{prefix}{sep}{subkey}" if prefix else subkey).items() + } + elif isinstance(val, tuple) or isinstance(val, list): + return { + k: v + for index, subval in enumerate(val) + for k, v in flatten_tree(subval, sep=sep, prefix=f"{prefix}{sep}[{index}]" if prefix else f"[{index}]").items() + } + elif prefix: + return {prefix: val} + else: + return val + +# conversions + +def hex2tuple(data: str) -> tuple[int]: + data = data.removeprefix("#") + return (*( + int(data[i:i+2], 16) + for i in range(0, len(data), 2) + ),) + + +# repr shims + +class CustomRepr: + def __init__(self, repr_str: str): + self.repr_str = repr_str + def __str__(self): + return self.repr_str + def __repr__(self): + return self.repr_str + + +# Meta Params Module proxy + +class MetaModuleProxy: + def __init__(self, module, params): + self._module = module + self._params = params + + def __getattr__(self, name): + params = super().__getattribute__("_params") + if name in params: + return params[name] + else: + return getattr(super().__getattribute__("_module"), name) + + def __setattr__(self, name, value): + if name not in ("_params", "_module"): + super().__getattribute__("_params")[name] = value + else: + super().__setattr__(name, value) diff --git a/ifield/utils/loss.py b/ifield/utils/loss.py new file mode 100644 index 0000000..cdc2237 --- /dev/null +++ b/ifield/utils/loss.py @@ -0,0 +1,590 @@ +from abc import abstractmethod, ABC +from dataclasses import dataclass, field, fields, MISSING +from functools import wraps +from matplotlib import pyplot as plt +from matplotlib.artist import Artist +from tabulate import tabulate +from torch import nn +from typing import Optional, TypeVar, Union +import inspect +import math +import pytorch_lightning as pl +import typing +import warnings + + +HParamSchedule = TypeVar("HParamSchedule", bound="HParamScheduleBase") +Schedulable = Union[HParamSchedule, int, float, str] + +class HParamScheduleBase(ABC): + _subclasses = {} # shared reference intended + def __init_subclass__(cls): + if not cls.__name__.startswith("_"): + cls._subclasses[cls.__name__] = cls + + _infix : Optional[str] = field(init=False, repr=False, default=None) + _param_name : Optional[str] = field(init=False, repr=False, default=None) + _expr : Optional[str] = field(init=False, repr=False, default=None) + + def get(self, module: nn.Module, *, trainer: Optional[pl.Trainer] = None) -> float: + if module.training: + if trainer is None: + trainer = module.trainer # this assumes `module` is a pl.LightningModule + value = self.get_train_value( + epoch = trainer.current_epoch + (trainer.fit_loop.epoch_loop.batch_progress.current.processed / trainer.num_training_batches), + ) + if trainer.logger is not None and self._param_name is not None and self.__class__ is not Const and trainer.global_step % 15 == 0: + trainer.logger.log_metrics({ + f"HParamSchedule/{self._param_name}": value, + }, step=trainer.global_step) + return value + else: + return self.get_eval_value() + + def _gen_data(self, n_epochs, steps_per_epoch=1000): + global_steps = 0 + for epoch in range(n_epochs): + for step in range(steps_per_epoch): + yield ( + epoch + step/steps_per_epoch, + self.get_train_value(epoch + step/steps_per_epoch), + ) + global_steps += steps_per_epoch + + def plot(self, *a, ax: Optional[plt.Axes] = None, **kw) -> Artist: + if ax is None: ax = plt.gca() + out = ax.plot(*zip(*self._gen_data(*a, **kw)), label=self._expr) + ax.set_title(self._param_name) + ax.set_xlabel("Epoch") + ax.set_ylabel("Value") + ax.legend() + return out + + def assert_positive(self, *a, **kw): + for epoch, val in self._gen_data(*a, **kw): + assert val >= 0, f"{epoch=}, {val=}" + + @abstractmethod + def get_eval_value(self) -> float: + ... + + @abstractmethod + def get_train_value(self, epoch: float) -> float: + ... + + def __add__(self, rhs): + for cls in self._subclasses.values(): + if cls._infix == "+": + return cls(self, rhs) + return NotImplemented + + def __radd__(self, lhs): + for cls in self._subclasses.values(): + if cls._infix == "+": + return cls(lhs, self) + return NotImplemented + + def __sub__(self, rhs): + for cls in self._subclasses.values(): + if cls._infix == "-": + return cls(self, rhs) + return NotImplemented + + def __rsub__(self, lhs): + for cls in self._subclasses.values(): + if cls._infix == "-": + return cls(lhs, self) + return NotImplemented + + def __mul__(self, rhs): + for cls in self._subclasses.values(): + if cls._infix == "*": + return cls(self, rhs) + return NotImplemented + + def __rmul__(self, lhs): + for cls in self._subclasses.values(): + if cls._infix == "*": + return cls(lhs, self) + return NotImplemented + + def __matmul__(self, rhs): + for cls in self._subclasses.values(): + if cls._infix == "@": + return cls(self, rhs) + return NotImplemented + + def __rmatmul__(self, lhs): + for cls in self._subclasses.values(): + if cls._infix == "@": + return cls(lhs, self) + return NotImplemented + + def __truediv__(self, rhs): + for cls in self._subclasses.values(): + if cls._infix == "/": + return cls(self, rhs) + return NotImplemented + + def __rtruediv__(self, lhs): + for cls in self._subclasses.values(): + if cls._infix == "/": + return cls(lhs, self) + return NotImplemented + + def __floordiv__(self, rhs): + for cls in self._subclasses.values(): + if cls._infix == "//": + return cls(self, rhs) + return NotImplemented + + def __rfloordiv__(self, lhs): + for cls in self._subclasses.values(): + if cls._infix == "//": + return cls(lhs, self) + return NotImplemented + + def __mod__(self, rhs): + for cls in self._subclasses.values(): + if cls._infix == "%": + return cls(self, rhs) + return NotImplemented + + def __rmod__(self, lhs): + for cls in self._subclasses.values(): + if cls._infix == "%": + return cls(lhs, self) + return NotImplemented + + def __pow__(self, rhs): + for cls in self._subclasses.values(): + if cls._infix == "**": + return cls(self, rhs) + return NotImplemented + + def __rpow__(self, lhs): + for cls in self._subclasses.values(): + if cls._infix == "**": + return cls(lhs, self) + return NotImplemented + + def __lshift__(self, rhs): + for cls in self._subclasses.values(): + if cls._infix == "<<": + return cls(self, rhs) + return NotImplemented + + def __rlshift__(self, lhs): + for cls in self._subclasses.values(): + if cls._infix == "<<": + return cls(lhs, self) + return NotImplemented + + def __rshift__(self, rhs): + for cls in self._subclasses.values(): + if cls._infix == ">>": + return cls(self, rhs) + return NotImplemented + + def __rrshift__(self, lhs): + for cls in self._subclasses.values(): + if cls._infix == ">>": + return cls(lhs, self) + return NotImplemented + + def __and__(self, rhs): + for cls in self._subclasses.values(): + if cls._infix == "&": + return cls(self, rhs) + return NotImplemented + + def __rand__(self, lhs): + for cls in self._subclasses.values(): + if cls._infix == "&": + return cls(lhs, self) + return NotImplemented + + def __xor__(self, rhs): + for cls in self._subclasses.values(): + if cls._infix == "^": + return cls(self, rhs) + return NotImplemented + + def __rxor__(self, lhs): + for cls in self._subclasses.values(): + if cls._infix == "^": + return cls(lhs, self) + return NotImplemented + + def __or__(self, rhs): + for cls in self._subclasses.values(): + if cls._infix == "|": + return cls(self, rhs) + return NotImplemented + + def __ror__(self, lhs): + for cls in self._subclasses.values(): + if cls._infix == "|": + return cls(lhs, self) + return NotImplemented + + def __ge__(self, rhs): + for cls in self._subclasses.values(): + if cls._infix == ">=": + return cls(self, rhs) + return NotImplemented + + def __gt__(self, rhs): + for cls in self._subclasses.values(): + if cls._infix == ">": + return cls(self, rhs) + return NotImplemented + + def __le__(self, rhs): + for cls in self._subclasses.values(): + if cls._infix == "<=": + return cls(self, rhs) + return NotImplemented + + def __lt__(self, rhs): + for cls in self._subclasses.values(): + if cls._infix == "<": + return cls(self, rhs) + return NotImplemented + + def __bool__(self): + return True + + def __neg__(self): + for cls in self._subclasses.values(): + if cls._infix == "-": + return cls(0, self) + return NotImplemented + + @property + def is_const(self) -> bool: + return False + + + +def parse_dsl(config: Schedulable, name=None) -> HParamSchedule: + if isinstance(config, HParamScheduleBase): + return config + elif isinstance(config, str): + out = eval(config, {"__builtins__": {}, "lg": math.log10}, HParamScheduleBase._subclasses) + if not isinstance(out, HParamScheduleBase): + out = Const(out) + else: + out = Const(config) + out._expr = config + out._param_name = name + return out + + +# decorator +def ensure_schedulables(func): + signature = inspect.signature(func) + module_name = func.__qualname__.removesuffix(".__init__") + + @wraps(func) + def wrapper(*a, **kw): + bound_args = signature.bind(*a, **kw) + + for param_name, param in signature.parameters.items(): + type_origin = typing.get_origin(param.annotation) + type_args = typing.get_args (param.annotation) + + if type_origin is HParamSchedule or (type_origin is Union and (HParamSchedule in type_args or HParamScheduleBase in type_args)): + if param_name in bound_args.arguments: + bound_args.arguments[param_name] = parse_dsl(bound_args.arguments[param_name], name=f"{module_name}.{param_name}") + elif param.default is not param.empty: + bound_args.arguments[param_name] = parse_dsl(param.default, name=f"{module_name}.{param_name}") + + return func( + *bound_args.args, + **bound_args.kwargs, + ) + return wrapper + +# https://easings.net/ + +@dataclass +class _InfixBase(HParamScheduleBase): + l : Union[HParamSchedule, int, float] + r : Union[HParamSchedule, int, float] + + def _operation(self, l: float, r: float) -> float: + raise NotImplementedError + + def get_eval_value(self) -> float: + return self._operation( + self.l.get_eval_value() if isinstance(self.l, HParamScheduleBase) else self.l, + self.r.get_eval_value() if isinstance(self.r, HParamScheduleBase) else self.r, + ) + + def get_train_value(self, epoch: float) -> float: + return self._operation( + self.l.get_train_value(epoch) if isinstance(self.l, HParamScheduleBase) else self.l, + self.r.get_train_value(epoch) if isinstance(self.r, HParamScheduleBase) else self.r, + ) + + def __bool__(self): + if self.is_const: + return bool(self.get_eval_value()) + else: + return True + + @property + def is_const(self) -> bool: + return (self.l.is_const if isinstance(self.l, HParamScheduleBase) else True) \ + and (self.r.is_const if isinstance(self.r, HParamScheduleBase) else True) + +@dataclass +class Add(_InfixBase): + """ adds the results of two schedules """ + _infix : Optional[str] = field(init=False, repr=False, default="+") + def _operation(self, l: float, r: float) -> float: + return l + r + + +@dataclass +class Sub(_InfixBase): + """ subtracts the results of two schedules """ + _infix : Optional[str] = field(init=False, repr=False, default="-") + def _operation(self, l: float, r: float) -> float: + return l - r + + +@dataclass +class Prod(_InfixBase): + """ multiplies the results of two schedules """ + _infix : Optional[str] = field(init=False, repr=False, default="*") + def _operation(self, l: float, r: float) -> float: + return l * r + @property + def is_const(self) -> bool: # propagate identity + l = self.l.get_eval_value() if isinstance(self.l, HParamScheduleBase) and self.l.is_const else self.l + r = self.r.get_eval_value() if isinstance(self.r, HParamScheduleBase) and self.r.is_const else self.r + return l == 0 or r == 0 or super().is_const + + +@dataclass +class Div(_InfixBase): + """ divides the results of two schedules """ + _infix : Optional[str] = field(init=False, repr=False, default="/") + def _operation(self, l: float, r: float) -> float: + return l / r + + +@dataclass +class Pow(_InfixBase): + """ raises the results of one schedule to the other """ + _infix : Optional[str] = field(init=False, repr=False, default="**") + def _operation(self, l: float, r: float) -> float: + return l ** r + + +@dataclass +class Gt(_InfixBase): + """ compares the results of two schedules """ + _infix : Optional[str] = field(init=False, repr=False, default=">") + def _operation(self, l: float, r: float) -> float: + return l > r + + +@dataclass +class Lt(_InfixBase): + """ compares the results of two schedules """ + _infix : Optional[str] = field(init=False, repr=False, default="<") + def _operation(self, l: float, r: float) -> float: + return l < r + + +@dataclass +class Ge(_InfixBase): + """ compares the results of two schedules """ + _infix : Optional[str] = field(init=False, repr=False, default=">=") + def _operation(self, l: float, r: float) -> float: + return l >= r + + +@dataclass +class Le(_InfixBase): + """ compares the results of two schedules """ + _infix : Optional[str] = field(init=False, repr=False, default="<=") + def _operation(self, l: float, r: float) -> float: + return l <= r + + +@dataclass +class Const(HParamScheduleBase): + """ A way to ensure .get(...) exists """ + + c : Union[int, float] + + def get_eval_value(self) -> float: + return self.c + + def get_train_value(self, epoch: float) -> float: + return self.c + + def __bool__(self): + return bool(self.get_eval_value()) + + @property + def is_const(self) -> bool: + return True + +@dataclass +class Step(HParamScheduleBase): + """ steps from 0 to 1 at `epoch` """ + + epoch : float + + def get_eval_value(self) -> float: + return 1 + + def get_train_value(self, epoch: float) -> float: + return 1 if epoch >= self.epoch else 0 + +@dataclass +class Linear(HParamScheduleBase): + """ linear from 0 to 1 over `n_epochs`, delayed by `offset` """ + + n_epochs : float + offset : float = 0 + + def get_eval_value(self) -> float: + return 1 + + def get_train_value(self, epoch: float) -> float: + if self.n_epochs <= 0: return 1 + return min(max(epoch - self.offset, 0) / self.n_epochs, 1) + +@dataclass +class EaseSin(HParamScheduleBase): # effectively 1-CosineAnnealing + """ sinusoidal ease in-out from 0 to 1 over `n_epochs`, delayed by `offset` """ + + n_epochs : float + offset : float = 0 + + def get_eval_value(self) -> float: + return 1 + + def get_train_value(self, epoch: float) -> float: + x = min(max(epoch - self.offset, 0) / self.n_epochs, 1) + return -(math.cos(math.pi * x) - 1) / 2 + +@dataclass +class EaseExp(HParamScheduleBase): + """ exponential ease in-out from 0 to 1 over `n_epochs`, delayed by `offset` """ + + n_epochs : float + offset : float = 0 + + def get_eval_value(self) -> float: + return 1 + + def get_train_value(self, epoch: float) -> float: + if (epoch-self.offset) < 0: + return 0 + if (epoch-self.offset) > self.n_epochs: + return 1 + x = min(max(epoch - self.offset, 0) / self.n_epochs, 1) + return ( + 2**(20*x-10) / 2 + if x < 0.5 else + (2 - 2**(-20*x+10)) / 2 + ) + +@dataclass +class Steps(HParamScheduleBase): + """ Starts at 1, multiply by gamma every n epochs. Models StepLR in pytorch """ + step_size: float + gamma: float = 0.1 + + def get_eval_value(self) -> float: + return 1 + def get_train_value(self, epoch: float) -> float: + return self.gamma**int(epoch / self.step_size) + +@dataclass +class MultiStep(HParamScheduleBase): + """ Starts at 1, multiply by gamma every milstone epoch. Models MultiStepLR in pytorch """ + milestones: list[float] + gamma: float = 0.1 + + def get_eval_value(self) -> float: + return 1 + def get_train_value(self, epoch: float) -> float: + for i, m in list(enumerate(self.milestones))[::-1]: + if epoch >= m: + return self.gamma**(i+1) + return 1 + +@dataclass +class Epoch(HParamScheduleBase): + """ The current epoch, starting at 0 """ + + def get_eval_value(self) -> float: + return 0 + def get_train_value(self, epoch: float) -> float: + return epoch + +@dataclass +class Offset(HParamScheduleBase): + """ Offsets the epoch for the subexpression, clamped above 0. Positive offsets makes it happen later """ + expr : Union[HParamSchedule, int, float] + offset : float + + def get_eval_value(self) -> float: + return self.expr.get_eval_value() if isinstance(self.expr, HParamScheduleBase) else self.expr + def get_train_value(self, epoch: float) -> float: + return self.expr.get_train_value(max(epoch - self.offset, 0)) if isinstance(self.expr, HParamScheduleBase) else self.expr + +@dataclass +class Mod(HParamScheduleBase): + """ The epoch in the subexptression is subject to a modulus. Use for warm restarts """ + + modulus : float + expr : Union[HParamSchedule, int, float] + + def get_eval_value(self) -> float: + return self.expr.get_eval_value() if isinstance(self.expr, HParamScheduleBase) else self.expr + def get_train_value(self, epoch: float) -> float: + return self.expr.get_train_value(epoch % self.modulus) if isinstance(self.expr, HParamScheduleBase) else self.expr + + +def main(): + import sys, rich.pretty + if not sys.argv[2:]: + print(f"Usage: {sys.argv[0]} n_epochs 'expression'") + print("Available operations:") + def mk_ops(): + for name, cls in HParamScheduleBase._subclasses.items(): + if isinstance(cls._infix, str): + yield (cls._infix, f"(infix) {cls.__doc__.strip()}") + else: + yield ( + f"""{name}({', '.join( + i.name + if i.default is MISSING else + f"{i.name}={i.default!r}" + for i in fields(cls) + )})""", + cls.__doc__.strip(), + ) + rich.print(tabulate(sorted(mk_ops()), tablefmt="plain")) + else: + n_epochs = int(sys.argv[1]) + schedules = [parse_dsl(arg, name="cli arg") for arg in sys.argv[2:]] + ax = plt.gca() + print("[") + for schedule in schedules: + rich.print(f" {schedule}, # {schedule.is_const = }") + schedule.plot(n_epochs, ax=ax) + print("]") + plt.show() + +if __name__ == "__main__": + main() diff --git a/ifield/utils/operators/__init__.py b/ifield/utils/operators/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ifield/utils/operators/diff.py b/ifield/utils/operators/diff.py new file mode 100644 index 0000000..8f2b194 --- /dev/null +++ b/ifield/utils/operators/diff.py @@ -0,0 +1,96 @@ +import torch +from torch.autograd import grad + + +def hessian(y: torch.Tensor, x: torch.Tensor, check=False, detach=False) -> torch.Tensor: + """ + hessian of y wrt x + y: shape (..., Y) + x: shape (..., X) + return: shape (..., Y, X, X) + """ + assert x.requires_grad + assert y.grad_fn + + grad_y = torch.ones_like(y[..., 0]).to(y.device) # reuse -> less memory + + hess = torch.stack([ + # calculate hessian on y for each x value + torch.stack( + gradients( + *(dydx[..., j] for j in range(x.shape[-1])), + wrt=x, + grad_outputs=[grad_y]*x.shape[-1], + detach=detach, + ), + dim = -2, + ) + # calculate dydx over batches for each feature value of y + for dydx in gradients(*(y[..., i] for i in range(y.shape[-1])), wrt=x) + ], dim=-3) + + if check: + assert hess.isnan().any() + return hess + +def laplace(y: torch.Tensor, x: torch.Tensor) -> torch.Tensor: + return divergence(*gradients(y, wrt=x), x) + +def divergence(y: torch.Tensor, x: torch.Tensor) -> torch.Tensor: + assert x.requires_grad + assert y.grad_fn + return sum( + grad( + y[..., i], + x, + torch.ones_like(y[..., i]), + create_graph=True + )[0][..., i:i+1] + for i in range(y.shape[-1]) + ) + +def gradients(*ys, wrt, grad_outputs=None, detach=False) -> list[torch.Tensor]: + assert wrt.requires_grad + assert all(y.grad_fn for y in ys) + if grad_outputs is None: + grad_outputs = [torch.ones_like(y) for y in ys] + + grads = ( + grad( + [y], + [wrt], + grad_outputs=y_grad, + create_graph=True, + )[0] + for y, y_grad in zip(ys, grad_outputs) + ) + if detach: + grads = map(torch.detach, grads) + + return [*grads] + +def jacobian(y: torch.Tensor, x: torch.Tensor, check=False, detach=False) -> torch.Tensor: + """ + jacobian of `y` w.r.t. `x` + + y: shape (..., Y) + x: shape (..., X) + return: shape (..., Y, X) + """ + assert x.requires_grad + assert y.grad_fn + + y_grad = torch.ones_like(y[..., 0]) + jac = torch.stack( + gradients( + *(y[..., i] for i in range(y.shape[-1])), + wrt=x, + grad_outputs=[y_grad]*x.shape[-1], + detach=detach, + ), + dim=-2, + ) + + if check: + assert jac.isnan().any() + return jac diff --git a/ifield/viewer/__init__.py b/ifield/viewer/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ifield/viewer/assets/texturify_pano-1-4.jpg b/ifield/viewer/assets/texturify_pano-1-4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c2abbc77e1982cbe426b39cb4c967e67e8566b3d GIT binary patch literal 966126 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 z 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 qe{5HxrM8tOP2^>4=N3Q!06+Fv*D`P`r>&znmP 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 z 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
  • D=ymvdD- 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 z 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�ojBocrOLc8 z!@r)jCC^1U609c1T{&o%(XD&YwRcOSUSfEQTZY4Lhc9_MyK+yym|N*N?b5X??_XM! zR5JVs-8os@{^`^Gzjcbb3pTND&y@1flY8{=g}>0^V~hV~ol=ZBZ7}ucZvU@uuQ+9$ z@~z=Gd_>~pvwcZxmn4asOmcn1UT3<}{?)&8-V&R06Y`EcP5AgpTJv?h%!ypLe-SYq z>U-Pv3qEl8#(Mpq*@-7FZnD)Xe+n?#ox`a0StEYM)QL?+rH}lJzpea{(0DifWW#-b zb%CDalP)y)hObn3GI-9R0`V)|39^vutX-l*7lxs{9EbhO#{x;*j`(n%WWPbd+F5k@>#4~mIB)7WIM`B)# zez%j3maaLo_GQSXqP2X7_Mh!=44z^+;R9nYd))19Dod1dW}e!R)n%H&cXh$3XVFUC zofGZzcR}JatPW36B5^f9R`Sw~rc{Ov!cEOZ7juTg3Fs^)kZ+^Op zguonq6ULPrUt~^ey6CyAeZjWns@xnGN|Wp#DI0xwWPE>d=WK(vGmlU23vZMBv70So zc~94cNnYBu)6Pz_YCCxS%*S_;pMJ)BUp4iL7nz~Mps&DpXUV_1nVhpS+So!{$ z|3n>=&Lg)^skLwhT$T-UK5Y^zxmttpF!JtO_dcx*Ta&cvzaWj=3K6OBIm-yn!UkJ z{!L%_Y%d>5uWeOrrH*D`O%$2`2v8jJ%*}t8VXIvul zdUB`!G&=R`%ip9Vp_Bmb5`~qFRdv_pf9^JoIE|YQ*BdzO$#b~ zwbcJ{t7EcN%`@J#YhgD`Mdr`f_~==clEW5pVPEq)5woz}DKoZQyiybWXxr5L>&4eQ zUY3fE5Y61NPIS}8hb>e^NsDNEolx*Q_-D-U`d~*)qMTy z?*3;e%{Tndkl^qqb6So>;gsiIpQf!{a#n6>nNLlO2G`>&_c#4r;^+ME$xY#)8wy_A zb=<=<&R#iYs%U8taBK_P zUNE2BTqS>MeTdbGFBAe|`&vdvlHU96n!ynGn?3sCBuU}+h{FX2BhBMww z;k`TS`ka&gU)#SP_G+(<_U~J`tcU+=<6#dcz1_=@62U01;sA*xzw00yZim5%bSaO8SQ@U6YZ`Z&REtF zKToUi>X#$?8jfkmZB?>OD!WzDy(rm_8P(#f7RAE%g{Dl&iUeA_9`+40MhMG956Zc{NyH?tEwHAk9>_L z+*Rt_+@tV-KW46}$gOK{0(DHOniXT_1tLUG?xzMj~$b^hW=|HDyp%vOn4m8`Ion)tYPRgc+v^+Ssb zuSiNpK{g3^v(@Y&prVCATRk<>6xqvj& zgxZzU%%c7|JXq%2!!xnqZ%<^~o&2s9r@w7j`2YInUvrL>dvD^}!S_RSL!oyv*LJ@f zt4ogR2Ip{;8iogR$@=eS+Wj?Y-O*^!82B2kH$iVW@|kvvmT8vn)5zx9?xXc4^y<;r zuI-I{%S1~xyLJSN=8No_a%kvSlcfXdSi96%G!rveJs|ZSu<9*Y27tg9eQBh(!%gy5fk&dR%zT$UPN`ZifR z%sPZCy(Y^Ex`cAk_H zo;5$q{_FlWq04;PjLZFYM2Eh&zvud&p{Mg#pU0=n{%gw|mm2XoM@{>-v3~8Jf_c8o zuR?gYv3-w~zq9_=>0jrBPpi+qcJl zmCru)3$+iAP5Arb-^$;QrrwF*Ufq$Frno54zxMT%L)AMa3!4P3TI^aMAM;FO$*Y?6 z=d-%aip#BS4BaVKe_ArWaao^L|Knsc$A5vvgQ`=aru@MTw!$61cRv))HAt(Vr$2J@Tkvp7W&83^eaYNMPQ8k_u#%;A+J_US+Rm=i^1n|1r?g{f z=)4^Z+yAAn*R>M-&!8VzFSA7049yRKa63;mbJT5PuGR>kg1um3WK8cL+8MZDr=W{%3UyYcit18;jt&Q8#=TiErJx{#5UO2GjZ@g&V>TPl{hv*=4=g@7Ti_ zLC&N*`{b4cud~)*Vb0lQn;R3daQViQ1*VsB-Vc5L70-m<(?;p?M%L!o6|x%;9Y zo%)tyxNCy@hoimQQX;;uSf+i{r`~U_`wYDmwJ=I_OH`(yZojbkmYU%4d|2=;@SM%>>jsFboZ)ZEmMrxc) z;Wply`MWvx?`>{wm#RfxT+@CyESFJGn6mxMHT#G@qx&3Bs_Iu2v@X;9nH+X4U-OOC zO}qHnzGnKx91z1u1Sktote~IwK2%ycXP6L`p&}7 zDhzcWQyu+pIoS*QR0JM>k#*+$hqwFRrah9_wk~g1)Q-ss{~0z;f93f#ZA?kuj_cO_^;4kY1_pJsSf_%ivJl*lYdrxHgH$0Lb?)@=1NAIS&U3!Ko&d(d}dx$2XsEhhyI2n1X^qhem;>NwH= z&*c7pnTLXfcg^&Yx-9l!dxP?_{|tUQ&2bafdaU24?Yo0%!TV1~JKZzS2$sK$+q)}8 zC9~7zqReJS$Gw^ppB-Hk>2A2c?aSe?sgpG339aA3{!-G;hbvl(CBOfX0^dG{+#e~; zc3C>B)?Vfk{BUEsql35X6~^uR!Ziau?s9EWUwCpM=ZcrbclWOpSu51QxU}5PTJ%&p zQ>C2PjZ-^Y76)yqwKADj-Bzk6{)j!v(e%#twqTtUZq*GwvMXg1Gq!Kyx-05uvs2^# zN;$im9FL8}xPCO``c!}Bsu22i>=Ng_2ZxSW8z?p2lSdB zTgnpTGACr`x(8Pp?597UVflootZbI1m&-?&$N#qT|30TayK+wbjw|5J02iKV{Hi}! zZn1BDGykbMM^Crv9a`1QCHmkbo9dUe?b%iTV&=>g41VSEkzumGzq!5@p}@Sg|s z*VNQW??YNYtnXv>uz9PH%_=ACR{mk-X@#Z}GEGOA*khUkz9%f}cO zgZGvCYxP&f0z3YF*p~K-`JzdfcD{g!{BHTfM%^8}x>qB_8ifD7jop{H!D!3&z^a?^ zUAf`*A39qU=K21Nipnf|64V$q|ATL@fl;zt&5u@hzuXy8)2;nhKY7{oqC9iI(xu>k zj74|#FC7m2%I5g=^`l)m+zuIY|K-kfi0-uQdOf%5p8k8)UjGKA{RK~oVrHo9y8G+Z z1nKP3Xjl&&u7$~D7w?5 z-P}2yd-jQK_g4J6Z1eWcMoW=q@4RFEi{8vpC!PYF3N|R@s_(XD;JMXK+1gu;i<6;usF)>rI%PDH_ zj=4LY26jH$uH8{^Jxu+ldx7HR)BMj1zkfXG6Pe^IR-zLATb((||5?dX8RehLnBRLE z2|u~nKl`lPV$-cp4;{@{`6|$Spuert|JJE5msa2IJaOgN>pGEpkG^pmL_Krush@Hn z?Z^qfJeDMX_4rqrX?LEil;>u!VOFhw5A{R#4~=G~PJDIC(51vV$5D5u zouzlS)+hbw{vSu!|4eO{`0TRN;B27B48cFm%6y)a*drHg^Z$DO)nPrKjm617gXisj z+7)(PG~&3Z(~0{M7Ez~`oMT+(vPji+>D$IxKNe1N-mu`<#f<+9ejds^X9LRaE6on; z+$X5s=i}NqY1>kXFV{O?6-?E+?)7Kmb}!S{Th>0X6aCLHYyTt5=`zf#n{|#aHo3fK zXKvb_+(!||e=4=Vv@KR}VV5{FC39;;t84a;WRESYLq9E>y)w*u#o|oGaqFdK{?qS|w%CWJsoyz%+IW$c zp2*XpAA8b{)Wo}G%g%mr{`70j`or6N&bk^3F^K$K_IKUR?MG@AuRQzJm2P4pBAKac z(i#xBN$lLb*q^&CYTfQ?2W`mHzO?3Uv2Z}8<*dT9of-cBp1d_*{yw<=o3r70K-#gp30-X2|8l*a8kyZu_K=<)YAU_)<X-T?^?<&d7!n% z*ZM)IsV>TvD2?PBK2w2zt5cctl~3r&k( zu5&eO+|#$jm1Ci;-?L_=6UuLLA9q=8wUnEk$e}T5|0xFBb0Ug*4;8(4GL&1!G#dn% zaU`(5-2E>5_Q9gvX->L&b60!u@8=h?2wApcqE)a`$}A^uVZVc^%ejR8<#~EHMas<( zTUw+uz1DR~jlGA3=uWLw-nyFiIh?~X6+`1fZteXw_ft;jzvYV7=KGy{b=TzD#h!Jv z_u~`YYVDmTu6wSf?wRs&W_mc_xX(3Ap=kCeK4F2Xb?YYy>}O+n z^x(l%&lu0xkJ~ek+{_W%wqaK3eUYeRiQPg=RKCP`80@$iaxX7j>mQ5EgaYqyt{(1y z`k5!UDr!D#)RuU(n)4`c=$79vha4!30~I-pA`)2 z{u%`3GOx71CfxOvZD)#ElJAm*)iQgVO)lq2<~$NvpzZtn8PCt@dg>|p0_+Nze|K`H zdihk;I9H_{7LvRBlshng`GLJ>68q2YGycyYbatJ^h0>kAC+$U+d9JOxy?bGSouE&q z*m9Me`5A&uGd1j3mTX`CcFs}Vhw@9@kDcZ3^}pvAEx4Ka?6#*)tQB9E=d9Tjn802& zKWEK0R`dF&A}7SWVm7fD73MVZObyFzSa4(hyq`=$$Lh`BhP^&L$>-R5=_T`(q%YZj z@Ko~_HxZxyl4aQh6({G5EB$Wwekyv_aH3}GYVHNP>l!BBsA1hxKW*{P&2o;XUYxC& zzdZWRafXSr6`6tL-!_u2jFm+RXVr-eKgUvu;3U7aLNi(?@HBG&v#t;H-y zr?-XOJ6Ogj6szK4HEHqJc@|gI4_BJcc{^)!oaJ+qkk!p6tR}nK?0!~fd~xx_W!!Fy zrkPq6n{6@6cs?uPPE1fs?wtn{wstN{UGj6$O@XCfHkr%~S*&^c&l3B!MV(3NlPgYG zZ7+PDtLC(D?b*Zpn^dy?GqA@n3(5xSG%ShQwlsUiiA(PMSFcVf49Hs0RR1vgpSV%- z=Du@UO5*jc9QJ%Hm%__6y3zzSl(U4)ml}vAN-mGx zyeCkARcb-+toCp9SO2bARx>+E@@@OmujjTd-+T5*V@yc&;t9MC&$8pYzxPzE|GfWj z6WcT&v0G;!w|)5dFJf1I(4T$sKSihAj?y(b@o1;#g!!A+{yVYaiQS*xRZF@LIjoLT zke{d$K8-bGO2~!(3}$XuOAKlfn(u@Q1p6+rd6IZNp~iZfk_ny`7<<335=(2DIFmq|xC-#wBr({s7lf`zYx@2hZ^gqmdA2^vq5 zoH6VDrFlPY^K>rhI92gcfp1~C=*Q)K0#Q<1Kl4mm;4UF;X#MOx%a3H&YiY-i8$T;;v5&)?{JnQletAn=pH@E4ZBPHiqNwFN z)%L8O*UK}}@W!5>jUFZ|RD@R*u-<6UvOSjk`~-{VKHnP;a;Nw{&0Mf`&y;yul4Z6W z>fh>TTL`Zdns)A&#p_vTmHj8bE^89id3C};&h*KRqEnBYGnw?g;#E%yh#P9_uvy#+ zWnjA-xFk<|TV@fb#7&vm8-19L?>Am>X-mYT-P`hmyj!#-c%wv@Yf3-;7ykCaC7;vj z8qW=$e9R3GjQq#3Q_S?)**iaYZo1iex7tjbTWRcMbnTmqj@_yHW9R=E?b&S8oF~z> z>5ROqq5CV*U)mFdY=af$I%UuP;kwt|WFB?lTGQ5?6MQn0E#E3tTgr*)Eam3pk>$N&Sn%YG+@3yX>vhskOlDaq@*P@B4+rxlB{?MgO?jWIW6{_uyJr z{muF`?<4L^my7ORf2YhZWg#%>L}X`*iM{^oNsoCdLL{fn*5*IXFW}A@I4PAS!0o<<=|j2x-5mUuL#ti%76v^k0ix>vZN;Hhy`W?VUC^nW2qsNy*QLTY}DJpZR#h z)#IP$ozUvWf7`fIlylr(pOu=f-&Xeh5S7nFq zYLt(x57EE5Lb~=Qv)Dnc_~d7MgT4DNY@K|$Yv~GxS9KK~mnLT&|I8n0|L)g+h7IvQ zm-BOpEdP9LsXhPN9g|cNj#f0r-?UGu*EZv0O}aI6v9aEr8FNlHW=@JTKP|B?D16~j zlQ|jN=ghy9ZaD2nB|r0T-GBZ%Q@kZvzDIu!xqeJ@>BjAzNl#^ZMMJ!IZ9gvcce+g7 zo%-|BW^Vnk@wMdHt+!*m^IvJRGirq}`#<{~zx(NF#VpsBy|2od6}&Twn%LN~okd?Z z2FuExC_27WbLvS&lghuFM5fN$Tb>T21FJ3`xGK|rsQO2W-jNi+k7Vl=<+0aY&!e37GuAH7E}PkYYzsqw@nvQU5#Bkfe>HyRPRzBL zJX0xOW^&)sqca|C&CR(M|6Y6=(}WeX(pgm*LfOCmvsk)pi=9QT$g)J`bs|BBB_slt zg@lVnB_C?9ja$A<+Pgl~PW0Hd>9qlJyOWP>X`gkzV}AdOk^Ktg zWa*^H!%1gN&Mjc5n#KR4W`3)Wjkj0+p2z77at&Wo*uS~m|B(B~C`Lh7Xu{pfW1p%z zRtnAMJ^x4W&6YTTCH)&kZ2^RzBVKU(`}-O;E6YcGqIiI$1x%@DnEG+H9`#=^rjp}T@} zH1b7D4Yb=>Gv>y~NV&k4P;dSxS@vS_Jc*veKt zyBh)beL^=jMoX-YSoJ{rI+tu~Orf{Ch{dCI>$I+k7RnxDEz^1xESk|1y16mxXp}|h zA_Hw71J&%L)tQZ9+kOaa=m||undc&Q)R}CnpK14>;p)_- zlV2X&Fn{LX$PyW!J(qkfF4|50^=aFO*^#q6_S;N&cC2Q?B(9kKC+ha7&r&=Y)xP5B ztiJ*EW%Z~3Nvd@e2XnXXjQalfG5evAzwYXPbeUgA@VbRP(Yf+%YyaQ;$CGU46n+(r zyUDJ2J=*c#$@)0|#o-^d1b3dg)3)9TY~8Yo)r+^yAmt|CyiZ_|H&Q z`|$Yu?~8wJa&o&;PNz9{r3BQQI|{j`)qo`KB1HU z83ej@$19nTc=(3Ha=G0C2;s% zp1O`?7a&XBz_OQ1S&OVGrvaV?2kf`p!*{#Gu3@5tKE5_y+*c)qu3P1abF z5&SpILPNc$WmEj=XZ_WYk^cMtT-oDiV|!Fx^)pBE)3a6gf6r|0FaFP9`svuxdy5;s zEZMsD>uT-AjcRP{Hj|dA3E)od6;`|h*a-4|DVeRcP1+a-t|9!T`gOMrGB@& zKWLo1`SQo2FZPlDRz*K~-yJ-7jT$%?yA|OU?$XY zamjxM=j|-Ai~N6d99g1l>lGsRJcsM%PS&yoA1y8|vEpW4@yh}R z@w#bpuB3a6$+oGLTbh@hVK12f(d4jP#-y~~hy!Y~c{oE>E(A$Rp43lr@)G_rMeE!cc zb*8|!59f=PKH5CLAC<-Gq}2~w|;zFcKlyj z!tD>@pZ+sk1Ic7Kmq&F+-=BVM_P?y-`3D>>|7VE)7v||#zN=Tted}J1hRtCwS1{b& z_OvD7-;ufYU-v&vx!wOdXhq7_J&z8E{%7z?+<2!n>+$vnnoymE8~51etn01GJOAf; z?>|lZY5%tWSu;C+u|B`I=D*p8|1*RZKKc{%FZ%v}25q&4#k^lvI$SI24?Lu+cW2gw z8nqj_-!|mbZ>-m`7oMeNtM;b%&5S?qX8&8A_$Y9he5Y?;c(Z#bpl^bZ1MF7VcYKiHTd7&b<#X-_D5|lf98HYt!k6%k;dB>gEY2? zJh{&=)6!p@l3+da@3#KxY@wJ4j|iitfLU_$Kk4~@i;-42wtBMI=V>cd?|hr+)2h;c zU2Usu^1rZ`Q=UG#-M{|vs`#Y`(ymN0I5Tx(o$8JL*1oH!3P0yfSMx4USg^@>cTLF3 z+;4{bk7r(aRA+y8!JoIuqD$vwil_DoMA=uK$Fp%xcusV9$)?3-~dPxI-@fUspJF8_0V_JDnE=iSf!QrQ%e3HI=jaKYu^$@yO%PLq#)%FLtYP>MAwbY{F*Ujs4{lvgwNK zi|qZ68(1VoRDLyP+^w9y$^CrJd~P|V&+~OXHr$QhJd0Vo|B%kX!+#$Z7uPb*d}%I| z?4;q&xc}m8=H2UFEnJ%|c4#jkGs?v;-g3_uopZ^ENh@PToH*%k+kg7YS?kl>q!&$ zx&4N3uNf^Z;}26_@q}0V?X0sIPrm+bH9oBWV(ZUB#hq=D&(g|!e`u&&;3|vXd|G`` z-_gTw&m0S4*qo9$TYVOXZ%zNj>+b(FC;w9_Wq-s{ahfcIFt)G%#A?KV!>k?O2PwOZ-h^!(Z!% zM7`f)Si3C#$Hvb}5eImc6;*qqmL|K}YX2z`-E4hVbhU$0=V9>{9jvnBr)yAhA1e-edq3bOd;gDk zKM~O{+W#4NZf-q#!fMU^K$qA}3sigAJFQbr2Zb7DM)xFl{7b(6x9dN{+4v8ZvD<>V z{v7^Pe{J$>v%vOUDn)4~D#1tI#&4dIDt5aoD*M>f?@j?564aj?w&klp!h5h~Z5>@-h^T52czRUeu! z9Nho7cde<+NrTmY?CxKAl54UeS>&nj#t@#I^!zZ><;#xk|0tERGFRey!du_pPb4*q zlClG|A2x>E^fXz^=BlT)r|kZ1rKxOB&K}8a)SSDhyW&uI-SWI8-z_UdE|iB^_h_|G zGE-Y{{pE>EA&;1zKYG>h_xZof7_Jqk{O(2{c{HuXCATp|Z;8NaW4WfCLKBuQk6g?j zcmP%i8WD4F6s*KHlcZCn)^sD2J|V>`DRAJI2g^7W`*8cK>r&xLIM;@o5k8 zA5Yn);bpO5+11xwAvcvLHXHC9Uh3|@pJ~ksotOaT%TLVy-Qf&bUn4T@r>=FET=|`A%eUG!+VJe#X!{>wlszHZAz z=_5w}mi=d#wL#3$C1|IVcg~lW`?MAvKQ?1^nI2D#)f83t6Seby#He!3o47V}?az3F&Z@|taep|eYh$m{&*#oM3C*&W7jm>8|MO0{$s9A$_}0<#k81`0Gd%SF zbMZfe;IX-Vx{=bJy3^FR+o*^f^gCtAvQx3=;OvHX+6_CbR_1zSFLeC!==I~X>DMgY z7+jvAw*9rclz+#?o$4YLeL}`LtcC6!J688^-SGYBx?tzO(@$C)SsgQhA@K7r>y%j& zrk+@ucjTedvlIqa>F?@dx*V^}kLs>TseZKTqDS~LmzG73b|+Ll@$g-gyf{kub2S@ytx1|`4yujYAA zced>I`Os;r?esafZKG@B53l;W`J3xEzWLAarr1i-<)=mPk)%^{$wDeVX6u!VUT0)I z3pM1p*vX#2pY>2nAbdiTCv%6b=G18k8&99#bh9I-VP2%Vtd)UP1OLOB3{_G6CNjNo zJ3Vs(iYMqab;~rSZP;qWGvRyqgZ2G?< z?x@tqG68F=8$9i8KU8?wxUZ5s{dwI#H|?s$6K|$=HMZ7WSDD}`a`fN1FVJ{ z&#b>%dOO!kebS|;$L`B8Ry5hq?%vG$pCM3f_VhOezb*Co+hoz&zTobeJtbJct zuxINPZrS}(HBMXqGc=uO+R}P;ZOe9w&tboho!A+0m3>J+c--&B92|K_P9+n1e6oYs9Tb^T|?Hcy^==g;nHj$XQX zXU4;Vmmiv)*pANbjhg>-TbN4Lge1L7J8xf~xQeIm%_UPC|FAdv-_)n`E}HGZu=@Jr z52o^N(orQB{s@YhuHWvvA?nhqs9)_Juj9VRuV-Crwykg3Doy7d7EO~R-KVbASv)DY zoMYO?h4=4lzxgj_O6!hxMQ^=@?XR!9UA48?dE9kvW{8~K&p1EFQ-`&mUFd#yDyB7m zm8;e}=9*s*wk*B1cES_IXBE4yu-VCPj@iXJBX+?}PnMK3Ow*DbtaDqY3EwqpwXgmd zoZ$YraV5(xk1)Nru1OVt&gH&p-SvC(rmKAtD*ac(XZ20x{BXVYimA$fhK{E(>5J2O zKd0_WTdYzwb!T)qV?u)Xgk-Pz-39Z{PV*|7u>QHpk3!BVm(|u+ithR7$nqt-8P5+Ui{;$`HL@GC-5KV(%iE?V^N!t|4!Q)x1#?HvnOBt7pCKX_Ih!V zhP!Iig5;<_wtFn~Z=QR-`7@_Oz16(>04*2Qe?FI|McxkBv!F>Z=G%vKc1@g z4-R-BA99_A|LUJ>)v{~*7R#&@F7}vk;`jv4BTZ9Q*Vx>j{_gYiqnvT)TsAYG?WtdQ z>;AE8+$ss);>(yrUqnCp&!9dnwNNfo?dM)I?UzsX&Wt>yv?%BJvcm??8z$&%=v%at zeZs$dci}8Ud(niXS8WXw&c~d%+$iY2_v9m^yU*<+K7Gy>UoX9VIZN&-PyRPu{~3E{GNotp{HMXE z|K*-J@mSAh6N~H?adY1j>qWocdGdm7otl4cw*B&#tKNE5=TF?4RJBS{H=_Th!k?8b zW=6eCUzcxa?OZF~`E&i@)~>Y8a(@jJ3unyxA++U`P5GhLHvgJ{cge@OcGz({*Bm?= z-hMdi%A}7$?lEF3N=B`ujoxw+a& ztIFFa$lcIXWYg?5DsDIx&Ji?SXZEk6JodgAX3rF}pqCS)e|`Q~7PfqW@?wMk3_W|N z|5=2Tz*V6&5b)v*qi9IsG+_UW%P3RyRvM2ytQU zzjm1ZF>P6?DPatM zHfT+^`npcUG_Y&yhNDqWyLL|#&7Nx*vii*AOSdn}#y0%ke&~e3&sS?t7y7lNHYhCn zwy$KC;<2Z;j(-kZ_|M=oomtvf*XCh*fz!r}lmGJOe{g1O< z^F&ry8y@9mx^m@xV|dxZg>pYa*-O_SmdWQjd1BL4rm3$qzin8;X65(bLE7}@u>6^4 zHawbMoibzXp|#R(Jiyj^7*`HZ- zg1gZ8%<)O(tLwaPo&WeUct&@gP<*HVuTAPl|1)s?RPNu|QfhkkX;f?TjTrAtMb?L9 zZdzGd%R3*xogx@*d2zbH7L9c}vn7`9;V2W?Et=1?d;NLQoCnUJ)7wL@9F2AC+UlcO z#$q*N^~UgE(Ncre{cWH-W+PVtSU5Q~I7On{`HFQn}ofv;(c28w06zi7+ww<$-Z(l*6UGQ$I;lX z-CR3(La!WHxBPC`78}FxaL~xMJJ*)NunpSo%WkYXb~J3h4A<5TiitsdQl^|Jl0tcv+pr@J0LeOCSQS+V&~<*!dDV#>_O z*7*65C;cR^#(xH{{IB(WLdRsLHmvvIx&CUe^7`K&>ekGBa*;2q^yt>G&(-=rU(8JZ zu;cOTADV3I98YA2+P^sI|LmWo@yR9fLECfI?p%HTo&T?szdqGU?eDBv-u*PsQF~c@ zV1k^{hW`w$l9h7Ph19Qw?pvv#SZii8gK>M1-+>et?#da<-1C1{R_Y%1N^RQIU~4*Q zo#vm{ep>h6Y}Rn{n~N+AGze?zc;_f+x~%`tp!VpH-Gs;eYZl~&b{d{4OZ+gO`L8sCZmX&b z$Dho-nQgZxM@!sLdA>AB`Jbf0ZO)STk~O&s1^ld)j3zgP5C2NOX!xuDAm_Q3gj|=G zDO=AZ|Jm}lf-}+1XZjiQ%Qp{8-}bm@q5V-&;qU5sucyrvl${e3$a3*dQQ7RDv)4v3 zEK4-%yR;(zM}F&nhKCz?o|t)iGyfF}UG!@I(iwNptWufMslj&OQhRUhr<$1P9g@n2 zGOaexO)gJ+tMs4YNU&~a#)Q;uvwFmvr*2uPVSBOhZ{(x{U9QYsJLYKJFg+T*43rV} z8dN8(%FkGPB{^fs?yzm%6?^@C4AycgEp-1Z*g26)X~MR-nML+h9quR63}@y_mpUJP z(rfi)|8iNTf48K#exz;?Kg*V4_@BY@r%R^TN-M87Z4P@Ru5h*4?0;A+A1c*vw=Qg2 zxSp3>V8?EOy}k^;ihA|U-iE71RwvhTO$%Aw=;;6E?A~2aeqwWN+`nH=PJcYK zZu4F@*wA}={`{9bH?o3ky*?(`7@M~qP-S29N+(B8WW~zfUCDB!R3ClJbq{@6>A^R)A zclFAbUi`ctj1ua zoZozP&x9+NUjAng+y3gzTk}f~v-T~`H=G!~{#*P(SCo@}qv-%&` z&kU9ypMBLo{p~+P!M6FY=4;*Qu`p1Hd}<|xnNQaUn`C27hJ zk&~$RY*^Hf4}=l)3OC&J6SWfYHaIb! zc_Ai8*jy~peGXHGjsCp zhqi|?c;}u{kTZL-yiuOt_*?zW$6o_^7Fd|+$8EckxP$fLzrM#WP6kKlEB?8r_;sm9 z{ap?AOVP@9JrBOFHGjCRM{eJ&{|ramJUgEqvNyW@SLtZ&I{rUu;gcup)cj|VeJR&+ z_{)}(e}(@U1ael3o82r*6>ljn{uf+-WZ{|X;vfILW&YVze=+GlLr?qHG`ZC;i%Ry~ zOMce>i$f8n;+9yrplZ!jXNGuBbXceJ(To z?<3`P{~7L9q`lMEuUr3l9^=odCf~BF5g}Dme>a;YCqH|V@+;nRZknn!o4w-97(I2N z!)yCaxSx4^pigCHsZ~~y?*?80x!a;Aue-#Z==}P{cV39R$MM$Qg{q%@xHrz2pUU!| z;Ru_F@UGC+ua*b3zxuY(S6PVT2gl2Q8zpilbjn;d`Kw>}_v~b@@5RU21>!`D7i8xx z^K3CxVA*hI7T?|vh3mORKTVrv%KiFu@djhd^}jhbv&&u9%L{%X-`8{P_NQl;tSlxu zxjRH$Hu~}Mu+sHca-mx~T)dcSBd*te)9swPfXgM~rNNQ!S{))fO;hAQ##G$$@O`^@ z5#vNv=QDeL&6ln}=JvO;ckZc!XD8K#DM-aM|I@SoC~~-cvdo>Elg`Q{^&PBB;n}g3 zVZ|hs`H9Uny+vA^0w+1Q`*3FVw`onk>$Nd-Ny6fzz4mdQ{3d@+Ue$f)qMNIAV)3kv zP8=)+S@nn0_DAmE_q=gkSfOUd^JzA(Or$Fl1%7Sv_|y2*fkCGH#*>np7S3{)4?pse zSH1q9VdktY$0imu$Ulji|3m%hOm)N3jh9^vcWym>`uEgdcP@GFyg6gy<)3xuc#4fC zY&+@TX03nK|9AIR+rOUs<79(*WKKDs_;yCza9Um5&R>`Rw7;6H+pctR@(kz7n|EUN zFTXai{)kb-9f>O+yiF24Y*zm<5IV#6{DQzw=0E<)60B1nZ{^~UW_mRx?LR~4;@|eK z)22IGO}X2)THs-~!1NOZhY~J7nV@$0-|tl>9lkl5B8oN*bUX4w0{-aqNcd!4@ zXfpZd_LJ$3>7D6a503lQ@IBh{pP}`~zH9NEA1!Vw9y;n51qaD-} zPL!rz?0(h2$!N>LEK%h0b75(g?V|NROaC*po|N-R+?aUor}xIKbNU_kX@qwji!`_9 z>0NYLJ66eX_n%0nfaa?U1brG=8Rd_wi>Xfe8SXOa6VvNWY^L^FsmnI;~7e)Z+ zJbCA@!~6dXHk)lem8QS?u`hY^tKyKi^L^{0Z{NA|v+4ksij&~Sz3yedIsd)+`A73# zSkA*Q?U7Tey3%de6bQWyEBx)d{}0ED{cavxZ?Q!$jo&;W)w67&^clyTb?&$=t zMIN8FGw{|JtlEEtKlr10dyb}y>g=y;ZQDFM-JO~G=GJ~nYz*GDFT%qq>-nO-{|pyW z-uCJ@xpJR#iahc5_TLy*t% zZZH2nP3JrNSKRBGmHSbiq5g5&-}yguxK{|vM0AH~0VT6SuxXXmcoO=h#QFLiv0e>ic=N>35*ut%(R6}MGA>Pu!f zo;~YZU9WLub*Sj#+|MUg%{fuEj@9w3M#Ri1@4dqBFJoD_xP4NWrP6GHvO`l-dKx#& za6Rvtzv+h1l0;o2NKcj*Dv~teM?6WEfOpkBBICj~y_S{;jHeRiFnp^q*xbv=6|C6P( z-ixX3&1BX$qGq`twBs7{Ke=f-y_ygtmoRH3`}+RFe+m|A23%c{{QZH~rsKh3Dt|2` zO+FqgW7={w{KopFnhs`#0k+5g+`9i^$AZOK+DG0LE>TR`#`t3b|31wSH`l<^9p5BY zHEfr;$#%t*`No$M0w=U;Bimf{zRYF{`{lmzQGMXiz!Q&3el)CjWy2T2&C-0nj44;k z&FkO0{{IY8^RG|lI`W@ECym?oOdexcZx(;y>E8t>BiWWdUAl7K5z%*`n*Tq8)MH6i z<=s5ePEr`wkmpkJWtRLH~-j;VSm}){&*0&szq)_ zXn>r0QsL4NA#<;{O%wK}Chjv?^|IW5i`|>dXrYCNz4ooB?lEa$y~FYT`ciX=fO(k{ z4Y#?h4b5WsRV=Q!=&3`5t0T{r$Nmjvr+S(bSOa$|7;gBPTsA94Ek)#Ukd0O15}j!e zb{8=;>|d{9mQ zn|N*g3!kbbv-AIX*G`^Uct+*XX~C{qo!g~vr)@RtE&3z*UZPhc$B4^dD zQ%qY@t4y-$KJcaR`Kr%ia-J%7U|Lqx*=6&zOO4#$`2A=2V4tnvogj8}EB~3)H)ajZ+;j=xj;wrDK%Mv`IRjsh_KSPtfn9KI#0z74vPiA(XI(p-KlINeI zMbZbB_|Dxjc|*jNjo&2ub?0Rh zTC)9?!u9tDrf%QXmObN&koNhnJt~(NQl?*Yo944ZW7Xn(-eci>IZIF4U$}bk$;z`# z?;kMQ{@pZl+tK!Hs}N0-g#nu3i~j!RnJ|gNJ^HZp3e_^%exEg)au+|fV8}i4S3;=2 z->)z5Sk#5DhqyAC*W6sArqchWZNcviO@|y;JaUqhtrUyx&2$dD{&SxU%fiUTTAcUm zWs=W&r6#MtS7FXND*q>UCLbqf?S{2?ulgNX{>NSWaLTD3$rb+@IKSDS zng3e<&(*0F3*`g@b}l}Ayx^3h+?TU+Hg_J{-+5SqC-twWv|2*YR0VJG^JS-OoTM!n z)675p>%Ou!y(`bb>Fa}qyZ>la_CGsOmlVYDVR7d1Nn2cYUDY$SzA3RK@MHLt$ziq= zvqSs)Z~mQgCO$hlVkSiZ&-L%u-uTxKWh6dv+y3KC0iZiTe$vRyDw~h z>+Cm8r$Ff|bL|2xJl?)c{w^L~zToC@L5?zAFJ90gS8Hdo%eZ}il{Mw0NSXJNPkWzk z)D@oLERfOGF!92Szx%J8Iu|FlD4Hqrpt4Mm0egdFw86yJ^D;MG3Yj^l_)Yij+M5>1Mo%Uy$VHjH z%wKm(;ju_-yWHOF>&849rkpoZ?|JWdn)6}a#{CZt|I0m7bn8UroUV03f{n2!F5h{y z+S4LncX!##uIVqfroeUo^kLT5#jh2-dsj*A}ZB-kD?Z8@PyZc*P1UDxu>$LgVHM3dIJnVI4(~LSB z!&xN2@$}N}%j+}?m6px5P6$2wk?YZFZJ(gkEN;$zH>Rk09pK_^3v2zdj%B+~sBqpL zKbNJ(9?f0fPF?npUa{9~#oM;Ej!RCT{xxCioMQXkwX<*E*O*Y0cXPR^?58EVMm(Wj z;Vf5}_h|&_Wo|gMR?JpQyOmF7Phr@P?-r};=4l@{4pMZyyMLZ~r;ZK`nFU$t`QcR1&;P)N8o5cN~pgYxVc1iuE?FjlE_P0$a9; zmU3DMUF^TlwJxIZ(Ap1ymqm0H%#PQD`o8tN%lD66)LGcs`ATBg(W+q4$U??xX8p?* z+(Z+J1)w# zekv)wak1l?NbjlxOL{bl)&5!NhWrR#=5=*hP@&U3mba}@8e8r>nXv4rIG2drld}72 zOk$lUMcz(Y8nY>!+hEn=9G*j8zaO2X$G_Ppn(3K^$V$&E*G26AU;6y*uCd^q?J-`fR1_I-ge=E;g;<_ zTsKavj{SCM?ZfbJ(K6P;Lu+L;^Jc8xpm-o@+Q+a1N5g|fOnpK(XtqW#)5y6lTJASP zU`umX<|2dDE2}-*(A1M%_sS*(zGbV)1Bg$kh0t8fCFMLNwDt zG&wPJ$)nYUq05;>ZgZ`)6VWsi(QMo)v2f$&gwTWK>s(f)F3*%qA(B z=BmuXr+2-giq$Uc|b{0a$e{C zDQn)mTXXj6*WKr(Jlqx48G76gW$c-`YX6&JCBYp#B8>!XyKvs z#10noxBNeHcDLuwI_7QtpJ7>K)_3#i>$Yw5OxEmu8r18Wv}oPN+*j_W|B0&~PXD=9 zPJwy8)bt;D_qhAlzuH`N?uq%kzC-guQ!M|G{Ik z(l@?6wXW)^s{@`y3x2bUoBM`s!-bi`la(#*wUj69Px;RNNkUV`tMC<{~5~a4{nne z5ZrfGqLcmSdCgthCb2(On&5W)d4tzaYliiUy6zscKi&UNwPBj1rTV>`f6om6t$)4a zbXu*hgx%sF?~=8OWzSaeHS^35Zdhod!O4*C{B7mqkEs_+E$bGY+_NVxevQYIkI$Hz ztZKMpPBizbPjoE!FyVyPhIhRD_l#vc`uv_WRBrOsKR;{h03WIYtlX@3A=UdnZzE=Fj=b<$)^3iqex-pW*+(`=8-q z(TgWS*%loBIe+dhjg=F;qma-3!~f2oqOdCo?kLBrS=BbV-znyE>ox21Idtr1LX$b0lJ*Trh)OU-W7o<6RBb9u+YWq&r$Zq|y~7^LB-`?ui!Y$@4O%%^7U zU3c+}1izg9$4!ZM`*}i^Uj91c-zDw;3>)P?uI9;E+@N82CHU>_uz8H_A8Kq|W#lq6 zXbez`V>&M2vbs;LGR#M7ckfi?||LZ2PGuC-P&9i0OQrsLaCYQ>EO( z7?wCsX8srO_TOnmeQ%31C)0X=wq~vh(AwhXE1HtZQ|G~HDKSy4XvY`dMc2Z%hP=w& zcw6^D=Ev+s{H|9!wtYEL`s1nT`kuZTgAdBbUV5&2C3Cx1BlGbDL;s!yr3-dn*m$RO znRla{5p(D@(KYEkiVQ~;%(3AzjyrL16-#f#LiJSXw;LoZgo<@*Gc!LN-}y55 z{=35mjvxCJRr>LQhW(rU>uk6mFTMWjE+(j<#;pR=!+N6>d-}xr2Gno4@+K+S4z6 zys`e|s=X<_=Z{Kcg<>FV@uuF^33G*_MQ z@1;-A|5?@P9-*KGaF^5!l0&(L8O+CMwx-=q`o)uVRaUtPE3v+hy({%;=f z);=m*`}==?`M2iC)mlBj{+X5MXZ~k+JZt`E!T$_WG6(<3ckh4;F8TTNm`=ef8P}{cqj+ z9^bj#@SmacnVntkPQLSn@fxp+n0O9qUz&3JL(a*M%-x6X#7`IZ|NHe$?_)3i9}O{` zrzQ#rUaOy07Pp-9=A6rG>z}QQ6rR)+oMEs3Wp~}gqMuJ}g2FCy?Ae|!cJWa23rTr_ zRhwUaJf_jbej-UVt2g46`Kh-YwQi!nw%q^N`=8;Fx~lN5J@ucSX=Pon|2WP6M@z-= zS9)=QFXj6mRxR<|YIGyBO~{H zb^XuKYc!`lt1QanomZ^RQLp*Qzdj`2>|0;-Q1eyM?E=l+$-f_Xe*EjMcknCQn*E+` z_fMYp-5Sq6{p-_R`*N-7RvMlWH=Xh?e*Twj{~3~hEjg`laq=SJ^TJ!oUDjO{1WgWv zL?<2p^49n5JE0=6I3DTlcWa&FbiHbHe@8Oi;w`E*U0V4{*2q9lB|3GlYx2fNyZOA< z{(CLI=kdq1ZtqD!b6#KGz5Pl@htuDn{>N87-pxPjuM?=rczk8S{!>ibmmi%pf9s!{ zyW6x%eijP_t@S>WU7j~>!l8*uf0wPylxcj@Wdp~TQ=d?M|nJ*SC)G88NxpY~($+J~0JaZDfnH3~i+o%3#xIer9 z_{%dL4>PBQ8UAcs%I$qZ%ph#zmH!L}&5ZlGb&4LP&U5|rrTkaD_OkL0uPa?!yc+fk zGk*Kea5MGC!o=gJC-t5Ac26`^uvNxk0rLXMDa>stGa@5a$$6_re3QTM5EfzZF*G{$n@69@%QQ(M|LyG{mra=rSV96!{5lQd=oyqxk}ufwWM@`HP2*`{-{5P zFO@8O>Gp5S-Nh}}>%X?$|6sFeXA0vki!+nF`#*}$Y?a!TJGu0UeZ}Fw{#*Yuu$`P> z6ZEe;eVP2F$;bB`&)61jF7{xWpvMdDQWMo;rf8|+MLA60bCZMFPj6myW&TP5|NM8K zll<ICo^v--O0XU)txN0ph`J= z8#N!7kZ!HM&~kZq4y7L?l)pz&|Psw@0Vn!i3xI~AIyT=l@K+dH<8 zJEe72>eGM&)$<>Ag&kLqQ|o?w=gEYQUSF-MIiVXIUbhCEE&nL7NI`DN`)$&$3bkUr z-BB6zA-f?etTyF} z(C(b7-VITgm;-lIN+viTF}(AG@25~C!=8c=jzx`r2P#r?u1#C+yGd(@p{yUv$}G`OA}v(&aTekMzC1G2eN(%Ry|K`?E-q zMwR4#-@gA0eeRv}xl+@sWpC)q=iTKv*_^|%WSQq7n{`#ix&Pw%|71^@c46w>*Pj*t zUi9M6da%qvbywTE>q&hpVoFk1D1SWYGeIMze$$$|u1BITxuPNj_k{XCoIYLFtGa9I z$8RT$Ty)kvT2N;Zu(ViuPmb-zkO=|uf?eUFA73_VyWKTV4Zp@TX|hw>@~7XT|A{A!xvKyU)n7vkrezyo({q^H5m3Pwf+@?ybg@u=qWR zTY}Ho>p%UqZ|zI-w~JT)veW-@T~*EBKaC~-!uL~a1IoXxG-?VlwHAze(ikSc_Qo-# zN>L_J*}j_wp?#5#vPaJpdU^EDU|SxQsCDB0>0cGrRa<`cznrjjTU-BfwtsJDgja3< zbGa+mY}fc+#VuMU{lH7lTGUJOtZkc4*lw-~%^inU2i=`N?RMVm#3g14k17QHmy7J2 zUKMhs{B_smkjER9UrH>Rwn63EdM3u0KV0eC+3x2w<(=D?bw3T7HfMd3z7VXlO_$^9`6CX8GnRxHxQQ)z+jMOT52LsI zVHK`RKlc1y`LlMKb)=>9zu%J|#V`Ig`EPStnx?q04wHD?=fCe~_!M}o7O`m-@p@N# zbJL;gg8r!+uRe>_Vq2i%U~d0p{kJqnX^SQA4(abXUSIV`%4t=7s-67Rk7?^FIm-l( zNw6M0ndvou3+KxB)0l3`P855y{=)moc^qB+GM#Cniyv4`uxp$;?ZBLu*UK*S-?KLO zu$KLgUeXEkqowcGZO^!HYXKMIO6COHPYcZR_RiSWaA$4P@A=nfel8X8`Eq`Zacf^| zMwWZ-9=mHnG2MP8zkSWPO>_Mu^B6L@eid;X(7CeukB}+5{HLNr-mTG7B6nY?SdzJ< zZIY?h*Bw(ntJE0feyfo0{#n4N_n%>--^ma$vls7@dlxh4{b$Iy@+ag+n`D%e^@S&v z_Cj{=nl*L1qS7YY+*`h6K@+E_Vwr5+wdB(_j?2}ok`=QySK3u)Tn>IJDKyQ7r7QZO zqW|H~`RyvE3@x&nPo{RKc6M(_RDAkLT7JJ?&)ehk^yIRV)NK3{CvDs1qqJzk`yI0F zwXYikGd=Sc@Eq;n-}rXhjgy9cr6TgdQ{1-e>Am$_fbYa@36b5JDn;Ml_nbS?;kNqrtuDVU?B90vFW>Q>!M@w@>^$Gad0FdM zMyOgiO%lHUyXb^l?29SQ;#d4NIr<;6P6%J_Cb_Be<~5JJ)@xfW`xd11b=?g0r6CFagQYK}^&lEFzl^kv~@n-oS_dnNXI?Fj}9+|Sh zJR$1&vk5w3cY}=TZ<_z%suw$RCd&DGxlmPurJ=;T=liG3cvSX$rvl^tUyIF@Ws3_^ z?VeOs>Q$aU7T=xkcl*zV8@wq~YQIl@d?}}HyMSpp*L}71e{zp&%~?B7DOdeMzTM*0 z(Rb`lMJ%qF{op@C@5X+u+!@=KcLvP8z3$MW`RkRgdWP*?7n$+$Rm_Gbj#_)q8Z`K; z`DI{qFMD1>eSAhc+5OIaO!TqKfAB2m!5m#i?XfvyZaw(>mO`# z*WeWN$uIG)q6suOHsO<39#wznmXTGrQ-ibuOk zO^@=*%?Mo+>bw2MLq`W+akk~j)0nP>{7Q6Acr@E3^6uZzzX2u=SljzlR|-eU-CH_M z3*L7)aY}bSDiY$oFxl|ay~ST=>}9v#(^LEUKZDsbo5jAZ7LO-7UGoX`UA*2$Ygw{I zuE;yJ9lG4pjP9})Zdos|KS;B8VS8oc&NvVLHx2vSA|zYp>FPalIGeNP-(1eeS5glp zua4w69dG(dY>Fqx1io|TzkfX{Y&v#Y?PAUC+?q#{?n^aqu-S9|X9(R>G&5Pz#>=ks zqF6=UeulqKsx4%%AAdGer|88}=aW_^Qmtx^KZ5#@JyMSHD)mG*6{ zNlJH@PYm^YlllGWf=yww&Q<%r7i&I}XZI)6V@*-s=`THEP8YO%Q|<;_zpX2rZQyJg za

    !GB;#xZUE=0Ww%+9{xg)npR(O-%d#J$Ig>Ob8dlk@^O~3)l`k_@>B6U&#;w_t z1zlIpjNMgoGDz&B?zioSrX5juoU!!KZRw~u1@5*>Ob@r|HWu6$^Vs2kxH}=YPiv|A zt)u+^FMs})w0qhItq;CgR(&%?Q=;tWm*(ncEd467T36-A3XaE{YuEqCnK6@B=%Azu z%M+Ql*NuAXSYx|(uhV)^7!F$6+j(g11Mk(}6T)7%MtwgTQ=r{(H2S`18Ect{MWT0Y zVOX0+;cc#%0_}>`8^Z&V)~$Hm$Ol?9`Tly>j-Jq~C$&qC#@=Vz+O-?Bs<`B+-nXN? ze>QrzvBt28<}VX1)5v+W_CZ*m)>T9Am3})G-U!{p_3+1|_C)WHqtV|EfL0cV2XpP3 z5%9p!yF%a%*Y(q)c{5h`iR_pY@Syr(xNu`^*Y+5#w;xvTe$=+QYX?v0I?y2*QPz*v z9cT~d+IpF5H`CUx9gkL5KM3plA(||swV@|;an~Bt1FI!+Te*A;7J7czsO9~w^C)-Y zlba%|R-Bm9Qa8uWb`$Glwafc=)q{_zh}m-~+kdnFr~cQc4j1^m>3<*m{Etx~Xh3}Z z_r=flALp5o{NzDa`H5|dO3i)<|1;wM(Rq65$s@MzmEsm>t3a+oL z54xD!d%8;K$kL2gT8``wA3UjD_2hs;G@qfe=hW%5J*OG7eCJ!Y@RsG>voiG+-AAOB zf7?tc{VL8i5);-UOG=h&OQ zYMN^v?kSyR^`D{4PFx|+vgmI3-G=e4G8|&!?@}MY<;@f8XwK;!-P@WGB~N*7}s14Q33> zm;Rg{aB=Q@|9KufP5lQh7`*(be=~pUhyM)vZ=M=;sGUyduwFJV{`#|DN2ZI1>@ak2 z>f~I&b>j55`sqT}Gfo)upNY44X_vTZi~+rjB{r@_Um)qbN|mEsr(7;o+-xU*JwNUA%Z!6x4O>si zd|zH!9yICRp}SnGwT@{9-sqRv#h&gzrK+oV(W?!sPt2Py7o^LSAGJ!~XP5D^PMhba ze(6NbJ*<0Lq{(hc#jFpaeB*;!zjAd8+IQ_;`|D@Y-CU`J4l}jchOf`f+|=eJZQ^H> zY8vZwJJ?k`(6vyy&+EQ>%!xifW!EJ~4p&T{dN1qJ&Db+Ku@6HhHnk>cFy7vmcv_J? zJzFNpL1@;?{WGP`?tGNT)BR9^_wP=PXSzX`T_;D@<=t5!AK7I7Jt*Wq!?BwcXCBYh zFZ6qBZ~EnB*<6*5Kh69>YL{n_%3N*a%o)*y1zw&Z_t@Dp# z+qtoHW!xgIJp0EC@;x&Zjx3WD^N4i`yBGge`fExPH_M;ZeY=i+|8@AE!p`3QnMKP_ z*v7atggo7L)yqfw)1g-N7P-Z|Yjp+qd2&T=cFoAmbc$AZwj^;&kd&{S`0tG6FC=bR z1iXLRt^V7?u6M(&OecShh)WABei|OkKFMf5X|42X!=D%a?Fr!I;M}kG<|a$#2Hq0_ zTTIv1UH|l-VRA29jHmdVnkBdLCKlV|cyR5`|MPMmC+{?)yG^(6&VG@+E74i|%$NTR zk+)4P&tBeqK*M;w?(K8GYSP#qN6POI{cWeX+1y{=yM5(4-Mg!!?i`ibxABhf>E(I$ zpVPb*Znjx%Q(s@d=i+~cweo-5d=3{sJo`${HB8EODcimIe{ybu#?CGOEo%6@rs!|d zr4+Y%-#HWPZ={@#aa}O^jNObS+debDF*}%3qw4xOL@WEHe|%N_*@%z&ZPAm@uDHKh z<5&2<>_c30T$WCkIr|KkQ(W%wmw;D`_!HX{#MyO@;YS%h~N)92C5N%<=g< z{iv|Ue+I5i+4YN8=a*e_R@yAIW{K?0+2+g&B}Ip|b1Ki>t%^Be*WBKxQ=_T5fA-ql zF{brbEh-M#NGj_6InT4vQ>1vBPLJl1t~a%t)D==?j97*KrSvZ27L?yF&l)G0%v0mRTht34U)I&KOIa z+GBoJTeRVh*MX4MxceU>KDK`7DqgCxnOWuInT<=eUomLarx|{f@BFm$$%6a+{DLng z{M?qj(xb!U@rf1xg6cE(^J)KcT30ly=a|cX2G@5bnSZMre3F>HFw*3)%EB5bxs}gP}uSLDig=@1;=ZPE-H308Y*zLEv-Lw zw?5nIPNl`R3Y{AjDIx1j-a7qjiZ&468nxwD#nZE*9$zk+>PosEooVFeptB&4zb^3K z^qsO#qvs}HX2lKZIwlnv{`Hnw+wD8$#&b2xh)h8}Vn=v73>T&`56#bf` zSNgrDFH@Mt_^kiOb9Klv@%r{hZwvm$vnjZRJXk z*MsLwYutXkZVhz&#C6{$)X&LEMloEuE5WI4vHCBQ!~eAFe{`O7pA~2Q#8ag^Xm3XF zl|t)3rpxXq9g{w>b7recot3TKwe*U^C-z8ujk-27vruTi!F^Yrtkj7CoXYmXj2Ew~ zi7L!KUuD{}+2p#1^QNf}!`6yuF6Xadb1;@zQpvLH^XKVaU5oBnrrB=evVYjG|08D2 z)9#E*Czi(L?f!LlPk6}V*Nm!GmnS^;Kdy0BTkJH)VxPR@XQX-@OJiJec8hC6YpOvQ}kp`_U)8Rn=L3L z{pR{KrOp&{skw8b&L%eqX(Vec`SEW5=e%+`eFwShhR>Tm#b%jq-8YZpxQM3&;{)v( z>9aSrJ!DB)$DMZBl#R`6qUY~za$ip^dsA|!i!XTBe}?%r22U=o{59*TZ=3I-Snj~r z5BOhM*2%9hP5l)Z?zYXKpRM@E(_hQw{m(2deLsUQTkFq0_1C#?*k9Fb{ z`;f{#%cFc3I&H0b+u9fs5UzG~^3RCAw0WHW8Pt3r6GF2{9YR2h_ez`Uqr5LzsEmI2F)HQt` zUTTTfx_p0Kyu{_eNoErA31R!)q7Pg>^7;PRh^F}43*vMXSpMq#Y+oVbJbU>a)k(#s+|8NIOiU^?d_@eT!BwPirN2%*?$K6 zZZl>5;#C&;#hX4Zdi^i?$JW`+*;(aZlJET0*w6o`=h=DlGqud5z9RC(oH_J(hkN)ZfJdxXyz|4n;Wnc*-g zEK9)g&g5AyKW|SJ-h6G{QoDptADT}2J9#F%+Vnk|ZDlV1Y+35en6iR1SgIw+5*4e{Bt@Pv=X-prTW&UUxoe`#o+)wjSXTIWFTQ9hRy9FZyPHO(eAlb1M8mY;B7s-Qvb$=ipS7KvzzzAE(k(i^mN zpPKC+BS+p7tJsx4^gUlDqTv6_an&T{kMHW@xVsfrO<2^Wu|QHZQmG>M(}Ag~-Bs(3 zONZMYRxVtBcM@Y~?AQ5Eg8cXSc6+_cJiR}$HT25cBRPgnUwmJfC*S5;Hf=?csK~FX z2U~(v^E{MRZ{K+MNLQG6*6fe=jsGkvCLUUHz3>=kobwawAIaI?BKvPo`1f&}9Yejs ze+K)`4N+m6-yho{aHDAU$^$Db(?eCa-(RtgEnB(8f~W4{2{GRf52_x7o()rK?=@FG zt~B-F^n&AwT?>1fq8iH9eLbz&BvyRnN>KAYmrWe0(`ScoE!v&xF|X6 z0kS8pXZ@J}=E$nAUUORwR11P*w;fp3#bEttijkIle?oM9?f0XZJ1<|AkuLoHV9O=x zFE#O}f20KMyC>Q(S^jX`mcto}+%JE1RSNI*zn9&roxClgH+X&D4WVa!ZCmaio3U#4 zq3E5M2_ ze)qY~dRmsdJHczwV!_53h1apieS#Vdnlz3VZofN0=dfqK)U4ifZkIZGef4CJ^&16u%t)p2rD>C})muve>{_WVhGB)C{1_OiUrKTB|ZZSRfy!~+9 zJyCY4KsCl^8mI2BDZM}GUG2+`+-=TlPL^G3liX><#=~LCG+X}qBq5!$gk7`he#i^9 ztZ==pmzv#d z*W0_YYti!NYwh!+a$_cY23~qEbtx{k@9g`3_1Rh{`3%kpKh#+y85SjX+;mCsJl^#x znhd?G8?~1?X|VhK$mK2U{U>;xcj4Cf7Ji;k&&!jGet$~jNsgUidz9Tpa&AvRp^>!4 zew`aLpQyTPvWn=MFMn$Q>eoD6`Sx{I!bXq8X_A3S_FEj8W;gM_)r+gNm~)zSJI8jd zE13<-4}0?JZ|47J5Ik$syrt7?&*w#RtzN1{{MA@4GqI9QF)Q=L`nUCmQyxV2Wh(R- z++P=UXW7NBH%AgQmmaeETI`?Gn8K8pG41tk?UQfLI{s(i{?A~VDx~|N%c}bNG<#16 zkK-n*a@zPWv&t@gJp?c18VC!fvhu1@PZ z-jQ_r`?j-_)S6xM_G#yPIV)66Q>-eJ{p93f=r&cbs^w3@4ioE&fZX3P;lkE|EW7@_ z6=dSQH#gI({%oYD?!_)9?Y2bEkWG9IS9*?3(LLRBBGk}b{e39MPbMQ#pC4;OiZm)O zgyg=Rb}ZzwMWOa>N0p0392Tv%XUkq+)_qj4R4Vr6p2D{d9Lv2PZV9rwBo{tmr>TOc z?)^Bisl(^%G^KlfDwjK7*=}%nHMt#=A9oC)g!UZ<%n$|KRa% ze%^2O#~Fge+&QvXMb!_BXz%S=n6;q!dm?9W#5>V_2AO_)H+gJ(uVd?}z}iwM9Q5|` zwEqn3m-yeN8qesqIB?QjE-vCke1ymG4buF_4eE_+HBWueUbSv>Vm1q}{vx698+>>A zgQmXNzja#D%sEG8XQXztm_M5kwc%^u7d6wrmD{%a1$e73uT`EHBxUR`#W?YV#p1Yc z0n<5I=W{-uWoS~Ldep5*sIzhL#aE9F6_Z!7y?V03hSe`pOl8T$S4{kEp;~p3JGvW{ zy|(@8ocZInvaviv!3hn`J-2EP>04fDv1W2)Hhj75((hgw4I_s;(eK&+roQ~oAejGY z(?Pp$n?;tr4lrx!Ub-;6XVUK8j{gj)myH@WZtn9HQJ-PzaVtYFmmwwVQ^~?*kN-)l z_T)H5&NdVLCRaD>O1rM|)ZeDc`MVV@qLecAuhyI7sU(RxEcq7Sx&Qp%9KlPs6R!lz z&W^nD)$Os=?(p6J8P0NVOYJf2?kk!!1PMW#ZHMIxnT!mrCvUX>b-h? zR;is~*XCIoZ&ukqoA_(P>2FV?t*>SrNI3R0a$eqUU(xql}s z{*LFg-TuQ^%yEycfPU4rok3xH(st*^&A7Fuy8NY2u1Q;h&%CL;)o(Jte>ur?G~hsu z!7WXn+u_o#reD*JUG_6OE*-XS-QoMZ3)MecZ;IA2Svd8;FZLrvfhiKTfA%Ej7yE3} zoOx6I>2!;?iOw!^J61j5Jhb*g57$+jf>m?cnszE2S)lr(wgO8GG;b@-uGlWv8F0m5{kQs!r?}Sh$8g=%?%FkD>77F71W|=` zTI;1(U*6uojkWUXn}2&gdH*@%|9HAlN}PXxm$$;ZklL%KmNd<|7a4uGD@JMmnf(6@ ztlu^YDNmN#CjCraYqmk2?y3vr?5qAWgr3<`sh@N$+2cQhR`&Vge~;hwt1T7T{#L&v zf3e~u(H%ZsfoonAWtKZGUccnnio@G~+P~KG@HdzrW9sIo-sUO-wgvxoDZztIMKM_r-23Oke5j_WNUavD}YIh((eyV>)G$8wQWu9MyE?#@5~8WTD16L{nzNP zi2+C7Y@26QZ}GQM&1b>;sP~Pn3-n4d(pIa#yYZvs_l8@!nmaG8%iX82=R$e>%Sq2p zU3io_{b5$Eb#lnI4aX)nAI|!AU}3iB(ahUY-cC_(V={A-gV$-bO-hqyoYrt)rPTIY zCl!m_47aS0cvW^VGdzO7rg!Pq6t?D?fIH8+INrCY^6?fO^WIr@VCv~cjUD`lTQ`^$ zhHBPb)2RP{4j(6fo(~h}@GdG6w=*&K__JMPg(dLS`8sqJI9jAohE zgTk9*n(mK%D6<3eO zMkTGYSRE01W8r}Z;ng5^pGHQ~x@B6|eK)Ljc@VZStd~z~YoFFKkE2o6k5>B{Xw81K z$|rl0Q+IA_*Q~kcbi#w$Yq~<+Tqn4{{Q6aUqRvdU`Tm~!=3kw5@aU<@H~U-WgGQcj zJ0)janP^w3@j2PfOWgX-pXooIEIBN%8lm%aR_eB1$)$DOzUP!wHce>|i?sdz^xj%6 zO-{+h>M`#(jS{1m@RsI%Hh<( zv}*>3bp*SQO)6uablB`5tNSg-4;!DH{_rf%g6r<}loOt}({yw5^7Vw~%t}#dm?B$u z?fyqO`45&6VmDGf^VaJ0TC*_PDKW?$-{FFrv5BUkaa&BUjHq!q;a{J2;a%J=?fbgTkF(=A9%1&^E1deJ?Z>T`zvqc%v4r{ zsR-@9pk0&Fe^`IHaHo833CEWw%pFV3?xgl6Y&>rsq56l3FAZD_^EuC2D7I`_r@=(+P`n7P~vf4ZINlktBBG4y5rJYMjNjqyMN1mdhw~$((kFsC1r2-iBm$_ zU*CV@KCS7Z`s~WIU)j>zi|mVa9oHAfH+TGJh&H|XNX5MD`DB}Id%7OAE{^*1pJB6s z1;102r<<1W-y@l)w`vAYJ1#hJwY#Xn+o- z4Rhx5Ln4bN#ca9}G-rE>$+63azRuU&;A?hMqAyW<`+oKKAHhwMi+rv29JpC26VBz^aHY={? ze>3@ZNW!z@U+Dbr+BN=h&i{PZB|Ux?vu958mCEb-nOR$o@;&W}vVPRMbY*MUOwQY) zQRlnFCbxzO$L$E%a#=L`IMY(QoEGmTcNgdXo^D^TPN3;Stw{ZXX#Pz5N4c|V?#dq1 zTOaf(gTXEB_gqd~Rg!YiADrs`YadD|eyeH}A{;JX1b>$~wNW^4UK7i;w>^ zMA|6x`-_D^sZC#r;)JDkgj7 zFTQfK!ADWW{?}2<=BEnVZpk)fR6QUg!oQ_*e(TDA{yNLml6fZ!aGxn%&AD~v zql$_B>v$QWYLvf)Pxo{Gef&Q|Z}6k1#pzRe`aSBcKmI%VqVQ=CgM9z-FEfrUTy{G5 z<*@_quRK0Z;&ou$tEM)0`afx9&b$8^#Ccr)Gu$_ub3Oi&|C*Y46HNAX@{8{JY-Gq_ z%y=@eKKuK8{+~9*A*Gf@3|V_T3kr_NA78l5a&g~(hQ+VG8ueeCHY+1~O4+YHt6y%q zz_j$=`89Q>vrOvS-+cbhpsjQ1#iultRQWyatL0Z;e)-ShKZEhFb!LmVv{u#4tg}C# zX2@OEsk2qov+VC>qoT0ow}Rv!_qqIM=$c!({OF(4bEi!cV*0oK#eW77Sw5ep*B@0o z7rqES`GO-!=+d6d0Qa9f75^Cy*o*&Xh&F3_b<1&!<0rWpe{&!IXJ|ZpWcPZ1rI&$! zobGCWI(B*2@lSEH{PkBK58i)M;zqPCzs3!H?~4Bn58TXpuZo|#=KlAx#D9h)!>xA( z=0$Cco3Q*3$HB~)Tf9q>R!enN^RRjQgrD8jQ?~8ioRSdJ2W(gWPMiEMGyjLo)n_xy zB$6a_x6QjO`s^s9;-m%xSJ}wJQlI|0oXtF>`mrq8o@?nvqhpURM_Mv;IF?%1_$vCj zKgx?wp5|o1QfX}28M5V~&nN9Yd7>-*mKWH`_qqLN=-vNp&OVEpSx@Kf6iZ)n+s<-K)tPHdNHiSc%HzLKEo z%<<>=rL{*2FGm2*=gB{;b zSgw8OUH4ruc7GOaU9k4(5zo(s{hTREUe47&S3dn6+k0#02Z!jd2{%f4 zHy%{JsI=$Lk4p+GnlzW%D=hvet&}c!bw{RJklCN_(*x(~tbH3~GWVL%nI{uuKA0?6 z{x(6<_05fv8l{sS{xkDR)b{Pztl*U|tL0jzDHeYGuu}9MLjy+7{QnGwTW2@B?M(c) zf?56XRH+P>^s>ZSZ=D$5Frd=?1>g02} zt@&zS;(vy|)QSHYx|07hbm*m|{&HS<{HqB6w8tLF(>|;)GW-(Q9~gMb-=}_6o%z4` zZ;|bmADCj>EIvv_z2-6$QuVNPG`(%o*6*I~8s_b5st19 z>WOzx90Hs)Y&RH}%;tKSA|CN4;8YFAKTDsv%cfL$Nj?2{{=~mMQ!FiR&C4jA)^d59 z?;))V=DNRf>I2X8$OpT{d2~-#J0*B~a^0To!55eFn=m!`AJU%T7p?nA$|!b{tG54@ zpD9vCnw7g4b#JqYF6jTKIAKyk#Gh$bMM6bR7;me6rt);zigz2;U-?{pQNL&U;~#V8 zx?hrLnXqwtkN)SA{~4sxzRk^Dc|7m!QPF_Cj7h1 zB>tke&g?%!>zSWfzg!9}CR~y$@~fFIw{hhy+qb9K(ok)x(|y?*cjr%seRBPtJ?i1_yPcr* zbAEvOZ2sa|P8z#kZ}_gO?6c+aBIl%TsZII@Y|j?IE&3g~k!fzq5`Pny&5Lqo&u1w6 z{b7TX$7IjAl*a2Fzb$SBoI9o*WK}M~>8p@;NqVE_6#GVnaE)niH{Nu9b?9b&iA6u- zWo@O|Y_D0?Jm|XqHAQ!>T2$$ZFR#q=g>Sz&{lF}HqRSFj_oGhtv^eDZB7MR`L&^_K zG1(-PVYKNatI0aEo}%w>?ANg@Ji1!G^Hubb2fm9Ex0RVNJoe6P*#5|Tse7N-jN3tH zS)A5;%{#o(j%mi5EdlxL>;5c>)3DObvde$`Z~e^^x3$6q*P0#7%xXzm71UM> zw9WiiYoHjK!sFlYvTKzF$AWj6SAIP3dfo2I+<&hyM9WI(75A1jKa6X>|Jy)lYHGsb#O)goOb?#- zyN4s!^G$YF$kQkLM3!&UYBespDc$&u;eo2jwj>qC$|B`;++Ll1OlGps$~5PutF{+c$X+dilfAptEUDJQIy}vL1TJxYqon`z&t0 z3qiA5xBp3zEDZYc$WcT>LRa^3E4O#q(YW;IMd1PIOf3Qbn3)rvoK~Njx2C7LKFF$n zNzsWmev7N_N7lY6dUVEkcCOOBXCg)2AC>0sNzrYRdwzQ3qH9JW-xuDNQ{5u7OZAHT zw6i~CY#g<1C6(BxqzGSm``0MOQA_yLrr-&t@eKBlV{$p1R$lZBvpwskxpeuJyJdxO zdka)A`K47&O*3JB8}cAJwC|&%Qq;r;_w3&kMn^NPHb3Id{AYRnkF3P#+y^cy3+nb~ z&90MJBD(0x3HOCNU&hT4;;-6%C8Z;5Vf@bp}Y}qG-q0Tj5q6ivd*W- zIqJl*-PfPhKf80fFt}g$mGF)8qIXx%c;+Mu)03^{f7T8vP21UbE0b&D z*@Xdj?XD($*=PE9&OX-#uKmZK%?%EYR1V8hnx5~Od4m6Do~-ta7_q0f996Ge=Z|jk z=4<%&lczPfgiE93=qWCh_YIrkdZ$iV^eAVM@5k`;+giC>4n(N#>1H-p2=&yd5?XO( z{l?Q3Ypf1vY%4kL`RV}QlJJG>4{s|Ux$E&(>FV3Ji`|!2+G=EPt$%iBrrE{l#d5a$ zWxCc*JjHcs_q7>86YreKOTAHc>hu&=<+bWxSovOG)>gV5_R3z}2drY!rJ8Xd24+G(e5t|pJDehcPJZ+WQ$Fl6#)fK;{oP8)Qe^~pteL&6} zTh(iB8{GU$B{k=smf&p;58H6(qtVJd<-{QN{+y#HC-gQ??U%5gnvpBWnj9zk;r`dB zJ35uidKNG{#vEF+MDUZs{KwPTnnWIV3KwqtcF0RJ{93CWr{+g40oN?M$hBvMk8a*@ zRPj)o_vhvLnURX`C4YO_Kic+p>wgBteX4)wtmxCrdAC#ZmDIy4kHfb=3iY&}-@TOo zZ}Cj4iVw1PVxIS?7{z(Y9NZzkBq4{tFK5T$br$_@ZyxTxqNi#$?UKjy_Cw;!?q{z4 z7S6JXLE^ZeweeZ~)8((T78QtIk?QK7YwS2pCP?+(;~6auPFqZ}Jg?+9p4yRl;@MjH zB~w(G{bi4ND72)^%j~*X$KqmN@VnJmOJ$zp5sTL|J>T#7rxCF4_=>>4MISlE#08F* z+FP`Txp;*HPc(Tw-I<#+B`G=lu|~+G_1ANM)olCE&~#>(o@vA7i2I(}TO2)#Pi?th zpTodXDA(EAK4INg=IEK+{7e~kPmeqie6on;b81xn)3!((hUVk7PARa ze1;AC6(>GBchxq)*Z*QP0^_V`B>CZEL!v05G=VVX$ zcA2@8^)+tkbuRZ@dsqMaY}M+9>iTu}KdkOKFZht7;i1^EueM&l&sKV~6@m zQ~51-f2As=%)QO9%zCB$vZNWMZtFk(lQh+L4GUYW@4Vwz(UR3poIlR{H7kT@1v9HI zttnV_%%NamhU`XXchMXkjbaUp)k2?BUR|GXd;85^Zu8&D$Nwo$cgWfJ?C@46$rJvY zBIYkPQaG;Y(7|y!O3G01wuq+XGOe982C8+M8A}U8WDn;%PGeK$DawgvmX6AAt$Lj8 z`z!9ot;>6@61FZcSZB87KJP|f%d(>)Go$4LYmd1snrb2UQ#$li%N%a+y~6idmrY+1 zyK$@gE!Vw9suMUDM`?OZoUmod_P{EkPx7goSj>(rmy5pAqW?9MSMc1CZ}~57`ZOC! zI^NDo(d~Mm{rS*pzZ*dhCx#x#?OJhnzMH11v_Q+>!yMuBj_>u0nU?s}<3GbiZuwiq zKNzQ+p2bz@WT*H&!Rf=oM)m?%-s&e)pU+FWblY=}(Ct4O{ubvOWkMo?Z z`^B|t4v(mifE8ELI&B}VhP{_{^H!w>Nc_8S<6(62_gUHp!&`qIGqV&s~hxR;HgJUv6bal*yMun(5m zW*y5|)=3C;HNSauM&Dwom+!0@8|(jH{rtfWG$t&=b>qOaW12ZKp?kP)Scq;Y3_Eye zdO2u3czbJX*KU#RUAtzit`N8eI*wRmH)teRMk7Zi=-rLgeWGQo1qarC2M^I6THC`> zUZYudWA)0$SRc@#8I7@*MYDE@-U!|GFuZ1i;$hJkKFt_|)ujj86TSCUgx*-ax{*(5 zhv@!!ni=`qL_rtvy}Hh|{j$hzCfU{)KCQ4e9r-a6AC*uUQ9xJ7yGw$h(ZnmIptZ{_Sd) ztlcOoEf;#2FSk;~!};E6!>Nm%?l}Hd+OqIam_q3K%PifMjHwD$-EB4(ExCM``-eHc z+8XB-wEM66ZQa5jD>NdHAA0;ak5xvXMI^72TaWv%}r4g?g$^eJs-%@nVhRLbf$)zwMv?=1JSxA{htnf0NRSKDu+1+z8(H zb@`k5pEg~(U~Y2%x`VdVtOAAyDcb|Ds_vL#HOrhy`1nJKT$k#r53W4j_1L6st(9U{ ze^$?w)Eu93*UjdlfgfhgeSO71>xWA8MlLPQwB_G2XFR>ZB0poTQ-s$&nfgcGGk&@+ z*(uS#La}Bi``Wz22lqb?J@t`y=2MeE-KD>TtPAv|XZ^9y^#8Sg%YL2t+wWt8_@?Err|ZsF z+hZ+e_R(X0Mw<1^{P<6ggZ;Jz|NG^Cb-MfHmGg}nKbvj4Rl4TU-KKNzKm53`#QVd4 zhN=G<%oFD9a8A>yaW9|u@;ax;qwM8rg*Wp3=Vfp5nCN%m=)BBXM<;Sw_PJ*TT=_HI z;E6}(hnuZyJVYb;{vP~zDsiRqWKO3`{~4@*X6cq4TZZ_h5R5D`5ZDwMQ1XM#qo>_xS9)oiaz3c2S*Y`ss% z^91nS38+8xY`I^3^}piw*#)2CTvyI^in-8xnM3bDMQU--xjp;;Uir`PvGqU0BXuK_ zJ9l*c%9Wm;%$4-aDAw@D8iji6dY+S=1)qvzZQcYm{P~o!Q7~Zp1h-S-SsQ+ppNKV5 zy0|H;_~o}>bC0g+60ERoBy`5KcL74o(67Sz_lu`^Rm2S#r)sM!TLz&a$X) z607x=Kku$ysQaoo{n--vAHkEQ`qd^cl;!k&yWi&Z)}sslGbH?H_#AMu*CESF`NFbo z{~6{+h0MS2YEtizf2HW)EM0X^gITx#WxNQkKYpD5>y@4vGi;;!IQu%M$mL(ktKYS| z_%oSf{lY0>mV)h@nOmFITYWhiCSRiw<)`)F>QRl{DE>8(=Q&<| zwEFwXO_BA1RF0c=#=^W6DZ!tG?6ORmdaZNRzE@43e0Vqq4cDiGX*#IPKsOdcAaB_^t5}&Rei&{_RY;v7K&kF=5Glu`xetv8#7bhTkMLd z^y_8r6O-ERY`A%&NMQ(-HCtpE2?M3`~M6gO`mnRdReA(t9;^;_h5BR zS)cfkCH~X>{@*&s+YA*PR{Ur1{xNydBS&-n7k@QtudVoa~XZ4 zq7nV~%GPJ^4?p@H*=DVgazoyyHt0|N&cx|qiD#;oep$LX(luG=V2Sd~M-vul^Ul8V zJI4M2=vWzpH|I1Znd3iROAkwQUe$Z0cL`<(3jf&Yfnml`|{uRA8t-w ze6U|+Z@vGA{|vFyiftC>%@6+?nYVaxRLsk@`HGw`-QCotN*DgvH|ON>?zVFIM|w6d zj@Li*ahsZG*4ERnvGYrFn@xrc-|qYmb3CRL{i(mPGp>(swW%-X!UmII$>RbKkKYRR z|J1JdpMn41vgkI4S-+w_9ojCpRAX!A8p+hWpy<8Knk<{HzxiXoss5q-KV{3L7YDp% ziiC3(G(J+Ca=CEE+p{Zfi&%?B6?%tSEM#2ct8`4zK5MJpl@q5YD;(V#EwNSW*PK>X zkuN5HSB3xF|H!hZ@T0j~jRvprsfkK6Q+3Xivn?o8{-<*K&;AcPB@$#KPh0vZUFhAz zvgp_BkS*O#y!NU88K(aX@Bgi{A!)&pC!2QM6zO1S+hfrc5c19X()3zP|NWwEq;XskyC|q5gex(WKQo zGTwRoXK0d~ef5~kzW8_1f6lcW&*v>yJ(rl}4<0;LpLJGevHZuv{|p_^*xmEnXAA0R zPbii>eOP20|NYib!Mz(6ismb>_nDxfzn~=ktS{Gjzin-iGfvBR^sMU1a9CUuvMlGA z$M;>Dnalju*45jZtf=47m1&ot@yE~QNmsq5$-38{|9%&{)=<6sKZD~0%cNT-?khd> z{xjH`&dh$%ktBCI_{W_7{wFs~ocAj2`E%|1x^3Cp1L`NR{*x4*v#nRh-DT4Iv*F*P z&lhT6KYIS_37I8d^ZF$E8X2zV_XQ(sR@o?CQo=wXrbiMV! zB)HO)UGrt*?^)N6^zOL+@oeEyzhl><4yqnuD(&rBE#Ea&RCfQv&-$MHp*v(dL&3Qc3Kmb@09Af}a3CVKMn`Y9^~ZdD%) zv$dG}pMmG(<^JIQNzqD4jj7vQ6$H5DkE^ee-gqQ@=?aDm!3LT8?lrAt$!9Ti>+sfC zwL*TwJ;|jPQzxEw`Ojb}EN!?q@A|cUQ)|TZf3)Qv*tQ{)SFX=Lckibd?IZK&L#c>ZZ#g(-WY zN==scX>2L$FBY7#r1XZO`oAjo8Gjt6{S#uAxu&!3-P4e5^8A89Hd#fxZJG-@{A_mq zteP&Q9dEc$X+i3b4IhiMPfl*1d~=Jv#*Iubv0I|fkA46Bxp7R%W{$A3Ugn#!6MI?h zB2@Heb2(;N8Sb)a3=>(%V}D!HLQr;wgsS$F9fFaM(>KrBZQ|>yH21G6q@?-SMMrwN!hip>T?3>5B4`J9zJyY z=+WJ(+c)$jsCruVosnAnE44X|W%1*9pJ1VOPYtE^9IlpGuFDNF9fQB5a5>aG%8h&V zFv<5;IG6oRnaiK`zOAs`c}0Qi*+N$hGwJ%nGH16(p52=9C-c+6BYU*=TH20~xiA}tn4_4BlwWy~zOp2`;c{pE%FJdcA6D`w1^;^=xJ*xJ|RwSU9v zT6MjKtcfnO1IpQ&b(Wbm?$yk*uc-RMyz)OoXo0{Pk!6uS?T>EOPpLn4&yq>fWK&Ng z&%_BHR)R5If!jVwy}!&P^w#l)??F3D8*K;sQ}s{(GuT-QMY22RDcQ_^JmIVTLH0N6 ze{OTSsbx~L{n*tNix=GIT^OS9F0(bN>+)68tQPyq{|vLjRhWfU5*qk7F)Yu!nao{& zb>dMkrkc#IHPsyaZ!SM6Sae~!S+@YI)nvy<{-1h+I=6M^x~nVf<~{!>YyXocq1)>N zE-(0aVD*%bOfy6)v%12z9@WT{@q3=zcKpR#AB`|B{=imV>B5JN8kt~4tBpCt4sbf7$e3l2Bw0jUJyoZgaIl z&y)MqZyByFD;F+c7Ii!yXs?hN`u0uzvp36fCx(VU(=u9iRP+8}(O3!gdYPd1D@xBL z-yg5vz5Zc~mcRPJ%S_SY>IiD_C!k z_cK|Ux9g&GB-4f`nHzpSoglq3X`1t;T}_U^_4r~UZeLK^X&zYI{m_=TTApX!g_c;Y zhfBVy&glP|-DuYLrJ{jxt@Rv@q`Lf1e~&GAX}jy%qV~c-A5D%IZ*NIlOzycTpvitC zXtC1t`B@hWMeH|SIql_a_UX?vZw`(-AD7?V78Vf9_VnuNiB26dXAM-HO1>P8ep9Bd z6x2Lb(Kh`3!Bj1NF8f1l_aqfn)>(zvlm$qyEtg;MWXH7$MwvpYwN?ho1?B%{Dw>%z z@7z8?U))XlD|`NN)od@F<_;D{-(LZLe+2s~aqH5K_Sr>~>+=rtt~L4i zQJz0LsyCidU9)l-@q@_CJG=WaLqyGpUNv zUmj0(_NqB>z`#}AWUAusNeLCbdqTbE|4@G@^ykx$$Gk=-g1VpenVFcXui!oLpJ7ws zhyM%*l65CbYv}nG9kecC*0$ajYQ(FiWopA}^nz{XGGSejKbtOHlWYBHx#X9baJ*Er z%|TbQoA!_6@~66|eG2~1U>b3dcj~pZnnJAGGcL+HGM;=OUw`Y#P08}jJ>MRFu4vb9 zH@w@_Y5jy-)#bjnPLrCk&obYOVb8by-L&Z3O|g|L>n86r_E3IuYQeASb*Gpfc0BC0 zh>cwyDLs3~+s8INeJix1LOWs_O>P9|O8X`=EopGOxViDcm9o|0|3r&|CP#FoAqZLwDy-=UZ8{fi2?L^TI&KsZY*7?9OS^Q}$7hx%Bjs{?aYe-?|-P_F}S6 zZQraH&Dq(_vs75v!%{D@)lz<1l!Q>n#yx_X3QUg|DsB0hl6GFI^~s-q%2&Rha9MNH zd}_(}>3*4$8k;B0ceRg8em2)@n!v`)x6Af?H_&T9cE3AbRJ42Bt0mjs-Q_f9KIC|{ z-A(@K`aikTldZR$$$6_CxxMR!dy%bK#-X)UvcJtNKMI+>chhVr583rO_1M%^Ub-n< zn_MMyT&qe#zn^@3M3u2Fw^B9erqH~S%tyMF+9$rg-?04jzuZ$snQz|Q@7LwMP%f9N zP{W|{(f;;vhD)2QTKYbpYue*;)sA!jANQP7ZL@Y+d^-PZ+R3$d?npTbZ>`?B;CEXp zk3(^$C1;+lcIfU`E(!k`H2$fpR5(kk8gKo?e9Ae-u=ro#I)`WLybspgWNn|k_JL?A z+uXLGBB2wm_M0v$crol3Pi&a&uToL({g7$OsS~NW+-+(zE`^KpXkWjt*2+FJ2`&Be-gwKZk zX9(ZF({Y3DnfgsXKuZIf9&UVV?HcPJ(swHC!KAI8-uKq9@Af~-DH78c z{VYx1by@eB@*~5B@^^OpKdx&`Tr@$Lf0e=yR|i=mv1$8OusaoouFc5&wx7qWwe9R~ zgWnrgT~7I{W$5g7&Y^7i{l7C-&GGo8ub_E-<%io`;(ufRuyKdad2RGJ?c1~93-*kk z9DPo*H6;mg`X8OCxX9a*XL9teq!pIemhA}5>PkAH#k;{M6C@Bm@nqAH)_K#UlWz1& zhaNNxJM_Rik8cM{e;I_wbyw@VzXit<6087E|+Le>|JYp zdD)kP8B1bVgfyEj&5(3jT4SU&@&1IbvYULGq}YES3st)id8~KE+B?iw5?|>uu3TCp zt)VobFMCGtnhv`hBL|U)pz7a=8zeEj(GvZ%*vwC{^%&D|fTnd@4W5T589x;!Q{aSCsn)=o!@)g>Q~MlY~6 z&~9K}rgiV?p|!#94y{VF$}@DDZ0mk{ooK|d-ASwYZue+pPuB^}*>uT_CH$fNYOamm zw(peI`#FDoGSgV;i-p9xukAhoZ9Ddayr0AvkXs!4>&Z)w?2|j)4$QludQwrxBh2?k zc+CpWEn7_&HJ{{{Po7?IJ6_mR#qh$}%X_saJV-sZDy1p-_d?h2#~XdFKKgRpF=j?L zvr3fDkpKaQ`|3HG{3@mQ_ZFzS9N!+K*(ET2Ba6d<@*~q610@e>_DsmUl3I4ww(Eh% zlpU^9g1@zS-6(SQTpW2%C^4D2LiYNv{|tu{9xuD7vhDHd?*><=aEg>W$Nz}mI$4-? zhDOA}Ku#26PV`Q+F;Kk%Ixu=2%Z~iZOwynw#6dT5 zxL!R7d%X>`()h;eRfS=%yS9Elu9xHTgF;=TQnzWEsxe4u4|&8 zQS^XUkJhnsZM_T{(hj{5de<;)qw@ysjbR6m>aEYwdN*U?#7fr6tPj=f_C?!tBQ0$w z{koa2C~)HJ5k^MUrCeHAXw!!ObQ?w9P2zpp1}GyPnCi@WYoO3xLs_+?$uMuj^n z-QHdM@;mx;*`A(_6E#mKu=*zy1$QXja7t5~^j6JWr)RZ8<@(FV^RG@lV3sl|U2J}M zx!aHV1y?>w|JkuE_R!-wb6*MG)LnDZrs1=b2g8p9fn{#xCodX%9SX9zaFaEKfk}h?=U+)luh|MbO-8vvl5=H$91~#; zdB^Z~;^{~E-P3hs673|H_)YkDI$Pk;F^`##63Q4ff7CyUKmD!9U~gGW7Ci(2MA->0H4nGgV5N~kDdu6=8F2`~y z#+%^}*MB_YGkLo`$3x!CU$J|7_AQwbS;T`#|%VgK&hb>%B}{MPs% zImgfPSuA?{qClH(<~jjgHP7D7QNZ>yZ`^H*}^om>5zHVN&2wf)%q4{K*% z$gvEV+Oo&gVAHl)e$o%a9?qB?qqQnegMXWdZLw=wpF~g6n$@zb+PCJiWp0oNTog4**wYE%}H{`j}(=u zF7iJnSlY|^x_k3Isj;6e^`aPqygoBzMFcPWE6F1}n%6JDgw|L13y^on=>tb*e$ z;XCJ5*2nhyZfx-Axik0WvAHvA>MEzVl?pt3-Z*7?_O7dYU!6;4TN6=T>Q#T(Sxxdp zs6h)y(yptAqg@sWAKA&+-y5vK=fgVp-pZ%8MfYy|Y-KBcJ-=C)Q9*KPXGa3JxhoZK8A!rMd$vh{|wCfpHqK3g!r%d&mjIe zYEjP3r+*9suGE~&e{H*U*ZyTpzk0SXy!{p`{qR3S^rK@6jp=``socEDS^IqE67GC% zk8%oBbIZdQ{AbX9TfhFamUX+Ds%4&{)26SoGyXHg98b@-ShzC( z$27Chg)f@j5-s~PybS@YDEI^JGz%yo|I z_7{>T%hL2shoUTXMfv#)kGi^}Lf4@%EpePE2Y~^oh_Z25b%QV-MW^ zJNZGh$9tQ*`3nuRzt-O`#j+{=I`O+?T%asLR7xw;`)w|ks8-2 z>#G|3-_$>wv&d+1?jf6K^>C@phLHjcTs{onaz7h)E;C%e(d5sWxl6aVZ2vs}>Wo?Q zm+tmH`($43y>t3MPTl_~bMVDGgU?9`Jl!*PFgEJ`*|2I+qSLCqhM_MFB~|o{CbwPm z{k1!3%ZAfkG4c0BOizpKp2o6!u7PT@nWozd-+xbZ_dm9&|EM^r-Qe={mv+yB*I#e_ zYW25r|0B)mKE(wEU%nfLSG3Zz^-iFpj!{*Y`pUye%Kan@sZ2NgS~uRozLsn zveVa=Eer3N8v69sd~SoRzw>H}Ci(as?(`6PRuT3uH&!{r-}WJ!=hHxrB+H`UlXvt# zt*VjP6sOZ~YLU!bn7l9LKSN*c^goIH{}gu4o&J(Bb+Xoa-U#VF8(`H;|%Yu zRBnC4&ncH*MfFV2sZ(FL@Qvn&75^DRQZG)Idub?eQ>WX1Vz0zyUc*PeZ`X7%hL#{NOAEXEghUrhJJT#@_z%uRW7G=u-xlk)X8StFuhl{KRQMmy+!gV@&d=uT!abWg<{TI1x?*eh>&fS1r<5`$ z%L+7J2sX5c{J3~-W_b>Kz$^QQ@|J65d`emBV^7Zfve0$s@un z1@pp`GN1i!BF@S=3~D=5jxt3Yxw&K;d;FT?=L@3d*A-RiG^C2XD?auhxJ{&zi9u`i ze+KF2iFutGtD1dUH%EQ@cz*K&yXWg4PE=J;_|M>S`=+ud*Tq%M>;FW`1s-C~7v1f& z{j0)L|69sB$4?4dZ>lvD=-Kk|%n6H2cjp{wYVK5i`mf~l+Lht6)t)ffZnN+IbG0%2 zZ)(`o73vEfW&hd`v|h*Wu3g0{$7j4o_g>a&hAnu%ars@JIsE);LLHiXQ=dNBIL%M@ zm9x@?#SP_bi*Nk9{^qGwLz-DSqla$&>9A`PO`kSoXHIGI@d**U|M0hEf6oaioo@Nd zf6lJx47(Ybo^BIjf5`L0GduYoI;W=WaGfg1YOv#T@a>Cv4=1tNpR<$yVfvq8R?)^8 z-jiyKR?A)~|F~UUXfYFq^Hz?9FF!sln!3%+&y;Kz2q_H+LmuexfZ<@`M|W~N79xRfvNHmA|FmR9J~5`M6V}Uh`un?fe0}{+&{PMEKi(hHLrF ze`{3@@SPnk^H_1VZj>$cLe?cB^dL!DY?3PQu^GBe{IlulE>}8pDCa?Zc$V03ijg5 zOqnGz?^ut9x`Rg2_jnnfMF zdgHrxgg%$LyZhwoH9!2> z1+8|D?r8rRnX}V?XWp$3xA&W_jO(#+3(Q$*-#1Ak)ig+p<66JDl9L zM#GJ@a`~*phox2}izoZf`% z-HGmp7QZ{N%9YU~l-qWaaZySTf3W|{_D&7yxm>p#1Gs(&6ntFBa4$MBSZ0gdWB!gU zZPPt>`)>;E^Y9hf$14@!SQsWf@6nE#y2@b(r+ljK+R5#mo5!Ey=+u1sN6JB`sdH!S zoS|{c)U>E}H;-D#L}@>1-%SM`LCgP4_Gy@EY{*%9w}+$RxU#q{YrRm7(LtjFM^vq* z%`{&Y8-InNzeT9($&R(6USabh_U&Nk=vw*ic6}aqO8?~3y2+9=Z{%J{WV(b&M zo@YAP^t{ zi+#14Y$p`w|47;y=I68UD|_GO31*^as*4+g@67#nAeu3(r@`#hk{etbOis;aj4ana z#I-@|a1!5fLFr&Ep5rGzEnA(DTd{t%*j1&r`5W$kT$lXpilsC-p7La!XmOQamJyoz`agqY%IQUAKmIf9?RGi#pP~P`$TiE*5RHHk&8OR* z%-_8Kr=_&7#><+28)5>gQV-3WU2>nz>tSxgS2q1;H=pdEJ!kix(!jVa>-~Q&S8cx} zuJ*L!v;m8z^t0riT?*`-mXczDuI{Pl<}{wNxLpysZ&s~oNPwWja>0i)CgpI=nl|Z^ zV0i}DncWlYv*v%?{>NXHvqVQ#ZXsvd>(W9dv-9D9LTBrr(GY%@c`WD8O_^OW{@E70 zR3%)V2yU?FT$cRkq>I_pzEit++h*LV5sqoEjMNGda=7zt)w0;xx*lyk6(<=M=A#D-PH0dOFeMP~nzq*B-q~eWDc3{;l!xe+JWM9#eM| zb#Uj+N@zLp(Pi%y^CPvZ>YvR?nGqDKx0$Q__on$gJ8cp<_4X{0(~e)RX0XvxsQdS` zDOYbO$Zq@3(7Rb(rXosR``L8QlI;Q~CI~7n<*)yIU-#krtVgl}A7k(CYWd<>z_8L< zxV^zpIHcS2s@|>*J@QXQ{zUUHQ95OI|3q8xsi&vs7sqs-j+uBk^K1L$w+i=ri#AV~ zmZWIY?6JKgXF;u`=R}>0oxF)z#$~P{Ss=Bslsr%Vq6t zHJUYti}vn*7%tf$VyU7z{b-m+4V%_##z(Cl_m!L#Lf5Q|lVsLBG2v!kNU*PW@T8|~ zKSL4^Jxx7%iZk=l&s_S;(h&-#DKIl-qavUlR!IO!j}DxHn;c8m3n<)`iZzUrsb z#jR^o?%n0{mi!u@_n%>d{ew?0Pc3#_rgV01{A;JFXSDLS?c3JA@{i#|jV;^H7_026 zIkkrWaQu$8lZRA9x6h5yNKO67{x!{8=#0I7Ugb+g&VTRR<3TH^wgpa})imGqjaKkgJ`GE+dZyqzhlUB^~t4;f}y+idj8yarY)u^(nzRS zP4)PMpf4S7io%Y~UijhAmW2x6j)pWI)oPIE3EJeYv*qB5J<)*>yz2fe%A;;t6!Ep zw}!nkM=Dc!!JqB(;x_Yt)A9?cb}1K2_Nu;^{WInCx2Fa5SN<*6vR(f4+vY#(XTAR! zK0*K1)c*_*-Q0hA#U8YuCi{BPC)+)~C(~5=zZS?{nE3Mh`lrXMc2`FKO!=ezr=Yj; zo%_@FD!F()pS{u_EHke4J!AK&zNSAt-F}PRdL+>vYuTuV~1>k)@9Xd;a2X-jW0A?W1a5$iAG#(+##{h zck*E_F~QqhVG|5PCC>`B|5X2)=q$M<{+{Ls<*$!UPTaGpaVwv1lk78<_men+GRseD zb)USi(qgiyh$SWU$QBZScP^8v`paq zC^6wc3hV#tZE-)X{dPWoxp>K;-R`^IUw#|%QL;NP;DodM&QB)Y&cbUmcVzW=C!D=E zRwRJsKMm1iF~8_Jh{jjm{CG>t=-BE;X@xpq`MTBlqSdSmrQ@7hA= z)iI&_=ZS3f2|ehj?5TEzNAzTc=SDa>n#jVD6#x9O(`OT@pe?#Jb+@2PB zEQ)QOrtg1-nOm*D7{oX|RLzSP}Tyk>%NCRufEFQu>ZO8 z(hbud{xs(Ac$dZbpCO|4a%oqNe%aRfLinU? zW2!Aj{N~dyPu?{&cx1Lx=$B!Y+5!(tzAvIDdz)R_1@}K&9%iUxaz~1BulxOdF{~D8 zVeMDnJ}Z88XyJswh}FzqfBJ5411Oc86n)cc7!kG3Sgns#xuN>j^~-d}%3 zKnLeP;&C%7=cu)e{9%yj{B8BM#gA^Uc=>Ogo8o?zmCFt9?&#Ukrh3=L{?zTC^S>4D zPEktUe^vic*4cSIE0#Y}&TGy|*7EttsU{S8@7}D9f(sc69UUDn?Y;eXn$b+n<86ik z^$N~42bZNkv(K#RIi_^y#Q9d)#HYOBuIpc{ZkfqlWO&AER`9+b?jn_%59ix^n{M;; z(aIAIi>h(-b+D}6@nzMb8MjrYpY#3qX!%d|KfXq5=6mKI{i+)0-kY+m;O@-&u<-s# zMW0iaUE%Bf{{HXI(k+)}uKFtaGiAc1d9F6Lj=yGeEuD3C;jDkg!oTu1USFEMFWh){ zp7ExFX)FuwPh9r={?ln3w>@V|fA-y&nY*w@NRj(E87?cH$JtV}6%( zTh41J2);aez3$Tk#;KR~{EKVz>puLnpIgs_MNq}-kh5!#secvEg2l5%w@;b=>#%(P z!?iYS**>}Fc(%pb9rKv>%t?2ie@FR>@BTlROFU9s;dB4VPtgV`4zP{m1#KZU5g6lH3Fg?0;{rc{yht-cd)Yzx)pKZJ` znOCK$Ea6|p<$J-|wc9lpD(=fTv;QNT&nczZiF!R=9xA@4CVx6`JInVYmyF2?QA2&% zjlS!2GPki-t8VGe7f54S#j4iU)_mV&N3TzPj$@wMXstUt?w2;pQ63 z%gFb*&gcH-`1XIM?V?4g)7&SdT#qtcdVPICmvTkpM2{OafhRU;>-%@VO>uwT$$8nXk=1>!@b@kDSI|`+S>UX#HDL5OZR) zK^p57<5{zWFE8&)E0n%rVbq~qa^LT>>XS_k3lFV&du~od@AQPq`a>x`?qLjaWv3Qj zRoDLg<SGA_PqT!4PWQ8Y&U&ZXso%vQU1OB-#MPw!|&zEcvK8 zJ9YW~zA^|G+~=`NWO1SK?Gw`+J1522O!f8RTkGfkw(eZ0CgX;GYCpKd>RSz?CDa?G zp8il+_3@GC?e%JLmF*KGW9sIA_dFVC#`nqLh{J%mpm?YLij`CCAO|sa1!PIl1^Pj_i`@$8k$j)~24&AhI_x4E~FD3;vyA?@Ieb(z_v8vCe zPG(u;nX)Y$Zf>uyOpbV!|MYBLV)@_O8$BETh1o4A^na44Kl%8i?|Fugd-;!ZTg}Vv zSbP0T&C-)eCwJUiwq?0{@ISw__~O>+ckRiQD&5LUHm zy6xt&d9h@6Tw$MATSHONeU|<|cZx#xJ>gcF)9v%Jq|1}UY(qU+`P~O_|(Q1OGGK9eIhH=iPHu3JdV~`1fA0abB3jMfabqtCRiN z^RG{Ho*Y-WOZlw#?-}Qtw?FD{R#%%*oLn3s>lU1}Tk=Hc`n1On-#I-ydg=Q=$Ibt^8vWdL$9?+F?h_grMcXySmw9^z zA7T5?&@m?<(5h^E?b1d5%THa{8|xYO;KPmP4|6&>Oez?n)V`RZMv3i#`@S@@7TYbNr>6d zHR9%Q;{{;K_b6j#?XdS}e{&%|09^N(IO^&?xO!>Ab z(sIKq@%(SfMg?6R8E5qaT@EtDHb|D5+){qE=cvOUgMz4vNjJYdpB8i^_%KJ4#k9ES zDuJnXqW>g2XJ^{lr@MWO|I+^=`}DNemJ|8kTzD2XySjAlGK-8&CYQwz?VNq+#g9qz ztv#jOMOWp7gtni5^DIr`!nR2{OXtPx6uT6C>bBO-C$+0W_dhI1xjRAHb{oIW0ftPO z6C5iZZ?IqU%+_F=ZSE4)Ynyd!y4LWV+xx4AvHr=jj1LDYJ{7CfGTQ&;3lnV%*tF_L z|M5Tbzgh0>ym@GXXX)i{WH#)i*%UZdH+NwSbfVxz5fh#%T~Q;|5(-k&GK&Y$zv?-A8qbDJe09E z*2*$KD&X=qkBtt#dCEl%S9p3ibLe_}Yylr8?`xzwA@*rubo{s6U(?n5C!L)X89d|X zGoP5EGYMfzTNj+3HIa+q<@Jw8qjk6P{Sfu+Wj~bpYr{gVD^IGLTI1 z`eoYb%D%Nv|2q54yk!yP!Du7P>MwtD{qm3f-y&zQ-ClM%R_oB`z|G#PGq0ZY+Ec7s zvB5rl#*bZv`Q4^JOPPcoPRQlRb^BLqdQJPqUZVpO0-KrGKlN-968;q#^_tg-`+Uop zRh~CJAKm}(Go35fzUlhKC@zM&S${q`7^p_3$|qdz^9)T)X{}hmWh0({m}}kK)!(+u zNi0#l)wWcGxjS_JroR3DpVt4n$*h$cwlupSb@5r>@7y=4|1(Uv|J3}qoCRZ)`>}_& z=2xDKTD|pv>!Pl22UfYPP<`oUTm5KNk&)ch%IiLv>1~+2vx#t(u?y-4U6}`EH`S`a;nKan_UntbTOk(%N6G;j{nn zU(uR3|F!({LrQ%r_SaIk$?uO^@lJD+lVN~|W#P*2uMC}ouFV&G{N+I?=le+pzMKng z=PmyklAP^P!R>Kx%NtuK4#x6F{HgyLdT)Q*fAwIdTjA|O$Ho|UVXybTt=a#sX$DP{ zb9DSWLuk3`q>X|LSkK>mcU*K!U|Z+Q{!LaBuROW2N+BeQ(I+%}tNT8!MVkV?9$4#N ze4^mh;`JY5I&~VN?9To5bDT6~Qoe)v%dS=L+;c)x8biIsG(y zVwL0lbu6n^t`BbInzmB?m;)116D?5)&S&``MFZg#x zK)}Ym)eoI>Pi>8=e%~6-Qjq0Zpq)~5^Z23aiU+=GV%Hm%zvqp~$^0Sp#4A?y#{H%* z@5&FX;1qpkI$>5ti9~L|^{Nu%9kW8iQbkz$nh#5R$$6_h{=gV`frrz1M%dP%%!iYb z7Oq(FYqwEvt9_iG&4r+7=YNw0{xfK#UV3uG$hEhX?Pkwe`Q>;2#-`)7TzyH_% zvn?V5vrdKj-;z|*$}QN-sQ$uYsqd2foAQ-M<7%I?s=aedbUL*>e_Dj4mioy6L>}}pX z-8rGQyLx(;%Bsq+IR=#fGSHgX+s3j|;`gk#tuf)E&S!HZLalxzwb(D*YyBf>YA^q? z@|P{D`AhsBix#x@-4J-TRVAEjjoAuEz6_7sfA>sqnz-53Mr`Ug`?rsRxIQmEcbob6 zo%db29J7iJ7o04*x`IV`YmtYqlGw)jvHfai!$(73kJg4eD zwEbyzq-NLC9fxD)E|31$ATM*a+dC%+{_eFS%1?T>J`n5D-`NkjtR=GJXCASx^ zPP3dmG3@An27^66=4DN~yP)@BpJ+np3DY#|`RzCKLXC44X)0}F%hLL49cmt$jtfAP$?#0!}?NX>5a&c@CmZ^ zY-b&B-ej73ywt?Or9t$oigVnTiTD4RpSdU)-~VjKvFLyHb0S5zbyuqBS~+Lu8OubakoLB06 z@oPC3Bw740%i(xmV6l7RwR;(p1GiN?Q@_G>pnt~lza={z4l!Fo@;JkFljDEfToRqGG%%_gJZ(EY#VEk(?6W>=ldk4xMu7*8MNaxX z-$Z9VPtfLS4Yi#$1=E_Rh-h5ZTVm2DX8P{f%=9+v8*{oY-psnL{vfnRKI`8e8$+Io zPFMFQzi<9$xYs#v9>azDLk}J?Ptur|al2m0!S2G7nnFwQR~+cW zajVAd0*Ut*o_H&q(#?_bPCC3mvMbf~bWd4w`GYnS5jkcfrN^GE8*lVX7VBnw+!{8M z(YDY@$!x`esi*8K42-$n$5~3H=Y*fTP&KV)_pt+i*&o`kSChESUeWTwsC=pWnIv9O zrNbJ3_IcR5|C-R>JGZ6%PVM}~ou}2yu1NB1lDd%Ze|;jOr}LFbS$sFmGI$n@|4ivbkIJ9V4s4#qeA_5NcU93+RaNn(H~VBa{VF_}Gpp=S+xNF!YgKwzc5VGw z%FMM+*vsx@;wN=h)~$}!R$nF_|E=8IqPuF{`m*_HmF&Nb8xE8k3F+R+zJBS*1)Fmx z9<>O^G#;~_t*o@?u%M#nZ|iEQic~f|-$j!&I#w=}g71)Qr+C#s#9@^jIDhM2=jvHuyeQ`;rBT&g?upW(oN2A}@*dlsk7k~RMs@}FU& zrG9)>SW2F-HLjXd8lX+I|wc`ZL!f9BEZCjExr8=_XR z#`7Om&MapzXZR~BaclRL!VPKio`+V;MM~6ev-dp7qOn8w%JpYOr;|cdtpmQFWYOHP zsCg1kFzc0PeT^;}b)ojF&62fS3U_|xe73@h_mq9H(x0 z1h0(Qxb{wFm(Q%$9>Y5cSbu8co_Hmh-90%_E(njgirk&-|hdL zmwm#}BwmjtGm;Lu=vEimC z&XZL>{gK~Y$zR0qi~Y~tHXgNLaj!R3sl6VRN!t5!Lj9V#q#nnF795RMmkMojmB{1^ zds4&Rd2DKElJY*5^$)D)aF)x2?z0GZrz~2gwPD4FL#=zVFN+3OcndKs{C+rV(Y2>_ z7Y}Cy?BEhz`Jg^bH0j&(@7?bXi@8o(9a401>%!-TbK7H_7Ch_n3Mo0+)WXv5ymMKE zz=pk!Cr(ZX-Tv>zU(5chTRB{d4NP|TiD^&eI2z7)n`zw(`*m7xXESX-dwm&~SL@Z2 zr4PzX*Kv7htmfoYC|$5D+^5r5vH!(^qp`_aSL5b>5LqM?f73Q|;*!N%btS)Qui){D z;JCIRXm|bE56=R4TwdBY`)u9l*2ZyOc-!M5{-5bp{~1=d-8!kdFfmtCewR#@Xi;SO z`+lMJ{};GcweX49-<+Z6^ysRIy}h=0 zA?3NQUSE0PmwUapcGsVckgf@u6jLc3++W&p!X~`_YU7p^PM2G*XLLdzC%DJ%N?exY z$aP`ED~@9`qwa~^7TJ2Fhoj&&)AqO^XEBNu}-*#<};d;2=hwF{j8;vrpSHVm>62fIB#grddca-u!r!GwoU~S{@Vduq(DPwv{`(HF}-a)xxliVXJ+2Kk#qHA{pH1s>U zG0g05q0`KhEjl@~r333_GJDrGna{b%>ha;kC5x4nPJFI2H16tVs#ZVoR_MI;d=|&l z#J`L876oR_$o49J(e-tmDr3|Gwjh2dgI3k}6PIek!+HZIsI010fAgQ=aIn$Fh{Mgt=`~}?R(aYdE3pz%)UEUlr*L;p2hgE>83!(kq*v80`*`xmyX%t_ zTy9s*44u1LX<}5D)PIIU>%7uS5;`ABEB+PRl{;}p$^ESU#hOM%Et-~_F6MbWXm66b zqQCF%-~H3sWsNNkKI?8i?J4i-xm3qXK*W1{d2YErRB=?8~-y1$E;Vp zxmn(1^@;TFLiKCx!@_&s%-M6(ec6-T9j6;Jiw;#kY2x~sc+c)XgT!Co$%?HT_ZxcT zZmnQ^FaBD0hSbV}>FQ!1Qv}>qF0M>}C~KvD%l@_Jzt{g6!tA^M>7Jd&SSa=&Wvb}g zjE%=GIx(?HH(38?FtpF?|8=w0^nP`eT+cMePMe!oMXuz2__X}boD+vc&J}M-y|HP# z@@qaNoifoof2OZ95|p_tDL(JM(?!7vx z>f7@vwI>)Z-`0}Yo~*=o)bL7aadoyt{FeCc#!o7#hfIzcF1kMJ%YTON(iu~KJWgBj zpCO`1`NcAyV~06T7adO7lqzeqnd$bC1>d&*_KxW_VrAEx(wD``zfEVYZ%KL?*HqOG zhMEr|A8jLFZP*#NFw3sz;v>6-?+c&l*c^}dWLs>~v&G2Vwv{#dE&mUl7nSc$i|kd< z%B;`$aars1$rGJvw>1AVxbLw4=raGK@ZmlnEkUTuvNP7>9d0_vs2Gp z%}M>w;L-D+VVZp$)AC7)&paz5<0szxSQdS7Ji%dXweyCm~E>@O<(H2>qf!Smq!E5UzV9WE!V{}WR$ zaV+idOFqtDr}CfXYA)N#RVVPu^W)>wlQjM_XwLX_n&IYR#jmP%8B-UyJl^=!`9A~m z)Fa!DnMIn-muchZuub;=(Q&q?(jxd-&~CwsTbCWPRw{4dKN)dBRO`-<`OhDJGuo6D zc8B%AG9}k(eo;k5i^XcE&-Fi|^=IGtUo)qtMNfJ#F`9K{e!1x>6$O=^^7~88*WK`C z;r7jQzJ2)Ir=k~8O;Z^9<)1xnGTQ85Fk$V<;B9+)xjlK34BXzHS?_pd`P=!6g|}Y` zQ~SxPVH&=3_J!?iSpu9g`=tKeUpD{rpG&E8d|ryLI9Qlgn>}-1=W?uhq43b;!}jvrZN&T0O4zW@BAfA)(RPWz)f_3+N8o~>Wx)|_Pt zDqg8N*CUgd=<`KKSnw?@BtTH||1Q7~6`@0HcO zQ-sfQZH?SHF{&(6;^X6g>yQ2mdSHBeRx;zAZJ|xpyP_BUN?B|#dn2@~cJJ*8Ka6&A zOD{6o^2l?Mhvngqv$lqW%xb(ebKU8fbip~2RhDmA=1Emnw);YC{~6kO7ITYge$BPJ=+gJ<)0ZC%cmA%k34RzF|0Ab& z^P)=C?Z56mef969@~_?c;=&;xc`B-Uk1ywM-6y}fGgZK9!+!?r%Br}y>Am^N z!RyO{ANv%4M|QYM6(<|`D({(D(=k7!($+lfiS~u-TWgBdC2!3#=Dut5nRW9LjmXX) z-+zUEJbChXyXm~p%SX?xT64`!*u=!lFNSS1nt*{MMNzVl1mKZ)UKpKO5;+`{?d+Q6;(DXP^JI^Z!ZB|Iu+q z`Q+_{XGeBcJdwF}@Mw6r$hxOp(NA0Xp11OTKD6$6*Y5d!BG&UXGWM~S+i>R3(~OE2 z-ICU-TFQ+y{%be+UD~djfA2p3bKLxoo6X6|YmU`Dvn*?wwc_5)$Rfv(%L)_jC<{2; z+h2H~Q=}+DP-t~Pz{cM%C#v?Y-LzQBt5{rm^ zi>6oBFpErm863acka=2}>uudPD|k}eWu<0cnH)Up%+;g2=XU)FO}YFt`rpUXn~qgo znlr2W@@?bif)D>Q%zEtP;{RyzFAXsju4gHV4i=N=PU>p+_{gj;m}TVVzI1urPCYRh z@9Q2N;d!$szipeKGmFRhjDZ|)f&K0xr-})CKf6wqKSK5gu-jM746!ts*$+Ixd4=1mcwJ}eVt_}QZ>~D}g?OV{^ZF3fXPw)1+ zFQ`)b5yE)VI5un!VF|r^@80IYlWl%{hu*(+oK-ihNuD`i!UN zKE>IU^=Hd>MXjmXo1J?5a^2xWX0P^tlxbaXaAIZJSN*T2J0GrJuHxESbz#Qm!0z8K z%{;1{jmkU%mrQAOVVyCrfib8!Jy+zjywT4I@!MC~i6}pmW4`}q*}3#sZtMYXmsZBf%jzn18LJ{o5yF2Z}#~<^L}fU zwsqHockP`kwCYOZ+aJB!&zGzGN=zauJM~$G7yDFMcE6A(TmLge7CxEk|B?UNtO@e% zH@fEkT&_K(+oHuXE$v79Ud>;hrd`S1b>i5T`#Rl1eT)}E!teCU^K6=NYnI8UKZXkx zsuLN-_DNUI>~%l1&;GN2{~vc=rHdOK6n{9_8}GFD6Ej<7sekk3!^W5tmHbe<1NDN9 zdOFLC?$^0ZYTA2c;dT-BIqi#9{;fZ?LsL^^)1LFMe6sE~ys(}AFYDM$ZI{c6&w5UO z&f5{N?sClJpo4omZofPl&b^cE2-okF(17^m3X&4r9WQ^K6L47|Vsoj*s%wl#MXv8W zFkK`et8KncXjUJ~#BZ~U3ca4}m^#O;d17uGSID`0_b&wdZ@cUNLH@~;0|}RRNS7at z;WvEW6?<%MfmZ8D&VQS87XSIrFrCqBO4zFT8Ix*1@l3s3Tetbg3o*fw=UXgH`peB&m% z)vbNg+>cJp*2ljczht25G1Z>)MHc_%rc2Fz%S2wEYLK7tdV)@K(&FVcL0d{qJ|0*# zC%bD!yv8K4<+p+Zzm)ynuqwi#IDk2EYgjaY@bA0F1NXUinyd*8PC1yhb&>A&{u-?X zANN>aU&!!h|LtQFv!|uKcu?~}U~0fguSo`4a*;5z7OyqIeb)6|nCw#pR*CCtx64?tJmIl;qp6)(bI`oss!o)ekUYq`{S><#2 z^(_1MNlEVYi+7y3b!ko_+jCJ@w~og-jhai3DVX1z$?dCgT0Mc`z|@U?7iX>ad;I73 zL)Os0rMcJlM?IOaW>s|ZWv(5E++za0(i9A%B0jYJW9M4%{HfrNm;UmvyEfjVRa(bplo+{@ff%;=_|1+38 z5%xH-#XIn$QE|Tb{jU$UTvB*h_I5j~yu-oFrS=y#@NZ(j7}(yK>AA(DakaYQ`~9y^ z7Aj5q*VE{Bv3Kvv-lnvU4I?cSkxWRidFw=*k_E|?ZC zyPm`8cUrDR%YwWsEIExHiRJM*&jgDOHEna)s$6S6Xsnr6WlXt zD&rwgO6{4SP;Y*87Ux4ly+g(<>bF8?#Tx9{#UQ}ZXa8jVtup(q+Vuxk{hj~pl&aMY zbH?iBa~$MZ?cOY%HUE(RQK!0!)xw{z^=zMZZ&UEq{wlsDX?e3;q%u$FYJG~^Bc;Fk zPVJ6wzwFOHI{i86m2kJdQ@_*_PGz@{{YRB^w`wc*A4xKt^{3uMkT5Dx37+8FqS?zy?ExMBMQ$x`|h=4P5z$R?5nnU1&3zM!{Zr`exE$;Hv4Sjl}gp` zb_KKdi~QdIIA@nt!Bt&H?i|K8ema>aosF(VxTT?Uo3I8w&Pq?j38@%sx5`iUip8 zG;+Eva57uwH0k1_s-&sasoWpsZg4FMJZxH>60|8@-X@e!V)8c8&_$OYGyHxK!t!CU z`5_K_``44UM(IX;$;lPD9PMG<+;(l&m!-0OTC1hxesHUtI@8rZFD$Yxb$J%Ywlzz> z-8M)wFEdbX?amTvdcH5s_28tq6lS$+OV2G^E@IX^Q{3Ne!u~JJjTy_x;*? z^lZnAOr^il@&`97MK?rQ8Vjnq^35vg&;AaP+o3%rqRab#SL&ah zQqj0@)yf+Uc5nQc_9?`eW?cW)#?P|+2)BH6Z&l)-o$g&C>7Q)`rHu0*?(@i0iJ0?1 z@%A~h$4Q(&Q~ooks@c!rNR z=XYDh%Pw61{n{Dj<}1q!AHLhUZVnIshCOPHpbzY?l?`Hq8 zSaoRG?ulJek7^25U0U)mT-1)?$%ID>z8>X%JZ0IjB`F>$Tq;`o9D=&rR*wC8)SG^He9QpRGXpw8$5tEVYTBXdJ{C2YB*XWiYAA$aa^;>MFatul=A ze7m)BRT5jRdiy+lWjLoU{W|yHjgR?kufIPzxJ~3g!~cto?v)w~!<6QiW$T_<67{;= zdxzrQ{;wwsm0Jb*XTJP!M=|QVbdQpcPq4SGll3GqwUzd(RWsbGmXyA14L`20Cdwdq zfhSblu5sPs2u6a5fb}YfH z#;o}~JhQa@r)gw#C4?tUTN$HS?!)zl>)nmj>7rR%4y=<1y?SVRIB3`wbkiItQ9bV3 zku>dJ#OgM!2bo>FwjPZ>$}1D}CiLEq)l<6!US+sF_}!!7zwqTMS zP|#34teum?6S|?MVAX?y)fG#x9*rqbgq)@vx<>0&V%Wy8*Ihf3)_y;*Zhf0*X<@ib zz?;xb1=^uUW8-Cl-e{B-hRc3fyFMku%#zpOOJ*&m+)jB!3&i|kLo+y zMc(;;IgrB46!~7`YJ(VI~ zcra6IR?7?Z)Cq>BcNq8oG4t+ZV)>NCYGnRyq5PYZ_8;XWh0T&B-@D(=5I%Ef&ZWIh zZ|oly+4wFJnHTXhNu&J;o6}{_En$Jq-$D|%TvD(XbTAB?`!oOk@qMhJef8d1%|B!& zX~w1pIs9GEd|f1Hz1Huwf)%hWK4YFLnNx;!V>Wb)4)&C7f;_aFSvAQaPc z?#u#nuRT+qD%6+BA6Mk_o<7@P`>s$gvm6Qo9+TcZRi9Bb$${&miO9z% zPv_45n{z4cT#>Y1jo}Bb^j#?vOgEVu25!8+ET?4GDJG-;3_cIi4yGN_zxc$G_gEfF zV?j^m7MrEsr6%d?{xPIRZmvk&EN7>5v~(|%cl7=>-eHPAYhKh8$7+6@UF?#nzDw+T zu}OxcZK#q1fAF=P0;ebOU3ciIy0B6$Y93FOl-B$olWXGN6g`mq(V913b3?*)!E5Fs zKia>ZX11)_sieDA&g|-==JRV4+;bFliDtqTCWZIWTDT$QvA517uQGi zZ$*y69UU9y`YuprIxt0!y>Rk!=}r!t-P&EVf;ZUu|GC`HRq>L$aDm72H{nnBIUL-O z;;bScI9JmBeHPP|l680X-*{%{d_ef<(ajoP8GDaA1oR)ayiv^C+L?9jys5fr`khJD zP4(;Y7ey7$x~bo3G3(L{wP&tVGn%%2?w5%Fr&RQYx3bFS!^ggx>kEv>=BwMtYlTINO1>*G0C*gf6-fa4{!zM#lX2 zD(ruz{b%Uhrg~_;(K($jg{yAdzSXs|$Wi&H&&1F6Z$j&2&K%QIuzGoF$?3eD#5V6X zhmd10WfIG{M1$skT=jHjC*#q^&AXzX)$2L0i#Thwpewty(plqXQ&aSn_)qOO^S7Qh zd^kn6doqLLzpkz8W|{=L^)MuKajf@ZoGmydxZgr3=(McVr~47+>slNx>`9&4TBn-w z@oDTonKdVbZm>E{``0$Tv9!N?HN&bpu>~)WzCPOiIW47#&rfGT)%IUb9F38)GH%Qg zwGKX7r&9j-KZ9+wN@}e{!HUx>Zk%~=ykvPVqiVzkx#BKNZemQTwbFItL z$#JdwiaV|KSE95YJ~q5JQG)a9R_B`hwWotD_8M`2O4r`-{QSk=>Thc2#nhiXd06rJ z)-@YDX1Q#eDzIQjWs1p44Fd|y^`;m7M{}~RkFUswLdkv z{||GTToH#}oW=}Si(kJLemq{u>vSrE|Fcnbs_~4zPhZ~t%emvxe9CTp_|JgWGY|X(!ZGZR29{)~yU16_M6^X6ZC%9ui0F)YUlHBKR)@XlA+M9{|r`sdKnYSd~41wbJe{g)%3?` zkFIF-G@02~|1(UCxophvDWIx)g6d2u_e8JF4K)nR`SXwL$Q7A5WAf!~+mpARY3+|~ zkQcwajo}vG^IwXhwo8i5uWbuhb8_F+#BUWJ|1Qmoe{E#uYktx2@`7y~QI8rrIasb2 z`?Pevm{NXi&7!DJ0c%5VM%O=+Pye$5Qwo^We|*xfQhA2o z_UVkfHcdRAru=lhesA2xJLa5Ix2=2SYGr=;cVr4{TcrA-;I&-Vx4UnYNPluEvUqfM zr-*bxUC-J$`zKFQGV+c%c-*LR+2+6O)U-o4j!Kl?@8w+h>g@0M*Qs&p4p$QOQdK_7 zO_#YoKTNTu=&0e1@A7i@)lUCdyUNTwSuUex>7pP(CQgq>jM5+CWsaS2l(w9~$X@q+ z?$0BQ>74%=x}*Oo8OwYstEk+_=d4{U{mejh!;Mw%Dpv1&7+r3o^{yiH&WF`bJ^}A4 zHfC5_^L}()eLUM_eyYS@b|#AhF2@(&wfn;T*<$fgjv0IQJpX;1`H6Nn^Hjr2B^D2N zwRufCtt8LaV^r`=YE#OFNYg7!g=K5B>~=i=CuDP4@gV#3ogBMr&6pK^-ioqzI!Tlr zQfgM6ZsumuZtVNr?$}J>UZqUkt6h@&l(-62gsOk=bTr$kl|C!}*Pg}x`(^zjW%bz; z3O{_-@Yi)b#~Cq;Ywr0IsRpvqPl6@$lQ(aVvlm*SlDj$o^xOKgJ6E5Up1bqLQ>O`0 zWt)Dr9=f%FK~$l^YT~YsXBvF=>SXZVoMIQfqj(2*{4@K@=FQSeEt!(}r&{D|2S3sL zvCYT9bmr>QiK!{`mNe{q!N7WBK5Kkyflmi_-r=surGd%!lCC`IQkI_DKh@SE_@Aob ze+KoRcIWM%J)YGYw%}^fzy3eL*UQq{7(Uk4*oQp-a{Qmz(LZ-za=d*L$}vsk$E~eT zq948dZBwUn?ZmZnuQ^m^$}e-jbXcv=AoB`W@1_f39^GX|3|$o)ZnZDVDR^~;Ror>a zn;&OB^7~8>7oRtI%2Yd56U*6;3iCcc7wlZr(H+{R8lJjh;eua9GesJDHtyebO)c7* zVx>m=|4*@u)BhQ4?uP%{{yH1)-!DbhR~ z4zJX?gvxU|)3z=6dSL3>w~bnP+<$C0dR>%|dXJh(GbL*DBPc=_^vV)Er70}eOQlIvp!Re&>Ld^BYSVBawq2B$z>+1qig$IwKeZ-(~NLj zenh)#Y54S4p59sF(qh)F_8)iuXPEq-fpwxzgLmffGS!*eb*dhn+;Jmp`SRF}UWU`! zAH4o_;OL?&zoTV1gTr+Wia$!eP(MG1tFK8ks(E+0O8t@Ajm|}zcvl&Qm~^c6l9JE; zpt|7T?pZxS7bm*M?QOU-KZk2(dQlSJ4i?hR+ZA$NHDpSz8Lo|3W~!)=n^*7IbB>|@IG z5t(Y9+RMFLpt<MTax=S;Yf_zr z(1ty&8MBRZY*+s^^wPWb;GmFG*c=hPyDzW&XV~;RB4W{`UnWTzp1%y8R7)jJz2W#} zuxLtH#@Pt7FU-r^Oje2eEbqErmUu<(zWkr;Mm-&el_xd@>O|)r`1tYT(eR^kPk3M7 z77d$Lc7wOQ;lK*b>r)=?KWV=vY1)r@J4IHWieA*bf8&9v_B~wr@mxu(efVx~&Fl*H zRrKm)ykEF4QcTFz+KP`?_eL*@FO0lM_oB4qq^J;;v~5Z5obXbUgPC4OWMn68(JGU> z8~#sR)Wuc#OQApCPnOkJ8CKqTw2JErd-3=F7exsRgYK2Yd0qSze0}0ddrwJ2tt6*N z^8-))p6z7I>Xuhs@v<>&kCt`PY8QvV#${T|twJ-e1aA{)+4N6bY;sr&i?W);Mp=!* zU0w6f?O(4_sXE(GX~F!5Q;Z5V4$VK#yNat|@d9S9j2sWva$eg7ZIZ0%KZ)@6TQiVUn7wXxxLc z?=fa8W~>chI91j4u837}dGq0AEKAF$2OatoboWNZe}?%wCQ~`KTDRqYpSSwq`+s3K zGK0OVGoR*O?>~|IpMm$dl%vLqj-aI48Hr1j>g25dS%~WHyqc@@Bg$3%V7dK=or*$z z3Jbr!RR7OVxv)%5_e0Ngu3OhO?%VP2<0ZidizgoHD*Bnk{P$;O=AYyFKLp!5GX-Yp z80K^ysTQ&iGn;zY|M9oj<0t$7(WcA8}_ zkKKzJcZ1W@m;|?3vUzRT%IC6)XZtC+lv=$6&NaDLWDZ0|*<&GhTbCj4=0KfEl3C&9EZy2$rKV5{~t zjzu?k|L(ZF{!E95+iSz%Cxrgzic?~#PNi~TEPGHI(0#wHiw|?*J6Y=Iy}F( zAmPKF>qkCCnMxlQiE#MO5OJNq#rpaYt&LGx*X8dXTl{3ngNGgNGF`iVrbkYGyLp8j z15d>Q@hhQ|PfXwRUT5w8Zuy7(9ZVKpO8TdNOt0inzh6@mQlR|y&-AR_mp`1C)3YOR z<Rn=TQU8}@7x7YJzMuo3?zDzV^#miQ1 ziM|`F4mp~v(^@Tj;p;CW71hY)Z+%3z?eX^)Y?_=W{OLtOQ0%!Gn%X|M-}Y*I6?#2< zKQZ*-%f@hJ;jYzu>Ti=y#z`DBWokaG6ePH!qKm0$SMCs}=OmEt~ys z59gL`87nHwB{o*ReIg&WW18Y`ApyJ46@QF`ayfGC@>gbE@G6VsXZz2P`r+w?JErGn zUwC;y=q`Iqx0vR-*Gw<}TAY73{iCH#!6TQYhbDTf7Td7%OzqlwQn5l#V&Oh^5tGwC zTH8go9L~`QDzRAVI;D4IW0<^f*P2W&&4f%Jk=b7J{$-pEb7T4a+B@n`Ae3++-^?J{Y5`o^IvxF+qXLTq5IAnr(3VfyRuZX9)mc}_vZeL51I8W zQ|RI88dK4q&-hkLbg)=jsCb&qyZ5K;o&Cu(98!v>rmJzP{(0E(%#~AekHqofHOAU* zi!J_cZa*x0rs7m~ZmBw}%H+VuGd^`}`!Q)v-s~OfFHd~fw5|8>#W;KULND7^wpMq_u{|$B|Q>XxNqm$>2S9%x4UUp=JxpT+JA?0idb2U z1a6A)GRA&bz0!AM*hc4uL+c*LaFj2P(Yn7hur*|snDfa3iQ9@=j(6@zF6*?`^|cN+ ztgvt_W?5^p)wY<+@dVGRs}8LqU$~4uJf3!=_3b_}z4Y4!bv*&gkM3ITU&D1A31LO4? zv8kaBRy+YWmTBF!ezf+{T4B&2)~Z~s_2)$cW<8pp5b)!n6IbG^kg1}!zN~&;7aFGf zuY0}mG|P=kf^TE1x>DA1+cFh~nr*kZwIas-nAy(+O^yhLFGs6{C$er><(cmoD*g1p zR#7SA(%Y&zQJhVe_9n06_ENHrdYs|1bjJIptC6~g9&8Qk6HET^V9O$*8@#t`IyIL# zxo>5-t>mp5(tTXXYmtxvo2&L-+mGIRt@67TrWZ!7TzRtT=>JR48Eg2m=3IRdk+kZR z4H9v+b6nKHC5FgDTppO5j1=M>0CGE-%Et5 zwYmNtoAKs`(UR|SL01%2qr`b^H(a(CP@OJjbl^^^o7)Gac4h;|fQ%DICmk}-4mq$^ z_%_#$N9$g8ZSC6L8rv8f6S{A{P0)kvF6nhzZ#eV0c5OKt+ZDZzHJeHL(Asd3-JrFs z51sq89!~VGxV2j}M$h0l51-`kJdxbSm%TAaM99& zg;#AitX{phK)ds3Y)t5?N9)#Uy?Pj)w6@7$_3Fmhn1FXXRJZ`%nYx&X&Hqq&#XH{&ulWb zb=6q3{GW86kMDxVrjDGeUWE%cZJRiSePNdHcU^QDG8#+E=UA*Tm6#e4wfoUZ`&sw@9y?=y^*=+Wo?Fb!!?S#! zdN1h`3$qtYU~2G|{~B1Qc3k3SUtH$HD=M|CU-Gjqw!d^=B(VNu`hSLCeZ~dTWAFWS zySl8SF#U$?Nwujz=B_&bpF!}H@skJLI)#sPv}_IUiqH7_G3ofkweI!HO`heQwc9+& zQ#InE(~3Jx3s?SImMpMxlc(4`&R)y?VJlz0_uo7%d1Cg2Eyqtz=gzH`o$Pszd)?Lb z?CKAH{}Va8#JFI`=XPQB&tdJRTh!j&5zE-8#P+=Z?SF;?f7cW}eWW0AShOfnJg(T- z^`*I3RF2<&hSiFqI=Sl}G=G2k(>{#LivQ=TojDPg^ltrUn6G|U<7sn_`%TA>1?vyb zWbD=5Klyc*V1(ARX9s3AR22u=UCI5=z;!>n&v#B)bpE1aOJ`Nuah!a@ul`o@S@BVaM?(GWhit#^kBA@h!d_KMH+IOo- zTc#+=tPpwmA%A+(oh>OUt}{{N8_#gyFjzo$9z!_7jK zs2^6gJ9o?pTi(S`ce$ee*x7%6p@xTamf0;jJn2om$7Tx?OawI56CTQ-< zSsJ}}T6WG{q$pR)xU1C|D>MO6Pp_EsOT9bZBB_Ux6UknGbeYt(A>zn3(C*Ca`y)_YsYO$@ZJ83C+tqj(cH|*B3oaTNi3Y5 zq5hYP|7-L=wHw~8da1AC0e7<3 zFXz{i$!DdG8rigboS1#j^~oBJzcViX6IYxqImsZc<4Mx-J#T-uukhtM)Ml~pnZ&U! zrdfQ6@w=CsJUzN;#-rtC#*cNHP6y6=ICY)cqZX#4f!RBLrsZtR-Rv;$_p(p7{I-~V zFZAO#5;?|b6SD8#>~#r`cAjqe75!XM;>MOPTQBeb44!#{fm3X@1bL|0c^|p{XW@Sa z=Giq?^?c`l_AL*bb+)o_MQofS&x+(Mao&?rYjONadRm~&ziEaOCfwA$VrreX zZ_*tW!6t_krmeyI{xiJ#6KQeE^slOtN4KtTu4vae%fkHjtq!+8p8VnR?s#v{>wD?D zH(!yhTy60q{(fTU&orG)3}wX|9|-lmycBmcE_$^}O{8ebgvlF&kL~~9bEi;}^V#Kx zALdTl-JCYjclohr&f15C%s=Nz?!WQD$Ov>`b>W03M+&9w51lg2SkfjE?fT@;ldlrJ z9qZp6`p>Z8Ohz)ls!8YqW|-RY`l;Awqhy1!Um@wD@01= ztkc3`EgGKxjsG#_u%ddI_M#Zi<#&$ils;?Q)MTY`SEkmvM+c1 zeKP+|o&1lQ8A-k((I%!92W+^QBKsb87}XzCU;6St!=^)rPHp|qFy;J=+$VPH7mIG- zDO(%WCw}EZM z+vV80lzsl3x%%c=*X7qT3o8ZrS1LpH|_^6|D`CRG0eDdIAJIaDT!MOTbwHEiobRB?|HJezhl+B82c?>fAZwYDJkhPiQ3C6e|flV z^MplR5fGUj3^~*HrtgkGmd!+8>|=Yv^7c=mNN;d@>GAs zHq)@R^F-ISOB$~pfAg>}i!cmko^;VFh3!%F66ya8OFilzDxYS_U2$r1=%pi0n*zd@ zcmCv=&ucpK*7_IEQg!M?KP>gXRCnS(L-J`}rHcYDJe5U4^f!D|uX=o_Pwid3{=K&q zs|sazPH_KYezf87mYyloe(n=y33RxhW%?lV(c-@3SFCJzWKP%l$B7yFZg{Hb7(Z!S zXwQY5c~ALr6K3{^H!hAi%*q}1W95fg8o%YwekNi&ttK9)0?oci=wExvGVPQ0vFe2){~21&PB44Tp`3K_b&Q5* z%{BF|8!^#WBu=hB*)H{LcXW-p{KG1_V^b{7sQ(MHf3xVbrroxO&n7<>)JRVX5eyPA zkNuv1^Q_F`qr0!Wo3{sQ#AXLis-A4M-+XE1F^;#l_aE5L7w&fRNTbw?<4Y#B?US6u z9P&)6?a}h783*3B&Ek3cDvJN<)@iGkI~T9g{+kpKGr_^e^N05KPtWqK8J~WQWSqGq zMtoA|t8Sn5y6n}scFT;QTWTUUB5e6zZ@*2` zS-f>}>WZh2ZWL8sy|QKUm6h_MWw++PP20b^B30}^!;I<1PC8%3zA9OZ|6OGN=u~~h z{tx$Gr(O14@z8Glmvd$@Y0hcV&*W8O4{A<2Q#E1R>;1{UKBrHTb>{Fp_NI0VuZw(_ zl3hxgrN|v~ACq|9Q)-c_3m2{k+~?xKbiV1{&LwAFN`$G*Il*?zCo?#F_tqw6+pjF% zTQfZGFPF0yEf8q{~7e(rq=lU;HrJP^~)OXGcMU@ z_uW5a#V>RAh^^Vc9FUsnt;-_t<|19nL7%x`?H2&rV4%JoZq? z@xcN4>s>2uWClcN>nMX!2yM^nZq_5C1bTPftFfHtBV~O|%F5s=np7dhFN#(Tn!j z`rYbJ_|>+1DV_dtF00Ld?LV>q!~IuJxD_r%i8u%_>^rvj!?BrBFW%I8&5Q24`|nMr z*|RpojcaSPCwS>ucsMvN`Vr2$O7tr8hk&#xU*h>c&G{C?)!W9}5xjctjW56Vh;xg! zT$xq!&tj?1tXaGtohGtO@;s^=!uz^0*qYb+qTQbP_XIcCZ?b>3W(E(Z%LKo_g&LWQ zSAIXSbi?9(EIWHy#YGn6$!z4_BzY4?79;rXKzfL3X=G7%S93}x~_xEY7)?Q>0_q=}b z(?;!Gla?=I*|Kr&;of$?AFFfa3o;vHnV0xHn6O`H*5rSFJ_cHod^ttRgX2H7sfN{7 ziHbbice{6!X2HIW{%vdc_ZCED7VPQ%xu3art?G6o_8qJ8xIi~y*ncjQ4)wUx6B^6$ zs_ZCN&+fM|ohdg1s-6T*d9{JHWJ>Pohw69o>>pOvA9yrvaYx0I+{xKY8}9A{Q+!C9?7#!Cu9V*BX zw(5G~b>4;7qw=pU%s8n$;fU9?8J{Zc`ZlRFH8fwYnK&ua&?;teSwYb*ulp-DP2TTg zvLdqN<`R`j3@2H1`~52Cs`+F^)$Oq`aY%CT9Q5gvxV5@*V4gEENMo9cOE+J zySh+h8H>(SXXgu#R(p$D2rW33v|8au^@_Le_J8)%T4c)S{y_Ad^<&Simg_F?-Eg`f=^TG)|af(FskH^ahBP$Yt_V< z!xM{?gt%K)hZ~-r(3W~)=~9ssQsu*z>>ce>P`_*9^goj6a(h>;+X4KXO?F8oZb`!R&zi*VZDnRFj#vZ@bK9;o@&t z78coBS}5>XQXwU1>pSg@_qk+xBtE`>Q1xVLcC=8LM6O7Cis82Z3|^`f?KjmjoUOFwg%E*owKL??zu`q9jsPCeW_eG<_;x~C5)vnuknu2}7wxSPqW z=D7zf7K)}ZuCzVJbV9uc;^C3Gh^{haStoq6cQ(S3r>lUO@%GQXJgcHf&- zRnHbWXHSX>T0g5DqHTm ztrk0Rio1GpOR|y4fzvHfzD{+K^CdoX6`Wb?-{#vrvoLJCM8FPPt4HmUHU`>>eWFoE zWVAM1=31M>wJbn}tNDt?#NTr_w6t_Rct6d^*-Ug<$8Bj>6E|(&!e!c?$EQa3KIJdT zIehg!yE^-oGm(yNvL}{h9xU!Y_g=hbjqSOTKx?a+yjR-yd3LK`Na~BQGjiomj5$8z z?mn4`&#oC?_$MjFbLH%!x!Zqliq@JPdF5?X&4y^H@+;C?>)yzC`*KTKhrc^`WL8M5 zT~_(QBeUX6Uas6*_{i7#OEBZkDLE`+Ru?Itat9%#<90h&Vy@#PE=F#^QkZYEvvLt5qN2?a{aRM^X;$C zPMlDvDJwQn*Zh&){FhTds!g`exGCN&b$Opa?kYzC#*+qdLVF8CkLhHJz4tyY6&)kM zww+6S zN2i-TICI3INA#n^|>x z!3*DPeciM^{fMKa#zUA5^LyJPRFO}BQJE%<&g z+oNSG^SbA(%O-L&X5~&))moj$9@D!tG-<(ssSh=~wz09SEq|cJXc5Zw$@r_in`c+g zjMe`yH}0LSpVgmp_4cf#FXirTblPIptM+!o#{*tYRuVyquCE_Yu-+8oaA2)qSI9kq zyRL;{ljJ=<^=y(CwQyV_m~}j8ch`~=D)DU6e}5*-W)}6RIr2DDpz#rJJM%T4<3OC6O6@(CgJ>uUARymWk%1gx(On zvFeT1g`?biKYG`0Sb9VB#_E)Z;WD8&M6VuLcc^W3+>X#ap{pKE4@p|LwlM6qV=HgC zXx{Fmbr!2bL1V4!YeIK{hg+|Um~kFj8_u*nM(aVr>W$8w7NV;jO-~F@2v1tKPNPh; z)IjS}W|xd7NX^!_t=x~cO)5TSs`8sBFynQ-UflUz$3ko3AIg8Ya$*t_Pg8dGlOt@~ zjhWv{tbbJTq~eC85x2Fsw}Rbz4j#>qa?9pF|8tYsZ0{*G@0C(>>ZD4Rxm}y^$y1s4 zqy?u3mxA04q5I6Od;%fK-r2qzk4?;$x-lm+msfAr@i+a8Ib0W{Tm$pJDaCtfRR}FQ;AHze+hi zpd^dy5v!(I#{y}-nQ9_CBX~dD(%k2~(jr&n!XxPkOAEIyO_{#&Q0vq4$&*~I=UP47 zx^%5>`LS!Wz7|Hs$js69s>#UOU9)Iwr@Vqrs_F4J6Yt8|MHT&;L*di zVTGm6M&(6`1`+bJ_Ovg_T6cNT)-7j);)EUiyWPL>CAq7#n|*d|h_B>|HJ*FO|Fz5F z0#{z`nHQ#h$uv2pcIDQ^r%h%lsS0iENgPWxe_KxAVu|VxFZQdRFSzmKN27=C$5;9a z>8$*H!ja)emt0Lm{gHx?1`kusuCFYVn8>f1xXtTMlBVv)?a`7?r}hf6AO4i}pW%p` z*iY|{p!6q_@&VUom5MZpq%H3@czF8VnI4&2rc8_d1DJNs&)YR;>GU^~>>^g5-fwKG znYUGSoAuG01+{w2o9mB+8f4Q)6v*ru!i553ImqfYF-23ZE zw*U8)v+KWxqz3lhu9pqpDX2buN$d~iPZmFXj)lnFGS&}ORw!gkRuc0y+H0gPtS`u` zHs!dsMYo|T`(^&Z2^OdIOq&k$El5pMoh~%{hT?AzyEnaJPF}i84%8>qN|>h}S#V3m zb`}45X@9B785wn_1?qZor%O%F(EY8yf5+h?pdnYwcDLZ~4ouxJCvKW^dTq?@8?!T!n&d?_dmnU)Q>kTCUqFyWnU(iaoi|Nkz0Zdx4~M?{fA>}Jo#K3E+);~EHLHxv*;_h((Z`)+~^5RtLpN9X9 zaaNzLJ1NnAsk%O&m;2qrI(=*07yexE;`97RNB>Q#{~E}<;Fq0? zxygU|Y5z!MzxT^Ok0;n1T%2(DLEPfyZ=d|}__^`H75;}u|1)T-{$~ie>GPjqR@isL zHAY2T4U8@eZxsH^nQ)pRzg#N9)aai~{in_UET(706<>ZgHAqvXJMqL6ovVKrwQN5a z|1DB+rR;x(q#BvSKNSBnXxBgP`X*O$DW_@1-hfkC63oH=&(_B@oRu=PJ{Es5d)j=P zB`V3U`hVwC)ZbCt@Gte{n}3Ur9o(MAv}ntn%lWPKC(ju78A+dtSG)1}oPCqve}+l( zKVH#2KJTr3$B*lmb=;18HI3bO{@}lL(H$Jpk0xeY6rToL%l^kJKKZ$|w?T#VJeO%U z8lLJ?YsB@BPcnFN+agP)Zbtp7^FLlKxmUMsrp3mrA1zDW_x(6;E_VIjQ8%6c3}@T_ ztohH-r)rRWEzsDcSEcdzk)^EmkLowiXcK&IuddMR_*5qOpO^Q)m5cRielp)yo%HLF z#KF)gE`FxP^UmzlxKeduLGqQ@Yx-Y4|7Td0VfuLv*B&PiS5I5k>@VL=79Kyl{qVW^ zEBlK7Gjs+`Kj-1JO1WXLxor07uMa*dKby~N_`3VA&eMOtG&oIPL`=G99CGFAe}-pw z`a9*`e~aI^{lM8jKk83y{?8C9%=-DsOYZ1{0wF11&PFZoG*zgv=hypDll4TZUVXyf z;QtKXeTM%TN;TJQ`yBfA@W+g+tFP_p_x;b1vc6AV{zUCcE2jEWDL<3`Gj#Yo|J=4x zCO2=6n5E`Pr@1dLPmTVwM(FI(Gwx~opZr~M-ta$zmBD|8LXIWAYwoVJ;pji2)GASv zS;vqoB~far`ZouZldN3-UimIJ_w=+lo(zXq20fc>Bj)mHykq;%aLH)???p4S48uwz z{z>`lwP7_ooVv+k@g1?)qw1zwWsJYSue-sS%2O!QQs?b@=kxMk&f*W=td2YVVa}qO zIUNjqC*5bhbv?Vr>qwW!@%*oDA(fT}CK0bPK7L>Mt7v!LBNz82hxUd`y9=q=+6i7{ zzdJG7Rds``eHd4CsCQDi?1v9)7b$Pa=b6x$l+xjAd3#%w;WV3!8DGk5-J%ROS_*0} z64GE$Kdd7WbuJ`!Ti4@s-@lt4_L$6EEbhVWwN`tpuhr8g#l}fywgPom8NW%Un$A>8 zzW69OIH>N8$?;Bc*`DNY?w9w!KIonCyH<8x;>1TtT++m6DJ07QR{?BD>e+;Wz1Tb*fJ%v~cY9^Zc}Y!R?=6*Mv{GJ$b$|ZRLN4N%iS} zV`j&$j=K@%n)lSz*M9o_pEItDx-3?@>v`1d!Ce16^G_cZSrqoP{pOSp+#AOA7Y@vsW*KGFwX|M6OGs_ewgr895~kJ{LTXJ>vtI;D{u2_|Id|yun$1HPJ`=r+J>+Y@NPKrTNZXW{w z7QLzX(cL;f^pM=Q%`A-JsSFG@3}^1KJ0F?wbJnZi+>#CX`iqwEOPQ<5f3RfkJM{7U zo{4)7TsM7kReAfq%uP&Bjsyu+PddeDJ*#fb0@qC!+&;QJd4F9;Ks!I=!n&zz6uNxx zCNunJn19;*#=i*ZcK}k?T#70N#cVrypr9OSOrc zS?s06=(l6l&9i(r0$wb6d`0N^hWkt*dZB&Kv%Vc#;XCDxkop?!>|wlxK+nMGEH^0psVPkOj}t^3CR4876+vW{}SwwkxR|JUtACq)6lz)8*} z?+jMYD7w4dg2(aMis;=I?~*f8Wfm7Y8LekiE;!i{`!B}j_U&`0-#ps?;q-q7lc(EO zuAMjSEk}EBpXN<7p`a!GpH_+f<@N5nZv1PUWrSDUY?{Z%-^|}` zxG7b@B(nFSaF)?+SI@W4yXJl?k$?VgAICYPCqW%su7A04xg|(6?QZu<*8ZQdn~s@v zMBjM6=t$t}2Zxujd2AL4+;+PnAymCJ^V)Kzg{i&lhpxQ5d|T9K%Ucsw^(iI4xgY)u zu0OW;TTz0cs@zwLh_&l^|Gn`FJE{4BU18eZFy&>e&i>l9jT@Dg->9E|^QcCF=4Fu` zr?NkU?KN1v)50`)|NXAjyhr_h=xV1-ni6`q??A$#@twh4g- zvzL~AJ7E;6^~S2?Xy{+3)t8o(trG|cSDCk9b*TT(ABkIndVC}+Lu#V`Gt9p@L3IXq zEeqR9hk~ep?^;(B^e@>jGh11|=JduD_I@I3zaD(OPixMLE?L?C45yagVgGZrTd0@& zWal!CjQM;wmhSjxyE?E-I?>sO(V`D_2VTxNpC(u%3|*|jU9OCFN%cHjdu6Mb zgYPq~%Vc_Yn}_RBQ0U{>Il-b{5&~Cqw=b@i+1RC}#PG;KHBcm=`SLcctqKblyzW}H z>hiiPM*}7ubziaWKg0Upg^Wwu-m}^%_by~DcD_(@ zG`j7S`TbbbAFy%TgO&`*_p;43jIT_XkFc z%T=r|nI8D*>64ZZHtj$EGwADVc+T2!#3@*RTK=@HQI`+x|Lhl*CfOlk|0C*G+{F1i z{xkTjIAiu<_0cEXH+}i;yV^gBDcU?i#ns~Se+Hcc3D!U2^`x%$aZkYKk5Mf%brQ0ZwFJ^dM`OxfW-N!Myb|=0cKGf~Z9dWr-ZJ%wyrCV}Q z3zr8zGF-ZKbs66Q-i=GQYDyTgmf79N6lR9$O=tx4p}-ml2ume*1&(%l(fh zF1fXHrq{;=iRuSS7CxIHP-~_c&-WB8gDf z#Vld7lUg||Chrps4q%Tx=E-Z4bz4BQOIopE(YK@8Q!c!}&a^Fl!_h#2xtlb@{I;?) zg_m0Q1Z;hLYk^Ft$IO~+z+>g&6i3H^>~u#CA{7DLr}1E_44;_KYJQ^ z8hvx$^&MGv@3@xY29ZnLEi(j+|S(-tIX@=W)r)8RNFa6+T<+V|Junn$=ej^Cfu;WBB~pThqPQ{`VBYL)b@O7Q0V ze5HPGQ{a`=>UW&^e@s)Ktg(^%>vK-I<1%SosXH8B7K`;T-!}UoZFO_*Wx;)szGb`n zxO}%HAN0=lDLppr$}Ove&@Ib-xE@?Nv{w9R$mwvdwND>6hKb*2TDb1Pv;tdG9oE8K z=@OHson96rHQ#rI!N;~5Rfm_G>-XJ$cle0#p|IJU_4jkX%h)(pME&ZSf8u`O;UnU$ z_X8(yGPQG;Qz=-y#XD1Rx0}|1JaftZId{DC6ob+@%I_~ctGyxN`>vWzXWn$2(JE({ zb3b{;f>+OFue41psd84k|76bQ4ugj}^G}CwpXH;=xIIm$GEYKq`%g89zE;nNPT6jx-?dK#mW=6wPGcL{PU)qUT|?@h?T~j zr&lgqzc!s$G5PL_`^(R(dM(SFxy>Q^iILEh7Qj^TI!jdObSJT6C};c)HzIM1w0aMH98O> zk~{s#DfW&NQ&Z18nY-=e?Y?)6+bnKf+QJxc@xc9^e&(5F5r*di2%@udc z?9|zXG7GjZzxBs(Yq*E_wjZ}b#caCPeOcMHW2w2tstXUk+`rEhduaC@uKPTp%R1xV z@|dmiPg!1&`S~PMSN;DhUFPkn?MCSNQ5(avn!y%(`5TuZnTM()RP=qokzX?ik%I-QQ&`3)_(2CV%i>KwxZE-+K{Tx~<=8aI4v~=APH3l$U~GqA#-SpRK8wZR0e}|7UKt;+i0l z_2={VB+VCDI$eI+r?oCY?H`tZJf7yPOrP)^+G7NJhoh1M4tYS#%zrwzp zzx$tZCr`^E#sn3{ME#5VUJY=!U|u*Im1IEZy~JI&+t7Oz72hTK6rX2}6HsPJcrR^_& zBreTdz+QM=$~njV>*M7?*ZNcPB0l>N9wKSF$;l+%LkvK+U0wN|-w zU*^?XmHTb`p(E?~I2XPDbg1=V^m?DkqDS~|tvs}Pg2r;$eesvMMSGt5AH95hn?{bo z>#nuBy=!%!c3rxx!8Y~KmR*(y@1!)k>Kk8pyG`1i>v36i|B`y2+{}y__BTx>Ze6Zh zCmogJzwJhDX5zdVVbgrgS1he!V+nuW)o}Q|N%RW8b9w@0x&1#u_w))xJ920)ZHrQF z+g>WNP&$QM;l!SmIo~psH6xQJtpA>p>-GNl(bdxrCp=EMv&_6u_2Q%DkNyR3{N0!M zbV_p$gXg+EE6yEVSk(Ka=aBKfJO`2HT<(yTk6$~NpLlYFWtYMP(X}PoEBW6)N&EJ4 zro@N7XEXg~uItUXupsWR*^gGMH*Gg%#B)WGOl^%0bDLdJ^$LpJTPLQhRLFeRCPm|< zvfnbxjL=5*yyNSXMV$DYKJi=Jux&luE*;*HRlC6c_8HA1M=ozXY^Tt8F+U}~$;HUY zzcr(1omS3-RI_d#_BmN16TN!oZker}wyQO6^+}moMP6JJAK7RBW9MBq?bEF1Q*uAD zFMHCeqW5=a{gI-C_3Df3;$NoSy16dO-uud;1=f=m7yV~=bNkJIhSf8FuyPj^pE|9_ z@XU9|m*;s(JDjFZsY{GHXX=*mpJDgR(AA%0B%*<-uRJ_-w0E%oGqv2%cyq-HQw{T#3;sqX<{mveqtf{I)1T{K zOHN((>~P@8mrEO8*~{GCwPfA1TVk16i{Bo-{Wt2-)bNYB_utH_HTlobnY3-n>s>+z zGj)!>=vp%A%JM$~2OXApc2x4a?VJ}qO-uY*+EnJ8ih0^Q{?3cvJmqmC@8=o*OPiaG za=a$-nv2SopXNy7>g;Cc%JqDEb>9W{X9mHFDkigH^si=qGC3i!>9LmX!o$~V`k56c zx_+_v&yX_lOA3!<=feA^|FOu=I3bgB%$5CuOd0#j6BS@)%0K5X`4cT>R&+#`v;{l$ z*!46XIg=7(6`wcXrt{EzL8n^7E7d7{O7jH;MbudO%wCCq-7F*2t03*VORUxZ{MVj+ zN{3zg-rm-9S@%9T^)&9jvLGaO8v*l9B%P5G?FKJBLWZStIwyEYf>^}fV9O>%yHM`=Si&#Tt@QxCe% zf2@h;x0!KFV$LQ1;7|KKIQ>_OE&MUV?`zN$fYmeoh*zJ#xzghmrU3;3`vm04C zkshY@O0k)X=N`!u+Vadi>WA=e-8VP;H3XixYiQ=bXpub^p1ZAU%Vkk*ulcR}AE~QI zc-&h3a)syXD-XABk+~Ihj5F$O)3sYtMY2aTd)Kb}D>3(&+3d_OPeO0h{?H9MyQr`E z!-=K$L*?Y#ShrSu`DV)|<+}K7$;PM?8Md23j$ID8=+LSd70%8X?Rbj&{e3kiT~6DX zlOMe(xO8jTTu$$)>OW=bj}#U1sFnHVU7vbF{$s)4$W)W2E2}CsiJss@$=3XQnQr`TPoUrvA?BHC3Rn;b^f9G zMn=h;jwggAYIbV8K2mFcS*(se;dZQ6>Ex?7hYKmF&`f9u%vSuV#fs2J#S3kF6BxZhk{>M8J_ zpcKj+kQ+asxWSPAJ7jAj-EUlCh z4ba?nCUXD7TC+11y|+_xjOBG-PB<=g_tp_HPu9rYSN<+M@yt&rAy1}eC+Ce#9y=R9 zUN$Fwd@KZzv(`|%;5#G4W|{R{7rild@yYJ0iFt{noRMP|DtEU;XbR8aV;eD%gJ~9xBol+ z^mk0rnV^SydJ!LOc}*D}EqIn-_Hf3fxYV?rMO9PcuN57L>ZttBFw>^*lF#K^Lam)D zd^208%g!z;JioVZ|5Q^3TO(IHcf%dhhxX2&;-g~oHpr$br6qLc%bE*}T+{!?*QFd? zvCMzX@$7$J&aCvm>EF4Z|8dJ1z6^ma{b7GjZ`pW@B`$VW@X380m;Ys*Iv4lsU}sbI z{F&vuI<=P0_5UoT|EJsk$8Akx_1OsxoMpXh<5f@WD0}MH(A$0@b;j}oxsr-UH0NjD zOXz#jAN(MnsqFXXbXlL&Cl5|Db{R#!s*{PXnst&KmI6V}id*&=@t!Su5Tzo_ zu`Jy8`$>bmz&msQuxW<&Hbj*jm|}b9_GPYxqN|E@raG`QZQ;)eb;}Hu?o`?SsrUT1 z`Zf3YT$X5f^lSY1$NDeSdj8k>|1$nFG#xlSi7zDLxCjG3<5YngQvJ(V)+PINhVENx zq#1u=4rfHn7wP#|yJEz5-WQE)TQ(!0vtLbOTcCfIyx{g%huRqqzuEY!{AkoyiJUt9 zX(DU0C-BOx{w!VlXff;3g-WNtapX^2=c?`Tra*PolThyBWw-C<+IakXv*3Z3*!|Pj zrWO7Awkjz}qhhj?jilerFb~cyO^(Hq3cVe+n|WSVcWWm`U7wh0G;_;0PU-vu^Vub*yqDTF^ zng26zUzc`D=D9F`)7|O`1*&15k3&~YI8(;O_vFzE@ojl)%GK7?6sRtiTA-5ew@>0$ zxYmX6ybIOMw<7vbUSW5n7r-A#UwAePwwT>VK2Ykf5Lyr{-*sO*A2I1 zE^PY!Bsj}h`^p7opKcY)Rc|spMGs8TJ+f{;D=&XdXo-%+ROgSTA~iQY{<8=bx}f9U zAzdaR)T+=Nb(v|M(ZnkWDa&79`13nyUF3|dqJ<&1J^TMk&o$Rqw0AE2&(K@2QTNu8 zgSW3}ovJ&_%Kux3YpsgSD%%eWS1jcG<{+`!wNC4S7uS!vznVK9++SOys_1>`>DH>A zZqpN6ZU_}REjE-j43!UPzP3YXVR>X?6<^c-@}rYDw3cjjSob8+>Fbnm+h#4#XGlYN!4i5dXe^aO>KIQg( zW>vMm*$=`E9WsvRUvG@^XwBFm>h|o8c9DHr?ChKS6aF)7`Yr##QlWK&X6TPy>u#*t z5#(x980si@xb~Q6@RaNMpVgUGdi$AXX}s@R;l9$Lk~5ZFD(~1-`Lo+1l)9Zyugv_@ z_?3Ipmj^xdk79~qcq*pr4-<_E>nEY27ld%fb7!wqJ?L-G7>E>zR4Yq7kQ#T-j-0K-{1e|a@V?eU;o3`@2}Ikku{6i zC$u7I$EC0>%a_Mwnq3gNw?kmxj-^NI_Bf#I z=cCmTZ1+W@U-r!io0W0kW!pu+hsW1xZEdxB;62SI(4)m)Mr>+H{|=KAw?dtMhd+4lJ4Ee&p@eqGQ~w?oQcV%gint_3dwCSsqn- zGfcXFxssEU_?hVqclbgQkL1~J=W*h6)O}U=wo`e`<+Q*g6?d(!)+hESP5&5c zSv6GdxO92q$^2^*a*lU?zip(fP-!9|cs9beoF(ODb3%{EIt7_twQCZM_vJ*l_OjQ>ny=f}Buk59ygabI%$DD7td3564 z{)qQd^r!YtLWQtv!A$$H|ukI?xVy5}`+f(0( zHvIA0XVM)w>6y`yV{62AGiCoZxTKqYZRLf;rQ43)e7C=kD^Bg`tKJ{;_sfYs%75*B zt-VG@^HFel@7Y+-UxiCPYU@5)uxRgu0FmzO6}db)i zYd6=rqfzR&MYCqCZqwT9CK}@*`$4{99KhtB&J9{CgfINPh6U50D-#iP-J zbAoOJEx*kb{iXf%ebM|kUtd1%lKRSB+xTS;XNG(H){laX;S*y*7wv7+dMtS~ykMD# zwP^kStDVYIMP3;PJlE&j>v!KKXx~)Pqp@CJkMb?kjPhVwp4b?&^x5GDHg&ayP69_x zU#Y$QHAz6T5aOS6mlarLJb<_FQSjibtBC59Umt`|Hu#27_DT?5Qt~ z&8V1=v}*gL^))jl%ZZ+@dwD(i@uWw|hdSCL*wdr_Z1||$Dzu$jLBT-oIG1LvQ*Ucs z#Ol`bf({;X606hR^n_N$yDWdCvtQXqYt{MuqOGMt{~69Y#{W<`w1Rsr-=XJ~3*3|J zu13gT?_J{2!uct0&VPmsk+?$*{~6Bew%x2~jjZWjdM8IE;CN!F^2Y=F6us8(*L)YY zjNQrV@4EYCvNL}7!6L(~;-K5(Q{@};L^jAV{9BW$ ztPzy28@uT0v?-#?Ybt^twd}ZMe_q+=M{|5w;%!#7Ycu-WOlC(VD{nK|c71u<)O~Um zs}l{qYYMbWj)r}-5O|dk1{%8**|p`s+DB`@9E~~}W3Y5%*ET<`>)SNSeLs3fgdS#+ zjR|z&KD z!ya2*w#|KcP~!Sh#zTFo8C!O*+;=3euDMahQIdb^`X@_;JM7OmEWh8|QrMDJsh8Cs zBb%IxQwl%*PVMK~YkOPHq;QH;Wz{L$7Vr2X z|BnYBiEip^vv*+aV2w{;b2xQlyVh>5<{+DbsI9{7Q7gVJ)7ss~THq5}A*q_*aj0GN z>6^lE25sk!N24FcXl!SB-*xMuY+-bcd)vgkjMdk96;~Dhj<56N-tnmIWn(l$$$bB~jqTX|c9uPyog&}o+k`)Mxm&xhK2{c8eln4Hw!>l3i-ihX+i)vlG274qGQ zk8l6uW(t=ySTvRQu|Wz#>)ZVGEvikK6+Z^r6q;o$4X_nB?EG4ptQ{|Ecep8pwI zk6oKHx!r`V{lJ@oTbG_s;4$lRI$NUYQ!$fc$*tDc7dk!^ZhDxst7Y;=)y{)u3l!g) zM(W-$+88dsg_r+f)8+89b{qd3RQY8dlg6BXk4t{x@jtn3rc0yei8C4<89E zJ2T-zv_jub6UAqf<`xKTX`A##&EW~-gl68)Qy=WwG)YaSW9rPh60iRZho0GGcCxGU zaOj8~`;rPY}MVfoRa0%JzuPUzad(x^w_2+4IEG3{wew~#n}JUUp?KZXP)m? zeLTd<_~MNJ&HPUxb?4F(8m2uxde-WOZD(=9gH;+QZaL54N-$dHWOktD_tW|7)vrw} zi^4?TqfCb-df5*x zYF0RVX7{71OAS;r`;|SnF4Ga29g%FIId%8N~U|d-f=GTW7X%^_LR`(Rx-Xft6wB&h;D3p55To z5dM&D&c5?+bN_96=2FP;=(MKI#Q9;J0`d1(8m@dQQ~g1uzoqEOiamAL|L8?TG)3(E z_4PYa<#?f9LwoaQM@yHD6Ml*KS{O?@q*K>)17uy`wrh7l^L>7qz+m;FF5k z7L2mN*4A$mXT)gle}B5DD9eGZC#LSa=zoTeXDVC%1U=Hdr_QlpvF)GL2EX>6nJ(Cn zCCL!=Ltigu|FttGb`&Y^^t&FN%_)^J!(`0@qxB7Mzdz~Oo}`pDb@pez%=?#JdqM&x zl`9|k6c+ZMA@pbBN5`9+TUy#9H?}?5dUuJVMN^8)OaJFCfBQd8t>eEHC!el4huz?I zzv7dCZ_~6M&#Lh{b;aZ(yOPqKl-*wnU;Ef-A6Zs%?8EU!8;|N*8_kS4dF}aM{a)2S zj{jz15qzX8*3z2m;X{r`F(q4acg+3UCnwOS%6joe-Qn;jg%5pK+`D~z`KF~O1$T3` z+B(=uHvBeydzznF(AqWX<)#?7Nr#;#F$G+ky71BM+O-=W#F=T4oL&uY_A!dQU=n_x;)2+Ab8kHd=>MBG7A^`af~Q;x0Zn;nZ6uOc66C zMj8B#c-Y%ksp@JR?f7t}60cj<=`8k~>0B05h3ikBOkcWb-Qs$+%^ z<5W`}J2jN3H~hrP3>+88=LVz{~TlSRPZ>?r2I$6c#9=6pML zp}B#%+@RP~Fo6Fn$J6brTZ4|7|^f ztN-zn84=9!{l}O8s(*I+%8ALtE^I>7FFTrPI8ocSBa)dB$(;KjS}0O1j;23q8v=J#MMe z!y{Wm-tSm<*8dy7I@_rhX`Yo+GHy*N>q`u(Rl5_mTX6f^vc#Ezy%v|IE?@Sw=pEZW zQ||6tTs>^uM~>%zH4fgF_@sFr_v_EkT#Y&CD1w&jycoq*V0i=IUe+mB5@ zu046*4Hiz%2|fwCA8tJJCZSy{MKpCMQ~1Ph0o}o0=A7o!bXB?NwY5ileZzkS!-lo0 zyQaRKyYITt5|_GDe{%mbFj>_fcxt3zc0}mNSAUC_*W4#*sQ+AM{a0{ZP!Yo&1%ET; z)&Ekx3q#r`_w#SqU-ZZQ@3gQYp&JU!k~^>EueTGc<9skXHFwH#z8U9tzQ49pPUVuF ztgd^EjJN01t^G0;lRcMiU7YJUjZ>lJ*RfL$mX?d2rCAp~nd2;Ht#&W#cf^X$rl|~ z%YU=~xc%mdr5=)MuYYg(!2ZbI{O|m4@*gUe7Ie5-EO=z~=kLkCYq(xrESC_Pdbjsn zNVL*cPG+T(M~}HI^?kyZ}5pJx7R?>m=2oLHKDYC+fz(R88XvrA>!6aN;dF2Bvx zYV5aM$yrtNZPJdgKG!Eb8jdfDWRzzGRqp9u<{8Fu!v7O!0ol%!w<3L)O}1TL{6#2i zlHxb#uki_|f7?HKCKtn$c1b)wV(FJO>DDL9m-0Qn>;Gn3u#8dThIu*sA)nSQ&Q|=j zU-Qx5N#^!%rhGr!lA2s*vftHFxGHLqFQfXyiJk%W*W>v=ZCbO;A*TM)61K2iE*~d+ zyS}N5w>$7CUqWxEYV}y+VWx55`w#v<*{4M;zg8r_K2iN4|L1b)5Ej1lr^T1A z-gUguDu4Gs!`b>bpC+Bre^Mpn@cV!KL(C%0MV0ICAKm{rhNnr&vbitx)ag{cX%94bjx}>QMojOH3S0cNZN{xV#qJt6 zERZ27pNU6*Lo8E)@5Hto_~&${(mK4xxzZ|B}G?_d7g#5&#vS3Qo^p~e2cKIxSBJud))JMV7quU-znF?80*Jw_X zIN>fdr>gaIz}hYS+k;)%-yd&2n_Itf<%ujs7x|~A^idwUYE36xt)VW3kqsKdRPBQaE_7qx=ic6&%CV`LhnS5YI_yQv>pHR>rv}o zUn`lQyN1poN5cz`>J}VW_oY!pSv0#u){_6Y$Z7@lLNA%z@VOhbTMNTJs4g-Lmw5em zhS0K*^|7!2)fzf2dZ%R=c8)c->_$SUUwj$M+RT2(uC=;xJ3^Nh?d8AUG-?0q zNoeYB*`XOFG)H9JSM9F#y&JtYPTuAka<{Tn^k|f;R@Ugu{z<=wC;qkok{C-1KmXBeu%m*bW`E&Gg}>Xv;C&&AH%JY2d9^@ z%?M4r5t10Hbo{Up}sxo49LBP0V#&Uf2F}by}%CA|1;_T^*fw9GFtO`|@q2P`#`7HvMJhaCH8> zXvGJMP(dZ;>s1fDoS&UIekJ14oLK(H{*ODK%=nxbJ6kKy*~yO8cI7k?79W>ouQH0n zP7399=W6iTeiZUL%(|v+kC(itWlgc*)isaVXGDMHnswCFc1D^@sp_Jrgi6aTzn{u; zc(VUg*OUA+t8eyB$6L>Im$n{15w0t_=t_a7|Lc$a+e7UhtEq7Z9&>tFE?tsP6m#R! z@)b)01luNTnEJj~>DpAcgNJ4ZZSzxY-&@Qapt17?--%^WZ~c!O%1oK{@8^U0mmD;G zPPOPnhb(oC_T8D?$+hiJ%iE^Fr9EqfOZJH8zMOj5By4^9FFS{ZPpqQbze@;a%2aj! zI=`yFs}(arcxTwKpo5 zEV?e+9A9avC(y0;Rn_(!7kBEtCHvH+I5s`BnP+h+xBi;S!9(Jm8;jNZY!oZHeO1<8 z_#(s|I7c^>TRhn|4o~-dx~wd z_}<LgY(eO9!OpCEV8{ejVsPbuOr;@^iP-&cr~^Ep13wQ$+$ph*cCM|_vTEZUkLKR8w{M%K-O8NvRsH?3sqQn^dGe|42whO1T6MMjZNsVs z3h#_`=GeHgX0Ow_5qzIZnjxHP`;i|33106kLKiHkP6;iLlUQA{V&RLza2D-v<#O!5 z9y&KOzo{_{Hx3rfjh=8cyut54$nT`p*Y5TQ`%g1l)t$3?fAFJni&gI=R$ba>vAT=7 zYwOF)TvCsHLYFC)=V&eSv`-0s{-43*(R7aLjVlkVZVDDHklmp5Dz`P(>(9opmk(RH zRZ4wtzdITtd-GR~GS~k9*E&C(b)Iu0Cg=u_l~hvOnWI&YR{K2t78v}4Cv<6F`{ca( z^UGM)A6lm@V)9Wt=YUM8=bI~kC;LoYtFd>rz7zk$wu|1%+so}3WY2MjloYavFe{y` zW6hd+Xmv$Wd!h0=&2j~+N2__Gi!W~zEtFH*aZ6ghOxkHl(TVnl_KuQ@TJBtH$}g>Z z>-;0}u{+c1SArXUOlzCJd6IBa(vmfs1f2ia_eJJp#tQUa*);z!mu7^d=H?=K9j+CV zH~n3DXxfrpwhTwP7hYBMZRuh67wih;UNLd!qr0zo`Tu11Dhlk{b-9!Gdvlk#Y?zw# zdi}3c5<|9q_P_jIM5kj3-_fd?KC>W!vU_2dWnTq$`svH5`<$!3uI2x7Y-Ytm-d}P>TC6pO zOMWz_+=@M-w8`y2#kb?F6J}^Bu_wE-{0?R{dc=Kp$%2rT@@^)53d@p}rF?fBdc5)H zgXsKAg|~A|W@mT4@73Mmc5Df6drV+%VREBcSGU)$nUzX%cIr7M2hOneFT1nw(M1b; z9UE1d#PiGUEPF4^zu>WJ#i3(crq*3DkXPo_4HkeigcRiT5kty)b=}szONDr22=U8#nCJ2x&j@X~)W$ z4BvU|A9?N2Q9k;~wZ38U-b?=(4$R3h{ODh_cK>9Z%fD~Rp5L(GXToD1pC_TuKFynT zfaR-L`|W>b7IPY1maN*vHd9zkKy0n%$jMV-t-rSa_8AO<~yNhcXsZ_NCLNDhSp0O1BAhc5_=)tCW=dP?jSuB<2c%oO;{GMx9@tGQx?~)NG z?o79T`g_@p{rNTrezpF-z0y9swM#>mQ`)#z_df&otXP+IAu>OB zw|lOQ(e>Z%b9h;5q{@Q(g}*j@*y!^nCF*0|Jj=;F!9Ejr{af}vVVe6RmnlY*uhi&% z_|LFQhxts3lsn}J2q%FE}TKWcG0m->S4<}5F?eEI}`shDHuhECc6DDNu zT6Ayv_MZO?3m0l@GdpYZ|M=d!|9_S^Qu2KC3g90?^&n8IQ3hoGy~h={F^S4 zcHW-T<}T8=+C0s1=i8I}>QC$xR^^;{X~N$*?ZT?+mu{4(OZ%?e+T3^GVW`@c#4EKo zRvi{#YhNd_^(Fsji?v%W28bPE&a{u*Y4)-1D#L$ zgx<?o9+;rAI3dV+Y4mnrX%en5FaI?$t#qEsfwZ3!3<}KRw$4lnglvkGF zZ~k4s88f}3QJ`VhH9bA0zh7FFdqWhf1v;MWXm8!g{4!w^XwEj6uJce zGcX_BB%bplvm{BPLCA1o)gSi4@BbO*e@>nFIeSv2O6JmqJ2n_1=V=`XdB@A%oqx3c!A3#ebPZ0v#p@#v7JVz&&7klkHNm1S zNzClA!<~x%4EDF4?SGxJ!y)yEM}pM8%{tR3i3#34#woa^JNWpbJdPhbo~o<8z1Vi@ zmg>Wq)1)^Z)B3~6YavvgvHeH<^gm*Zc3)`$LMJ*d z)Y5kTv-Z#0f8GfX+&fnP;%L0`_dwmA3MLz;V}EWhlaP`O5L%`3B#T%3<)uAUDe6+` zoKa6ceP8H3CC^h;;`(+a@$Ek&6?=GZ6y7^|{z{_Rdqw35MeMg;NK^-_`{?#oo>S@5 z&Xe`GdV9yzm_PW0WmWRdpihg6yW+pLzp^MfoOIsYd*EAs~T%Ne;I~8y65&{f90_Ydm>I=xsb3mOe%Ta zviUl>;p?XGatjr1(RNRo_=Z9B*rj#4Opmj@ijE)2?~<55Q^mkT-D~xw#`eHJlKyYC zQ-h~-=O|YjX5TlBKmK8p=6?oF`)6(c8D`Da{CGO!kkD^=^Zw||dlN)=Pjs>?Jt(vH zhw2%m!4^e(z+?vyzX!4U+e3-JaYooi+4?o6Ns7r zEq>RI-$s9DTAZHz?9l3uKfe5D*qORy;>On#y-)mkQ7-y=|LZfh&Qlw0KJol1DO$Ye zTs_Ni{!7R8ugsa*ndj2Hy=G=YV|Hq~r+uc>e#e__PBU+9S$j0g?1Sv5W1M$*Ds-zZ z)U7$itLwYt$O_MO3sl}1%LQ!vXu^GKzvH%KncPR2x#v0h#S%{+$g6vLYDeYmJ#O}SFujOZjn>#FVz3ZR&LH`feAK!ncHH=kvBs2EJye|JA6;g%_T+Xubp@|XgJyT;bw>1S8 zPT2j%V4+|2g6F+%+TIVdxC9KNobKJx$vq&o{S)u`yZ;$Xle0ZM6L;TP3~By-O0IiY!{%-%PKP4?+l?O~6~pXl9e{#pKdW0cP09riXs8=q_L z=AX*{^>Noap}q(Gi<#C%hI~pRna-+rjHk?qAzkF6gRU(#yGJ;md>8d+gtDU%33&+U+vO zPPh2it(xg6IhChqMTxaQmHcAE{|q{A50>4C+xo=PXWp_ISAxpjZSAk-^MBo($m#uK z#-+l=Kf|;=m|`1E&h8ez{b%a8lR{fM^R*-F{!Nfqax3_%E03(z zzIEDZp}XAf@PB5OiUQlZ`{O(&wViw7Vg266Mo}!_Qe}g|k41Ccf9(wH)>GlWcgtF= zWQOn?HlR6mg z@?ZY(#DeQ~d0hUcDv2ej%cG9@*|6r;)a75El6T(!D<2-KJ{ zSW)h^O#ulHK1WBg>}m@CE0gDW_xt^?PkuP*#>8aZf45^%{A~Hxy{wtRVeb;7elQi@ z6j`DB)op>f;947H_OFiRY73r}YM{=ITeh};6+UCG(L^=)hK zmsiH^(<_L|tooUDl<(uGpBwFu%PGwY?|0ekH(~kR7_qR4oT(!9sUkHE2d4h9P6%sB ztl|lJw0ygd)^#6^QbXtVyRET~U12*Gt~kou&XU_0l^I%halz4$-Yd1eb8AFbl^J(qw=?WM9cr@yv z-;7lkW$m|%X7q$+E9B2(S+kZ`dcS{7=qAJPV5S{1p?gn$II7!FpdI638tnW-hBIc< zd$*f=473*97mZ;P&FM<;-Wb+#V6`M`_Jto0!x^goGo*h@Y7Oz-_P#OPC~0a7SAJud zVAqy_d0&o3M>M^E+^FqS^4p&O)log(n@4Sr`*4IZ2yR?)V5*B#RYGW@;EAQ11rMy{ zC|KRa*cxWUb$#JSiPiB!^S1tcH0{WO+J*k}v~CtuC4?@o;kv5X6~63-Xu(3$_l@B} zJC-i9aT5)gD7x>$uPPa>W!rvVk>Y34?vl=kC|iG;X{U7O!rRZgmX(>@+9`BG>B82N z57}?NhzG5eowZ3lW!be|N~`ML1eAZbp%`s> z0gpet^^YPAq%LW<+iVYFzyF^>@MN2oo2%~5-{1aLtkS#d_}lu?lw+#5m8NVC>shn= zN6Mq7HkN=M4cBQ;v?r!a`Z=>X;*1T0eX*WY;Mu0h*ERC}Z6>FSUY*lz#Qs=wsoUdx zxt)_09yfbVJwA2qxet@t54^K~wr0h_4ZdnuN;an~e4?<@WX1PWXE@T-xHz=TUS&^Q zR(7HPFh@9_SC;l9R<4WpPAr-;Yrf5Nq04C>w%=lG-yz}Xs$o*-xwF^*bk2;q3P+P8 zqPE@Pu)Aq5(zk}spvtmjcam9p%!Di6d)GYZ_Fb$V@l4+TcVtef(5HlwkB)!+A|h4` z)LywRGx<>}N5T3Bhl@PUlpUEJ6y@dldS<|ri+b5#%9N5n9h^KVp?`mVOY@YrLp|4) zXSW3%+t1X$BSFVm^0)bX!@aec} zVVT6~EGuXB+gShdOgrWN16y9~DgP?`{`e7p=KU^QwHpdQiZ>qi>#e&SE@%26Zd-uf z6XE8bRRaCS^uy)3^eJbH!pRDW`bos%fk;%?{eB+&Z zpU~Eyrx<15uh=W=_{;t9AEO(eLgO`JT6U$_Z)yKvdg6r2rtiBw+SL-+J6}${Bw%ir zwW&Md==q;YJ3cIJf3>~o(<{#_qG1aezTODdlV(}{BLCl{*_UfrG@qPm3VB!Lt9^FE z3#&&{ITasY7SZYWnDrneB|oMsy09_iWoy*8m#yI!zF4eUAp1czTf@4ykF`kn&z4_B znjsw3^LI0a7s}gA5)WqD@xCkedQRxBgmA$}hG8#TW4okMgE!u1+AfoGU%zh0s!fL$ zKY!mPD$x6~RjZ+~FBGad@d@X~-@E2$Es34~rqAAP$LgsJrq=U?yVgB2 zSe?wY?(yU6q8V!qon0P!`)jTE(Q6oL=W|zU|9TM%Y<%S zaHB+G)yJ-_jeJLAeYBn_aLsMgTJCgg?H8V)oo!mzc|z|LEG&#ln%430D7UP44fpro zNvm6G+(nt@{kRpb@%UTS@8qogvnw7x(pa!FJ)tNjRYrHqoAURc4t4HE zx<_lZ=!+MR=DTUQx>w8hU-Sv+h@NqK`@>eQjUIdUNj+N8UU4UILfGC+AI?bmC2b2B zZ`XvnWmow9zJ71Utp(3YTdK0yk7e$V)toqSS)sFzCfCQ%0RF60x7;cBP1ky`JgISg z7&nnYYt`Z>Mm4E2+9@4+U*!AbObS+-ZsE&%A@TLz3>%jZt2|$NSZv95d}H{L>%*3$ zmgP*%&lnCrTHKf;X4bKkMWOlH0-=H*olDQArtvFsh`x37-_75#rM>U8@Aj-;IsS=T zjpCFzw4dzR_Cz-64j2FH&nG@EZoTx{^yWnW--7)eeXQ))rp&#xSkC0b%9HCRXe{cg zaX5Tzk6wFxiij)w3uZZ$g2l;uB12;r2P>$*I5BgRV9vQSSqDAk6r@sXT&G&ZTC8B3 z@lkZ?vP%EAG8J8!=_{_@d9Zcak)AS^$Jt&vZ=$`D7$E& zb#7}oV=FiF>e|UM0Xq`IUKOa`PF$kjyYj=lb}6TYw{tSJBVV@iUf-v6*VjPXd7^FE zq18Sis+U*3vZ>!L8n=dH#mg@7B8kwe%QRw^i{{8^-DW7WSh%jntZr`q*Q4RrMRtqm zv5Q6>+OgVWp}S1LbBEi#{e7aDaqZnXclZ8_SoJSrb;852*FFKecC2nrbnaxYdf&Uc zZe#q`?>%N+`SUzQZscfW&geb%{I+N$&s)WnBFs5jtLh>GmMqXzD7Bu$b+NhsdwT!& z!2b-){~1gkhPFBFzsFVm?LUM4*Nve8TSbq?2wZ21{&KvgE9wy&%Ni{sRc)1r5~~G_ zSd6yFOv!yLQ+xd9WhH0r=rCE=+G8$lVH*x@%H3!wvM}{>$lP5Iw>reUlv7A)ndljN ztZn&%Wf5w9BCDReroJ#bXvU_YCoZ=C?#B3>xwoZUBY#eNb#|vz^Pdx5^AB^}p2WdE zTWQOmLq-kTdDj1DkYwfmBlTpD^VRi-WrbJg8#(G9kzBOC|JeTP{1Q4m!ra-5HPnTzXf#J>wEKYRCmePU#zDAwH@mf!1<_=vaY#N%uum!oVyYZ9)d%#P$! zN%K*^(WU$O?v)<3()w+ZJHwCde%7w=RXl_5Ty$IT zgr(Y#_iAr^KWQ1Ou-qcI$Ll-{G<&bSxpr}NX_CzRA`a#kF>{Wxow2zoKIwMvne;zf z|1)&*?DjufY?~Fm>e&(3gGPz7uC4ek?3nCe+Fsu-)bj6IfzZTUD^3$<{9UQ){xh77xD|5Ga&jKSe}+xU|4ehtrW$Hb za_nrik@Wux9Oi@U4O-_}}+zm^2_3Y72Q9i(bBt@+(U2qq- z@7^gc2erKBaj*xU?9TnS+vq>TA-%+zm+N^K-TGs+b;~0IN13_5ul#YIeslSokN+8x zCkpL-s}dytTHv&n4r59wPn{Hl_J=2(V%jAP4tGUFz|~@nfg;Bs;m!Vd4V;eQK{wx8BLxM#+bTl&eKb%G!Invef_c4=<0uK~j( z28NKy7kDxw!q)z57B=(_3c6FjJA}{wKZAs=vy1l~R(#b9RjsE%tew}}B-JkOUS7jES*FBhfHo~@K|ep^~}-}PnwvB%8Tez5&^?CO4((xnBfmK0vOG-IJbm+51# z8s~McG2&H;A*b#s`rTw&(eLZax$LIMdg(tKL;F7+YF%V6qjg!TT1IQBrjDVL_v*+s zAEzeXR#wdHT=e<&Z$?fnU$=x)CeJ#fW%q4<8tBzL)tKYFe)juif|;dz*T0$nb}9puNc41WDu2!GZ#^Kw`Tdbh?3NtldQ-6w#+U5lGO1|Vr#|boD%Kv_T@~0Sy zzLO`VH9toBdaw9pbSUaaz`cz@4s83aQtgy8j_lJ=Ns{dIQ<>tWpdNPSjGaQ+``gAz zxko23=1kYT=&$_G?>|HT%|Asx0pi<}Sf3htgdcNb{_vk+_68v)w>Rm5pZ(^_W-Fho z5h#rRp?vtC*_p_v-IHa4lB||Li`}|6jNi{b^~dcGKaBYzt>;Ya-`kO8KO^|gTZ#1V z#g6|O7-pxcxoqRODp5E4Z{4XVJM9v6 zX6iHsGp1%$AKgf0W;JG^jy~N_KiXD`oVq0?`ztMim(@ViL347#${nKld^1+X+n#d! z!=Uq@;S_81%YX6TY6`hV%A6CA(r0J;J**0&47|<<|Z? zEuz`J+;@X^t_3qw=F&;K=YG&S85*A^U&pfWX_o$hW6c}y|1MIU;PrIk+!d_lzl|VyQrX+a(BLh{R)%rKH{v54e#q7a$Ln~%Hd6ZS2 zV1I6=LBzIm(Yy;2*0Joa;mnwPd!5#Xe-=W^&cr{AU-F|qPisq{yI`ZP*xQL)wv?S% zx-QN_=+&cjMGQ|H!*pEc<$l{;o#6E-jSet!_BVXPp@K?PzS5jC&u;%8wt8YIpreT3u_yb$wZ( zcUScT@3^@J+O9T*;S$HR-uvj?W-1J?(!SEz7?T)$CATZ=mzEU|*Y->7+q5orlpfW+ z@aLm%0;-M7C!@b=}}pyjaeXuvXM!3V#;vmdFCe|D%{{xFxw z?PXdERSUglHSju!9$3}-O2bWSZGKU*sdV#|ivJ8}Z>&m{?qpYe*{J=ZFkJAqXv7r> zp{snFnNtKDUlclZt}4A-Q)5>lTFQBp_p-=3W~S{vL3a&QvlSBE4ouzCQ(LF_18m5a zAaeIdF2Ze4p0NUX2rRMLu!kN2PX&&W%C7pa(G}Jp{iHK6e*M-Yp9hh?N6njszblBXEe^X9~InKx| z@(a;+k*Qe7{-Ms&k$0iiXP$|&C%&9~<0$=~VbjT@Ju^xleYbvk*0Y*#N2uQv>(ZlK z6XyhV_RMeia8tn?qpusU-x z7x4w$J5kf(bkJ)4_XmF?C&iR`sx&WSG3>YS^?20%bH@DL|8^Z!>~R&`IZs1;wSlC; zlFgMRKT_<4^e=9Ib?}hjv4HoBj?|qNwXbt|%+nUsHrZ8k(*{%PvJ(|K$3i(xPKM-Y ze^ORTh^%OIx$Utxq<=B1Sd3$$^!tqmPG&N1JQ`*4@g$2vo>cGlwkWBt8Pn!|3OROZ zt%F$6J&`jVpR%T#XS#ns@;jxd$Vc$|@(1=hD~z?SuMN=tvskEM!hOZaYmS%m-=10H zp0=|snw#Bqd0Uo>#&nY+FH`P7+k<(td2YP?H=WS8`7WvOmCZ@cpCv&QbUBVUd;0H>*(_8D*Y_nUWQa!jMmNp*g z_!Cj0yiUz?Nzu#6F>-#AC*M8)^+adt4Q1UeT(z56YYZQ5DO8o364!fVW0@0Mw4is{ z`UMy699zEgP(Y>8u{9;@{;@NAecAExXqe~6M^jg`_i0_$cC(ZHyD{{nrpb-w#?UEk z2c{mZ-MF<_l|%RPan`kZN;_7sDD-yEn<2X4>y6$I+SxIo6&9;Ik4E#x%~+khjx2I~$#( zqMxueKT_WCpTR0|iRSTw)LVP}KlSae|8u#MOVsH?K!W$m*6`rNqB&eLpiNAxW4N}? zQCKa-6Y9D&-JW5=N87r_)))ca-#_NuxQ7si(xkN*C#$~)&3av@^RM|Hm!SF?`8ySy)~O}uVL8L z3>*KN&{6~Kl8=YhEz`{I)4CB8>ONgL?(p)j$1dEhPFl;Ob?-*#p&7Z{FKP-tD$R0z za>xJv+xAY8Ro6~m_4i*ar}AOzOTLzHIn#&HF9os;AGkApB>H7Gb{%^1wrl0|YI; zr{0slk_tyw3b2W2oT%&3YBfoAp5)x3QCG1rP`K}Kj#l5M+^#t-O-@=X^DeoH>lGydGN=+iN$59s2>ga-jV6(P#1+9p4(-4ow;ZE?ukYZ!X!s9FBz$A1e$pNmEv+Z{F|;Kn+wS2CgHG8!4j z)>&+OEE<$_p=)cTO?ChL&xxU-r3#`7&G$vi4R4EP>|-rAZjC+7B>l8C>Q3$4y}MJI z#8sBOy?;pzM<0f!g9oapVZ)Z2OgK+;t8sU1J+1m9j)3R-$> zxzf}_HX`dX{unN~b(kZ!k5A-wT{nN>`-u;I*Hkp#-1aw8Smc(Jx2dhBPp{Dyom*Mk zeQdlMc3xsG6+L`p%apqr+BZ^;oE8>Y_1r0OSI_3&elCuvvw5C9o8)(^@NQh{z+xG3&$|KhIry{%Dqh|7VwS@R707 zx_w^HF6y{1R=&J-cjSu=cNyxZCHntJKK@U2X21;Fm`sPho=F!@Fr<0)ih(PTjnp zOV8xF?6%;YWUqU&y(Lx7SKO|7-oD z$o@&?o2T}P?piiCC4hk~(6?n%t=j3?4F_6feeIV;NIf~d_MQRLN_m~F3k5`EKYBe_ zz$3O!Lvx?mx(8N|v%Mp&A7^_z$ZiZflO1$us@)CUs9r{up4`w$R(WjPzNSX3P9FES zpZPoS`{Qg6>D7snkIa=ZDJJqNDT`ql9-o%B=FacfV-r@zTY z8;T0P$_FJ@J%2rK=8IG7{lA&We^{<-bE{n?cTaT6VUZfM);4CX6s3jhZW={;{AW0Q zWD!2b-ae|D~&Q1okIdVWyQ(e^_*?Yz&lfL0^1EQl{c#^pGzAm>}=%e^-~da z-u7qO{@1m0)RNwIG_LY6jW_Wx6`62*lQUyr$YVE^Ke_U%vX%9_jpo^v+&y^eyNCW( zj&(_W5{o(RrcB&ko;P3kNBzW3vlCnaT_2`%y*s#yUqLHtao6>IHyGZh%)EWS<6W1t z)}oVcX*LsG>+T*m-gW~uPi-{+3E^oeCk%-UTS{xcZHRew71$;12E6`w~MkK;sw zxaaLp>z$CsZ2D)*M&mn2^`+don*2YTR{dv~|LIxUG_%}e=Q4t?PWYqz#5m)@p3k4F z&*Y}(%gy92{JKvw^UC@+%YUso{P>iye~a0Jev$pF|Gj+j{LJ*u51cdBw`TumVE(iJ zO|d}Qgjdfi0^bGw)mB_GZ*eipx0nA;^LGUw5U!}Xuzg}}++T05!e_e$_rK-q{d2S6 zl(oVEJHd_X zmF#aHIy70jHtEvMtckxSU7FMHf4u%jpN|h4yP(|@`-a;{IKBHaCI1<^ZfmMn=d2bvk!$mErHPy8vab&VkF05p z`S^E2n1Aoo%_>{wRpK_|D#R!-OMH(uK9HJi~FAaAB|^3&2v0`xit1k@$Z%U zuf<;}c=^-#?AghUF{d(OghjR<<`UO9$~AG>*JYyajYqS;KMB|(7}a}BL{04NHisoj z0>L$$#V1x@&k1$&o)Uay?uiw0hq=}mU*7nuU}3U{f5Xv`6w_NfLOIK}26stpeLH`J z$Fe|;+Z9s{U;njPo^yDLM-k(eY1IK{$~nE8U0+!Je(C!)yKC#hmyhPZ`p+==pIssw_7L^P@cwRfBx^ZI3=sCg;LSxv%kDHJi0vS@D}Y8{}~Q$xBoHe={=pK z!wo0mTi*?sfqHt{p5(mOl8H(A|+A3 zznx~0Ix{iw=H;~8H|k^Nb91{MOxd&A_fO%{E#9t&(@wH##r!bU-WDODrPGi<$!STR z#FIw{7Uxb|e%mNPYDsWMqI%&>UOjQI<2|8e(lxg1XZM{G(f=YB|9)Qc&)|P%_1o^h zskPD2l?XFD=n(orI;rU{Q*Kwt@_@S^L%GThOl1!+Qq?VH2xkhpb!Be% z+LZhSGM!$6SM(0#7;U<7f#FHemKDE>RCPs9EX|Y<+S+PkFQB=M`u?B)pR280NAhF1 z9vNtd9Mu&G%5qS@le9WY#J26eo7QEi98S^iN5e1vXPEK#u*eSakL)l0-3iTUyxs4o zaOLa$pY<{U`>)u^_eqCW9VxR|n7ML>ulMrbDGV>NZ9Fjb&Wv3DBT1{h4PR(>tr7A(-?`w{;&oapEajHJ zV-_tJmG!hY?phMl{T85!*Ms2Gv?>HLG*HX8KGuEGP z#_EKWpdHnZ)&?X^>tGj+d?}E%r1@Wc9cyN)_TOjs{%#Dd3eVvz_tD6oCR%X6?uO{D zT!+lYSg-s>ZI)Eut5V7iJz}Ew-SQ10U zBv#!DUZ%CBCv=f^*Y0Jk*{xNj2d2J|tjhmsKl)~@u4%mMv3#4>h98gC zK3dy+TQo$zjWxXE(UeQ4@@6tkn0xDPjHaqesNboe{U7d3*H$o#TDEdU)!{<_oTR2B z`cpma`TpImTeGz(>f6`9i}*abbcOZziRgRWKAaP@YOUW6QBm%MlrG-DiJ_X&Tmt8= z99os|&}osUPo~D~>IG}}ad~8i?h!IzKg_`uba+Sb=aY(AU0mfygZ}1qry9sw1Pe_# zr>XYp8YxD?~Ez)m;6!Y7COu0@cn4lvGxPkMT0UVwrllGk+`+P z;qJ@t54Y${x_Ul;$3s?;W!K(%8O=)E8c^+c;TZqLi6*nP;uk-x`rO}t&mbW6NKkIx zEsNM%+nvl&R~}d!v0ZxF!+e`{(-PiCc@OF*&lGraRaMtSQ1hpZq@^0i?T;UXY>ZZH z)_(6RYJc_QgodV_J>CL&4;~A9DqY?!zJ&A79oJ&En$tCv8WUW$ew3WKTu&`Eab}-# zvd9je(0Zw)b=+Ojj|^6a9F0C2{jyivT`D}_(OQ{IZck;AHOW4i0h>*uUz~|q7pLNr zeU$S*gZhs&Mzg0aZI>VI?wS8we!ZDP&SR0oQTP4{USQDtwDS1EMA0gZm+`v|IrGA| zUE%H25t-*SJFzp#X>)eD{x=c*^TGxbMJ4m{o{1O<*s$HOm>D$dWzT;G;ilSi){72l z@oF{g=9$oGbMe^Kr;CmYi~cUT@%zaUW;rvHw23F~Ok@9erjbD~-=WVhgY(7&zT`{d zpP83&MJN5bRlm%meum~BHnGHe@d|N= zHbyf%THRV0_Bw8=`fbr1<+&Z)pYQyW{~V^Z!@)jd+8_3ZUF#k(ELiX}A@smy(VX{P zJM^^f`<~N!)uZ*G#xUIW&;pqgqAz>3nqMg|;+kK(;lrW}mrkqf&$v=ib}~q8#i7<4 ztF{zx$|;xop{e!Kpnm>7SFL$BgkC*bYus@(;zH7DOOM|gk8C{d|6~94Xszzf_^v&j z@9q|c{%0_Be&4m-f4^wCOz0}X%Uo-%AFcm?v0HV=Z~u?-e1~70HJ-QLIVNt)FvF^rdhop7dU2ByOixx;Ht(I-#{jR=1 z)=%q_TlU#~*I)fiboyZEy`x9#zD&Ty+e|xpw6@;v_@mjiU8?TlZ+FpxW^jh0YbB$GLVSwcdN2WEgr!&h5#v?uYNY zR;@{2X?irA^}yOz(4vyirH-$=R-EML@2s2nr!e%iS4g7Mt4Grg9_4$z^Jw%^!?2$f z4?`C}wCDHdf7!K4n@P*ixlz_Iyy*TqtqW6XK87w!zRe}Ob74|pXp^Y_yA}KH_GxBF zN!3n!?cBBgz`B(Zt7|qaJTONidwzhq@?kFNFZUeXemMT}6VdnZ;$n)apHlvxq3KX- zNMW4Po<00ATKlibT5WH5-FEfZ@~n@4{Qq43&meT{!qd>Wxix-2Zbd(R*t=-%d1+q@ z`-@GNy^L-xnQFb#_Im#QA-qntbN25cRxoWRs)4H+nKCfbc z`+ceC5W(wG(NP~Ol0CO_D%ktEw@zKL#ijJVQo`(@jO`yJBfAYkQns<=8Ht>_FzLqX z-1{O6^h~*BNshmkG0(0ezK>BCqU@sdbtOJ(>mEy^!omN;%yd- zXS=VuNz?4I&D+Z5^Y2dY{%5$6`5*I}Cy$NgT-QY$*|}L(|8rLX(;bOrazgsT{~1{3 z^Z(IHbq{ejmx_v*7j5*`{Ijvo97dC(gK;mM*FXHv5b{|iYfrM_0KHnYr>k9ydzH#B;gU+^UPyieJ)b7EB% zn*TN|OYRZ5Rdj2OTwIeAS3}Xk)-_Kw&hq6NxpB%|RIV_5Q2%5-*E2s0=98<6lxJwR z&(GZ}YbJc-jE4KK{=O9`)tE6f9}lrGx=)7gZ@i> zi&RxRlf%;Nvm*K5di-bjob>F1)icYrug)6R#>uujzkT~}`{z{S>F(+>Rx57YY_Q6o z@%G5_ZDCVRwk?Wen_{QL?zr)1&y1`|C2Qk$MCgb3bJc7+8p?F}&Bnj=>qXYttlTIe zw8QWn`~9xn(>p9yyIv_>f2S~VL_oPwk!f)K>+2d+M71uDFrw`&0Anr~Ds&kwOB~;td=oYh5y5^+|dqOZ}m# zKO!I3|7c?p5$SsMF4TtO6|d%2>-x3VwN*E;Fw9)MK>5!f!)+l8b(RQS(UM+UQ*i4N z>#bhj{O9#i~tWNj46z8z;4_KiOaP#z0Hk_tLCiu05f<8H@tk z#Z|mwlnED=xTCQaT2%Se+EJMSI@4CSg=~HnfyreO74gL38$m(S^vD7tablj zS^chxrsjV^lTXy1+1a^5X3km5XL6}dW|A$>c6Z8FB~A4>tbep?weIPKJbN7vac%ov zAE1MokT)Saxx@n%1y3OOKk6+p!oS>qs$h=a$ z@1Df1&;^G4+jlPfw(vhg??zVE9Q8*!o{#(;TUlSupW>sZuij}E$eF)pPggk z^q*_aXNvgqGF6>Cw|GOs&6!6Y6};coKfN?$|MqET_g!Ms^ndzyvBLk4^6OU-aqpQcR5d{pX~GuI>eWFaE`%k>-*N z>?`h6%Qy)f?Yy~7S*3O9?((ByhKE*UH*Y+!(xYolU4>BF{>#%GJR~^}-8>d@^!=89 zEL~|Vi~T};mrO648M{q8BQ9aGd%aiG-o>)VOYP6h|G4Stg}J8Z#7>z0e5=~0Im_vz z2dC5QD||a`mWWAA;$B;K=-Q3w6Ah~jQ!^uSqr$qsq!~`Ta!+~hlH#Ag?#X|jbEW_L zt^W+i&QIMI6j=Q{d-mke*grATEI2(lQ+`eTdhL?Ol@GD|A6e*5)mS#`{m%85CqD93 zdU$E&w@o(L9zV8h{c!NeEI0S%!Q0#}b@d(L3F>b5dwL<+JL5-5|Fe@FhL7D2FI)en z>reZ~(`;sJ89&x!?p*Mv=px%@)6{K&7ixd%iJ7eunyHnvyTL-#;L;l3gEow}wdSnc zCb;e0gD?Mtdwkcls!lrk@V*{zmZ{;J-_=iUOs%flvy1Wmwn#A}AKiCmYn&&3e6hd& zZT&{c$zn}?U23zl+jZhGnafgu{80-(nY@$yrxWUxxKoKdF6qrTH^QOe+XWF`7cLo+F6d< zOlux#H-F?Fb(%TyyScV^t<~LY=-hZTOun<} z+i&+DiJ=MQue-L#gyt`s`dhg^hwEZ5-vP$1s4qvYf}b{qu)0He=O6oJS{K)UmOm`Awtu!pUWiJ` zGOaz+{^eioTKi*<|HH;8h5rnOf9#iO7OwZ2f0${DNa@O>v68x{i#INRz^Ao?i>qFS zGy8JiyrsuDkRdYh?b2x)$%nF*i?)IbAiK`~{USIJu zskN{*_DIrN#>N;|L+_9SE3$WZuUGw@W%m6)gStRdGmF8BKUMw7lbpJBtCFVLnZ9k* z)AkAVJo(FD;b{f7_I08zhpmqty!?`V$AOhw#5t`##Vua(&PX$ahjVH9(Xd|$QaxPn zJ94|C10Q#-TUr=usSwFwD^X$*y5NdUOu+md{~1;{hKC<#ie76NwmOFEP0;%suItKC z!4E(FI}^I7f~$FZE>IY%F61|Z9L@rkGGb=O*D(Wn~3aC0B7E%}#4qKI~ef*zTkCYTn~_N4c*~Uz$<-?bxIpTwf2Y zI#Hl1&NAi1s$|xiffJWGY%Q!jos*fXJ4Z@HiUHL11awrFVV zx1(CCxnxiL-gaPWAfxib{Kt(UOFORwC;zBF8xhK_shp?&;y%}ks^)z+0;`H6ZG7(6Quy{;!plBHd?mS@Rq( z3Y-_W#k=FFQP;-=w!c=_jTTE6F3FTuYnRQI7X4H3L1UJy%7;l|u55E(HaBd3#C7dk z#sS})Sna!>61*)rfgA6>68PKslb@5d$j19nN4#O&@xO1h{=LZjQ4^7)a5S>!F2}!L z<~_f=dUP^H#b@fO{x;G-@%Gn;%TliE7WJ8#N@Vi=dR6h*J6HP13qCHd`)k(sNjb}Z zR%x7NRU!Xy;$(}ZTvwJkZuDLF>&T?z_Zpu0Sel%k)nk^QtFC5xTwS%h{A|QY$rx#_ zlhL#Ir$t1xz1vmRRmt7kgL-Y!_Pt4>HSCG$?r>4^vL8?QVR8v7|^+X^E-lx|jCxZ2*lX)-sn8`A$zIF89`tI<-{SBy zO)cD9T&3o4i%$JXWz&s!cD7HJQCR&c*iDu%$FZ;@_pj@Y-leL&ZqGTN95v_5j5(4M z+Q6P=>gH$gC|TKKp^W$6o#ic3KTfUMwc<8EuhK<<6Vi!Yq6`v3Tc`R*1v7>G<(OQ+ z@XOF^(<$o&=cK5)2Q307zV5Nxw1$;g)$Z{`-HFaG-@o+hGt)Zo&ywlJ`It`a*ngE` zQ}?yE-N+4R^xLsI;WE=IK{ofD)ko2r$4g0YyV(VNOwT?N`B`f)%C$`6SLUbi-T&ao=mOEu`vw2{b=pC zqfsnhOqQ|etkhJa-ucgP;7j~+(a zM(`bH+In2HfPJ56#<4B8b3*gQp#Q)OTCS=(rxRs z?q*(J-X|J+T*TZbblIY=xf?^3!@tEJc{J@%M`$1T6bu*+T^C|D_^j89u0GwBK^+q$?pfC-s)q}(MY1DhM|3y0(1N0r)h*q ze>oa`H1@V=-V)H=LfgAU;vW^?(O7<|VAZS3Ogoa+Ez^wIDxDbm;JS#;^hd#6tC_d4 zMqIIV)4Fg}xA$Y%N9WFUH&zM7Z>w|u@sMl#ij#`F`ej111HK;R_DNoGXthu7!`?-+ zI8IbvUiP1%%xq=H^1#bVXE#_sT6>vEZ;$%?K^G;{6!5>z!fPxf=l&ELJ^`_`?1* zY4znf=~K<#Y40@*aj5EQ4k*xi*tL#}-EYV0j&)iW<8G{OI2sbCG+*c)f8c)xX+6}ZB>e0Gy601J! zSe;}q!*w^aYwgs~e;3xb_h|%}o&Bx0@A$8WUK34B6q?_6ty`a?5fZje)Mdee)<4?Y zSOcbNUgz*#DHx-jW#e5taeL=KIZGi)rY*O%-f726JykJ_YCdw{dh%xx%SfKJPQ|_* z3gx!$51Xc4cy>1?G~?dmnxKWc6Rac$|_tO-p?;IzTD>H+pC~< z;bs-rlOs1iEcBhT?b(V*{%toCCTT{RdhghlBvU`dD6HkS|L3bu=biZEW+T{Z|3LcT zX_hCJVmp&NpGk^Nf7Y}1!bZt1cE@obxr)g5Bla<#XGFy0+*Fml;ktwBKE3 zLppD|U(nJn%WZ8>CFF0`?tc_xEHr2Jl5dawrk!_**wOqdwrZ+#puc}x>IuRAy6++a zMfI~fKRxkb)U)Wy^Rp^+yKWi1?zM@1c=P&K-~Tg2|18!EE_}?g@7Vd>rKfUtEZ=4} zb=eK)K)*>$&0TM<-1))(bM?=nW4qm7z7T3iObRwp7SUo`rnT3%Ff`DIvrIF?wE9uo z;b5ldui6`#MRQm_NQiD|zW?4r=$*DemheZZxvv{FMW3E-f0U6Oe^`enF8kTDrz=hz zUn~Ak$(Y;x%Jal0C%(9U`J%A+txuHUr?n~eA8dmEPD_3KE5>Gj)V}tor>iAOkc@vh2UH?-o7m(jGasN^c?U-W*xx&eEIWBu;4*cl2 z|IF^>&xbv_owFHtW#-=MThM$(>hg#86DAnuiUbImuevvT!t#x_np1=AJR*5~EKXf1 zjGy>H^Y0GLsY{D}UumvfDBo*vDWLUU@rSPYIVP)u_RDYGcr>Kv&aQ-z(77w8ulET$ z^Tk5!4pURR{;|xXCwE(1&gW%VUvs`^?V%~bH&j>kPdK?DIerG4_FCJwOC27()4n43 z+xy{!xnXZ-yzfqLxs!Rx<%mG$W1nl*W%JH1j@tL4x{2eD;gaYylLaRBRu8<6J39Ml zM2n=XEnJ$xd?Q%dJCEf@exvq{4}-Pj>* zV5F+@=V+hFEVhmsz1GH$EPw1j*rywAmA*WA`K!iHtNHl0E>zoJaN?n~S?aTs%5h)q z>%W|tHpSg1V9k`62~H~tTe&_?jNP!&m2Jh*sC7RUiZkanY8~>*ZHzJ!>{_GW8uB#g zcJoKR83FB{%GLq>v6^x9as#y`f2Bb^zYMd)jc#)X_O?YGh~J zPYpIpp~^YDeK#jaiCCIDn18gttkQbHZON6!Yx|!W6($99moYr^iSqDO)Ve2Gk*PJw z*)jIR!c*s(LG5NWmUo=rk7`Z4BV_icFl@;VQ^tmc@4G^tc-8oC-yS?sYsn>s3|0eG z&;B--rJl1D&ic8Xm~?{0TK3bXbJISbxOM5+6s}1{W>c(vQtsJK|Jna1%l>ixk7;Zn zPZ#~2w|u3oAImCcAFhjujiBXg2Oc`TiwI3V!N~lr-|@~vr)xiaqs!jD{d6#MY3t5} zEtlQ)N$BdW;|_b>sJFZ()MtXZH4oRN<7Yk%t)SnGrC$C$9e>L0^?&aEmvvy( zREdBsD~@WnX+8T>usY=9(I}-IqB+t{&%gCQu&O^B5wN-|?8||5E02a;2Ebbwf0yUxqXC zrD^twhg(CV`j*#l7AlLD>x5oC%8@9*dnDKQ_=*1v{+qi(uh;EZ?bp)0|3uP?j0F?7 zCm$CL(+ht1w_>%&pY4g4_i5efs_I+3PiwXGXHog`_HA0bMXcAcY&|ZT->0=@sezW% zv+EO{H9!7ak;}mr7yV?y7RIiy53=X9wl^G&dSn=S%Is*grUMj>x*wA2X0aLJ6Kxs( zsVhXXX0I++c^9*{`F4dHHE$F>$|0H86Thi${_D00yR;jP+8BC7ruuFS z4?kQJx>(g;^v*x#=Z&GtQF1Py^5uUn|5+H~VJiK=Yf1y}Ij!Z6t-Ml6YZ(Lg{Rn#R z6V@I2Q>sorUBryJc_Z)V+aKjW`>}?3xA|}Du|0mo{$crlhSq~VQy=Z?JujLNeR$#T z4MDe-OiJ+L%QRmeX3Hj`6RN%QckF+LWg4;ZIiZI|Lj$`OJ#zB9Yot2KHrFxgiSAUz zcWW#1C$X}qZs(qy)RM_)B9Y1MlJ)!%!^6;&%{@Q*CtBPJ(aY_UT0DOVXp7yGCazeE zsVnw#24rOhM%5ooxv{SQif+)dc}L_QPt^yYCOT*E|?ZJNrgA-zf&koCU)k-=~ zn)Ne7WSj1vcm5yF+~}R-S?n`sqokUq=(oN}LRH~9tex>GZ8r*nKlI(0d!e6iot*-o zL(6TqdusQl{7m69i0quIw*B$9h|33_rVHB(a{a2>_onN?A|O+f3K&r>T)Y9b+_#dmrgsu&ahZ0aMCi}zo~9gVZFDi z6PHHi9q%()UAJw=qPbruK5RNv;awkLJ7xZY2ajZ5KG6G`YTc5*<4KLj_qI5h-Lsw= zbG6v}xjb)pHL)x9Y|Gr;0o42|Lte@c*36> z@BE*huezL8KWF|o``Z)$+@Gw^P`*&5`PGs#>RPq4_)t^kKp(y*(>qxmfuO6 zdY)Ca$I@JvtiO`-yjbv6+26{Xou)07NqY~RQTwhkC2Q`t(;K&*tzT8FbSqkDdk)uH zku|%oD}{<|3a@&SIk{%aR|(OguDNYmD?}bmy`sGC#;VZu>n`qi<8gFK0GHEK-!q4f zJ$bXd!0q^tM8)GEtZPQ zsLh^WFT)us_VV7^&-Ry@)-&ik`cKoksPe#hW!Ls2GF(?RH@>_rnm6}%(z*qQ+Ggi| z^llDcrnOY{N=AmSf5V-JOB8Q?oc)GR`N+GvH`BRpP3Ci3<6ZNgVY!b+_S4p|t?oXd z8@3#1Jv3u!!O_@T3lc)FyzSZ&>A2u`9P>J@H4`?!yU*~8^FPC^@PE=wfr5u7zH44z z_nawIBx&`P+8e7AE`w&;wjPaMU!%3`5<`a7kA%=kE-L>%)Yw12FBtb&DGdiaZ~CSQ59x``*~{&Jtt#d56Koo~CO79Luc#kX8EVxv&y z<)>Zixe8P_>I0h$Ypdfc@mX>Gquz#~JigAT`^*hd}>XV`Zm z;I5n2mWf_T>(*~$E#-XOwYwv^HJ0NC`?mXKHv;xA(|WgKb;$ad(8GsC%e1y7ZrA6( z+O_hl#j2;bvmUL!^5bE6xQIEZd%onupPJQvv32#I%d~dphHX`u+`DQ)Bg4!1aQe>QAb_v%lTSwW=`ebz|&l(J0Ti`?T&BhKGx+IKh)XDR23z z{|v`Y|7S3Hw6={$%bZ=r{4|$L3{PmjP0&pX(N&MyWxpSd4qJD8ooH;=uB}JIgGKW@ z54E!>uRI#fz!Pvo#5CBc?s03(q~;GB9^I3(*U?(J)$C|kPrwen-$|>llpkt)-L=*0 z(P}A!svgd$NyX zIsPX1?UlsnsKk=r&M&3=U-v3qU98aCVIeBWFLmKTsP-joSDF5Xe|8eB0RrJ~-@m>6 zFYn~)ndbLd)ovN~^r~I+6gVNViPh&|%=%WdCEqx1Pu$;efu*gSEX@g^P|5(Y0%nq9DFMHHLODfiCFPqsEm09`Q zn_t6mHL&67Pnnyh*qhZme?x#(q>dD-RRq(w6-rcIW3w>);H=g%ZA z;p+{D4!=5cAV7G3{bD1IcZCPv`N#A9c?@>|6AwU z>L)uUdS0F5zd`!XCx;C>eTURtb&m+&-WDq^v*>TqqMqKk=gI#W1n>V7S34SX>mhT% zteS8C89Ec4Ql*)+mMy+5qSfpZu%c~-(8^bgmzknLNrghz*N+xu{VbKtG z3DLmR1qY^XI=PKC`Ll;?PxH54_7nBN)3ndmT;BU<{+s$o$_AT@iwi#a*X)q0&ItHB z<1m9=j^~**G0mN`XQpm+J(3nt7%u1&^x(?@r=sO|CB3HBCy^&)3#jONm{tVfPdp5(tz zt7prl8?&~#EVbXfnM1R&)BjDYhS7^Ho)d3$1sf+k^0eJHsmm_1+KV}Cv$%$HO6tie zykf$&PyaLcOtMPbRq(FNVD6Ibvt<0^JhZ1=%-u5Y@#zl!10IKW<+A*WnNad$x(ZiF zPphMh=G(~$+cdAtl5dgU%_ZjZ@w3SNV>6j1TsL7a;&Ym`)!an7aS~&2uD1WAmo0@W z)6^IIvy;qm-Jtqb&U?dOZdSf?4|1&d-=3K)eRIJ{`$;cOPiC6sCG?<3m!nxL%d+!K1Ht$IN zk(FH{X`ZsvJdO*QWxYR9k$eAV!K#1i$Ln)KIgJW!QdToxnEaoC%S~&s6l;D9b-`>a+h>#@jWk0=B(4H{rkt9F}hc2eu91tmwL)pIn0)kUMdz8=*TTFkWi)}4@XGa zx0)C{IpOB?tkR1OX z^w=mVvT}C{x5A?13TOFs5AeQRp{pLJ{B{1*6I0d*7X4Ui)A54+ru^sd-#R=~CBm83 zD6BiYj5YrKZKjyhje2$xt8P7Xx;D8^OY83I3pM{4p3TwPB2{v4uji}6ty%N^ShjHd zl(WK=4?MTBh>#Y!`Gux6WU~~x7~NI;RyXEvD)ux=GMB3)l)m){@UnWx=icR z+YK+fWX`Z}JQ@-f5OHZ)1OI-}5ccC-yZ33`R46^LHe6(D-0^jqk(P@Lzo~yXuzG4? z=#`_<2Uhbp9F5^)EqvJ(CdIzK>)+!44CYCzS2sp;8HSyZSnZzdmEgVdwrI{V34tov z4O%x|9|>P^#Pk&o~He%J2KZT)x z4OFijjS1UZF0nA9yS3tr?S|E@o(rXuRu%EF&$wHk{V(g6{UZy}*uu~U%-5Nu5+8O& z9gVRu3=c?JVZA$UlbiWFo7&?)<3H*sEYwR|_gH0ZUcu_AlK(_Se)&~wb=mZ-yDk(ins}js)gWryq*))T*#7YE`pIU8{b*Wzx~gk&9#>Qw|d%#{|t6JL<^D|LHBPl ziy=QH-(YUr7e03CH?noC-*BRyv|z@yW6v+dJh@i%l2D@;nM5d;g-jVvVL2J`i!?5{(nn{=8cF&w_bWG@ryxK^}&m(ILXW&ar(^1ORjH61lc*`W1w*Y)I2 zD^~nxXg$={a;H2c@tvLGe+KT4^@kpWU3#Z(@`Uk&TKl^klWl9?H)>yU;MLy8>UR6| zjuX=o?Y2!3VCLKVY0?dW@HfjBt~hzL(<86by3Dd5TSK(F-EW?xiq@Kx30V#YRz35| zZPch-qL*Qm$jW!^>Gs1Jxk-<^mi)_`vUaKc%qg|^#lrP`H#|GM)WoTF(}X*bY%@9f zZka0ADed?BIY-8+Q!#w`Ym0#8T5LZbwHQ0!Nm|)8LQpu1${#AN5o|6 z8TH+`bbGJM3y*`|xqR%0*_rj!eqLU9LMHREcWKd?kjZg7EHWpUP5?>}g86Y^Y;2?Z}~Pexb6PdKx#W z3KnzBQBj*c?#=@y{`c*FgO5GEw{PB4 zk3SnlEv35y--fOKGyBAy-KXB(xic?ryW_tv(eo$dKUyp`z5dp0*;Dq575u-K)H@tV zs=i$3mCwR?Db-%Vex1wlvlY`mHP&5O{z6htV4mvw!o0n*v)Q>mYRsPD{#kzJ@m3pe zyRGtVH$JQvF1)wsYk>QXW79hW*H8F6(MM$4mKfnX55jtWr!*!_e--qr(cyK>J|3^h z8AB1MpV`MnRhqJ#Pn^;F+BtAlRqBQ8$!Y#PdzTg&%LJ@g@cqEl z3c1-SUV+}9POMt>zH8k&&C;?v4?^Tt%dgBkP%2`viBmU=@r1e2UBkZ~g6BW=9~Ntx zb?aQ+>CzJuR$NVRbJY^kSl@s8x4}Z6#d61A-sW20%kir2?FUt%4J&_#+WUVw8fCbs zzlHIW#8QtgsYk6ZZV0X7e52i{-SGQ^c1*eGPo99AVb(pN%e?Xo!^4@@aEULk30)tW z{r+uh*rezM%g>7zEqGCWGSb9<`i9(ZTp=XYU=n3LYe;lSe@u- zvAU)(JpXZH)H<#06W1Do%HC^l-`LA&-3Zvt_hWVSqqQ3AKoeV6`sRN2dLzX)*D&=I=!B|Qb3%88=Y(E48a5}?DbzSe zi@{WO-<;5jaOSf0XA;7$&M9Mmc{IG!#!>$H+ezV^B5(M#cC|CDJ+w-A{i+K2O;*4E zGfeIhWjLy*d>C}E;GM$oq}3klG$I~PE9ipF+4#RMUF-@gUb4jqfyH=f_BDv zAKpFB{^j>_7tPxtdi5ypcV^L$1JiarTKBqZ*NoK-$|7d2!$^?UmrB?9&>7A>?`9kDu;nQI## zYvIv=FIrynj?H(|+F_=(f1QZgz8j)@G_$rG<+B%1_+k-S;~P8sE#Lm@FAuCfr(+_pyfeQq8o|hWLatcM3u?)p2oa__5tv~Jn&gz(^+&<$G;ty^9ba6Pt9Ylne+cH!f{g`tky zeYAEYtvd?pGreu){dkm5Yx%?6W1>+k6W?hoRn%ShS#STx`)^KYplT#*$n_)TzY0U| z?A;i4<=dgQ1I(f^HU_I#$Am82?-RPLH~MW}f!2B7$;*$}SpR2m?vjqQl(Rh^*c#q7 zZ#kFr--ytw9}cx$3BJ!ID(G=&RWr9}NbTPb3(s`@-f;i;!lNPgZr++B*ByJjs(#Xc zhR=Ci(V0IMJYZ+AuFtQ@)UJ3KYR)bid1T%UO}$4|b9z+^d_>l^9QN3HNM9z??7dHT zVn5ey-@G+;iZK=8osMh5zhy1{@Vn1Ws^Y@i%wPxYA1Qt!JzZ|6pV=kG1AyK z|3p}0`?j#c31@s1=lcaeGUA!=ei`%oNn0bXdF|)w{cv0Kj@X@Tk{MZ=@8&0a8NQq;$Sb6ICPO4xpO;(vw*Q|gcHDGb|rX7AK}lk6Lh^8LE}-R+k~eV=B= zy+wa_tv@69>zLM)UA_H>4*cmjFx4;R{cWags>`%isI6lS*gxZg;L63GANup3<$u%e zS~@wPMoWY3K;6Pg+&SE5I}Zm;t+Dvea3tK&xNGvvmN)Z%`c))u={c+9eqyWThNubt zevy;gClngXp4RDdnNat3>i(+=|JIx;Tw5p+wCpgm!m^ug&W_udPEF>E4mRXDJwZt% zWh;+W{rvmQJ)0hKsx3|q-f&cAlJs01!@^k&`YR@%m7uvh^UpTvBymk+#u-iR zKm4?=u*z#asR@hW%hxVgtSrA^{^Mzf4PP7!WRy*Qa?o(ik&hqNrMh>;+)7ojH0IUz zXgcV0XhHSUM^$jct@OMar~Cm6Q;>A_Qy9IqtguTOs7dztav@uPwXaVu=t+s4?NCr zx}IU>+jeLBjhat3IyswY0L2Q{j_5`sw%H8oiSxxU27s=^q=9_ z%_&NcXQ~C>;y5b8DtBn6RkmtiqLy}RNSaq(k*XrsKS`!DigQA)YbtKgm>AQny5-|R z&jN?CV-vPtJ{q=FJo$UlD&LRQH6K)c4shNtp6Ip4`?!)*?zTIRm~KtxnXBkGBVeu2 z+i9+yu1EcT)cB?2UbgZywd)3pJ|I^bmBfX->$y72C4@>-AM@R=G)uG8u*oGc7Ll)_582( z&({Bt(Yk+#UGzp`Sm!d9ZAND6OzhpXw&ZX8{n2}+@5ZpXJ9xj}e{Zoc$2<6xSJ8(z z_Nx;^lMah!Gi~uu&Iw&qc3|q%1JjQE5KXR$t~>wwXtc%Z6^7x0U2Bz@V*O=6tMXSq zyZRSYLEiq)AarO|Q#(^^Oz5fy-Vv+&MDuTN(}-BbEyld;>fefm!A~1?8)HHjUz%$e zYSP{B+#3ExVzmQj_^mBRLlhSJIe+W4cfT3`BPL*#q1XF)8W~+*j_MtlE)(kZ=90So zllfO0Lr*LOtp+KS5Y1yPHS}KDweqyXi<&HZzW9&JSYwav5Zb}mwd0?K=+$+ag-2r+ zA9&O@wNA+<k7`%_P6#_B74T1D^^UjBUE6)M?h6@c$+B}T{5$vfuf6-; zZ|({WfAq3z`+d=j^|IGj9*sWK_G5C_mT=J^hh)2%H|oy+x%}_=Kjp^IHr9wkv%4O6 zcRn&d8rA0)dT8~=@L*A=^VyPhDN^!V*#CI{%Q_h)n!LT0;nCt7Uk_%6uG6|66MCQ` zA#8P5RATJLu(`~=A469wIv?}<%isSc|Hm{IZRVJu_tQl4nRalM9F0D-+V97zn*tV# zYyTc&4c2{`tGMFhe}-B6pREa6vHN{vcrepiwfXiuT+1R)E{Nh6{%h#ZP6Ui6~s9_p?gBNT0dHS#9RHA^pEeq zKWJ?++rt}j{rUCx2TrJM3tuhy;A+@^2JIhZCj?Giyc{PcTM(41zI%f3WF9Wg+qEAS zx^}9IY;pT~lshu}@;a>z7vzPzV!hs#e>kxEnt^qG*E*Ya|Km*CQnbujlGZ(w7BPwD z+H!{da%(tG&<=jS9jksEm*I5Ld%Vsy=J__wfW&FJhf%BsN9&(ub9Y1dh~Pw>NcJUsU&|&v$m=#_RFHJ;~oXBx5YMop^IH zY0(#H-p!^*Vh+e?M7UQyT4f|;{m^N$rS%+*;7r3%OG(dVBANkZN24CbgzjVBb|W-h zxNFOSM=PQydxdMwP6_y`zT?zv*$hp?pEBEYi`;81&A9Rhvdd*{i@@MFh!o|v%u=M#(I++WSd>t#(*6314t z9el3l_f-#jYz_N(Vwy)0L*nEvuG0sPMV#O9x3Vysb7IQ7V&0ueACs8gPj_ACbx`v{ z>RIhWk6InQ61-g)vKvDmCBJXf*l~3>)2i;U+;cZpeau_@Ho-!E+mE;E2uwQ`7x#; ze+t8P)SLYf-NmC>?i0Gvhili4(8WF+0h6vqKZg8vMSpgV51y7XPSQIX)CT)Q#!NYc6mKOe2L zezb0Va@X3dIibnsf}k^0R(dK6e&FJNmj7V?*K=B%R5U6>XZ9D>x8IalwPRjedwpTo zD)z7!g`tmci)Qfe7TN#*Y9AB7^Q>^&%n4!LyX%<$CU>oU?B97_`3L_r&0J@utSs$q zckS0{#H^}%w0c*5tDflVu5Er-lyd?$EO@)|XxNE=Gjxuy%6cB)+ds7qG_VH-o)O(!+~tnbr^jh6}Cp079<95P5W0Kb?4;F`R$hK75gHmB5hC?u#yST68m_xGh2e#V);;#!82V+IMw!;8 z=tRZmI}$Ip$G<(an&qwd_rnkW6<+>3;cx$sKCKQGxfucPb3!-lSh!F0(Ax0(OuN@< z-H-^~EVW}X*MEljIidN>-2FSMzyAK{?C{=ktj zk)yRjYDU1##0%dKwTgAtr>*|S6W&%BMx+vT!C z(0w1SJ;9=}F&a7f+eEj12^Gzm!ISGUFV^j*fyC{WI_Z>#==hh{RXw)#PAHDzdiY@L zqiD5R2Xg9~_kVlBC+%@!x_?%=i0DW8%Z5u^%sW@;F0~4&`TjRDzUg%DMp3iZ%}tY! z>=hAq-Xd=S$oEme7Rd?BeW5>@FRL8PP7J;FEDApxBQmu5M>eEA@X;DvAm^_8TZr{i7v&|(>m7- zZab^^Tr?IAGJpDQ+xpL`LFNL?7F-i;Ur2medFQQ=q3wZxXI4ZPD!z)!xy)VhIHNaE z)R(_uSzba}$>nDqnJ0b+?)bg`*_ugA-FNz4J^tJ0(3a@AZt=2*`yWLAN=-2eGT+d* zr2m`xuN2KmJ=4qHUp;<#n?u`y>F2&J+rKA%zouat7w^+;%fEN}e{BnMHVA2%_WbXS z`5&BrJy;g@Xru7v^?w8odu)BlB!4S@PfAPRk-qI);`8_G^++vMxx{hF@MH%=sr}p3 z1HqnVGY*}~aIe{5pwXEpbVGmbhffMz%{vd3If!+AxzXGBdt=g4)y;Fe=I<7DjEO8y z^x;{nvukUw-9@GymkokWUb|Cw{vR8e3yei&$*6`ttFpR#8Cj z#t@Cgp?(h@hMm;>@O9;l{|v{L-~XrD8a>HR`H@1+2i5eo`wwyc@_HnJ-x1=fW~+=VQ^6!P2f#Tr!&!8#SLUx?DKDZBpP0 zUhNo-ELY`6@@*^&pC;7J=?W;C)0igEQ#9$;k|LgIVhkTuLcSf1k@!*jL*UWY-|jD@ zc|sR4yu8d5W^iEYmZRa!je6gYa!VJ-Xe|o3&b9h@fKg&+n2^@n_>OO~b#Jy9Xsvp8 zXzByI&;J=r`hVnX5aZhDro2-0N%iF5?@tbkI8K{yGj-9FILD~(CvIh~4|tsI7v1%y z%tF^>>ptC8?k6rQO`bvI62gOa zh^9GyGm_lZVJJgPLmWnb`3V%57iiPgy; z53Cin?Yk$jdi&9+qISf2Rf(dy2l zypN_X3Fne#t_eLfWw}q#!s3X>Wq~`SYknuSz7}7$klmG`_Qt|{H;ZtYx!vJ|L5*;(Xf}>w5~7HKFzevP3z)1%_xt! zU8%`OG*lBhe_`Kl&^m(9x?`UWmzVKK3cv`>vDeAPCwBQ>4b2jNgBL{ zTQpA#Ca`9>*E2uv3R7wMDw24m`agsJ)1%?xqET1!t{zw?ony94G+#7pxoE6EPeA*W zs?Y>}z6WLh88qsTo$d-1?q$|oVSR1K>U7aE&0@aiOgsKrtU7jEH0t!3LhI)1qM4Bk zZ*KP&zEZ#TKZ9xg!Fn^THIZ!(LXuWbxxP*7rp3azjkA{k_?%IBxX?Km*1&dW*53E{sLukEpFw>&2+#Oqa z3%z~5$TKS6UU4*F)7gE$>y)`xO#5&rsnw`pwXeF|j)m*DUeDpo;mYk=7kXgoYv;>M z>mPURobtA7K3ee@Zb$E|30l1TbKPm~u%*@4<;08U9ZRlA=M?=g^%Zk9y0*2qYvsuu2Ug}@y3pgTuzopzM}N*@<($y>0>4V%@z%X* zG1r`~BC%JY7)l7k9B*0J$%4@B$Pqc%|@|en)yDHZHo@{m~30FT%(ep zsF>BeY0@3hMSda6!n^{fb0srtvfb9y6*Bf(G&>~C$C*<*i~0M+{|xhMW@dL;cYwM- zHCc03>`aO96cE?Vj8jg&khH2Z?fqreWm6wrj+lG!*tLm;H$Ip$qd?z_S;r0enNB45ptgoWEpKOR0ZA-I;?{jb~_%jwU(-a2k` zneCOcQTX$TRV%isq~vN(yENn0da(xyTVs?YZf#R$&f(1NkTnF27la-x3|;eTw~)cA z`$79tgg@UF&DbpW1$1D;_KsKO->n~n3wCYy33!z>ZN~#|*TS$LZ@Xl|W-PsH=)Af$ z=?%MgsMWf2^ul#suwRHYGt!1AIUTb7Gl4}ZtliV2S!opN9&aLX=ZFZ zu-fC>(b(Xwl_%~k<~Z-XyJnBw9F5Smh29mScMDd#))850W{xIF4(p8xM+@g8*9{#rB`M8FE)k;i{^xj=E#ID%Iw-b z;pNtXRhMcEv?hv7kr%aJlNg$n=p2*XwW}d%?Srs3t@|;dUa4z2UP+XGzs)6Dr+jVd zQQeQWS$1!JN9&#PVbS18tfdM${>~4o6GAoS>|j5>eSb}8g@}dd z2AhIauM)#n`h;#xZVeA;?pkqdk-FjKw|V@3JPQaqCZ1f0tODej9W&^9~-ZH(Zaq*6LXCp3_=vwCUeRk@r_ZxIpI{2iy`Z zJZZoE<@(-zTCUcCSaHx94E>e1R}pMXbK53OZirs4c6)i*)0CgktrFLmdC%V_P=zM7_~pmE^B_2s|Cf2;pf zZROY)^+P7K@Mze__dcNo-;ah1v1vp_bM4w+r?qv8`7MTr&RI)pCx3tFoaAJd=zsP5 z!%)9Ei+~$d51s3liI_=qZGRnzp~)Ah<>D2xx}jFD{qU&p5dRT^)yS@ zFszxmYxg{@XG*h6kA_v1EckF#PdWFaQ%?iqHVv;*?TmHdJufyfWHB>j_C_0cJUPCV zSLkSXMu>b?|CJ)4hIhGrp5+@)?=`!rebnPuv0NbINg++%w^zb8RVD3ZOP)J>@h+)& z!>zl-d*?0QkYvy~VHv}h(Cwf9K7Vu8>OaHz;K?6T?;SqWU*Nj_ne8wB_s@QL*stgB z)%#}0Q$6+aXSc6a=k9xH{*$PwR6fwPt1jzq`OLZ*?H?q5T#9GXTK#jixqp!IXD7pt zT|XEr{#?-gHjDX-`Jby3KYIO8T>mp-#a|cpm-g2cihimjmH&7r_G-iYZxKH_KU}Zx zeS1D)q5YfoFDHL=eE4%U_}sU}e=iFDXGpVuHfMVGlYZ{Au{J+5=6`%E`JW+e|7SOk zblEd}!uM9(pCOiKv2{(!e}>rlXFb!Ou@~9vxrdhgIlZlKj_%^9lD`lBGt4q_4zivx z*L>E=dLx~u%vZMdzR0rljsJ07cqRKHw;6q_+CK-~-@B&X=lJ{b%5jpZO{N)X%?N`af6mXIBUQJGH~!_{oXPJy+sCN3!4SyHd;YpFu`` zrtQf;`)3B!pKW`Sd;DbdzpR5lC*PTWy6;o_QD%?cRLJWD$*Q2dn;D@|RWmGWYO@ zvajE#>fq}1T+gr*#ozC9iMOkZ zW=}Ogs%PAFd7swC8;x(@cP-q$KB`t?X)%MV#56hf(#5uPa3-3){7KlHQRQ7+0BYfSB3kc#pV|q11@cE zcb=$oVbg{aVvZbd-1GNqDQ@ID<9X-r?G$daMlOxrDM9Zl1Rh;E8a8bm%a*JH)f+-P z!bMA~lUAF(ZRM(IG>JXGO*DkdVYL)L-T>Z4MYk{eVq_(T| zl@-S>ZP;2Dp_{obLN_zp?23i1$?_9@ZTpV1E=`IxSvuA6N12_xbHbJ_7q49N{llLB z_QcX{rU#~)o!AuN=c>2zZPz-c8LRtPGqxINHJ{5qrg-A}2YLIS%l|1iYGtvwPh4%B z6aD8G|EF-KXp^^HVV^(VXWACEW3|t!st2LQ@{P+MH)?Zjns=n;Kg0Qds$E;pwQxzz zyK*!-$nEX7{+Q5BwI8A~k1$@A4p-FPc&Fmg)UQXwHoR{P`(&|tX6NmF8ktEP8mw$u zyZbat84j#lr}b{Gp|i`6k^|GjJ60Zz>dfMvxVuD-nJZkdG3xR62i|=wJ0^ZQv^H3@ z)X?cbrAJ7K1Lx0q&Hva%L)d1B?g>5GAZnc$uBpTL5wtKl;tl)7E|Ihe9xo;SWzC<| z7r(wwG~D#{b*{A*q6-5X_15yS7UYDky6_-W`WP$2#}xSwryCVx62o5bY3*3wr?qXy zYUdiR`%(|Q=AH^NQ(hsn|3RHjXy}yi9ImT|p%afes%}?jTGcACy2E1Wfuz-`-Lphw z{hc2ahAU<=WHkm}nqSAV{!xt|Yx&Z+=kJfkzUbdCntdU_bNS`29cr58%cNJVV+{-y zl=rE*{`5bC8E9=;XkcnkM%AO$J3~V9yS8?%=91ys-D?n<)%#P}YGwqssVA{*BEuIHfM_dV-$}X~!CF4KC zZu>X>{;&2w|L`~?Mvv*O!h_mhwY*)cg7y}MI%r-N&EetN>&EJ$#NX^SR z0ZR_e2w3Lcrgc$b)uo27_eCQF_%{c3g$it3C~FsTH1x<3*@MjQPb>{g4c?%%W7U+k zTMI)KsvoV6n06zn_0@u;RT~>`i-x%^WApy&_d{s0cDr?ci=xK{iGal_JGGodZ|w+m z3yS~lk#Y9^fpYuLej>^Wp{-6U7#$YK>u?6oZGPig(CYoP$-q^F`Rz8}Zk9bWe2q`= z9qqM?-86ak1T)V5X=}ULW^G})yu8g%Y1WhA{|p`z_wwH}%FXi4sr>O4Z~3L_QN6z^W3FU zBc&AT1iyc?Dtnz8B) z*X5+CYs`*v8S5VoY}mw_z}^=S-ITi2MWyz$u;GHcj2UyIni^6gB2TJwA3gZ}%!Meg zzb3wBC} z1~I%ah*l5V-NSWX>(M&vH-=%WA9u;bx*ch3)sR<0j{C=>)sba)CV#eA zowY?ew=2BlXvjT>-BJ(2+1PLGSY6{`vFhRbuH9T)FEj0~30-xWX>EGQ-Co16otyto z{S}@6_Gs*jqJJN*-^ejo^`OyJB%q??X!xUPFMUFfR`=~#-N>HLqqQ-G``fNZtB*8% zF}2VIZE`*1)D&@n@A)#VMQXZ#Z`}SlJMjzO+AeACJMU`zM7Hjb`?1=U!F1X4eWK+8 z=5M>!Oj)bpXc4+Kii>aVwxiq)3ywxHFh1^Do5aRi|NnX~llJGc#`EqPhTb&{7v83| z;gfA<3}+m#q4SJKE6QiSe(Cd}gUaKGMhsO_)d zBlpW)+h5FU`1@mZ-0bS4sgpt(bb_{9MChu32cc?;sb2Nk^~ZLEMvIvHZdl!LH1YpP=ya>?!!oURN>i-+d9=2znfLlf|IgL`RJ*pHm>B59 z-=_6yV%P3zTKBb**6I802)Mv=SIe$CG4vz{^CMIFHjR*5Q&iG%#9 zs#^KeZ5Q^cv3yJj-NRo$@$Z^|6}|?l$3+V*0xqzN#_)+2IL5yA&(Vm>y#4V|+phB4 zhefj+UhL=Jp1)gVwP)%pyNRv5ovhlidpE3lb$y?R7TdZT0XqZc?Nrk~u>@J@w{NO!Q=iv4LTYWx3W)yas=&egric18J}{o99J zyY|#w4S#<5{maRWU5mQ7zMX71vWjssW7nIhiW?^_4ew#Rt|BqjdJ5lGNy%;>FR5F) zpC(97n(gAj5d8AYiY+2yOLy2w^30ieP-jbz_?ZCdZiUWm3*XLEJgzt?+xADHAGW?i|%%y_@+z1K0j7H&(65xy^K^zf-pEjZUD4e}Ubffc-OMJN`4+ z=Y%HA%=U}^dm}W`m+khW_M$fh+FoDYcdawxN?N;e<;nw7k8boj^q5IxX`xTBha|^+ z=~Pd-We?sM?eyIxki5N+ZC#?j@^lH6>$gIR^A6X`EI7M`W!7^S<^*3Oo7^cau~Lh+ zzTRh(@i22sQQ2*I!HO`mF8?+Ned9;R!(c1zA9WTL*IP3$&MC8~xOiw;N%;p0i|MV2 zmt^Wr9`7{S@{<2S-5Z%~-@4AaQ+02qOI?m%H2=Wg8x_~){?hyv@b`wrwK*osKiHSq zcq}_MFTA~6Gbd4u1&3X+5c%y#kJ{reb2x7@tHo1Gb#UY zytg9yFV8=TkIP#FOTuh3n~y|=#tM92#xGbAzOLJ!2Xr~;E`#^KHWV&zt+;r7pG~&c z#+QN*9&3BHZksIi{@8LAl_ufn>N;Dt6gS@#^)Q>=J*Ru_RJxi(tk9lbXnN^&LeR!} z-8+8D|6Km&akj@1lfxO|;YVBb!`Rn}Xdio!=(Oo%j7~V)q1M+%y`2&ftEv{?+pqt+ zYu&HoiH@J`FN?-ROpfYbkm&Tl@pb(EUrEz`H11#)*{Y~#r?0$p5s3pHAf?NMn9{3on};0RLCFqKYt8Vx%CSj*uo-PxW6tu z)t%t%?RsA!l2ur>Dn-(I8q2o$<4n7gyJ8|9cs)7i`(vM6}u$oMudNTD8qbjH~OxlefH|m3bFtPOnPNdNzSaZ0gc;ENe2g zH~sN_V4&SnvwzR;cK^3WwYx6_d&Rc{Q+vMH zxV?S&@Lgfp)y(VbShgQY2-|U)DeU9AAFC6R+6|7z248rz*6en<#p8R#Z_2|e&=-Ho?h zTb_o5JP2K@bUE4ik%6jPflQ65-tNW=^Pk0k^Zw7kdz>TO)k%vtq^p0Lh(4D{KyGXF zIugz266i*rKP`})WJtA4b4 z3hT@5rchV!t(w9tvOTbC*VLm?){oXL(|VP(HXtEX z-KkE+B>%vFhP7Q=MIN4KTeU+}tLpNRdZS0HmLC=^xX-m~#_E)W&?Uj5QRPQt7%YUg zF1FdJ_~@SU{$Gc`Z47;FYc`=!eSh+&{|vJVL!&N>mR2WtmmZA*9k0IS?al*JchCJ8 z_M`82bJto!k$*2f{%25mXTR#NL@salgxy|T)$=#i-vn*zQS>d)S~MqU-INncYcoF| zSo*rA%n1=+Q9Yu5F9=vBs@-eA^YO?bx->B!3Iz&qu4& z6s&}_-#3P+PrT3?-!u90vioP-rrnBMdDY`j;gYCTXWFwa-*~j@L`{LJFjw<+W`$0( zS8iV{gxaU+DKGfRqoJY6TD!@^`J|ZFg|_(*g8Z~LN!)aeF3&yx<)@yAR*k!8#>zvh z{2Cj>-WjYG-~H)S*M}mzWU16+U6*r@uB!6NV)I-x=jzQnmL+w>|KZLd}va?vl_LYPA`P3&* zZnCH|RsWN8-F~@HQ>gEE>IL0kj#V-nS1#hO;S6Tz31zR@li|nGYHPUKLhhzt;N~2@ zmtTIb<@aMZa5q=k_+ZJmvo}gtACl21biOTG&U{_8e3_rtj$>}Wlh$_3K9aP0uYFDE zA;T{5j@SEGwj``Go3>XzCt&*pIf>Qr;SN?Q9%)?0o+4E}*Irp#?zo5Hl-)wfB^&f?w7b!~ag%B`Zy_NFoX{Y- zckQ0Qd|Nc~wZ@C=PxnQ3E!)cc{`Rj&t@i~@Rrsfg7CKa2`SUUC2je$ayNK009)#_< zE}GMo5V~YySG2_Hnz}cknQ=;sMRT|wt*!YOE}s*+EMfP?1>cW`iR*r2R6g>?Fsvuf z{YYKw?SIl-+of1d9y__m?eAj^S>6W9HJ3%UADgkdO*6*Osb}quJ3OHW4_d5xRvH*) zBC*=*&e8DYeIh!ORFh90SH89TvS4V?vMm=lxhUrOCImQHZ zG5nQSHGc);BlZu6R^P096Ponz^Y4B0&(uGTe|BWmkH?%l?);dyL+C%l{|mkPpVMZZ zk3B6~cw01ko!0dub`eVptwUxpUS|^V%q;U-lKySwNBOTc_ScSvA6qTK(ZDLZaVzMA ziVgo6o)w1P`51O^y^q$7`%JqvYCSAetD?62tvuu3=xrJ?3m6@{!n=~zURo|1V|Hlm zgYa-Z%WVqaV2Thl-o=@c(iWFNvvMkwY$Gf>-}*qDLac*oD#kzXaD_T zWIyxAA9Q@miU|j#$}NQUwIr?W3B3_|W7Re5+{Umr<@G)skusVN9-`KBG-D6iu;1<4 zq4bp@Tr{uwuxJjyOz5TsUk|N&#HQiAL#Z??*X`%GqoF%_IP<4z-7O63Jjz>iH1;%C zG*85J(V#|FuCE$LYUMNQ*^VrX&PoUm7tP^%7#_^ETeM6>GlnT_^|uM1?O+CtRH0t&;X{VOAFXqR8E93w4=0C$5`$zJx z9<92wpNBI>S~NaJYr|H9g-7PySl#zqh9mk&>7i9d>dSmqX#Y7-{$2iQ{gI7fhnbjl zx#s;4TEXh3Sqk18xz%4Lv_M@%k0Cj0>tY^9X@eK_=T|*yn-t&O9AMtwzw2S>*AEh* z&|0>q-^{c5UN48gue=nkf6mquik>zEeKQ@m_zC|8q6h zI#1Dl!GQk^r^@V~|68XK=ce^aaGTZ+`Te5hI$AdmwKXmiF^}ib+L7q&D%$ID|2UV_ zgTu=ne>|!6HDPa=-H(Ln-;|l$#9e!JlS!nGGf<}ZS7@YGZx-{^m4lC((kK}W=@!|cH*-` zl;-mp2e&LQyu$VLz*h0V`t7_MqYXK1JYQH(emKc#PC@IF=yLT(Cb#pS{%26EPyd&7 zH1xv5q(JV=+@eQUcCAg9-`cg(s`;a^e}ZA?LHBO{W&1zsgl<~Z-0FV3hTW1?&vuuL|k5Q zVD-M`kGsUVWrB9*Y+q^^`Z02~oI;-MhJ`T^jkiTz+%u|zRRp@aj_$gw+o9v>^Hyj6 zVPgfEN|D2tA8Fj2bZOC>70w|c)!%I0L`>4|E!yv35n5Buwq@b34EsJY)fkWCg^pkT zGo*=Wop@8-zaV98C)cTCvnSQff7y29(yEWP`};(+^&1Wyt!}gC33@25yz{`SE{it? z3pd>1oP$lPbP)?~)2>sej>TdeAx-*$yuJzTc%oeiI82uspx&)*-!5{vW|_k}sv zcuCc+juB}Js-C)Xc}&;Zp4N8;ZK}cP3j^xr?tc_%qILZA5v~f}f1ve3Pnwy!yX@jK zu0Nm5!=17}6gKMV@v*G=Dz@csgrv4^^o`o*zfy8dy1E!V-(|*r5!RN}k)TW2pO0qx&bZ!j=SPBflCgi!Cf6SY+MP*gmbRnb(=tDj&|_j3_%Wb<2UNOIJ4Py}m4(u|L2->zvb8*_r~? zb)g5Q?J7Aibi?O3{oGy7>{w8g?3tBxnJ zvIlQCsy&fGME>o3nb1Oc$D^^0+8zg{t=z}5TQrBcOXMl*ig{|wpV+TFH0>9t0?3gG zc-sf69tC|g3h#?X%s>11SDV(#z_zO!3bZ4Z-Vj~fwQGjZLcO!H_49w2vATrs(|T~_ zb=Nv}(Ts=Aq0Ci}rtJ-t_4xfk+v%Ou->tXrB!q4==1dHeHJ2~6@M79&DYAvP>VbFG z^MxWuqt|Jc7HGZU44Ss;)#K&P|4#qQd)&2}ZNbs#C;l;@{g^Na+iyn=ZPIPv8v^F19=LStwoImr|y3k%_Vy9zG&W-qtR=tlGfc`r*%<6bkWxPTv1C6v|YmU?tToL zV3ad^{ipdqu6#Q%^|eB><3?G>*Inyhg6=9xSMn9#9>cY}zfUu7v1l2Kp2*SYTT_mP z{1upgS7_eh!v74QbEZBXySim(%B@fZ{#&uf?|z%k6j-ohQjdhFt)>sBPwv{QyYh-y zmT2$YF1SBNY?i~F6>&Qinpz(^?vMLvqPgKHx5v?_qtVN>_PS z3qb3BS6_c;p=q}JHOGAp>mPDER&|@&RRk>Y)5u!3`_bC)UjA1HRyVHG+BZ9C_4L|} z-U&&oicTJX7<=PC!(2bnpaAwWUoBRLGOuGX@vROQjp^9y@Thi!YOFI~Pu<)PMq%M4 z(i864y0J!mkL|Eu|4+F!Bq}7gQ6ga3J&S<0;MeB%H{{dr|5^WYIoGOyq;(69@^SIq zST*|ypL7VzH`~lftQ_WzQ{EV54S5+8x@gC$ONODw zT=N!liKuJ|zO0(nK21(iAz<3QW=DUS_4;aOYA!U)7o5@OwRTC|ngcT1*k(PO`PXT8 z>K074~pLIx03@Fk4V-%1u zb#3+6Bb(ea9lBe8)rYZ&#j-n2NZ8BvB}_%i?vqQFcjxs{kQRGtmuL$Nq)UAZ|v9q*2xY1 zaebX;;g8x6+W#;1Yh6j3dcM#{YkQw&fkIO2WS@;(+iM$M`Ttrh>il6=nvlIn;6;x0 zm;N(6P0s52D*bKx%h*p^H&SyO@9%j3J!$R7<=eF0{(iJJ_tT-Z4gStuTTgtKFJq0m zyy~5=hIZG=fHRdAiq@L%{{{bNIJWXXgLKlW$D%QeC$(2^<#%r7zSfZ27{gi^_Ofd? zm&o(^mzZX6mT#$;|8q&ws>0=h`<}e>d{+<^&d=PnUd|$PW7kfp-94d&7OQt&&wDId zyd!jdo7N^%tu1+bJ-;7neQ+V5|20<7K1nbyMUU{@`;h}X453Cij2;G(F z?ET@C`)3XN@*H&^qg+wIQ`@LcQ*P&$;j|zO(+S{b%nQ zi-lp!4~yn}IU03)<+IxT}$o&Fxv7lmQZ?|bZ z((Z~{Y8dvPfrleQ>dVpSg%$y~kI57!243e{^JDV*Bm3^U|NPG|xi!34WPMKPfyrGv zctR@zKOYTe^a;3Y7}ju~Yu!;k4T-?xiVq4_UFzGP0&8dgpfOp=QY%wy6)`d`&=teHL~j-c){?leyZcqkW>E0A3yMK zd;CxO(fU7pE-QljC(XU`=h%OS)&DY27`q(Rux8SJc=^L=W>M~2m)e!>JiEAfXW!Py z^?g|2syQja=^G=Xdg}WY!=M1pXLqX@AJ{)z{5$@GrHR>rOA9WG==25n{oQbjYg3GR zpR}v~^SBuc56Ca)T9?sylC44_Z~Sn* zH_&9`pWYw!XCw7_lzR&<9r)Y7r>DkXPxi6-eyjG^|GC}XDC7G#xb1=dqrwMqs-c_J zYuiuOue5Lx?-UiAXXAg-5q##aM7FWp@r2b^X8rlkuq;Y}nNRK3O}8iE&pb~ybVt8j zaIc}3S>>mN31Pifq6Bf)D;j^lw7%84^7-cQguH1{xbi^4*Qo*4;S%Pdv& zcqb+8pXSN8@=#m%`=jM{%v{?yVi(yV!?ks0-+_SS%&e^< zIk{0>42yE#HtK#_$C~lLYj%zG{KZUbo}S3x@Zo)DT(l(1HFA6MkEFKOU15{Ews2T1-NSX`Xw=at6@`^AyVkm~KTgQ1 zV&XgeyD;>%lHm$vrfv6>MYcBT>H36TIWTp<4rkUDyBnfOp{t&M+f}o>{%l0R&7(2e zT|0Kf?O44!ZpP};^{2UZbBUe06EZ({qjS?o8TZ@`s<(T8C#@4<+h?)rBlrL$ZNC|- zBSjWIclhM8B&1mVUD(k;#gL!{No$1`e=7`U(!SIzvfgmv--+K7wpd^Ee=1*a?CL)5 z2kaNSwmV)(@ap2zdHiS9-v=@paege@_*nCqqStA?YTWs&t{@E;y>o^=R#^iLC*X7SwOxD9GAx z|8w`7N390$l{&@WOpFQGnU`Xpnq?RoacA2bjY6-#=ME&To#@ylwz^G}U1Z%l(MX-7 zz$0(m9{iA(30TxV*O|-e&EbD$@=vzEd9L!1YpuYd zt5eF}*gQR&66v4n}|;C#?USAyVgl8tgu)bkPzx{b7VJnPu^AH(h^j$K8czBFcDdcRdK}Ic0T4zIJ2i0pXoT z!My1u>8w3qQ#b56kaOUemlZ(GA`L*&|K1ndyL(j^mm zU_$v?!_YOaL5Vl^W2m}Ab;^WA*B-o|v_*64_BQEIV{X13xnWankBLT=e>=(rI!EWW zXq5XtjWVrQiJ@x@Lrf2SikaZ#y<#Qz_CB6DGao-|S`y7!^>{eDjQ^;bW~CAIJ?I093$_H6F(nr z)0ODcy3z9^Y3d>6hh5tgm8C-uDPKs=y1t+~IqUsuf$ZK@TMDGYb_xY`MDPbs^!k`* z5VcP1^?m73?io$1Yx-XuyCig5?e&bA&QpbEzg)*G^_byMs@Ye~ZGN-XDt{Jk3;k6T z$R*^m-bd%+tw{R_|K(p(yr#vqI=nLC5oZ?_xi^oQYxU6r&jsxH)3myJ?|fmX`F=v{ zgY@xt@^2qaJH_{8`=tWyj8%IXj)n_&tz>*@%6>yVKdCxt)q!ARiyZvZbd(s_-rB&g}q@0t)>@&B0yUi3G(NrS; z{PUqz&9xuHgPFFtnjMV>FEeR4uvSLv@jk70GnVe#yU}Up1o_Q7zx`*hO7Pw>`CG4T z``1IOr&fHq&9o)EYe$bpet%8qp&hID8kE1NaT5(rIGnd%N9)oC~;6Y|GC;2rDtV!{Jv4Zk)*Fq2+oD;KEncy|_&?viFY2^tv#`qioVWgre-{5U zI}ju~y@oT^Cv@XB5j_owfQMmIoxZC-?^>t){wOc+u1Bl2&%UZV^>6>r?Of~CMYErF zZSj0%7+z#+oe+BJ?(Rpc|3!qZ(Q3ZpY^77UGU1G6@4gdvz8(@;)fv6Z0+iuDZsQ8; zdBA)1_;2A}ZKs#kvuY0hn{jE~uQTr7uD_SKbnEHF=*7&REQIcT{V1_|`-h_;>Qk5| z&Rci*oxI@D(Bu1Vh#qOYFIu$2nkV#Z+>KRFU+()6y1`&|%7akJvp&^z_h0jNiC-4k zy-e#N=zQ7fJOQtg)+Rcg%d_Nj}Xx;jn(8aB>em7S2 zUUhGmF)$Z!H#$Iwz7>FB6(|hVv1lx@bAuS_kFl zt)WgEUpuyjJlpcsfpx{HN=@00qg)&I8)Ru5xY*wKul-wLsAFTaMCftRtR1Ue9)|V( zPHHlM39L`d~Rr+Yl}6Tn@C`k(8kiCCtxTwJyGL4Et@`i;k?1~j%tv2%&Dt@mvcExWtz z(Avf>@wEjD3x4d%u_@dd+FS8xb+1)o($>e}znylP=sXC2Gj|XF*OP_?MOMxJxyMAb zjw@|gabHbhij)1mn+Zv))*cB6cyiI})ZuS^p3ODiZ*z&SE;`Ag_37=eO&Pf!?>8Rh zmJ4W`qEp3SH79h(LdBl`J?*)>H2#JBXXu^%?PKUA{XV8uUPd}oS4b4*9^dyPpm|rL zreokI`@_rJe42QUTPvcre^R8uy8JEYX7x?ODI z_GRl9^wl2!sXzH)@{zqc$+pQ+HElMG6|>C*=ii9mk$h;6m-livzgKo|WH=wWaC01Y zjo+<$NaCYjw2N$;oam$cSEs6z4|Nwu_s#gQcI_93W7Dold2w4gfKbK6S48Ee-n zJPBIj_=fYq?D!W~^4q3eG<4sfuEW@=u_9^NPZjN;83Bv+egrJ=<@*tI+2AOb5kHUC zmL`LRMb}kY6K|^=jWRphwcse%#94_>iYW^YwI1^43B7Z^ZpN+k&z9!|ELXlzy8JxX zmUVuQmW%B8^g-V9&??u+Z%-ZHnE$CvTDwMrw`%g8Nrhpz>t^!=J!;-|V`=gy>BdG4 z&HEGYCr{9s)qI@8(Ph=;J1IA&W;8H7IV`ld#$aKg^1}O~L1oKamS}8g=-p&?YQiON z$ElOfa_T%RS8LW*o#DLowE2x7_s$!2*8dp}J<*-Pm9xp<$L;=2Z~rs!e%t@ZQp|g* zQ&<0frri@QL{Dsye&48jnJHRAXpQvy11FbNeSO`im2#b1Xamm#=Y}^%IWelDkG7`C zPOqw8Q+Mh=!=^*64iss+oNX*C7uTfUb^Mzw8fv;u>kZdEmK}m!+czGV9yB{4v@g;(bDL(Q;6r7_8|KIC z=Fa~o{pdeKdTVIc`-$N)p@;SwXgj{X{_)VNyjt5o)iR+~p69n|=Iz}WqAtvH$Np~7 zmGztJF8ycN{M-BAX>L*1fW?VEp^L@-OizB?we6(ujcG?iL%tu?PEjnkH4N?6GCP&s zwTdUy?UlNUx1h`g+5WfuPuBl&|FcG6;fiIEQ#|JKR{dMU8qQQbhih-`NAI*5tL~n6 z>l`Of~?{GZE3L&A70HCI@KE>;K(Q{b=NuyCP)eS+A} z9J_Bvqg2l~{LHIgrghPw?%IC_``GVNbo6Pi=L(pcir-Qz)y4D|(VtdLY-VzEE8zy4_&qL=aZ!;4WCWrJYQ5SH~X#d z@{^|$-}V|#^uM(CoY>ZfE8C{t)C!Tkk}#`hgQ0`poFd~V=VY!;-YD;v6g*`$6Cd-_ znH#Mwik{t8ICO9kdrs&99?i0=w?)f+a-+h2tbE(GiuGvB?b4&+3hRA1!$S{DeZVin zQFeHTx~TI#jYoCvUy~+Gy0u;Esqo#Cob%=#FETh_dR8n?rXqF9rKzuF<~o04uTe1K ztjQ=+-734p`P3@|x2yjog__P>64-0RBmJ;zUF`Owfr8syLoYLhUuN3fr?oRYcVpP8 zA`#`}uC;xu?oIx>?D&!T(7$W6R=FBzy$WZFJuX^kax`pW*Vd>L?|^gy_1PTv&JT-4UK8=?O%_v?R4n|VIVbDH8Q=OcA{ z6hpf99(y10_+R`j``7X}|1*U1tA>SeFfCZr*HCt1b;+_DOBWd^t`h9p=B9N`w7_C@ z>4IfiOVve0?|Qyq52}k;b>rf%lRMwOZPeP$!;xdAbzh)h^$xxppGUB z;L$^OHIu+A^KPu-vD}fUc$58x{KuW&?Kl7PQw?>xp2IVT)%j_;S=yvsJINOH<)6V^# z6YwfnG)JCC>!!u3E|1ug$`4=gpZ;C2YJ;f6syAHMZyt^Dt$MUtisSaG{vAoH)L7#> zw)|%ZNzQt4QM!oz;x?@#&^aW}h5 zrqFB3Ux6PM|7I+#)68pMr}av(Ywhxy&|1x|-HG=_Oi$Lh-){}kTjuY3XyWNk<-#j9 z&b*o~$~s-^_HwY)T0aOo)%?COTAHi;Xl!eg?&Gdqiw}ct#m)V8Xhn9(!-&S;^0oHq z|1uA?hIda`m?p2>wZ7{v+n3+}8Mcdt z3H&;_msO%%`#*!Jnusmboxc3R`*T7!Wq0kERV%SD<4&+>{<6oSh0LN^ zTaJcseAy-C{+~hcKf`SMNA|BCtv;Z<^Qd-Le~m^)Fp&k5==zW?c-vTP;8R(>4*k&ck2cZj?QKo@xE#n9xH8R=Hj4mKuV#g7>#+U3JrX zSF!4WqloQq8Lf*>b|-IC{AY;Kh}*=x@y4Up13$hVjaHBWUGTBG-AC)9qN|@q_6%Fi zuFI(}dsjOJR3$n+vuPJ%lw;>w^ChzGaQ#O6&*8WJGjyg*c$exc|M2IR{|rq>xu$+R zwD!_ogH<25Jr^7mwx&tqp9xOdt5|FQ51^eTEa@qm5(DaC(5v+57> zf!4lGiW7HV6@AXWRLlHik!)AOl_K>8uPaTp zO#Wk_>fc)!E_yWNh25LbD+gAatvsqL`r)AGw!ez^$Le`(#&$2>?G~4AyJ~6Qmx_)(eq6+~Yimr-S9bJtW{y7k^W>qpAUK&`0@Vl8C`=7mO)Hx6^Pd#MreY1X#Y$7x z+z?upBFpwe=&t91X$P0F7UXc|?GU<=`|ZT0oH<;}{OfM2=y?A8&rrhs`-}XC_|N`2 z8gUA`e;WV}(}A@K z-aC_~bti;s#;6@H2IbZ?){;WKGv&(58-CWGjR*}E&A7b2CNx=!tADp>j;U*b)`RM# zb?Tz|qET-I#MBy++NR3<``C83z5Uz6u${C1c)36Rwb6TL^VaeM>ogyCZN1F2y({|L z(P)taYpo|b?9X^(==9@)!XxWCi=~y;Noy0lLq8sk;W!%GyKq(6QSFM!m)Efd_U;t= z@_NHh{-3MgCas#wcVp?on9y}`H&&Obi)Jm`0a_+m6L3Au_T|5OT6YUnHyDPUSa3A# z(u~!q4M)R1uhY7DH00&)uixD5yAnbi?u+aeF|+*`ZuUdys`>Y$(H09AEfx(@&{G1R;A-$scET?RMX zoB0-liuG3qz8+W`E}FlMWvz;Q%cHexwDzYkeo0#QmEE~(ok^mbbkd5*%deiCl~^@@ z+y2jn^{4*jKa0@_6;WE$B70EwgX*qt@4MDL2F>^17cn{TXj+GbXfEfWRl3}@OH?Wv zGUI>l7R?o?-OBu|-2TJuN3Dr*OCGI#7`DO?bO6Y8uI;`boolkYqB0J58LT)O(r>Zv zYNSnlM*SN5?7yl185)mrALe3XTku60)DcVY-WYmZG-LjL5mT>s1**4sg5K9~ZLYeK z;B`@6_QFT?clM@7qrbk$c-;Rpe)HcMtG3$B;d;1DYe(tP@E*>PFbUBR!(}Y1kE;td zYN@@PpV6)_R2IK~|8JShkb4aNEB-SG^Rmcp!aUK4%r2>=h29DI`?Pk=5Upj-c_2UU$I{J0!Aapyvg{r=hTM!PQTQhj z>N=-yLI3fuN$o0Kw|PQ0+5HK+a9>1keVb;v@^z`Oo!6zDLl1ggvm26Ue)M{@W8pf5lA~dBw6?6U7K{na zjy`sKO7It+P@kJF^{MWse;bBc>LxQa?f>BZ>q*nXC#@Ve=I>W&W$V84PyRBOkZ&EI zq4-K$qgXMU8y9j`?v-3>nkQ0mT`F14!&9x{;j-lg_BJM~`4u0wP32VnqB8X6x?EG=R%P_2-Y5OsR%806o0G~x?;&WfFi z#+O|~_f=|aJ!{f-W2dReA@5jiyD5_vhQGL-QZa2x;-|G6e*3)rY;xkG@s?AUUAJyc zRLT6v*D|Rf>XvSMn?{tIM%042zY;Y?w`0|V9ikg{EG>{&byG=* zt3aSX?dUfH^w4dS2Sk_jC)?H+NRv5Z(g?)H=2UVcwn8~h$zgc%1sS{w5HDBn@N^)*_rE{jHe(&F=Rko&P} z{)+eC*hN1o*DtKD-}IlM@zB~OUdt!k-Qyp_5r3R1)<^4U?6%vYMS@Y~N28zcY2DXK z4C`EXKFj3MohLR+J}&o9jlX&9YK%-4tUq;#b)las`{N1MoF8vx|Fq(0=#Joh zEL%7atZkE6^|aL1>e1?kWuk>yQVhO@PH#V~UX}g6OTb9D;)?to=KViY>W?-5lb7>a z=USvQoiT34>eWH+?KN7vW-KhVDOjCQ@zCjko7RP8nofuAZJxP5rAG79-(~+9QvWju z9%{|{k>I_m>Vb3V(WnRfIYHN#u{-)`lnXy9443-xPeL?hlgA3LOM6*e%`KePMVv|Q zy3{PPj;Fe@Yg+{0j)lt-++%_+8NR6N2@MeJk~w3Yw8~RyQs(vJqFK#X)qjTY@0k;{ zhllINZPAS7`?QuRFud^-(b9NibzL;}vS@is(9&{0>HiEy|Mn>Ic1*wj-u^mMj8fdA z`JP9^tGplnc+}dnu$+VA+v~1y*Q2XLx!gMrX6H9OF{~+gc}{5N?PaW`2CE*-Sly>}O(P)6;ST%voI3gBKl|1G&Iyg%C$Y4& zV0FJwz_lBzH-^i8(B4 zdbCbO(0QNMs|udbWek7Ugzl=yZRI}n(77VuhRN&Ju-cgVUFYTV7XM@amwBk|ud~G8 z2e*%w%YP0N4e33cH@jaZVArDANvo$kbb3&*dbN*6L5@a_Kv806&YVdyY@S_P>i#p7 z`6yN-uvXl`l_@e=7>xvfs^o-lV+`|2}4l+hY5VtMIqh;%|j4i$Z2L-+6LF zi__rNWtYju;9wZ|9dLM@?2qnBTnrbYf^9e+}z|$lFTOt~5^6naVQd#M0!w z1zH`Z>ReH29}ldq%=Zb+%*yXt8@x^Hk!xYtVIHj=_7A(ZznYcXwf=c)$kY5T`>*|f zTt7N3UmbTNwB9D*Mvg|I#j0BmyhE9pww&z>nYsJXw4J{bLYH<*EWN*;X`RHXMU1U6 zbr)nehNc!q{YYAM?76bnvd`DKR&2h`wZbd&-h7)$D}SxN(~}$Zb^5yh3=S5#nMKCI zZ{{!Q(a6x5x|IEXm#CQ9ySj&yl2&YdyHow;q1M+@e=R~I`847KyQF!vyH;tpz9>7? z+IT9^{f2$Ye}-f8Kl_P>h94EVzt+*mY|CZyn%qpslk7P`SN$({Z9mVo?wR$YsgovN z-^VneY3i#Yu~W1Ayh;yoUD`0eV|B^N+foI4*x!WibLQQ+bm`LK0H)^0JO9`}Ta%l) ze7nex8C&Zb|1)qm>b69*iZFf>IWW~Md4f(uVDUtqDKi;Qs3wP+=N|9>bG31@%afp` z8%*96s2;z~6!yUDfp%jw)7}Er?b<@0ibN{ra0WkBY5wl*_~-nF{|t@4<3I8Qy&q*{t;>EUZV9?3`nqea!g}Yx z2L(%g=k4eGQ)ISf`&BND`GH5%!?DdkkmBWzlFKuFK&}VIkk{Gp&7gJoWeQq_v9*@2{7?okejctB(#J*fr|;9u+abD0yHU6BX!P>Ju3b}Kcda~?{el11-}tRvyS7;Kgl_KI zV!Lr`*4z);D_f)9cI|ky+QIZ_l;c+a;C))V=KWapL9=Vel}Br(9)xZ=8qL|Y?y-;7 zvc=zz=XKZ%|7S3J5Ssk?8GxaCp7wRs!jC2 ztV64o1T*b^zRfizvn%>&>^9M|yC1YBdvs(Sb^LCziYwE_xV_U`dF59QX|CG#^{@Xk zsH?QrrEX_xW(pT5&@Qnp3~N|_o@wopjx2sfzZpxjqNLiAFIOe_E?OC*5mgs@XhpvN zt218z8H$cAsaO2ZuqyXI1IPU*k6P<&3RE-K=Y-Z8XuIuL9r}A?=#t+_Yk9vP4QD+X zvZV7Tdq+cc^TqZL_D>T-Un&%oE#_PBRbqANQ9kQOYpWlI9n-pNuy8|Rcu3OPOUp%r zGc+pQDmMP^KmRXFV%32M+m{{go_GA8sr}Z*@QIJRV!O7iKEAgw>}8|gI<32gUMI~= zBt@g#`+Y)-E^pJ?eChGun~&dKsl9P)U8KV;$0I+!%Gdw7+O@ieYe&-BPwaX7ZV2t| zwR(4tS!vo2vEQ}!Q%Zi-6ov-fX6#z4+Zr;Q#9zBrw&M?IImaToU z_Oa@^3%}?8%Q|*#qS?DZr;~oMC*IZ1W?J-ks^6peZkl0{nwLekpJrOCQ}w8|y+-S* zp>uT7^zs91ukX{kk@sVD%|@?R*SW+DJ{%2+Wv*QqKTm7+!>`E#Wnxi*~FIIjVP*S0;49;&ocLOAf6Syf31|<)|_zv`lMjtFK|$k8g)o z3HAL{SfLpryU8bvcf+dIr(O44E(&{nU#2A#{N$Ugs{9B0+fB1AW^es;`_?H{BR1v@ zB8Po^CMz;XM3{-qSnXy|7@{40X^r*dU!THOa9>g6l$hu9_^g(0?5D1LKiw5c{u53& z_v>Y!`>}AH?Z(jcz8k{}jz)z@1nln9y2Vf~u{zauW9Vv0_MFhzz&}Q++DH7#mvMW2 zWS+apY`TBOnf7BdZb__KE<929p~Xc3Q~!P3$twRWPTU9xURtEur7E^NB~)NS(yC5I z+rq7Jx~t3%XYGEqau@)W;yI#Zfin&#f`7o1=uT|38oT{X?0*+7i*2ih><;lpgkI=(Sd$MgPg!?0hVm3-T@3cc&*X+06KSoMI>RMt;xOM_j-(p-PP9jhK_Uly(Zf3=^L zp)k;AX> z&*fHLcZt5;SNp?k{WRmRFsMCXlRCyoYO=eo3^mzV30`&a#sheU%o?$+IEh<^{xDmyF|5v{M$5hq-KH6jR|;UowT~*$D_4^K3tD7Tf=&L3&R@z zK3rZZ-}tY$YgM5#Q#8YmhhZlqLXYqr7BMLdJ)9G|xHW9U6AoLxBNaUw!CQ13JI^1L zyKnfL_j~=}L??ycNvq3`MlbmJXszsr)h?5}q?TztI#8VuI@x8@Lbnw>nt@jm!xkjf zm;GnRt^U#f40L_UsiRs4lGaHq+!J~rT(nHBuZ2!4f_VM3c5ppf+t{@ucY99g=9th`7apzc39Vpw81|$$w!-dJwM@X0gNsB> zQ$D`4tFu_$a-eI)jR#%}vU<;H?clEoxEXikVd$!^MW9uU;#|9D$UPS^@s`gCJ=KtZ z<#WKTt?J5dz29;Uw9a5zgpq0*8Eqq>JR;$|08CSsQA^m9*GKrh5s3v;(snyIa+k? z@Y|L0TIPS;AAwE`>I(C2so!+qcX<8obs90ZzrO5Ro4$_Qt9wpk%2SgAt6E=ZPuiO4 z%WIvO>@}x9?nbW2qa$B$bFIDq@@Qz|+g9!m3zKcFcsHo-tIqA(A!L4(&$?^gjMa@t zqx5|^i{@@W8m%&iYxBjvDO&tz@*B16Ch6Tj(tov4cZ$f3`TKu8@Sf`Ncky@rmlHL) zBR2e9_+|aK2Pqq-eT?7nAhdOkfSqu#-|~N%N5i&jeY5w|%qUv+XurpSwHEnL?H$&? zIvV5oFYG@e0x*77uDy)Vk)i)c#m?>G8&++ER(Pnbr!0 zAAe^d^ynYM-{T@{bn2)4y&<|G;@`1F`e!Sr0{|u%{Q~g3DL^mt`GPotu{cy{rd!ffJ`xYy&Gn$@7ac0Z|@ z>`^vlsov6r;Xg4eM_tNHspyIua?SRJ}fH2-;P?B<$}&OTmU55vW7ONUyjMYL=3vL_X8 z4bZ#%NArVzr}SU$+kdD3;bRJ|$ylLb_j%{WtT}uiw|C9P&{Kv^m)v8xHckB|v2+8gf$9c6*6d|kuO5bni);yz30=gW6Phoy zw_NVV>YW;*$^O^7#NFB!-d~^i@IQljqSM;K@FLld;YI7rR&NZoRQGTe9F3M(SZWx$ULw)&hftf7;+(!qUH=(2 z#kcN%FuhN!^XUUVtu51R#ot@3u8FAN-}AsbMtXPcq50Rjwk5JBo!!3IK1?IntmCe$ z|GxhW>qTQ^= zxF@l6vj*FYRhJE{1Lp2A`%@UI!lv7?sP5d?5*E?(`5J5Uio+F(W@0PKDHc z5PWAYe_dqNv8$r-o8L|hbrE^Fjb$}Y=#5o}W3)CrbUNI%#l21Ig2d_y(G3Qx_nN9L z$$xy|L8!wf{hNyI&Gl!UrM>rUKK}b?%J*0H59_-gwVu?N5N0G< z1n->*;molg!(O@jgzm2i+8MWKN5Ew>t*hEyYju6kf$mX`;{Kkrdi&9kTO7BG7VT50 z_X*f=yKmJQyIKDkj%*AyREF1HW+HqGdlQtunX zv_ARIv|lgkwKd|@;$W2t6D-sVC*-Bvs$GzwoG&VIJCN(y;rpy>O?28GJb2`5aZ^KH zr()XlwUbJZUG)7MX#H@DezeCg8MD>XZn9lDc6C{+RWR$SW`#)c+`jvlr9+}LWH)I2 zQ)b$+)+%Z0q}s_{64tew45mGpQ(5yTXZiC98alm29Im$%)Rr?kC3G2S#veb-wN7N2 zMo!Y|7*tV08FWMItpD6wI zyG?74hBQym9+}W=b>+8R;z2V+?-ZPe-EzyS7=q-KP`&WoZjF_(o7Cd?VI6D8O4)4(ru}TZo)fyEFzn=^bw~M_xz-(O-E{h;X4!A$ znozG>W&v^j@8!$B{R{oiklg6BPP0tw)i;aPZCa0N3`38#io) zp=;|ZL>GZtbi4bsF8(nLTVXdRG}(#QzfVNtuInN3Wsf@#i3$fs^@JYWQ&pV=+Q@xR z>k*&UmaF^Z_lxGZ`u=*fwq=>trug>m{|uVoToZiD9d|wiJeQ%?WsQ zd7a2w{k`ll0Sm1=Bx1^9=l>0=`p>W-zx!`ogcFy>^=&^^Pwo49Xl>V{wwYPxM|CIq z&lAzL5Y2qqwS`SHTBl~k$<6DX|JI+(2`wp-6rUjS#=Y^wq1D@u#_nUy*ui^z!us|a zt!r;Go&VL_gjV$SH~c9KYjNLcvFbsiuY0^qz$4$x`=Y@biK6lE{@71{`p^B3yJ&3u z?&n=Q!bQuE-kPzxBq#JJ=lia0oG)WS_x>qA%6I>`Xx{RTM?+KsmaTI2`%_c@Y}$VY zvqP&FPo8!-$*Osyq{yl^Wzqbr%*70>38OCN`9@+kyqqV!Ce*6B0x8IXi zH6%KBtUEUE#=;W|trEkn*ghU=n`Rc*{{FsbNRa!je~VRGU%BTV6EO?lCt}^_$!oGm zD}3b*jaPM%+OE1TI(MEfR9@8A{4Xp2(}r7@6oRE)Ew)-EZV5Vk%yXySa)^Oo2Dc-GyVJDA< zb;)q%Z9N*E;O$eOHSai6l*H0i4?@=&=}hTkS@|wS^u?n6^@sm6m?nlD|9CXkxl#A> zanY!+%sHV8INmpMukw$2w3ex0X+d$9c>9N=(NBY0!%plDNosv{*Y;z$b#80)Q9e=I z!tm;()zVBMCl8!lbVGE3Vd#Ox&;v>9)SBi=KU#e_Y2CA`2i{&+kMd5tH6zrwgn1?N%cCK)9IEo0F8i*Y_QLK@u9mq| z2xH^l`)@zW3;bu$uKHttcAF-*lvKc^=sUCee=b)#Td%s5VfksMl}3F#R(oXjuGMOP zR}^+^`kH3mMRP7CZe6kPv1>yo=bbKo|rT%!oBmvrYO(1jZykBoKc+edN*`K z)}?eXzB1*{m;Yw5)Qef0Y1J0lncvp`=HL3CLGWN^=&uF&?>+1Dy8kmUS^a0&lp{7P z+?C5>1w#d+Pgi(P(BAO=6Hg-bl=o>ZIkY2S$<;%v3l`qH5%B6^I8$NR%tKA*90IS* z30U~b`aeU7#{M&p|0&JS_|LHEaqqI(9#f;|z4^~@=5GCsZ}HzObWLssRP}IObg*$_ z&3+`^`!RHxSDxdsOYZ|@I7{6fLEDPLI@s4~UFCoC&tkQc^XYcsxPABQw06yX9o)4| z;@aH02+>u|m)EiEn3XiG?Z)a|k5+pu1C1HfYz&)u;LfA93M-%8tp;y!bh;;77}mH< zBV&W~qqXhtySAR^+C4uf^uU!zYp;t&Dz1EBH~C?s_La*|yVkQa?b;!F*D&nv6W>c;s?t@u4{|Ho~t zA$iUV*0IJOn>{CV@e!`M8&)07i%+lN+Mks)ZKY4>4N<3xoyT6-XL|fGXbo%q>v8cv z!%WBD$3)Bu!%OcoMKd!+KknLQpq*Ht^(wb(p}tZTXF$=H^H${xekcE9=Lm^1D3J7Z zeEGgnJCZkx@5idS*_(6RG~zT{W1{97hOT^vezNnIa*tL$gQIFRr^x*3*newAylGC=R*XMp*8kM5HVEK8e(4}+U z#_vd4$7MBt&-<=*rQ!0TW$*9E3lxS;Dq5m)<^JL_`_JC>vmS{^r9%FXv<)g|jkZ5^OJv`3@aMPo0Etbg7Z zr5m?n)szWtzbAgI=5om*OC|i88-PVzu%^{T58w&fSR&H zYxndlS`z-WYm3ZRg?|!4k2Su_J09h(Ey=$nUnd&FTl+CwinqTebOD=ap`2`?bHlP5 zqN~adt<$i6ob`_3+p$X*dw6ogISwAXn(bn^MJHoA@2bNB%F?064C@~AuDZ;z)Nre} zsKv46M|ft7><*LPrM}n5QL#_rgd?BVb|IPE502KUwM>wo7Q#RjiHv(qKQ2BrBga`SxrB^Zd5M1owLr- zTP1SJm-|mRPh4in-O|2k`(6L*4NDC?H@fuB}}=CN@STi4^6wcODIy^|U_y(a-uAt!0-smoU_PKd{P0 z%p}R<`_b3~yvMXI2HqCU)t2|Ye)v~nNQ!DisNH-Su9aQU3<=J=lGaIps*|Hppu20_ zJVSZSb^k0b?p1W#WVukrcGqOkIM|X^Ze9CR@*h?G{UNk(%F$@)q}Bb~ShIGlj#%vy zo};yG%F!5)qr8{q-B_A<`%zZSIjv=>mF69R)f?qMivC@r5igU-nR;jb7XRQztr@HT zU+Tzi3a{y_PaEq-|@osU-wV#fAa82YXXA^ za}Hj7OsuuDfd(F7*ez`(@u=bBWa}eFCm&ZN1Zc(0oGI`wRTf@_$_axiRdq zqr@YtuPR^Fk35=s?}zBF#IThyp?4UM@_zWRPV4^V)@X}`8~C(ZRqlBDe~)p0pZ|07 zKh^e0ffAxu-goWVax^xcC-nBCb%)mde6+TQBXEy;`?B38?H#}BE`rvRh(<6lFeg|g zO*^M`z3S1rr3Kn09}cbdx_)0YS48i}YS&ejJfWA&4`n{=S{J(f)q!<(H&$;9`+Z$B z<5X8h)x)rtF#(rlxULqgntJlhXriK@os;1f}{AW1U z`){3ycAG@#zBq~1DZd}JF24`jcIeKuYsS(=?loEq3(py(H?U>p?LTAxZ0mo9w%-;` zTt8-cUh$B1+OXn*efOvT3>}YxcE5V??&z#}Dwp5AY`Pk%v0FplO=}I?jn%7tLi6Kx ztePz)Rc^65;bC}@?MA0_s{AUV!B^|MKwY@disgYj4y^6rx?6rU#!s~Tv}n{D_Sn4} zL%R)C8kXlh&k4AH>-CSM=^EUZnRYhh_K5~7xtOwSs#E3?oi?}X(dq+lTe+JW8>4ye zi|q8R-54&|$}1PUD#~dU=8KDcXPXbYQ+dN}sgUQ7IDXkboAq$(a;^C{ z7yc?(Sedk_Mex1XzcpGfmh~^%u>QP=)@0vvp1j3JqgLLp30)U*Ys;}~(~F*77hU%4 zXfz8?=)MS{Eps>{W4K;Dn!5GH=m+#ZM zSYR0TIwo{+qqa0tn2_~@u)}nG_;Qqc<*gl|84JH1<$lHRx;0#5okrZMs=gVaIg_+% z7cqXfSeSK6x|HX>LVdhXXo#eA!Ib|Dk?nu7&vS`MJhlGJe1red@qea=R?FRuY1WPD zUFHAhvQMtb4yTFXmqSHANa%)jO^*8^bYJ&h>_@LfCm*(5n{Z}+_{!KvuiQWV?*C*{ zKV9kUnFaY*+`Bqvqtm;HTU$@_F5DL00Ge_#4a`TJ*aDV&}v|liEX_Ke@o+^Hp+y5l~#DC=B z4CxZ-ext$i)%M@y>msWjgoiVQw}ML7sSh4_r>^{TR4eDIiNr!DuX%0FTx%5`wF~>0 zt@YG!eR74%YVtO-RZiiPE2if^%Wc1~KXd=X!mTk10nR(0J>L2D->Sb;k6o=i8uc?F ztn=g1sF#geX}&)$JX$-kG3s&L4xx+PJ8p|cf7E+k*tKH^)AGdDXwlr`hwNoSH!O6! zA-XF#Cv;WPw7J=hQ4&kRg`;fF)>&(~pN9s5JXPCV+F*No!|9+-jEq~W=J?*V}v}%rf!_nvmdox?PgqbyY?1A63PTrKe0fnA)^$0tYo*DS7n}!H zPyE?+p(k{!iSlg`&6~Lb{!euF7h0-@tx%f_Is+iKQF~`X=wYUHHV_X*rgcLhN5e2&Ok#CR=e-%Lz8;M#dt@23UngK$ zs=|dYACKy8Kf3XK*NW3hNBsjXANcW~As$8UU1{QNKV zKZEw$q*YzcT`O07JFxng){bDV?NN`~i;l*|gx*-avTMhtz8y=`?HLsT{qiiEIzsd~m)M-p{WV$-{QVA#tYe!Yx^FSl7Bm%EMxHzub>d-yaSBRY@zDr8*{rwRilDw081d-S}d|dY>6u z5|^tJb5myNEQnfK)zyFGsrqc8exBtb`mF4~BSJU5FuVWGV&Q_vTQfg_Eckn4b+q6H zi=d}$d+lXHE7!L_ZVdZXdS?QgS=*1`eOm8C-v3Ap7g=B2yXyEhJ`L^fk28|D*G12{ zv!R8L$C7Kl%+$@CeG?aYW*qbMn$;DM!ntL+)|3+)!#a0-J>axBdD>z{&v>s#>y$-y zi{^{w&D|KfB>dKlg?Gy(L^tl!%$sMidPey3uAL#Z7OP%`*Mu%(U-7nUi@a!#!O`%f zw%MYYvqe_Uo^fDlR_*q`5v#84P=B-jkKi(`C9$_x2S3s5S|iAmRc@zV{NvHoBMHt; zKOU|9xJ>IR=o*w#!_eK$p(e`vv^u)pPkgL)rb_O(s7qs4jC*32)KbH+z2~&<8ipzs zEYE11H21jw591I284i3p>=FHP_j~1ldac~=`)~bcXnfch8f4lN$jZJ=Go!(k5M&goNH&?mUYKP?Ehcro1&a}+2mYx=eoNe zL;o}AgdPbOEww4onsce6;oaG9A*J@u|J-m0?dB}|s&=>Sq5IAFpDXvDI@Fq^y^UoH zE2uZHHJ~t@flceaOz7gbU0WRro!w@vx>m#ya`(LB1N)hKH>{qd$MDWu_N47O)>!Aa zUE8GQ7OdVG^0sT6bk(DE>$D!#6gnq741FvbxNE`+j`qj3?c2NSHy&EorYO{LeZk9# zUjJqY-Mg_mUgWs-1hk}J<8_f8 zJ)vttH)MB7|0)dKQ&X_i%Vi<+k)F`#uMfgH)R$@PDY-A2kr1lZ^XZ9$9lOe^9Ri!& z9^cxrIziYgw>9=<6UXZqt)-cJ4CjAxe|2Qla>gq>Tq_tPR_}Tc)?vFbT;t=R)m=Xx zwY6{4dY4jiXhn(ZvsbPj3hy7(KYJGuu==3*hTj{#-PeleaNVfg81^l9V|by-GOY(3 z()nFm_t$W}i&!Q1LUie&zbjq`K3e{^|Ho|(jqtE1+E?UegceAIUXk^TRV1x@+$CPPOf+-yjvEi16JKu5DOmNX(0g@b>}Aos z9Se6QhV^N^3EkMrw@mAX#Hy1EJj)7WzuA5}c46f!(cjU(ABKh|R7pJy7h?AbUHCC+ z^%TZ^BIaIyEdo~XiD+pajg5Nf?D}DK+mC=7>uWS}xJnMSKIYou@V0BMR#iCH$`emn zGyFsp&;BW#f1l0k$4cdYoY`$tMYd#FNv#yUz2m^@gSH=TZ9mat))gm{vbNV^PHyJ9 z=*QW9)^l>BByzbM-gj-|;|@Kz?O@if9RYU>78Y2lm`QW34_96$8gps#=9+lh54WWv zlHC4Iu)n(EKSRgEtxFGzx-uL5a{SNGnYbl5B=K8>{EUC?Okvws)TjENT=}0tNaEHG zYqg`&FBbl1=$Mlm{p(cUR(S(Av$bo_ zMAB64l`S3-r7Db{EmmFe;#1zR{BmRXie*~&M5D5OLUYY6MAvZUOujCfEt+3R~wZokZuRtE(S&t&>igwmODuV;jrb$Bnu@p{0dkw-+vt z3Ai=uf%o1vt^52nTw5nx7Y$af3C)xUO_%!ex>fgAeSMAAqb)~cL>@Z5YTT$Snq%sI zi1R0Nm$XcO;QpNwt7{~F@E`w`=$t7Tf7{;e{^u|etpexWO!tlaG-A3|WG&D?5iA;a zDZIFA4Qr(s^P{EO`+c7HMsk5ZJt{8zUgXd!7VB4N9&&Yf?XJh^;M1`|a!aV0WFRbW}lSaH;fNEc{JPvvN zpMmwTXm0Mcg*T?x9o^sXTf28@$o%6>TVu@HnY*^!PMWrQA9v^uUEPwSv0dBaeu#qZ zj$FAw)K307*Um)d;_K_TUu+E*c~hY6Qjs)m^=;8ImhC>F`7&JZSn{mO4@?ivpQn-C z-gf-9XvEPeAEhVXc(nSORbII|*Sg0(p^Nq&)7mbYlivlpayQ_H=+T%1WEm+Y5DKvv&xt^J=E%wvk~P{hj|A z9=rZ$=-n6^bVKOXqjh#aRNzT-aQ(92{@5FzGrbDYA zwqJHwa;0(S_xD}v)>kF1d+Nh=U$HUzz}i0>R<~(A_FvAm=5K}Qh44<>ZmC)c(SW3B zGk1KuEt>i2&{hf2BlG8pX8eA%+VhQp_Nv0rrEOZ9n2*k_JzV?vU+$sStnWv|ri-jC z^ln)lw^%gCXYq~`m!kRjJAd(MJ^IIWzx>;ywd{GP>L#&iy(^m6wcz*UzXn&a@?3H2Qq*$IwMyUysIc$Qp*rgyv}$S}gQEP!QPac;nHk z!kz!#Ifu*sasOO@HezWlo7PPW(Ze;N8(YJfZ*y%kJIZ@$$I{Fw9c5O*z7R|mU5wL6danXzm-;e73s7eSsC;?is zlq4Z=K-AXpXb20xz#8^R{~46)kFCG`@@TB=shtlT!(~Hv{b$JI@?B*p`$0S5dSRpP zo2o~vy+2wk4KUN%>&IgLTEoP)hD|dhto%g(D@^5XtakbFXtj2X)*h~;)r}IXTiIC4 zv|hd6r}ZxMXw;3Ig4GS8w?zw%MzbFl&D*hRW@~ofhxxht!$fn6gFkGo?fB0yt3W#` zjQvqi{Z-Td46_QuYZLj7TzoRHqpJ9U?=Ksp6?(L;@*0L6 zSf_QDyY#@?RhLCe3%wp+njv~ryD|2_qqVQ z=v@Qtasz>XTb3%Roh^i;P@7nsc<9OAd?MK6AFRD9q`C0vPoy@4O zDYjAb7616_gl22xZw<5i{b*Wy!-2IQ53MaYu#Ve@vp`~X$TE!rcF{7{jECXj??Gou ztWDrMzDzW%>&3FOVev;mmnG;~S~8q+=Fj1JnJ1*b&0)Rco&O9Qf4g(7=v-RAX^wmM ze}=Qn|IAVkv>n}%`$YBSBRVE6q+*$uLZvV}Hr@7V&+D!f0EAsEq{2!A`?cFp& z7!;Pf%4*&g*?#2f(P)X#8>?foyY~OTs9^nU=J}{YyOY+flr5K7^>DvWsONK)DJ^V? z8|^pQKU?;nLH!>$ui`})<<%k6^43(%fAgO~ooUshse5{>lGd^9Eet!Sb+s_OZcpgd z-ycJld^@o2^?ebObKwt|C(AYenE$C@)r-g6ac}A_emokzOf+xGfwf_?lhzipuQ(bb z{^Dq~=$q`;@bYD%1=f$+PBUl~hUmD@G}`_)$Ie+a^ecm{8_RkY!R??}Q(gSy(YmA2 zE0>8_B(39Z4LfhqW;WrQeB~R1Ri`6-3|n(={PC%Ycz0upb~sb)`>t(<;f!6|3d4gB zbID|0XWHT+Tj+H%hG}81)%@Lm_k^xrdxY0={rxW8ifMLd_%C-w8!Jd}V7}91(z@)G z0&lE?Y`KJH$l@!y%S`%Q(q1}b6?~YmZO^G{p3tpH&zEXm7LC8WQX=%!0|S-DE`e|Q zzo*J(27VXr3|Jrg%Fye<*Q45zpu-yU*6V%!nY8ZlK8+X=!QiefnYTr=w!H2NnYmJF zujUC+`;V%B<3HR8SRLH8wQKkEj-z2Sewr(l9StuKIkZ;vz-p&|5<-t`48soG-=`6{ zO|Drw??93N*ZS#y8~-!3KAz;H!V`K#ZZVfE=+eiQN7IgJJzDZ;ZLnxggS(KH^`jLP z$FI(C@PBvyd&+-?lZ)T~nSW+SCfBpQ2CAzruhV*z{l+jnXz$0cQ$3+~vJ9P53&R=x zcC23cuxo9G^ZWaMemz>tyH9xIq1C@Yh3>l@t4j{7Tkx_qdYRV4E*bVV(O93*Owrrh zM06MH`yOx8j9IhJ?7-T~$3=6hAGN)1jg9(pG@5C~>RN-<2?@?^qWOtkYadCx?~;CC zu<8NV?}uTB`zL-s)cRzipT(;4o~uvD?-$WtTd?Y5+>d}8@_r&_X1BR^KX2uG`mjqj z2DElMb;Ih=V^^2u-N+47T>mY%?P`F2<1db*(FEG%7<&8r z(b%@D1-2WvmS&k9%zE;qsw-*L>elXLF6rAUZ9l6YhBNtz#x0r=utUad-8!?i%w5|I zv>p^JEH^R?o7H=T`SX3zpzMnM6ZogyUoEoMV7==T``&@9GX-2$S@YtKorucZ<54xX$GE)~os7SkzoVYH zHTr9Y-RbbZ!Cl+GwlY`s&#=GDB_{pCN<5(UtikG}irJ~9_8tdTH!n}J`xA6?d7sHT z4(nu(t$#ExOGTHfWGj09!zH7@#zaL8%*%+v< zvshi@abWFqE=yAeIg5q+BgNBF<&6x(_H7riHc-D^f3-1Mxb3&8y{i3XrY$MSzj?n0 ze|)vU6!~X4| z*MA02>uL7>UyjDUT;A}jF!XWm3cH@rUAfL(YwMy5P3~8Hmk2GeSXiOVCHRz8Rdi)@6I0d)Jyo?Uo7Ja^X*()|Rbi_HLRPGMvl0D-yP>)qUTnTQyH& zDPQ>I^->@2EhziX5dJUoz*^oFA#bXmgjQrd&RA+(Dq-We@`LpJ!@O(F&$<29K7P0V zPnLG?vbis($qNgAy8XNU;l?d`0m5&(61J>tF?=tv>OX`2pNpV#$=3dA=vw!9`R_`R z?WgwLSi0fIYR8kWyVk|GT;8S;7cH_ixG^fZQI{ul*JY+CedorIr&H8#nXGrb^H*Z2 z%dbgND<0VRJ^#o4=Rd>Mquh&I13ulIeRR9M`=|d58xO6TEfc!%#5Cu5BD|yTXeOtd88#bY(4@)*hMG>pGx0 z9MQXlVIMFlYx?0R_X>8$uCTf_p#^yd9(X-CE*cfR;lS#hNo&P!i(^;L&6m;IG0}%>dyc3JW7$?1_AxwUa%*f%z?-1EhGC5d*1a+ewOkPCE-q`%Qp$eR zPhr)hogE+MO|g~V_@5#EXS7O7I1gt5vxpg+*1a2{`z%CPC4r6-jr#d$-8$B6(P$M< ztq&7I>ef#@8gPs=aXnM2Kl8Wt6JPSbMU-jnlWv(3sC}X|NW=YXfuJXAu+lnauJEd^ z{q~Gq+eGjGnfj+NG~;2&%f`?G?Z%_JpN>XZth)7RZQIe1djj{xogbN5tU4rVf9ena zmjmsb;tOy5e(3e7Fbp(ma5PHC5H#PuHMnct@;0rDvKzx0G<`yMRXlXA*Wt{*FJj{M zSTxq_(dw1kG=skg?dGc4_BUeTz3$*NlkW`w8P2MU=512D!uyWb{!zrzV~?62g~_|t zKeE~AJSjDQlcT&%Xb4x*^pXSX)J0?Ceyp03eSDqP4koKd?ZKkaK0z0mW`w4kf2mm& z(${=sUi15-VeazF_EgP#eq`QqCUKe2yJbhC9`XHHx+)2DF($icK@8VjgVkM^MKc;N zJZfFOOtc`dYv+^);VjF2H-;Y03Egz%Xu#!dKNVI4Y`xDV$|5SS!|hw^WA^oMw)egT zn%AX$b$>OyZMrsX?S!?4TbKP?#P)YX)TRFnE7#xeUG*@{Iyvk8$`yAmi)_g`#Q!;lZMX601WbR?i4eY>f(V-^ZG{F4=cx zgT0ML(4?;ptCaVjtbex7LTD-Pe}-$~a}xL#TwkGlTu3uqy!dMW#ciw+f>oE6->(VU zv0RJ!HrKkxpbJ9EeYozjXh>b8hA)0V@a>D7+kAH!C5tzGu@Xq0tg*o@1d z18o>5S6tb?KmUhLsG#g@=Aft9H|@LYuUp)@w5LF&dQpRa@cow-Li=Vv2>bC@B6Qb} zN9%q*YA=1+8l?`pU;b6FXmr<>R}uk_RwYmP&!ACfv1-nD!v&9yKe83y`O7fGbnBjD zYZV{xJMc!$Us-?Sp=#iSV;lLjG=t;kpJxickhE^8Vd#|QeltQh9Nbs2y5wk-oyF?^ zmlPzI72jg63EiI16?OUNR{-^n$G?!=qt4v5?-~}Gej7jFQg<-Ee zKqr7-&3@apeVf*{8KTE)Lf7YnUbT~0by8*}*Y1rk>^r|54PV5v?yLIBkB3$t6R}>W z^=uu>S_{z|tCK~nxuV#sg!hSP@$O0tu|522?TfxEIyLO=XE!=6m&!3aFs*@EH0tG* zbyttZ%sBuGX3O^*53FsD3Efbz+HIf2!i`-k&i=kRP5-8U@BSeE{f|y6Mom31?L}eO z>#iNYlhy^4uhV)~m9%>BmIAFc8R`nuL-(vUo=Lff=46c zSo=5kJBDF-)$KXg)&us5{xtzN8aY=o{FMmhUC!kez{Iq>EBMdi z&VbHu3r{TF%D$D=Fl^4m9S2q?hgm0vCQ5#^Sh%R+(YgnQUYEB!c5OA9=6ocy?eR17 zL#+p|9!R{{S{PpPvTIA&?jI#bqZKaa_GxWp=HHUt6&{=udL&rH^!hf|*nL_H%cTwY zCH_81pY;33`rn4zM8mp5XR>sDiwH?{dR2auw{@9lfymKliPZ^xGeYmQX=d$Mz4v98 z*hztjK6zTpUmOj2IJNPMnrVTS^w0MGUx&Z_XLzt-YG|mfe+<_>&DiUr*&PSgihej6 z&G2ZQLQ>m~>rAmep+~dKe}7n*A#!uyAFVx%U0aVI7R{Tnx@6gpRkQrod9C#|SQrex z((vkfpU|}*!(Mi+$!M0E+utXev9bScfBTW7)(6)M_i4TNTejqF*Lntx1&7vN7cG|w zc-0fS_nbz4!_lyhcVvQAxAIAVth&!7vm*G-tZKO#s~(!mZ{v`&braFnWC`_k-=>k1 z820zW>dvEl5~0UMtf#Vpwi;ZI?bEuDP{uA={AIaOH;uaHMtA|^Hy?3q?4T+h$uwLt-^G=@JsC8!R*0-6h6Ft;=;L$p@8KGPAeyr~A zJQ}u{hiluE15*z(#dd9v>59J3wD#p*gVj3|!)CtRr`6UoZQk17+V}q~2HnBdBxow@ z9;3B=;)et4)NgZb5%gHe{7&N5t`&yiOv{(QKAO2eWLEz7IcBSWT;BQngZ9dIb$>!r zdRFc>l=l*6A!#Qk6l`-vRdwq!_PTltI{6M{=G%_{e{}My=yhybM4i1Uah+Qk!i~>|2}SC zt=S}>!23B79lXdMrKO~C#0B3r5+t*w>`U3^(II)>|U+>TY}B34(d?vj^E zn%b>7IU~dU^Zd>Kj{p2{N%V1p`q8WZ8D{)vn19G%)uYU=t*4pRSbr7$Rp{-W!}Y*G zyY$esHm#e>Sflr8=Cz9k8%f&lw&(8$HEKL=6y$f_i`6A}B^%ooUxY!;47&`BB z>0izjy?&q8^)nr45BRhmZ9N*j z)GBH9lt*hP?$g>n!Mglt%*9T|u)BU*3o6|z>>hl{mrwo|#+viMdwNZ10puRL??+?1 zc1=AReS4YKHP)=Tj(22N6oxYN=l?x_RKCR4{a5=x)02u(nv)Vw+0EtOzBy^tl%u+j z)?S(+x~MShpn6W|aW1I^M`Ilubp_mOLKpcbcCDGlGNbN8jq^fj!B084nGS0{{AW12 z^1H!*hTdq=lH9LzAKO~>J$|-hm6=2++u<6{(4(Lc5!(&g3BjWIPrJ4{cWw2%vAXYu z=#k4gp_xZ@jhegGd|CO;>~F;CeX6gtKOGHcfBLWb(b~75nr?ODhojNYA9roh?%Lk9 zYwt(rRnGdPkG-O-uvyqw3iP-JEG0~eyra0Xj&g@)QPp58R{xlUF3+JwEB}u zeVSS8mBNerKJfp!+!giY@rvLt6aO=qCansNUz2f7@wNNoOt!7) zlYTSn&&F^;-;d!kp}E#cD>7xa%n1n%F8;Ss{^P1gtM2_+x~lwr*Y0InH;%@*f!ac4 zS{Lq%=Dgp=nsI%Z)^@HfeqRo?eGHeoA-aE>)~lq|Du-5R-c}J^YI0vhi+!19l$ye2 zrtPmQ62ks%$lj-QeSNR)_OEj?#jdaap19=p-na*kR`0Ff&lL4FyD>`W`_XXD!mz(y zZ@acc?N}XZTNw6ZPN?VPo~dsR%`f-STDNiD57GVp$C-8<_X*8b6OC{+SXeaqN`lwN zg6?lKYE=?KLw7oV%et>npk24v{HF826ODfh!#bvXd9=S0JXXsw<7@GkfaI*}R|Di+ ziq?OY`nM?F#Kd1lGiT{x^!&YLd$CF4A zt68h__*}KW|1wyeW!)3HiBIbdXQ_44It$UON5c%4`+ySoj0;Jtvq5uyr3I@)j)ojw zEu|XsLu387M5j$rr~Wf!P3+(EpW&?iM;)%IW5RnofU`$WtBZVX%981=Mkn&PyRE+g!)wVZ}`E!KYsV3 zN2?#V1}_i3GWX=K!l>9INoz~)Gi@_Fw0iGGuT$Y%Tau5)u>DwFvHJhz{(XmYE?d4< znce^HLUBFg?Z0V%=V%l;eyo}#7gY8^{#E~v+pMb=NG!eb;b_z{)>7~=<0{a^u?*L? z8LL;`7ma%Fd{iUi+Xp$_R^DTCY;SzEvshiRbc35lnP!26=$_ES_eJxcwsJQdT6-Z_ zG-zJFXPw~58yDR>|IG;4q~YS!@+o<@yioN6uZ5ri;zxTohVyO=7nQAkv<`Itac2L4 zIYAFklpf{oW@Vk7!0LaoH6*7o)!1OMS7q>lx(z<)>TgIl?-sEcf4)5zPqF+5l_XRFnt z)!ck{4OZP_nKdW0R&$$1ocM83ryIh*FI0Q|XXroLvP$7e(4)ezjZPoCwn-$dGqG58 zE59{rnbt02=a^9591FJgzu%7VfAv2$e?6zuUK<0|1#DV3Mc#I8+4p1V2LGCX9dklg zfe!iJwdKC3v*xcopcBR?h2PwtS%35I`X4%z1R3OhC$%03&e6JC7+!ib3bYq>oz?@J zLazsf;j$l{rd;53e1Sywau;3_I+9xEJRBSL5nIk zhOK@KIyu>3)x_@3r}BrY`;Najc4228tCNR?dDa(u&VhBX|GJ{rSnmFVm)ni0Y;6Pmv0PUE_}A5?>;h@4bhRIu8y z?oVid?1tN-uYOlQ+@dorfbG$eH|%|^Q5{!#BCa3arWqRGrx6qKBWdkAtsO~gP3CUg zVtQ(R_R6 zL&&aT;oZWp$@jNu?Vl!M9;5a4V|dc)s)Vr4quSoV(q6|D9&C*~QFfnosp~tYc`7|& z(^hXZ4NbCp|6{6wQ3$toz1H71^^apX%df8f`*`Cwd5-@Kt@r;)bFKFXG7bsg@2}s_ z6my(utvb`%bsBj)MDG@Q*A#{e`h;d$=GSR$XOdc<6S`r?s)@6fEJ>ctx8;TXwVX-oz2lJ^#SMYitmyCJ$U zCiK3*fz_VM`!tKKRy=v@D(k1UF?8A8SIYn5p8u`?x%eNqX!y&n9m1f&rK<(1i)sqP zRzKXP_2^0Uqqd#B2Y(f;b}5rs9ipDMV^!ndkIUaM@3qhVmwS|Jep*X{cd}^yGR=I^ zU=2Rja-rS*J07k5yzGgL*8LUxEJO64)KpP}Nn{zv;ah0ZY=7T@G-KZae~ zYZ&&rQBQ5h>V!vY1!F?D-WJWDcxc@^t*ti{bndb}f7-RakxL=?+phUDf6NxqU#E4q z8g#{RDd>8b{bibka-fcO#HyQ~T>cx6hW(1wsOG=g7$wkDr!^-uFoba%Yre>?c^0cH zR>y1%7mNw@QCM4Jl@MaLq{2mIEti%31-_pOP2CA0Z@a>#F}!b#X4|p!hQP(!qWL1* z3beZ`l2%8Qz3o~#!Eu%-Q3Pn-M3@aukS}=W4Im_hV4pPw~l44(vDSg zG7k27E)&t3yie<@p;wFZ#YE2EY0qF3*WZ2xp%-J!L@jnVvF zYbIH}GYp;6`JyUm)o!n)F(Gn0Liz42vXL*bPu>4G?E68lRW=5yw;Q{**%*eG9$I%` zo%&(X4Aa8!u)T(1=YFi-7%HjzbNj0HmicF_e;fQ=W7bttK1E6MIJ+(Xo9(~Wf;KrU z4Oc(B;>6Mo)sI%UX}t-(5xQ>2!abpjyLQas%-XSfUxlde1JClrk7bD)<^80?n$Pmb z-&5aq#{O~G(LjOoGPgDFl(Hw;B};|A;`*~e>s@uyYL*2*dN||ww01mN&1t$!>;8Gs zLWxzE48v9jZ)455zD+cT>(M&R*o|R(?U{W-uPBRV?JdwwS}wA^YwM||<)S%xhG8GW zHiie39%^U%AbMa`! zP2|BR_n-eropQ9YpoMSVkAUs33wc+!O}iTOgfTS9ZjQ**z*2?#Q|l5EmWD(>mvx#W zGF3afQz_1f;r65msjz(tk3vPJXOt`SFJ=no?f@J62tjShy-! zwD7>R14m3A-0t_Ergd4-Hgf;@zfp;ytC_Y3_@9~Fc2!V_^##Mv6s|?Ao@>hv ztUj>bhcmC`(b_3TW4&rNI`6Akx-5q4lGN9AS}n5#^Nxke?^b^#$Nu-n{*U|rh>6BI zSbzHls)~FK!^8J!y<5(-R{gkWRQzGCwW78Kt3F-1k+e2gv`|D&LNsZ=?&8(|8CGfk z_&X<)>vXm@*Cc`ZgYvtVaeF77v^p8d|1;M9LESmC6yGi?o6T->$p@!PIl zQx2`u?pn+3+orWA(K%$DX2v?L4YGTWY3<+_ytiYu&p}te!=iaxkA^JS;c-^xT@~X_ zd)3!nBCAc7Cn)*X-uTaOZ1sNz-mX=;yY#-?`Kof|?~kRm2HJf;R>#|bZdUnpG-{pJ z8_*Q6?7s@3>#_YYq5rS+*!1h2{II<9RsGd}F_$e*ZB#n8CmE)I@* z5Vq@K*sk2JT{{-uEew}>G@XZQle_7c%jJIi&LzGik(Isna{f*ZTy$uL)ff z3aW`kbNX(qb}bCseqimx(9_rJW~>rBUePRnTXo;(n2An%GaF+T?O0vP%(QFy)2_8y zHRnWQG^`$mz3$qzc%Rm;eG;qW*#15_{AWYm*BDi ztv;dUz8kdU5`t0-FF79gbNtBskK05;R$7Seb16F-r7~~Fst3FCTeba9i&*f4ZvOJ9 zy@>tT4xuFhr3{azdkf6vGIgzzd(gk>{u@7m)^C$%PFts`G*8d|l>C9eOHUexK8^$J z;|#Cam9+L@*hlX+tyf8H{~}hee%Q6rmvLIFuS)!;d-C?5qQ7knch+B}Q70Zdvxfi6 zzp$g>mye5aKrR<*EY?V(0wyjgU(8IPWXEx^i7@n(baeGwhOP4#6* zs%4LPU7OB5ooSNh&)yHW#Fw1g?a4o?lUftByS6Qw5gL-zddOsXRj zA3U&DI3{RopVqSXjxn0q4Jmn{qU;NoKkgEX(wCU(-d?x+q0?IS8m;>uj)whCTDMN? zZcWvrwf*_~Ma%7ui{{TY(020r^I`Q~uScuPK&zj&`-CoAAsz7NW4QP-tu5wln)%CE z$1V?TPmpKG9b(Dmy7jN z>mR4R|96~g^|4h8w74|h7xNH0N%Ux2bPqx_G?O2`g4p@2;QPwMg41 z^iC%zn^>&6WS|`a+6w9SBXqIjHjT(*b9oI`wS2Ok(4{qX@x*KMPwoG>O>4!P2F7m= zw_1Xk*8h$*KN@>%_oKC!MN2cgc0X;@TW~biC+MBs)uT~@mzNzD4d~oC+3=mle$aim zH&(4Y8fE?GW7x~aSjVm%{kugoctZDtUbR@AEE=g))wA)(toak}gHEaU?wllIWVt|M zb>PNQzP%FRheczMX5NlfhYG_rjz(K2giboNX|ZzM4TZlJxl!AaRWzdC3NZfc?bBN6 z6S{T-c#X-9iiEI@;o+kBqFHS_R$bs&xwghIl;h5tBW8zukN-OSFDw2>pGLTK(zL!G zq6asIURiNen=5d2Oz4#ZYro&-lI_|xW7W;YLMwy6$UXRGvFe1XZbh@+8 zdmX9t;nm@%fBrM*OgAZVaW*=$=aEhOtDip-maJkb0F9*;{k^feR3h|%Oz54=uC3c^ zxUOb5Mp?h@3T5g_Y8UKU>CNQn=UjN%2_13ZGuhYnyA$lNK)Js2I+;{s8`SgETrx})Ltle5}5%4%wxRm{AOs>ePjSBKy zja};mTcsHcRF7tM?Z~|@nz2K+&}&ieD(fdfZ$fXZPT>2oI$r;J*H%xpiAkQ4R+|MM zm@WIyaHf!}`%A=shTZc2ME)}z+aY>PlkJi3-YfNd7ONYkln4Ji0*ZsBcb5KVQ26`! z*Q3?mCk}&lV}QoNoZUP{YP;E$_6$FLN zJ{_mnNh!v|K$Bqe>URM_Se@Jf$cF_C$#-H=oUsE zk!e3IUn~F}_CC9CX}S9Po1k6SXDu!TT)%GYuc8JP~@GnRVyXEY+ zW7T9si`CPo7q*6qavoTHq+-=aQNJIn7Ig13Th%1>By^w2QN1L$2O$aJH6b^GpLcCx zzJ3HWG932hXF|AO*Y5tD&^y^*9<4BIe|6V>m;HzRpVR-ii|GB6SbFu)>bi*48^gnP ztOi}ImoPu0@$=D`h4?&|H<=n@zvaDx*96>n-L>Pg$PTWgb%)mJcCF3gJ)RSq zuhrH2F?8Ll{n_i=gS%FKoaF5FAwKu^zs#6`I|XY}K8mQXwDrH-wMr)Fn%1Mjuwz;m zC02(VjVTP<7qQw|WcPh0DRq%8Z&q{QuP+vBE8#UzR<7_q%dg@$|)Q@|?U~ z;cODCUR__O^=`)MnvG$d2iE4_7cI3;bYAHbx)y3guYCHS!My&^W3Qd* zZZ{0pH{SSrwpVMpOz4q{q_qj*No#pRE25rEc*OAXx~QX=x&MC#k%j*mniBsrNG<>4 zEgGiq?ZC9F=WF}4c5`j_3B7t??W47&M`L}sE=a6SNDP&zGt2aMyIFr#{&V1u4GZH% zc8eB(l&n~}Otes9;jXfyQELms`ZR-g*L$(ov)W(ga4uZY>-2-G_QvXzA4$_g9ylj8 zi|p87Yq0P(@9VC$`tQ58Nt9cJ-f7c%sBo04P|8>FBS$@xVQ5ykXbhXycBb76?u%@X z3E0_duO~P((1$0j>c&JOBRh` z->3BmbPB-ft%l*@qA|SwUyjBYhRgnXG*vTUrI6yI#|bs=pSEw)DDsYP-IjPIY4y&_ zqUBnT)~)Yj&9OMNj*soIX#VtVT35ZfN)D`LS+R_@T)@!lk%rmp*092L&(ppgY8TVW zxL>DrQ=MyzVc5%uUE8F&r0+BBNLt(6wf=8J=&JmEKUS}7jr9rGaPgnqf~2*ptZL_X zRLJdj)5ulhtLWRuzD{e`jMa^YKn>n)yafw)1&ij*SoJDtbsOl2l+N`rp;y*vl>2CH zowj44pGV;L#4leg0+zM;IbSl3`?J6C(5kiC8b7A|m3|mH(PI-=@5fNDq;;{|4y2w$+2O*FraHHYuV zsx{d$S}Pddc8N{!yuC~`!jo<8o*zA1krLU(QWJAX%Wm)K_3J6HG%yJEI;-fZKJ%CXm*-J`YtK9|(#F{IT|X`*c$!3OI*9+LD=bvq}8r`&qdZ)&zI5K^zp|Lr?1wvKNc1+aPb~E8gqv2 zIoC>$BX1V^pBK4wL}*f$$APJ(Pk+1Zh}iBEx-ag>>gJ@i*AI)93tty4T=2Rz?1~K6 z#%(sO*jbl1(EkrX^-rg6D52*bJO5nS8 ztlk%~+FfL;zf9;I_BPh+N3!Kd1J)OPt`XZ}+tdE0|7-o+{SONkhFvzzAnbxkYN43OVPI`zJl-E!H^q*nVe};}ns}Gp2(c`r zTC~9A!1SOUtKNhzGSCh^8of^I>W(L8)e}GP|G526`k(S7r`x+D-Zd?`s3qd_PvluxVZN`fjm$$Hezt>qI{sSS9Wo(D~<+!k^0eV>_I<7Pf|5 zN%Z;`Dr&ny>%vv*gwO*IyiN*Fzu2|Q(6LdwmrZMnJWuG6Nwy!u!?)K2Y`dTEqN-i} zMSlN3v!mgYyH-wR`1HOjobmoXtzC1E$8bH2pQm*p@$x>?9n$i$Yip39 zSIf1=+gF?q#m$+%|JUo^&b*7JEq&P2@$NWN8IRq;U-jvKrzUYp*EIZReErUU z7ydJ}9pznntJ$-$XTIG05B2F%UaL)d}NZY`G-`O5qG#y<(s{UPgb2eID=9kO`BSLDj0X(!n0cQdUMeciQ=w@XH9ubXI2 zeq*%7>V~5MQmrTKcLe|2`0Zc(w+II(L9v~xp-031S_C{*nYaAq(P+>Z)H@5&gXQ;` zLLClF+wo}aoX`W8MGFqB-g5D5T;3-s{;%N=-+;1rn>bS<7T{SSAY0(!cTcpa1sLTv1C4L)STRZDgo^5U%*lzKpx3 z?fwV%oPbr^E}4H?e!dvgwq3RSimRPk+Rxly8$&}{m40)vY39vX_3&+%Y*+L;)>1>~ z?FXiAQkHAa3C&tAyD{|iz8|4?985nRjqTcfTQox^^y;CtGNJxg*%P#CH->ejnW{A( zsE-NV+N1HKY@OEb=Z!ILT3g;;=h`h=a5TmcJif)lwQa}h=tpY{k48&BS|uFIlJ93~ z}NC2N2_S7y)pmz{`;d= zWA61gZQ2|E?N}YR)T|)kgZ{b{`id!SvMb(<`e>|$Su;R;Y(Q=>ARpk<^XE15p?ym_=U$pvLo%~l{d!F3b zk9}?X4gYF(tP8+N`HZ|m3q0@t_FS~Y& z=J50FSS1~>(xrR(N~Qh}l7|8DAD2Sj(2ARdzI*{l3Wd58qcF zp#QU`Kg=2T2gB_h8~!s zQLw%ybQfssI&a466;_Yh4)y(5n)WL5#=}r2o5E1;6+8`AQdaM5|1+GlyRquVjQxlH zGjR7UW?CiDxIn#zYlpi}XhmRajDx%mXzF^Qgy^on606;sb3*SFdY2sK6%2IVacEU4 zPpuXx6dkUFmP@SqC6%-`(dpr1@Gzuk4iD(M(nmH1t7|-ua=S!d`Fb>zVVOpxil@Sl z_S0M|Ehg!2s$5=B_4miB7w?iMT=bPFWnae{e_Aw#ehfXh5p?Lx)sLX- z(pPuqZUe6seDpif>AuhYTQ47WiGN(~qxCLg)p6I_6Zenr6OCeI>+-v2-4lA|%>K-} zsiuDn!>)xEJCuLFEuzKP6=j|O{h`x>1xLg7Ou50e@r9vtcE*zS32YO~*$?fLR1M>D z2VG@Q82X?mUoVqV{`(+l z9jB_*%3mD+EJAmASnJ=bU&dk{$#~c9k>QqYDtRvszx%gCH*?vP{+o%P<6pL2+I%JO z@t5Ymh9SC79_-2fE%WMFTT^q^qt=S|3b8HSpH>`Ny>GMd6?W%;ClW(n1+R6#P#F5k z@z##jHN0gCv3trwAvCzNV z8m;}vKy{UnW@FS7%`42UVY54~zqR6@%@eff*VI*CXBqxGTfdGq@>kaRzrR|3OZ{g! zQn<9})wd;Ay$!$hp8u2GtDV2bWm&h(@*8gMf4uuxm)A|0@wYp&{-#L$wHvG5o_*XF zAzFWJO8v1_H$v~^-_ANT{{!fB@}#x1v$y>&7x~W+W?=uwb;IgK8z>_ng*!v1GR&?%U&EwsIe0m1kJq`SGZ(;Nz|xGF+Eu$%w7y zE|(Cx@KIuQ*6sKAxx}v|tzO-=R)9`+?OJh4*Vedd=P}r0i8>dp_}T*ZMw%Zoeh(JYV@~#2yD77I9xEH1ELM%S_R? zMN2g=i{_YVz3K@)@*s4Q=YjB@H~58Hw3Y<^@(|wfs>Z+mIG6O%=(Ppf=^qcQ4Qm!z zBP91@b=HCRF`?z#KugLB?u$D4hV5y!W-b3!cjAyhXPWKDu*32^oDmtjzZ?zMW)qbV zy6boXv`ayHR?^xFkJi~{cdfPiA?hf@-6{NYV)Q$m9RVG>FnJKA%BN6W`?g=@y|ny~=DKrU z?`Mf0EZRIzY1QLZ+m0kT-P$g{Uuo)L(VRzX!$mW;T{#-wyiGIXN`5Q%P8qJd*tuIGoV?uX5T6cdP zXu)5UX+G$X$gp2rc4ysBJX+gvv%2}S#A?U+yRJXoXR^Abt7=xwx1*u#9ru}b%n9YM zEK`Wm`y@N1UihEKA*Q7@7T1<7dFT0la?*;~H6OhmyB+2I@-u0*{~_&|(1N@lt2^Fz z?FeQHWxFY|vqNIFL*I?nDM@REkK}i)jNM$78k}CG_2>4(qrn~zBN}?`PBpM!oEZ8Q zyf-Ilt$<-TW7k%%IiZJhH+s#GzO>gc?1grhjKea~^4OPMYeCZnj7MV+=Y+2JNm}=% zJtlM^$I+NXiKUs{x4ERgxStl;mdMN``;za*s)rKq8$%NMIz+xkt-t%>(dxfiZ+n*( zv^6L8E1Ew&~38 zz|h)%%KsUp9!;BcfPdQ=_tp&ihvokn+74!fdS^VoE5iKv%HQWq>#e2cwTs4H7tMa! z73%}KwrNMWXpWvnY-2Qd9qh&1bvKq~F8ujuwR`+Lt!KAI%e1cA6owmeXjLVxatpex zbp6iT*64?)%T2$%?GoqRl{7u6J!$QuwKAL;U5{4#9T&~#+BIYKc3H#laHcJVVVxGM zj@2nY`eU%_(0a8aAA)a`+P~SK{vzpkj|mKpOr zT(sb*-l0~r?M~TV@`Bq$GZwG-QKvuehG^!j=0_}b7OS2rwuTpWty5tP-XQxiRAFuD zrPZA8FKqvFY5s?^?UMw(7P^WsFf5P|J${^P*Y1!OE}CIr-Q2bP zeQVf^Dev607MA^+)TeXj#zhCy`+q0oZfMcpwmrJ^0k40U`byi|jApBLCr$ep&ZAK% z`_Vfg7_>9O)jcO*d*Sw&(4)HreL@TT9`Dm?6Lz~KmKL|iVa3Zk{~0z}YJ~&^wjchH zv~Kdl*n^TnQ>;Fz&1OBZRDkj0NyP$&uo@sp zpUJ#aW?!Ujejn63=UTP#!+oW-q8|^fZD0e9ovrNJ!3Y{)yJ{HL1**!N?)q)}wAes> z)>Ovwds|O3X2j{O-qGj(BmU=VR_(govU|;bU;meN(Cg;RT^;`!9=5UU@cGa1e&d(z z-x8hP2mWW6!oOtxkLyh9o_)F9|F|{eMA<9%yIt#8kJs-=S}SyXwftexsO&r2?-hnl zJhI{BNmk1@_nvP&oYl3|Ky_o+mPK>Rk4CGDmY?U6ecQFg?Z@iv2c~r%Se42xBQkY! zv@yfQSst_3pa1Fq>xP5V8l%oD9=pR=yyJMa{ORPRRpO%MQb}t|4yG*F0 zt;1Q{pxqj-cVpF~Lg(0xVJ`!_L{4A0kXOT|^)$?S+u_3^TU7-2GHcv^|NCRuUUmNs zm5n#P{%2@98tv(5c)@vxz_RUiI{gusq|=FNb=vNbtRb7ynlJ0 zXlMv?-H(Nv9Dfvs3chmlS9`LLCBJLiWbNGhtjnfmeotyIWY4=1da%%WrgP4r#rL^Z za#;Lr3V*uePr<7H4EOoj{_uY}8s=G~7`178RLKgt-$^Ylj2_RH7}_2a(PnIo1{I`h zFC>KRlnJdUyu3^_$BebW^fjm{5&dh!!i_N+rG8pB)VbEJ6R}{*l74Y$?WcRqOglRQ zV?uqsg{pfv3mS^n7q*5Q#@{;B*6P1aL_g5KCiINcJJ12sQR`Ua*fe90GexBy4HI3a z5xxI3*N%A#?rDTby1D|AC$S){+c8EIR1xV*S2i|^-4XV z=hFpWH0{^Xdb+72_xRTb;nE&^IDSR{dbHYiNy4S}f1LZ*X~cfj_|I_aKSOi=>$Xep zSGd&A|L11^=W6e&`xiHs%KT?|k_@^5{kU((+wlJk6Z`)&m?nhoUzGIzJXl$mRIV1^ zl=`0%{~11qnN2&^pW}Wr|A+a1hFKf5|kbyuiTaXE|K;3e|>aX zaPiH5hWmp584mP>21G>bofb)c()=rF^|X5?FIL$(BzUcQqhaXv_D|W-FwiM9ja_Tw zmL#n{Ct`Y9G^!l5Z1$01*h-(!O`2U>V?w!=rPG%SzufuCimCqD8m$ht#kWPa$K6=n z`Mxo1a@W?zsH0(*<{EnYXm>?{#@3q~^_CiF9b@@oA+$xmPiyPqWe<{8Yagy%`JiCc zSDo9dw%UIC&(N8)dat^Akw|s^ua}^nW$V3JCHCUKZvT@{7tP9;6d?M$L^;X!%A-|E zY3&bpn2Ii#yuki7=tPu5W?C!!b2uY>3$!k2H|mMX8ipONcC)|x zu8PF1MV7W@7Pqz)M6F#~7}m=k6S~RlXxOT6N28Z%U6(33)b`3MX{{7<*S0mDFMWa* zTz7K{y2F;ZG5MSOpDXvDtkc@1ZLs`GQe6Bq`<3o**0F}IHM35dcI?J#_ngp$UEAD~ zyTW+_uAdhzWzPxN&b75`cTOnZXK}k(IqYE{zR5pL2tDW^BF)&f-NApKXzY%oysZ|i z69n&zM!l-Z?AjSF8e{u0+|=rUchZz~T5Y>_2(I;eQo_8_P9pT$1(B!|*~)oW{xfv+ zrydRM;`<@GEWRc*@3F|P9YPlq3d5$aH4OcFl-uve(gP2|PQ3I9P4Rx^7xAU1{;>I% z_#g8GTC3i-hFzOmpxt&uv>+$w;?by=T{|?`4>RqU_2p=ccGvbRNh`wQ!b`0S+rMuA zbGv zb$&V-p6kzxhGYout@{(2e|53#230SQFipWL0UI^yCIPp`>mUV19Rws*Q z%zMnVE%ORb=&Ctdcl}t)bwU>uhP{l@bdI|{Q)uIVhKd%WKga)Ey)5mt#(2%e&g9=Z z2CC(8Gej2{h8MlF8qV^V&>NzQ4kU!_3}2>oH@ho(g?u)bcysJA&|R#H{8$5~F>y|l zo%2<8_Am3F5vv3JRMwg)udsE~3}qG#-?YVhTE_jKlC3rlD-JOWWpcjU@ba?K$)dKk z(aW@U=Y-y=F$_;ydnIX|vS_q}q1UCB1gDb^JRA75+?}kN|9Pi0E(tn1ExW$;KSR|# zg&OB)_St{?Y_1B6oYr_M`NT*w&P{7;o7MvZtp$gsZ45hbUo?(Qqfq2%)bc*9yETR0 z6#`fNw61FJJR0ViH%V&4%8%0WKNQ=p<}Wv?UR^B5d;K3r{aK4u@7HS0^5T;J)OPdXZIHjT>GzhWBm^`}NRyW!LWB z0@XVXN270x<~56EcYwCJywSQ^V;FYuwrJsj)wQOty=t}{jS1=Naev&k^laLn)1P?! zi??}Q*mB#}T)s>?)R^J#s=w+Y<}z8c*Vlwre82H%?Zg1bqajBW7 zGv0?YUo`rt+v9awZ$fV;hHl^wdtEm{xBjNt>HiFzogqj49K(~=8s6J-G`4F^a@RVg z9jh*17tQ#Q=yk#TXpGxq5sM!@TyH{;=V(3Lu}%Y+`T+p)T0 z_3UL@8^ok*Zv?Dh(*zw#6I{c!&~9OVUd5R|_SabW_svw`bloodck|!QfIl-56xOaT zVtJE2(Yqq_>Y;V(STo*stvtEypTw$%A4~3Yt+YL*`G{ZbL+tr)iAyw2ntWwZ72fwX z|A+kMu2shm9yc-lZd<>ZX;sOAX`M%7W3(Ps%LKd$y}ItWXufF1+s3e2 z=pC`T^Jt8J@dk;79@FYKXxR9FkO&P_=KgH!$FlthPiUsdfpu#O!~b7UUX~g2Y~{Yk zqL~}R8CzqWtdiE6O0T=IIwd?O)G5SO=6>Rj`BM!RuFzGj?|X5*s^yK1<$ng_#E|qD zuE*Q7E{Yxvo8We1>B6qvIb0VdRySI#x|S~!nqlv!b?X@8ioX>BD}1dUtx~$TE;Y$} zqHiyQ{OPXsf)jto*Zo*sBU8rv<+5m$Un={Mvbe@P7W_jGDme#mT@*0S7W>ksielCy4Xcf8R*QTfM%t@*F+ z9^UXP`#*yayJ+moy=Jw45Bw838s?-|{L%H@X}#L;YJZ{p&92?E z>oxz_uhY8f@ORqp&ZE&^r|+$M+_lo>P-IH!3yTH6SpENai-sLoC-Syy$HTB=TK9c4 zvKk((d)ydPuzK&tu$Ns6^TWSydwcy+;&;$KsO8&S^_FQp_R)Ii+_gQ1>rLownb4~r zj>bB7$ry%CI-=sVczyo-9L0cB*At!H7B+s&zdGqA#|`g7xdlIVUuFu`4&KJHYsTv6 z{&^a4%a3zyKOz%)%&O$T>WT|V(^-$k9^0{yUDIsRujRj2dhq`9t~*`7`M0Hta)SbR zwNIiU=zPfKeOfn`=V;^zf-YG0`_FJ(G(U&4?8d4o8#--gl-Nlu^s-!4t7$fYZ=Ujz zq*Yg!-B`NOsr)GKg+$O2)rP91=|OV~!#deTbCTM5H>~c{x@uz>Hls)+_ju#ckh!xI zPh4FrTjT!qXsA-@L}$enOC1lboeNo*mB0Qp*ER#ieRB&|9h;)LV5Q2pqtP61+?5zU zNUZuAV8)!-7|kI3r!ZXW(dw2u*$oRfE$EUxCK{Bn!j9QL`LbyC%=j&u?{AA1*#3I7 z_S2!YZHLp0)wQugm(1n~9tH5KT4+<9U%DpZcwQ%M24@bij!x_88o4a;wH9NFc z*F7e*Kp|<}O7>-1mlcyYE_mOy^2$oJxqPAp1;5w*&<$^HySgu8t?8$u;mnV_)_XFV zylf2B5?^PwI`XxH`N7PkYnt}#eze+Sorumd(V)lY9^VZ9sLmzGoV#J+sz<9|Sv?Hb zWakP`2T^0>c_HMlEKi(ORo<86^07o_HN?bz}CsCIVj?(#z`ilrU*IBcp{FZ{RgKSQtd z-#*QFp4CR5owx4~{46Q7dV}`rt{tsVy_A2;e=KFk#3YxQV# zWx2$v`vLMBcYb^M{bA@bqq>W~*zWhoXaxV-5EP|$88# zd;MSTe}>dXt@*1(qc1Z>%Zmqg?Fiqv{ydj#RO#!kZNb~LwoNfPwD#Yc&>O4WmWyV9 z?(<5yyv9C%}zu(94pJ9UR`Co7UGf1t|aMfyI&{!bN06Gb)(7W!& z(gj;ycI{eHdSLbL-$~OBu49c3;5Br1+p#)ynbt)+i_oiwTG@&Zwct z8Ve*uHyuct+Mc}eXlTffM{QkVTBkDo_WftD(THI@8ZNj^>w>7o>XK#8nWB;(UKR~j zo39h+LssC+wp^tFJ6ShaSQk&ETuZ9ir|EC0{X`r9I4M`PF8WuUvzgzgq-haQb74C`Z! zJ-$!tP3T?25UUC4#dnnYkM?PVau|AjSdho2S?)SUh2 z^q>3c&$g^^nbo&LXzPr5Gei%1zAE&3+LHu2K)msL(z;akaz zttfj<=wi^M(KXgm!_WmGZ@X4{=W#w;vid)R(br$~v;R)>y1IVNp7{G*{m%op|5p7w zhc%Gvwfd1I0@XcTp;aXZ*0z2;v~HQ!13sj-7YaWuEz`3PX(|eI*2JJS-O0 z_^iF~z-z(E6H6C&ZS~Q*YGbf^UZBwQ+NQ4gi$(M=JxtmD>_5XjFYo!w-}Emm)a3YJ zr1gHD*2UYP!}JPP-TSe$wEQTqaMxPt#Lxv_Ekv{D?-wna_nc{)pJ>LcM{9dRE0p(X zZ5P?iw8b#IHKLUo?BUPr!rnqtOf{ht_^Ms@*8E^1y1IkIdhuzdy9v_fXl&pUjQXUp;?o`JZcM zik4gWhW&E;Ww%|8b}v0twf>Z+hJb>f|g?;RZfGX(c(?TK`an!@s9?tg|y5xSYN z0erK0f}V-Kyw0?8;lf9SUJJ8w3Y{Kkw?;2`*|odZFzm;pb&vgKEKEt<{`^bQ)UzAb ziCC=f)4Fk=DRvucd2rW`_Zwe!EqHe6?bC#_Qu4BGa!PHNeYQLQ-m2x^s4T7RwVE-E z_v{O+wPp5pKW?p-3A&njnQ7%|EB6n(8EUNN{}B9`>=Bsxq<+H`IsNT_wEi=k-4V1k z_cZ^#jagr1+5d2W&V_Z_(4(*V?0>$~sm z<_BG?9Nw|o>G;Gy>=zruAFUPa3cJ2d>uUCOrX3YY>;GR=mRwdG+ZDC6Fsy@FwBXRX zpO03{`LTEP`BmwEv_IV?ewbDI%7jn#2kKWD+*);Mrf5{eUx}r;ep)+(yS8Mvg3bht z`yskG@Um!>=i9EeBA}}pxVCwSu6MjHVz$En$lYpw9<4oktoa>>)&{>j%A2%yKJ$*F zVKb6HEI*xpwQI+rs@3ub{_W9>NS^$&@n`?r1FNMc{av_y%%H@?eJ-?W%7L~0HKB*OcI{ZW_rvOn)t$?3s`9-`c0%hP2X?K`=?VjFjxh{flijtAwJ!5Wf+suwe zS@%Eg+I~XVd7o(1XSe1@3G6$MhE+|y>u7p3)|0>Kfp?Nn-DR0j{^}(4fMgq$*sEbiY%7DkfC&I%w;8PSQH-q-m$VA6U!s@hI=5xdyAdK<$=gpBKH2n$Os) zHFM&PkD<%Yi^eIg`0?E$wED>M!VmL~B&{f~R7yM(>R))7OLTQtw1mLT+r_P6zn1Rb zEh^up^)NU1dG-Y8XmMm^y*vCwxDIP~VB3 zD}MNI6OB4}y{hPE>Cv#&(`>@CO4n(Gg>rDp))Xu(dn_7bc4+O_qp_brHQLLr9l2fW zEEcZa^=R$G(8ISy^p=5Eobc!E2)Mz%-Y0Zb@H(yQs~8Wgl~`Q+qw9B0-N&x2FO2>( zl)bU57XYnmieY*DQ~G`Ie+KEqu)k&T+j{Kc1^zR%9*vHkapTRQeeC(yTe+6kgr3s8 zFA`j{;nvoe(9JQqG3#U7M1sC9_&G--f4$$1)eT3ZCjR*SFl@?n=_}Pq>sAE0`e`lu zaCMbc(p0A{FRzPchV;IU2`#*z6R;^V%C14MQETIc29JeDd1st>QJ`9-z#YxRsYDG}Gj0c+%Q{=AG-eY33((?G}yE{GPPB)-ks4hv=ri z?Kz=aZ$Ix^GpV4hZHKPzXIss#HN`uYY3*xyw3ux*MedqdDkGpmp^1oG77tis>92Dq$5sPCF^~I?df1i`9{d3}{ z18b)p4GZ}3Xtn22ZO#Kzmt1FBo7ku)u{z{U!D?6kfWlDqrnP75IIZU$|C|2|G*-FJ z)3?@=T^w{APdL-64F{$(HtMaE2;KF5pVqA&uB|r%LS`kcs=2$3IbZm%)dR1mEu~4( z&oBRD7mcYY3|(@0nbtDT_g!n%xkUcjscoERcX$7TLZ`=u^7pu^ze+3(;Cg4E^@>O9 z5wB)zl+s*2jVSH=qIpwaHtHs=E4^LpcwaO?*kreZo&58>`ET6c)*mSh^;qc9Tb^zk z@zrA0iu*O8yFj71uxoqQ?)5RDix}>d9+ILSaerQBlas_=ChQEpn-<9-AzK5_QL z`Wx?R>f-J{O5)SuLXDJ1g%&!*ZgRx)2yVn4vWxSPZhy0k6Ldh zt-X9-WKEicDA#|6mqu0EoAhtne_Z}sN2^;Us5!wpX|-W^{^Jm~dj2!)P1*kD*xG-q-v4Ldxf9M2lDN|JeJgLF#p)P8tu0*- zyjS{wy8kP(8>3eq)jP_^wqw=P+cjKEIo3?tzN>#{{j)b(dxCbXdR6;l>5+QI9%n6}!mqkKqnS7lqq;HFt)+ zZq(lXszBRi)^*VsU)zsiXR98qm7Duvb;6@{*6+L4hN&%@vP|oyoW-iv>jzj)?{?pR zrta2%h64{m9JAi-UiqS?Fsy_3x@ak%*2O2*;iB2oJB~&_u_^Qp`Bms#}0nx9s1S$3Fw_>wmT;G~(@b&@mO^hegZx zX}!9>j5UX==3}_vebG|G@Y36&QH5bAmT5iMvD(dkvB-+8Gg$VxESB5yqW)Ukk5x~1 zXKdRcB7bK0`mZq}E2b12o;0gJC$tW9Uvb#VR=#K2jysP=Gw%cq?On>hE*f$)MqD)N zGV2eA)k&*ujqVG-f7=*p@wRJQ_&%-2j@Lz_H_F{un!bqr#*ey))%APg78rcH@n~&l z_`)A`6$=A1suDu4+!xK8A-cg}>EicYTimpE@Pyv`vGB^#SpVIk*`j5drPg0SGYnS^ zojc!lZSM-3&t&M_Ao~5N_R6j;>@}hLELJBqGp#jjd&T&(Cp2+e|E9}Nw`py;wcKms zm;VegLCd~X=Nx}0vFc#P;cuX-`A{qOU90F;L8gVAtlLc$q%P#Phy*1?d<(J*IWX<7 zSDvH18*9dyx!-;^cWr%rtUjam$LgN0yBzj@T2GJ092d=)pWLr0Rj;_-cI^mxw2tBXZKk!E zf#zj_pA{0lB3HaBPHz#{3^$55o&*bcqFiV)?hZYlp-0 zHN9V0pNo_Mdl>7aD2woNleY`#ut_VKv6ph1eRZQ}2aM*jpIXMJeh z(b%_LD>fz_Yi3$!)38$1VztYKKOeL{`h?~kuHh_Kyv?*jCUisghNB@*c6BKqJ%9Ai zUjIK_eC1pP@Bs`yY2+?fCHWd+F*o>jZz)#DDm)YDvM8Xg8+o zhjTbVwSgPZu%URAl3!xQCBr-P5k< z^);az%GPO=>xAC73C;ZY!eC)S{nPuRQK{+=<9qk8JO11Fwl!wj(pEK__D}tr|3*tY zDQ5+g9GD)Sm9*L`!P{*?e%D$NwYeX|e&_BJjp{vJ!0}C4#Qy&!m8Iopjpw`qo$dKX z>s8V!o6~;`^Vq}QeyKM++O;I0Wv$iZowok_G((qZJupzsl-(HCu}o|Ggrl*i_h~&S zSiM0z`q5gM&_!EsB!&wxtamVU4wMgmY`Q!YG%$2%)si9+wHd1?6pE}Z414{sONw1I z_C(UOe?6dUv*dfseK&@lc_Q2PW9i!aw?)gjxOhUnN^Yo@=kDwKu`p|_hHOAf6H*9%fp zUaMi3o}&@7LOEdWlz;^9)r~Q{Wk;hAt>f<6#wJ=?zD%RkZcb>1sC1W1=pFZ*(2ZRy zrUi@Ubp7R{Ra6BJOFgK7P4$NY;d^2ccIbR!4~5nZ8eJX(3Or zzL>04@QRr(YMm!B1e zF5?d_&vQPIV;CCR8=T6Jv^q7lqez)+rF%(V2IK24L8kV7T94d)0@^2Xh_<}HBR3=T zMC`WZawTEQ24{5LB9Q|?-us{Kvo`n`5hr=?F18*+4g?A;mOTmL8`VC~nF z!sTs_@3!Rs==;y`VaMw1dil48@}|mPdqP9i+<)sxKXKCtS^3gO>xP|0=%V8bUU!MF zX2>d7^)7jvXmS2^(X1T{*MM^5#>ViFB+w?O#*YW4b%%>a_mlt=1 z2ZL_JTQ!F>M=GhU(e(Z@tp}^h7aWZ$S;}GZHzE|2PTktq{aBj8Al18fW9X(YD~^UU zZ_~QVrV$0YXys`1O6$_2x+O=Wk{@4Y3V2`3B_%HU&Gc`?>eff|H?6y`s{Bv=xQL1R z)O}}4{)4Vn%sel$rs7#~&?(!d{|sUlt6n_#m}c*5|H$NMXqX7w9@pCM_I+Bbq_^jU zUOmbi!V`2|_eDX}_P8HQGqaM`emWYpPHWQ^dz;X!_HJ4ik81m|W-nve(E~b=;<#wx zheNGP5<<;;tS)Ys5L*7q#`)3e<)8Vt*k6<1`ft;tsUZokPjYBg$=whwSf?3itZ2{i z#J&CN%dYjRx7Q!C-TtRAyny@i`u_U;qM6%F<^41Z3qdC`u1)OPVi+#Pw`1XL-i=|? zb3*f%G1}A#)mYWu2;Ha{zr}9iztW@OtBdaKPHO91cxY|&!>*m%?|eHjRdQXZS$yXo z_CGoIH+QX#sCABfais42oBp4x|4!3zEnKIWvBElOUHao&J61QYSnmT`A{Q)Lcr;4x z$LfvYT;)f@HZD87OtYYXeV^7lhxhR_k8=66B|nsZR9AOn)haHolB3agz8q?82wtaI z*kfMY7!{phX0bH9slm{>4RqSX37OE`?5?%R+qBwd&InBYos+TubNI=^P>&>m6|TSh zJKq&j{;*#OoIP?5Xk)My&uDYC*Rj_bZ(z?enoEdMsw(Nei z%IsiT+KjH|P4hpw-T!d*^1xSx@x({lIJHjJD-sACHEz>^m+Ro%N@s=fHY(Yk3Ay_g5#i zeyVEUxW0|GBxw2yTgPRrG3TXfw=F-PqY<+-BGf~9qlD0Xsf6$Z?;Y1gGy6a%tj!cX zD!uS%*pft6k(!O67QCX1|Ai-h|C9VrwQKvaxdvJf-*-i?yCJ#?bi^!A=puffP*C+{ z75Vze{Aze}A9f_r}n*9QN7u^R#aC@NY5ZBlkz|9X}qelapAzFav#Z2p8H^yifhOK_swdU6DN2~h|i|oknTDQDU>lNRW+e|Avs@FPx zJIcFbh9*bI_N=$RHhP_|?lc$YJkZx7=kVA5bC{5*xU58IMqQ+6x%__7oE1l-9u$VX z^xLs|g<*K`VbG~QS3s@LH=$>@X>E0U-?fgrYy0P;QHR!9tlqmp8+2;%(deULU+;^8 zZg5^?7`9>Ip}7UBS3y^)Y;n`te3_@5IX@>fV|&lP6TdfxZj4&K#@CGd^7GzRi*K(_ z^k4Eg>q4*J)vO;y_SZ%91Q@qQ)Nir~&A)oI?sE9^Mm>Y@Z?oUaUuN2(d*bi*KlaNs zi;p?zp56bj{@I++9Mh^l?(gJ3`)RE_@a0+E)Bg;!3Z1U`i|6kI$u8)rvRrDx!!u(4cb12VeO5e z!udk!ffZ$YI{s)>&S$y*HMgJZ_D-KGkGh)wEDrw9z_kB!oXNUh+Z8=yXHAU)Cpx6#gby%FcFJg7d{CQf}wH~eg-4lAeCNx>@ zhS2tvN29;I-lw&B;nCS{!?f(oyhgM9!T*HyEv|zRS zv8hL6L`siFbFlqb-Stgk>0Pt8T|2IemOU3Ov;gg6S*F$YAkA*!Z}m5S_HP%Bn>cla z%7bvD31+Xm)~pU&8xyov`Ue+Jz@Dy$VF#Ci4h3|t0S(ezVXg_?6YBP8&560);V{<*#{sq4xXoSBKWxyjuQf#eu0! z4-8kl>=K<^cSRyJxVB;X+7Sib%EvU(eR{o7OO*+ zY3&IYEyyZ88WSP7;l60_FNn;k1PAnz#Ve@@s;)GMP0-9=N;z~vuUWF z&)6Crm%i1mVs)38iOQq3zY=o0)_xJ25vt$z@#2ar%C&7?Q)NX@opAc7@F4WMpw8)o zeXPzmZb+A@OuG8I=uZxx%EG#t)U8^8nY7y#VIcY)J z(eUOY!TYpsSgblMwe3m%+t%nG)0c7_<^6T#w{!oiqoIuK1qE8K9<7zpy1ue&9ot^R z@Pdy=!xi5cIz4RV?LRCUAEUK>`rWQ=ep=h77J8Q+XgypLx}h-i2$NNyoD*Sgg-ema*4=ot zZmm^fSm*bnQMz$6RyVHGy2+AP7|OZSRbE)*=LU(@p0%7e4AlRCW_2tA_P^GuJ7xKw zAql((D04~iCF6f58$jzdSIrbQ|D^F@W&VR5LKnK6H%^+b%KT3yUNryJfp_Pg|D9_8 zNT$#`KBRj+tG!|Tk7-&vmfD>azmX8ywfpP+`%K{>-|mYRCO1Ysansrvf17LFQ=fqA zD{KnGx-ZmNKiC@O>sz2&^tLtp(vH<3>Y`D;hF-U>yzkob_RFKSLUj?Vo!9*ky}ItO zXilBQ(kttJtnTmAx*YIlW2ok7)+c*+JqTU(b>Y(NuJ9s;OS}JBtm>IC>CPg%nQQ$E z>Tgv1XPDZxF2lKY6L?JX%>(a}<)=ksV?wh}2!uSEYOF1!v4p>d>#p|aqkJo63qx-# z%??R$b{E+-V|B@)wRLL(u4!GD`^(>PXsu=HLgfh`W$WIAZrSPfn|-2ed;AX>jr>cM zcJ~kMV_tvh{%1d}Jx*Or4Hl2qb~M=Y-B|Tt%ZtMBQj?>4_qS<8z2I2xUlX*m?7%v^ z8>{52GtTE*Wrt<{cmwGgHN$@(Y3+(%}Zc40nm=n68VAVCzh4MKi|7NU`<8^*5e^=2& zB`a$>Mj(Po99i3Cn~0FE?FUv2oEC3DL!GyS82yEz`PduypY@ z)>6Z;-H%oU9XbBE=aS>)`+p|4hPxa*>abYvh}?pQp^lBQK3rFA48x6CUpGea`d2*+ zdzIO>HR|_+uoLUFcJOFDy)7F5>1a6PHqqc|cMPBH=l=2IKf~HCk-+nMd=}du)L*q& zwNhf~f&8wmTMNTF4y;>RpdE5FdYMMX!|kaK4QG`zH7DC z<=diB7uamtjvq;y+9Sz+#FAeSbibfx_;0p-7ONg^Jg{~%gI1ZuD%s_gb`q}apJlXG z%I@&*+^6=gFtl(RYu?sF>wc9Tn6|P@rlv5g;r)HC9n1B0th(>Q^{)Kw!$#2Q6Um}6 zhF*`fw`pXC^l)Y_2+DH%r@T(<;VZu0z<*)?89tZ)F=Gu8nkp|P%ueMI-} zLOULge`hj7EyP5n`$2b9T1oYUF4|wFb)9#k_sXuduR&Anc~35j#(IIy6t$XqXnL?{ z_B!x=b)XTa`!=C#Lf2pI+BJ7$SfAFS@0!vDSvf* z{b&K&D=QPaN`9JVlv#4ux&y1d{z|Mm@zCqjBgUURq0zTN7n{7Z2t6Rf^=QZH_I<}e zTN!*8m!&GMSn$rKFf=ua%W&n<==5HB6um22YQlS9`TCXY+Lwm|s{xS?V$%&p?_TgxFaDEQxq|)1u z)|THE+2Y2sTQs2h#A1_lnLSqXe~8}aRm{J3^FPDx-u~Tz?tiZTXW;HtT_l5mxu#*~e+HdT{~2c2KP-q^HSu`jWoETwKST>80`6%&e%u&)T{LgT z()`$u;fy|^8w|r{go~I)l^%^&&Iw)hFuXcxoo)Hcu9c^`?A~tXYso3lYRpU&P5ml< zwCb`{C!%Fw7a%+9tc|U=VR!B3rTG|!q9TipH;<{O_myhv)w? z{xfu@?9|ekU}hm&r?sWIOSUUYy5?he{`GBIcdHY^!?|L;9<{9~3~O=pb&r<`E$0b! zDvIftzW>%Y`OoDy53O1d5KwYpZ3$>S$d3NyqUE`LTCX;|+^11)yJ2-RPv}_<9rvh7qCvll!+(a&um2qpu)C>VjieQ=3?&w;-fj##G`W>~ zhYZ)2p3t=$y&KlCW^6SKd%aETQDJDK!=(M^G{5xC2#vlZdrTu|!H1)Q*+bd&fnr_I_C1&Dgaj)4gLItCOcX}xCf;Y-8l$y!<&HOHM?)^%6;8SRylZ{N$rru`TC-go z*S|ir>SGs|j7F^AkA=H_JPcdiwbi*bhLLUW2JL*IlUG8%*?tV2GRgM%vHksj?slzn z>2FK^R&d+_Bp ztzBD=@;&WZaaxl{w7mH8?}CM48b^{Eu6$SDc{KWHl*H=l-eX!1{A;xCmane~cy*m? z*K*NP{~E2Ug<(H0i_vp8u&A(dY_+>U|*P3)v>!HZ{`}NiR54%G2^_On* z4>`iYzB&ItgWw_7g*oQslP>(?max6~pP@nYXrRI!`7I~-H%XE?IDYh6e$M@RtYhxj)~ zxlg3Z`kxk!O40V}dgxuZ!qzaXlbtE-(>krU$F$y_`yuqmFtnxi$7*+`UG3|%Zi*gQ zTY5A`%gokbbx^xfS7E5dL6*<Mh31r{q z+T!c$ez|Mg8tJ?rqLneBnE~YorcN?nzIy`uz8kA1&e?u*t&PX>*GIK?PQ3o%XzU5_ z4Q(C2L;gzhgl>(q=HV>3ofEo$n%1>@600Lt_wUoX?z=(TB_Xus{q>xnOMC4EvI;{F zuHJYwdimYPu!*fPHPuP$)@hV!ZSoW|3^zHndaCSqd#>N5|C+g0En39iQ1ka+#p-m? z{AC*1pyPPLS&v5FNet`G-=}r|w8&N;u1AJpeK!`~H9NFgZDz8}oC_sC=jY3W@*Z7h zKBcgKQ^kLVWBxxE|5Kf)8NTd?=;04XwflWS7if2Fb7lJx@PJS2B0JaaX{_abJ61jP z(Yk0Mx+-{`W~8zflP3f3Njqjyrvq)};(8j3e{Z$T{P!pS(`d@aC!&Y}~kLL-^albNQ|C{B9?CQ7GKaSA|vsmi4#rliI zs^yA4T(8QH#$JDMG^RjxP3YeC^P;7h+eAzpG!K6Z+FsKZRSSpjul6v-}-QE=n35ux`9FN$Ewx~ijPa* zdCgxE{?Ftn_o2(nL{{#YV70?E^wmCl8?8%=H?H^3;abNiA)2rELv+J~@ApO4-S~1e zYT1p|AxERRV?x)>SiSPLXaJYul>VF3>%YZ+uK2P4+R;$i?T>5>Lk~3sB!n}AmNS4Z zl&b)ZqEvd)j`Kp z;&ikOLoCC)*GAe@_rLC1Cz5y~j~}!GpEJsjwK&J@XjqfmW2T)EbNgeocDIQZ9u3#Y zxp!DJB*N+Uqt(ZLEZo?&d!1%^Oz6hOFi)GaTgG zu`vJY=~+8h*D;H%UKDsULBNl$=Kl=btx-&&zm3dKHYEOMFs(nF zwD#Ah^|xH}zk0I2%X9uG&8l4=-8VJiq-bR1d>+OL!iI_yp+bk(DE7OR~_vv!0gFU)=I!?maO z$LfmJAxEQ>MN74}X>FaMp;yJ=c{FN!e@}L7r}Up+b3%hV53DVG+Zq$LWA%;;kJbhx zIF}sNlUVHnnnc{#xb8oLo7TSeeOm9-xpuc{ZCQC}wO4ozXWXL2OtM~&R(V`iNeqoj zTFW(eW7vzr@WKP@mWgH_HUDrl`a7tVQE#L5hUXJk4K{Hk-i)<@&ZVt`~dc=4q zsa12r4pv{;^5FM>?PrUuYYW!;w3Op!6)HxwK{sCEA%Uqoh)h!ZmkViZmbb9vh6vc%L5M0-554aHPFE@?1V*Vrb( z|6H^G1gORMQ_C>a?NIY!rtnKUL|0t~PmS5@U0GZGXzj$uUAyLfSasR&htR7>YkN0_ z^MscBZVa8|r5tqjLSm>!K-cEK%kKQHu9XlCkb`V(t}Qzn{koO620U`OW95gVAtyA- z@5pG~m?9JOROOw4*1M3`T_OpkHgmov)jj;sf3-Dqm0{Q`&fB8puaAa{Nv!UaSh&DV z>)zds;Yrh0*;R<%o_8bQqQuhswi`n&G+(aYAhEDCbDw6x(P-}8g+X?^bGueeJIa;6 z@5icxT~Xk5Gc_J>yFjO44jWbKEDiCg|5H8Mz&y<@(88yB5sn;ks~to7SV6 z`Z&?3)VP-BE-}d(k@<_cRxv&QmigIY^^TKo>>^gTxO`2ji%wc6pzzyizfHgj0ludB zI-!fZ7IOXdT($p>`5(>y46~v|T^6c@d_5Yhe0xnD(qktq0z3)4Fk=YfE9+ z$MB@-TuJRo>(=LhP5=p-B=CIFA3ZbPzcq!St4;km-NpX!|5`2@rZi*KtWaS%c2<*?37!h68wEam&V!s zSoO|MVs%2&>Nbto_g!0}X7lY>z1nxf!VT^|p#f6wyVg`p-LCxdMZvenD+BM{&3jC#a+qnl%t*Ozc*Yf{bho#`-JW@m44{F80rO443n?moM;i7pv z7OraCrnPDJqqPl&-W}_-p341L^{_EUq9=62@wEl3jwhAf7tIm-cw01oa#+KowO4*T zbau`OUF4^kEux$C?a(@w-i=-lySDLZ1nup=)_S2-;qvp2u(xVo7lplZV1H()5t{bM zAS!0}S5U_!oXIe(^C<79@3%z@vl6|onI2e`7$Vi!6|F8>>Zf%zbDP$~#%Q$}tKCJj zlecMIwO*(7@ME5V)&s+^Z?*-i?w->uln~ue7%tqkJ%%&t%F!r>q;-#K>Ulyl*}2v} z4h}MOn!M{mt7(4je}*v47?muB)&4X8F*B{PIr(G8e};{>|KXgeAmakV@^`|*9z z{Arp|<>tC>{|u`|^QIhX`xw@EH2TomOFKk!HOzh)dMA8;-?g<%HY#aF z<-5IRUnW+bDSsRlP;b2b&H6vaiJ``cXIm~=8uhlCG2aYl3NM&x75J}OhU?-^=JcTb z{f`W^78%rUa6dPt2c)2c;6bsC|l_5w!e%uV^Z1CfH|&@ ze;jD9|1_iiSZ8a$Nwi#qr0z>l>tedz4AJ8`oP`prL)QCnJ>DmpHDk5=anXVU(@T$r zdHoUDAga9Jqxv!tts_k;A+P<9{JZ%3!|G(wLOBc3g&#mye||Ztr!1PW^1#}lxrO0e ze=Sy*9F1+|y_}=9Dg9C3Jud${+FffKD~@$PShT;)WodPth0ulIPe-Gdfo?usa)BwU zu3~i-(;th41*S*!n3;C`NLn4+l9f{IDrd1Ouyl>L`nxrgCvSJEUlyT!@7QI@z-#xv zw@*ICEc__s%4LOMy)i_r!k@R0(KFr9d_QtGW!dOAf3} zns!XcCQ|- zz0S02$LiG&TVrFm-i03Jy|!cZ>aHD)7amP*%)Bg`JyX_AYezn4$=)8&+~1n1UA?;> ztqzRf+aX#n0~*-s-59nCl$*9O9$4MXxV;86*^bqMGIc~gdP_$ZH=;6 zdi7}3(HH~m(xb7UG3-l)&W(Qxy~G2beAp5wWi!R0uKshrjv{MqPw_p1vKjB zc)s&+{d#{JYu1#bvA0E|vacky3wA{xSevv?X>MWIti2mUrM+WvjA+20AQ zpi5EyNsE@h_@NyZmr`C7{ZBncY-&o-;*J~D31KfA!^|Id?a+J=UJA5A)-lJ%4wob-#3pjQhUl?+&cqt9X6oM~kH!vbV9uUk9D`lMT8OGel0wH@h{o zK_O@>sFCT+CEK;L4Rn`G(mK%cx1;g@uPH|`{FwbHA2js#BW>ZCoV8ZDUD2Y_6T7xW zEt|67X!OhbT-!e%jp1X>JgEHeHq(kj%d6gYtqK+`KP{Ru2ed1!@MxGR`_aqCMKq4J zeJ>7VfApW>>-&GIlb)=&XCfkNW1#KO*ACieAAKNfL0*A&$8YeF|j@02goy21O%?hV&{G23GzX3UpnC#{x#XfLc`_w~@a9&0`qjc;r_R{dx2 z-NSybei>^y`y2NAU0alkAAXu`}FLSNQT7T>D_xUdy!(6oXdrDW!gw|@9 zAJv}1cSH2b+b*dm9^Z~eKYiF5_1u4J*E+V{J)!s4i{>>XOwx8v%yB4-A z;`9>mm|V&bUVmHu<2EU$6*FhQIrioIf`1m7(M-U0ioCa7TTV%cCWcxEi#i_Fzq&;1lhnfBy#E=b zwu!p4S_s_buRkmrdxG!A>eTietygcmcI|i5di7}CI;|TFGNCs@Gw+K=mEYbcnxB>6 z>@Rd;PfSRnS7Z5B`8}(T*k^y6{#HO#fNIn`*`PBZv|hdU30;?1mEX0y(LQ^b)}GwUqL~isZmfEv^+5ac zQSQ|~q05S@N)N5oSoWN0+Y&j@x#Mj=gF#)7RXI=hiM+hKf0@=3M~Ov$|5+?Nx9WZd z^XH>cU#b@y{WX;@T&Hz$lFOZo{~4J7Gf4Aj?Z3|bZOZzK@mIUT-3{tDIsQyq)$pk8 z$D?(RZ;R&dV~rBgxSbQ4Gnpgcq$Y#L%3p>ds-4-}%!L)WMp21%lzUpH2__*KngKD_cj!>sy8 z5vv{w9sgGKU47-R0&Sn;TwAYmNx$rhk$!hz?To{v5~2C*!J(#d?4mK-xi9V${*f5! zbzQ_fCUimhilZ_9HCh+HA6UzEd70LgNlUU~Z)o)`dE2#O%Ou|q$9O!i?35S$)>~b_ z?mxquaIW=jEUgu8nz84L{JZ6E<%HJ9a28mI9?kArlOg(j!Oz}}-Yq`thmOBI8spQw zna}yggYc?TW%(_?A3CR8FDMMxN#6Ejb;)wS8B6bed)X!Rs48jQ(kk8!T4D~D4I9k@ zzuhQX|3?33{n;n70E8_+HvLg#=rBwY5!*sKFOk#8GB6YdVNjkhOGzIEjSvpTS_Kq z2k*!5V5TkMpiz54pU_2oB4%!)fxF}H?6BWr@%MS3)*fB6*Au;7O$2QbYP(yYoqSug z@OE+6mas+5>$L9L6gr16i{>>i({zfzA-!SYtga<*AGb(3#^$GrZn|W;@P&U3%dOQL zSVV2V9hhRe)kll%%8ftA54VOdG+A7FG`#e{s^+zZp-U!T7R^cUUir9d*VbR4DL$2q| zShYa*!|Ih?Td#{|E#Up=b=gU?Yp1KVOu$kV9skt=OXmHRsMoGP8?oxeGNIm9jvLKa zQU>FN7MOpLT@KJyXc?z zowSy%@SVL3*Nq8syJbSlw6-3|O7MDM4L++y*D-jTMrIoChNIE1_i4sHmyCm`&jd*X+3&at}e3D(5UI|?xYpUZ-`{?oH?w zbNdq3iavX+3?}wN4`R>QT@k+mnu{1g*W$l{9Tpj}sHuN9m;1Gnh9VZ%W;o z+;DEE`+4s6N+R`#dd$}Ln%&6@F#OM;{pdeKXSj4!D0AB>4cl!8R?8RrgzidOo$a^x zgLcgZ)dHodN5f{#o1G9|xJcUi z-juC88s6aW{b=~L9jjyZ7-;+W`vh%UQhH#mO=Eeo`c-M+m|Yx_E_8xpIVemq(`KW|6q zf-LQ>m8W`tTdbZiNu%n~I^FkO+oDCxPjhW?zu&dZ#$fdZMGvp|jP3s!G``4x4il~a ze_eg8alkXsxzq1#KZY*#I2!dV{65#Zr!gG)>$JAl%>ZrHy_gepUH4pDLST^ z1n#t0=$icN+B=T+4e#!~{pbGEqEbtLIcVp6$2zSGj{mM{-Q{?ZWf-=z;%(RVz^<)P zvLCb^u8Zb_CZdmnjyw0u^x{&rb-S7U`0>BvqR~7|q7Qao-ubS2PG|t%jnxgyZmdqe z4XPSI_s+D27arvmVNdSb5+ZzS$5Iwkm#@8h792b9#{Z_hpLct<>!Kgm*EvSB?M@7_ zeV}{H!0s~FpZ23I3X9mIz8}?F`L=7v#`lfk%rT*b607Te1Y8V#y-{M-Q-+|qhG9nw z!%JSbMy)?0@TOiSbYIAU)lsJPTeQ0tUSK%4AV=b#iN&fnoY~8Mgzl>^W6h|35cXkp z>Fu0=x4Ry#y*6X@PSE|@JIE8hO4yg0yPI8KW>d;X4-PPYe(+>n$V+sA{P2> zTKBh!W=@QM%k?m{%{+e7op$i5kGLJ|-ArpAR6kf6SNlQh!X5GD-yVj(xHD~uU`%MG zbkbUlrG=pnm|J-p*lw(L`6jX2X>Qe{bvk^k`Rh-MmTQ$9jmiu)&uwoL(Y&}+VXIR` z#iLcPY|KClx3e1FckP;eSwy$&sCL7G`&=u1^JR{$TQKqdj$dwCcM7N6jBLLQTE!ar zR6%}|`>FZYMa$Q@-*WyE@Tl$V73bB#+kV&W;m$o-Dx|NL`2De`bD{W_NshnQt=ebz zoL|+o`8Lz8c@j&vN`x*lbh;B-^r-d5>Rk`Rg}*;qx7J{Fdi^ww=+8%^B|`UvX5JRf zC_Nfg+o8NpYiAs&Q&1CnW!YoVyhSrs$Ng9xy51*rRh`A^?8~6jwfYZ>mKuiMDGY0R zv@YegXwb9juB6pJbGvr@_tv^HqIjn;x+|DVreNW^kfYj>{W+Y0PwKO_ z{7eW<+$Um@`z2|eeVZ1j(O6pjXl?j*pP=j8v|c5xH8?P>;RC3{*Ui^nqY-hb<+lst z`$p}c(%Q?9avo z{xs9}u3huXv@Uu*TH73-+!cGBY4>f>@|e&&D?$6PrPkekG*xtSdh(9hpoY_~jGNbxyw0gTA=xVC8 z$)|7l&k)Wfa`u2iv>FQpovM~$~;0fLJAguFf zz-Q-^dp*vo$l3D$)cse_Cz{6|x%#)x{!IVC#!#orqWPlP>u#*xc2w6`OC2x{al{*koy0qES1Er#JC{nJ>spJv(~*tI3PCUlQR*^Sj3!-ai+mmgaD zRbthx)>q{g0XwYbeLb-Dg52(&P@k1-9hpCRf^McWKN3~mabR6v!tL;S=If&I@jRh- zEUT}Jn5+;_>{=(Wx=v#0n$R+>`#xL`uZtFZI~wB&+P3^YC*W1mv{#v*k47c?cf9op zO0>)l?fq}3`aTs>TiRo0nVNNO!y!M;zU zl->EdXa@gH(`6zi$?=R`YrnWV#?LJbFZj=(@i08#(Ym$P^1HcqPmow0bMSrFI(DY5 zm)B`skXX1r@jg?C$_ z+PM8D^y)ILcOgfkg1feCky!OFV(GdHf$RD*TCXmPZ1K~`kqPy&`*&m2r^2w+j$ON_ zX}$f;6YBfi#a@{8=fp0N_~7l#m5e|0>K_(d3|o99u>HWg`){OwC3|gM_fGzeLtV~+ z#HGQJ>sz{|Ii^p|$U43}??zcjg1GuykLJH2pb*S zXtdJqp3uy=8=@J>QAw+(@C5DJA@qjps&?191M7}PKiguGm=CK=APXQl+)e~@4^S)>y%cFJoxpvpxSS4lnHFD*@ z*Hh*%+`pYma7lP_V@R#wx0-@gn^pumUKZKj$h-bw*E)-ZYl5C7SiSAq(kK09)}yr> zJ|1cpa?`qCvAWZCW2ojs?~#;~+7yt)Up8rJD#?lrIC z*EgDX{7eiLFW>&}_ap!3@*j7+?Nt=mk|0?ge4km}Kv}dPCUlQRjDK?1?scN2hGE-| z#z-WsTlp4r>cTpWQeMN*gN5OR9}lfN8fG1|BlOh5>s10Zg`tah_m_Emdu13leNyd4 z$4BN8t5$8W?%~=s^=Ne9!|Pn@RxB+HHJcDNzfB|hAgGpkoD;f~3FP_%k5>5`tY`T# z|M21GUE5`(KZ8y+s%g_&!=`m}eNMpRt}SKvw`pzhyuQ^i^q_liYfOaf?xeMiUE7c6 z1l+hSnzfv3`i%l@JNI9N=$$p+dFWm=mTnjBgUI#2M& z>Y6sK-AvKJdksT-{BuGxReC~C9eK1)QUS4z?jhEq8VLZj>dLHtt|`>+gqT$ZKg8_Sb75#SgTuk zn`1wQmrAU<#Ku~f6Ph0rbd^7_OV+8}LUiq~z8OpJG)g~Odtu#;)qSD`BKMiLu_tz| z+7TYn$_t)TER_xzpR^@kI}{;k^^x9;%I?f*e%>*%6 zd4^##9<41sw0gtB12UnD__W@Ht|~to8)x@p^^D0~Qn&YMJ>Ks7Vbzpxuk~Zkcl_J2 z>S&}AOD88oNtXPN9IY$jL3jJ_YJ|RgC42lg>)-u9`ZTtLn4M&>G1uLhyi@(pvO`n< zZqT~i6~!zX+Zeq9bbRs}t&L9}?|j*)+xB#yMs{yGsLBmFQrmb``_KicS=Wz?=)d** zu}bLa#Mu{J*_^cBEdDwBpK1K9qoE0%i2>c0@2|8|SDO0!`%%61eOj-YuXC+6T=>S& zIc}_Bwi<@*O||abm+)xq;>9Hje=S7A z8;@$2ORRQhTH&rSE!i=&<^8*V@}JMvKinANzQSsb){TWPyLLPXJErxxE1I`!t)1;h zP>1$*(z>4s;lW&MB^EBaa$96YjDSj~zeD7{r~esdZwyT-IJ9*gYphS`2AcxyKCK&| zUP{H6Lu)T@@6);{yFu$R7pQCgLg59QW>%2qQCEKlHm&PRj|4BRdJx*_yYF$=w#PkP ze`l?#f8;D0s{OcYYoPCc2AR-wRrYdutw(EZCYC|&A)Z(dNQLk zXK#{Ua#=J=F8>MhvqI;ZG}|jYK@UadpUZw@pn5-i{jD_h=Upm;8+c!|Q1ocn1JG{z%c5EHB$oPRF#qwY@YpN;L;hL(r$VPIJD=Q})7-NlY;KnQ zO#aeiQv*(EJ6{(qSIYL=vFiNlX*M$+t^FIzc)xz0)*k&ft-FSyhYyS9Tu545^Bq)A zu49c2ZjBB-8Y6yOG;c=es)~eAd$+cYv#QIEhW(o3E1&$M_Q$HnUAvcQmKuij?_kJ{uG8dEmz!kAR+7sm-#D0um23wV?v7ztz|+t`DwlV{b+6eZPASPjWG;yGgjAh z{sdjfyDDkzpAV~D`ev*S1ugiFVbi)UP<~XmAoxc3(=M3+xf`OHJ#$;#FBNW$x-f6y z4f(~t61N6y+mM~|P^7)rbFqeP`L`ppqr$k0%=lWWm;brjcWU?d{|smLe^CFIeeCM0 z6YOtlkNwj8ne+@Lzb$_LLN&FAx{|qJ%!)7j3T4ea2f&D*& z*`u{plS(w~AMD>OnsHM7Q~hC{(Dh+{C;v0>7_7Rev-d*%LH?IrTT*82R`}1*{GVZV z;mv4%jlYc$%@4wMo~uvI{I~Hx!z{y_QEQJoDF0_@0^9cf{HOZE$(y#=*3FsxkL5qZ z*@)16#`52j{&N0}7L9&!GHRy(h1Gv|EZo}KA1VFfk^SSCp!-)FUwxAQ7JpeftanN7 z^@%@s*T;yhovl&5z~1&hL!8;V=!*86q4Ej_t5&d7*K7z{$M7&bXvRXXZ(`d0#ZXQMZTd-i=lF3me0=u8YQSzHQWH zZj4r%Ta^&HM#JpTR3popk73QSJ4=s7gDzS5ew3qZuk)rb=YJmS|CrzS&(L;gb)~QR zrv;EeVcD`RGiqzCT{ov=(TB^)()bl653`f!D3HcwGA71}$82WL6qpQT~l<*qOQp5277d0%G7e`sF zj#%yTXzjyro=~5|Zalo2UF&TN!vkajF2)3HX)==tSZMpAVbz4l+l%^^i^j9?oKf3( z&+(hXZ|%R)fA*NIm_NTJbW@?T>&CFtd{d9=%5c32y|ZEU2JMwyyX$_0E@IPqB@?=a z>xRTCG5;@Z5C6S({#ZT#>3@dg-w~k#90%6rZeMpp^i+0Nc+lQL=N-XMyP}!*Xux|7p?CHq(wkSM9EF-?fj`OXZ(`IvOSRJ_B~oGqTRXzd{eu_<#nKwId%ru zgl6V`47>g)C$wJf#;R)p%NC2~SXits1xbg8gD!GflfU(C*SeL5K)1e1lpl?L+8BGL z7>i=V^!Roz{{4UGS{AW0; zxG}7MP1UBxH=KXdMYAuezqOt}mHoqkbz&Rkx9r(}P37Mnt-YbiA`aqD475`otyAB4 zH1@n`X?EB46G_uL*+m0OG-^G5eV4OXwI)YJG=}S@#p>Py)m4wy$^^YCIU3EJqfsbl zv3lj!!tmgHnb6FrFQD7xugkvT)68F{5p`HJry^-}MZnvxaK^4R^D-VTUv)tELb?5$ zszGkg}G(P%We+bmLbk*%n`pc5?L@NG(%!(p~z7_i&d9)th%(EYo*O2 z`ES{bzV25zw#v;?UGB2i6*_(|Q#yvh_IA?%u+% z7lmQXf}rykMWZj*gl^F(w=dJoxn5N0oGh}|PGYtDvb%+$W>fl`3?n&i?PdSz`>$S1 zYZr$Y>!aP1vW|RJ|2dm!J=PwSE9mqh1QtE9CTE^}=?{O-Uy zEq9;Lvr*Mat90`vZMwStYz&u}zG3-kksU7esWWOVR`nj3n5?r&&~e-07e`rZ*Jx*Q zx$M3WGGD0f;;#Zxrl|*b_p$75ywMYSY_Vvrgqdb+)PwM(wZdI%Emqgo^=Lip+8z^{ zJqJ`2x9o5>J+%IlqWuTA`5)J5xVQ`SGlg0*Ul)z-+F@X^dfMFGkJe6%3C&lkN?L26 z^1d;~(e`6_RqgLb(+)LW7A=VC;o6`sw&LY=(a3UvX-bTbcbLkS9gT{%xVB(gevzMa z=<7`JPdx!Qw)d0-`UKqwSeyV_0i?wfy1`HD=6%tqt?#?mEiDY&_OffY$gZhJqmup;1G_w1PyTX|tcCFO_ zZN%6b`$2n^)x)qEA-P>K-N%zbyOCG5p4}9)oKyRa+Yx!uqakZKwkzE$V4gemxBZ{X z>Obv2SS*x0(mxM$CD{tYu)UyzCb_Qq8iosZ#q54p2wG_>V#XmMTAJM&wN5lgCiKSY z(6@~-uI|D+j)u$uUDvJ5O=R>Z4mU9-7U~|&EEK; zFw|H$d>zX+CFPZe)-Lrs@M!hQ`yy5i;W?rE=V?8=6YwB(j+7>`+f=_S`{;aU3{pq@M!pDrfuSfMI%+_lqu~HJ*gx&J25oS`PPEO&{NC|ZU=rm zbgpsJ$jIIA6Us0DE-hn!Qr52D2EViaoqn6LbJd2|jp4l8kA{Cc8pCij_QzQ`*gr=;U&~@q{`_B9Cj?Y@ibLvQy)*JWY5B)!K|1&%+SUppH z`dd-Qe;zCUGc@J@Tr3);^O!}P^?bL~zr7o`hTmq2aXcDz|HXl|H5;@O9<8eD?El@{ z{%QWE`e*&$EVZ4Mglj84II#LZgXVvRUjMgAs}7WdmjwUr3C+`b#n{TXOzQ#oP?O7C zJANd1yF7H>`!TGW_0Ai^&^a@A<=D%F79Chzx8%ERp)+XpZ{$r6_Nqr~S0}Ar-4*}; zk}B`xA8B*X=1zSmso%0S%?pntkqjmG!QN3?Rqn1|ZcJ1ihpe2{R`SgYD zGSA-sS^aP4e}-P8kk)J4vKfsGpBvXMxAoufAtp5bKGRNzl?xB8Ug;CMf1XB^8)y~H z-eauMC-`%;Zh$VPxW7X7?iX8048-A4?jShYMp|5!vYrF&7kEL$j4ZFWegq9eu{w<@m z#?Uz-oN0U44&ACpt%q|rhJ9G=z!P*csL;8qCp6hbB6#7U6-Ks}R|FkG-amFSSf#Y( zz*W-j`S)|}@S5v*G@MiX&%vY7qPB)k?^M43F%0X8*}hIQ zDp5}T{ZU@&j6d4nAFVU{_${zCMu6`?(y9i=>&rBqVz)0;^4p&EM{1~ zk2P=Z$I#QxpAM}v5n0Dt%6MqqBR1C3!q7d8rptb;de|i%e4J}diu%i=VaMjU9hvp@ zXn2vzThPMg*4>+;H~!hAe>3rl{L9`|bC+H={I&PQV}tuQ_g)uuTg$M#jWuiUhSlvc zq4n~|MKeyYX>IX5y#RE=$HT5&EnkmDbFs(GSh(?h*H)jPd&gfMjm`;OReK|J)uYv_ zt!gqVGVPDQKXhv5T)XdVs^fnK7W-#wLTkjiEuOUPQ~vcJG-%0Ji`7Y1Qr|5?%LQ+X zmTF%X&71PNYj;iP#;BxqiCf*YHcvbn%CJsr*X&2@UT!?J+M6NccunXw=Dr&X3+?N) zwoSF}y1e|nXiV6Q(B+Rog8_?=*Eg-Q=Ls#)vFhs23EisjpJCn)Q77-EVP78qSn@%Z z{k&+Vf==bBN_oD+BHEWlw)=iqoh)Mg_0ift8?=K=+0TncOI^6~BWbF`j)esht1h>O z>$)8mEiG7`xboA{ut|pDQb}#U9<4jnHseA_g7-@Bot-fS+6|z+Po2g!482W{rt2QoztwyERQo@(qg?Z2;~pMA>!qtbJAWF!au!f`xZh zcI_~~+qFe{pVqsO18YC6yRqt~3ioaqtt}htcI&rk?UZ#`-lnyCn$}e})~p??9=`8d zx8iM=*yNbdr6z|~?_}P1G$yuM@cW~cPVsK~5i1h0u;CO$TYnj}p`I|U@GEelb z+n%T6eropGwm<(;%v{J^xG zGNBu8tWMhzy6gMV=%s~WAG8~fhRl_a548F&XR&(W+!VIC?tyobrusQN2wcF5?(yURyWD{=DZ;_GgPmeq9-#vDn_+ z#{Ccfk^c-Ic1nj$yXI~>&B?#1M*02S{|pZ|ZdrXeUnc(Uim0#3>+gTt5ViiX-;Jef ze?JIkTlXViM|H5s+WZ=>3pHGK3q!XaTBj~zy7P5wc=M0MaN(}C&mUeEE%m$&+Swnv zZ11n6bt~R?Z8^j6`mphMYsl9af5nFx9FYd5ttn->5S?ZgdKfX{w>g6+}-Z{kZp?YEQ=dc_lZY~vFP35OutC}BnZI5~o&fK-;i*w0Q-71kgPzlH>#mT5&{LeRyVl=cr?sVDhU>2Nqv;HVVJp~UK$Doy zV^=?Hj1e(d_@Xd$!j%QQS8D9bZmjwTI#aMibeYzTxF4&N+E*;ox@w)YdPlfuIloM3 zw&vTewOnqRc{5gBOIX$}8eDn3lxgcx?(#%G<<48}hnd!HnR4iU=;T8y{0r<;{xeLO z|4~M(+d}9K=#nCrAD}ae53EbISam9Cb@t;f&}q^!Higc$|dO|&JZ_4Mq{WH4o zi`-(SwO^a&=~>7#|KVeeJ(1uYz2P>~_Lo1t9$0sy08$qWkxAH11 z_;@rb;K8gfZ@a>KLO1UNtvspb33%AGdwOx#_Q2NYm)DuL_-WlY*jwmztyALK6uaB< zheb>R{+*UzUZZuvNdK1Te}?d13E|wWYprU&9o1TJy&$`58yjop4TY6ActRP@U0;77 zSK#&g_DO;Vs*=0cwg&iW z?{9C@$ea5y?AQ%ZyCB<4>pd4JBk$k|-P{$m)L?bO^%|~wTCXlM?b;!_Z*fiNf$J|1 zty5=OqdYm}8|YZwhvC7Z`FT5pHc!t9-Fja%%l(0NYuK@^_m7Ll9zQH%;-T43>!w_PDeAIWc${LgSz{^RzW2i9_?+NXxP|8(2m1RD8V zU6WEf&)J{#hx;G>qyHIr8?_g2^*9^q>R|w68slPXd?x{{%3+lSY+1gcz zE;2u`mj8O!I*HKbohc#-97nklm$v`YiD&+{??1z>{|u?Ep$q4#iaPIjWhMAIxNB9( zQEmSi&~BxYqr3sve{(7_ybUNtNo`>eiJ^>e={ACw>RQ2~pXhQ4Mou%L3cdcVw zz1J}8@T{b@*WVwF%I_A9z6?4m{{LlFJ9d+I*$&t1nz^<~{FM;R)Z+Ei$c&m>uSG zOqRH^QPdW+g>#PJht(cgZ?F7kIJWrD)T5ypd|Ef6WLGwZD=t*tr*)UXbosU$qWjX9 zX_i(etrc?j`w{S{aaT{kUBhtRjovezc|V3~hW=+rdD|M|@+r6`G)&X+#+$;hW%her zWLYErGaPYa4Oz#UIV1Sd%dV9j7k`x=TK8+MdGJ21j)1y3p{0dk2M(=m^a;2ucz+#e zhuAg^!?43i>%Je2UZyoYJM6XAp|jt@95`$b*H{`ft=Jameo^?HB)6|gqU_YVhmCq) z_J#aR2tBp-ao4&>{xw?n`K}&nyCP8aXzDBN`&=?fw%T1%hVzbd?O49^z*>&h?5-UP zjz)7Ctj_CJno{^-!!pr;jYW*xC%-+q{Y>5Iq<~I#rs!o_mldpKKZeemz_wscXmH){ zN9#ayZM!au=K5(A%1MN-3VF0nfhTlbgwWmUM=PptyYBSU4LDqyctu`DYhh-I^WUgv zO^Fx2 z`)xw+8almt;2p7ggX*f_Wm*pm7Vgoy_%bG7$HTDp)1o;&0gp5?yP{rq?Ovx*cr=>3 zD~f4%+0p1_H&$KR{iDAoG~227xAu3Q(Df^i{^|bDz+~ujI8{7#`H6{L+jK8{eZv3i z?BBw0=|Hcdtok(ttHdl+R{s6cn7!flkDlDnBSK%l&iTvzpTXoo=rc~MsX!$amh`;J0))(V;Uw>8@ zUd3U);LzG%8P@!}MRORelUDDPmkCY0zfS9JW|w&Q@nxb>ewx|qwC?ZIx@g}AD&n^s z2rlf}!BuiwG}fyWbjt5Ct&0+?&MjYdWA%<7rAMQgMRRyU_gRGASoMCI);*T3U0W|R zt@M^;pHglA`e?YzBgY5sIb3`CcXMrXHPGG|w!cs7!ky<=8VTT}DS18Z59fqJu<>$G0wcdg^T z%_U`b19WOgVAnQ|qp^NBR$W@Y?Z+x9?{zLqn6DIGo1ap@=0C&7^|uatwhuhsttIxLf0pEZIPN=pq*S3 znsQm5Oh!Ds$1dDyVg9)4k`@2;~}x?o(`*czEsk5ro+kmZmc>jc>2nO ze^+|y8eKpu!kl*N*2x4cICW>GSHFzbnzrV;9ZM_j=QT5}<#di)4%!S7Hp%h8>SK>Z z3oVu&kY6lX%oBQw-MMSmR+a>3XVHi?f;au&2DZPl2;HW@`|W7RHOC9H9<5$somUw8 zVowMUC+G<4#nyqmN&Kx+k`o$s?#Y=JizOWuJ3iRmf3o4X1=s3F(-}dB+Jg4NI`Of_@n3F@ zQraP!8Bq0TZQxQyV|6KLqxsh3`?T7A?T!}uc4&qFQSp!cKcoN5-*jV@ z5@+(<$|G4;f)|<}9RB8~wTcb29r(b9qfrWv)(TWVS}T88G;c5HhSJg+tAy~Rb#lt< zLt;r)^+Cp>S6v4!;$Amro9)N2Nd|ijy*_BS#;_MQhVA}%U$khyV&G+_?U!o;Zdj~# z^UA$18j*EdCNyZvQSH^=AFW%bb+ur%L-XgO(dom$wi)L*(sv9mE>>OtLwrhQG?0LT%qMMF$?b@+Aw(5a*>Tb}C=YuT6(Dg>@w-sv6 zX>EVa@SmY<&3#wSV=YCNm~87 zE5`5k!?4cZ8=YMqtyY;Do>cWk_TL+=ZR`Hp3I2ExcFn+CdOqm%h|sH`_C@CFt{wVq zqIvD21$Gvzt_9u}t^a>TedSr_8C&{!IHSs6cWn#c3C$Po+8NKaj<-wXonFvg$KvY= zY)|HYaueLO@Y>0DC#n~^$fxPux3r(RDLiJX?6H}m*%M#-gjODn4KfU8?Akp|G;8;t zkKy4HmwQz_YA=1+6}DxMzjN1mwnaM@9{6@N8gx7Nt8eeScI{Xt=eD}_@2cE4_Ot({ z9Svn-U^uXLg4Oq&IR@xDvwydO~+ST3aUpDq^;u-}thXZ^hB5 z&xQ%7|c~Ebl z{OH@(=!Nz=q5G`gwni!Z_UQF*tLq4nQ3i-->HJtNqawn?yB$8dSLx%-MW7_Rwvhl-UxUTdS(4- z(L#&WD`P_UXuaVm)xIvWYo3MZh8;^6cgffotajgUsP*2B)d@*!FLQ16lFtcUmDDa1 zdRR0kY2DGNKZW7^HKA8--xtl=^15qVRnqE++8?2r#m+vV7gWXTeux%CC9Q6_&$Y!v zVs*p%)1ujzWedY@JX+t?L( zSf{nUPorF*9MoyK5fgM%VzmSFbrf4}uc{igga{~124 z?h4FW7^2l6Qo@|r%4=Y;YR0QVuLoyOKVsm!vAVnbXpC=RIM<_fM`LO?hAs&gvEV8> zs`vD9V^relyc?^N^L8vfyJNXe=+Xs0AB3Ga8t~rOGve)8&CT|o{xeLPe^&jEPQ~g% zw+SmejH(V$~Gp>%|tonO3zQ|M}!s-KqZ!le-pG%KZ>}d-A}v?+cZS zZ!@jodE9aP=>BJSLQ8Uv?RjCN*(KvN`PA%3(_T9|UKY*UvD&38X)W9O9MGdlM{bIp?6OMUu^Y*&{vhZZd#8xMcCR!gIDxi?R?u9>RfauF+8s@ z?C;0W9jjBb3d6eo-dJ^ScG8OKowEc(gN`3aT9KNb{B_2Zc4?#k3`Rfd*Vw0v`XolEagMb;|J;d%uc zJjj^Cb;0^F*LJ@ftE3*?TKnqA9o3I-YUkEx|5I%Zza7`fztregaYb4FSLyw~_Ge2u zsc_{s>Nb9V1lp8$R5!nCcW-7)=!PAudkw<{Z;O^oeK|1gfU=0mtF_lf%Ma}}3}^DY z5qePb^U?62*$Ls{qNRmSGB;Pf7u2ZTRezx5sFt6c{d=*+KPT7!h~N63LFmA`K8q)J zJ(O>Yd3AIBNa~Igo1L_}PXlz;-`lS3@t`$Ft6jp^{SaEVq1DuPt=e5tkGppF*MuHwczMF-izaOnzYZ%TGdd$?eFsvnc(ImV1ue+ii z9Jsc-x+gSYR(r4cw*#yH2AC=IFBZ-5SiVqVb*Vyi(sVZ2Lg(g?q_w>tv{$!A^WGQD zFtFF*y03p&G<&%ZXiOF~;{Isep|#idX+hed`?S6B1xcVi7vYCbL+acRn{k+jxe9m|e9gVhzHyB@8* zlC(NIZpOlUH$Vq9gv>Hq>-L|)rYpMFV%EGJ4x!t{UKdMt_A<)W*zkE6MkZTMwK%zD zMa7Qqvi})wrgRBPfDVqEc3|p~N2{}2xm3G0%HDXi>Q!cAO!>>MFq5wR8I7NhMhUM^ z@IR5XwrcHf?f(oc^-Bvwmo8B+5~-hL|7_KxwGz#>o1&lj|BevYDH@#0Sl1J@e;R9! z)T6b{_nCGlcWu8cvOQjg>(-Ur+uO8uPi12*xW7&7nesBN4NP{|{bfQU6y7$5O|d=d zrWx&cZHDL_k8ek#tV@qZ-CieRy-Z}+-VfR9gR8~|NpASS?3uSMUO^l zcZG?5I2yf{-6!-u_uH<8%Vun@GFv>Qd8K`7{k8A^8PqvALbh&<@LzF!&hl^luL6H7 zb1lj;(0bgpa%0|&RZs0~3&WGvtz*sR+Ey4Y9HaFn;O)n-6Gvmaw#J0+3BAJ3wBqia z?h+P0zhfQy)c<8lIIWEC;_oh3Tk>O0(E4p!H$)Gt72KzF(WV@k(1w+$Qy4HSe@waC}#Lu zfro3|vK^r0(%iK@>TTDy+x^U~F%A7&yH=j&EbbDMkdSQ?&2TKZrD zXnWyp(L$eq3w}RV*J!pzKlIVs-&^%)1-Gl&Wa;E@@{juenZ;;uJkXx#owj#l=<;P+ z4>ulK-DumVb(izNy5%)mH*YV~deyj3qcHEVXq4yrHqffzbqkgnhAzLojkO@iy-#af zM9b=f$5n0JwAuo`&F2nX^rm|KuY32OCapMeLxAIsOwbO2g4HhJ%QW)WY2CGc7_Lm%7e!|IK+s?k#B8$m_l1{NKmaZ{!$6 zt@8+VWw`(GX!yt5Oxwg}ta{kBLr?2j;DvWK2CEvkKFDS+Sf980dvezO>lSk649oLk zL;l)s3~`$0w5TO%mCu=Fvy-Nsc_5@wptWk&!?0Cu2lBhNN4@t-bWZ)S>VWyjqv3D6 zb~YU4mNTuL!F*pdH_`E%!=cqbc(@)d7A<$fX4lqZGeYkghRbdY zU2<8p)W0S)XSd$p!q7ifd1XhV)n=?-Rj|5Yoz~;79TU6Ols(XH4AXdLB@?u7+3cVl zt2;j)jbTr2j41;he!9N6HJaD4YwLN@9NCY~3Ez&!)P4-xSFyTJv$QZ=Z2je~T{~90 zi{>P)HBe8;?26)W502rw&BeQ6_3FU)jp2Ha?{n=~r%}F7>!L*HmG_{t`on`o%Qqa2 z2^Y=UU3!~o+m@r+JHthzeCr}WU5-TsiYXg9-TqcrJP2(n=09AJVQqLrM(h6d#_H~Kx3#qRKlS?m;i^Adv2@wiO8dQ2J3d4y{AXzW@t@)0hbYaO zunC8EX|Nw(`JbWbb)(j9nV>5TeKQuG@HIcG+t?-RV3o8^J8p;2mi28~cQvnzSoi%{ z^`KyN#OmhqqhVXElh!TY2U_pDNPBw?=sN2kOIL;GaNQTY&9x<}eX~B*YrU(#DZgp|n~h6!49?nJHeWLTM0@?Wp!%~Cp-~db4F#P}>l+TNOIZFk zzbi^*{Y|xb>@}hHcE)d8Hcz>*Yh75lJR`ekxe_m*)(ty})z#%kqqITCTpbN-5L-5T z-j3B3p}QWfvsiU&Qklq6-JZ}Zzdxw@-koyMHS@Y?kdf(yMM4|qt+Cp^sa~u8==`m} z<`#MET0p4 zr)~iyBn*f?s+&deyQ7k2D=}tqyslpuM~P@87XH~C>yr;HiyO%r!DU){luo+S(_a{ zO*5AJ({~He7#Xg|U9lUFhUBF@V3+%`O8#};viWW-ms?-+_GvDy(5rQJGIZ6R?EBF< zblsJsQTZ)lGeUhm6XR~I&f4(RQH&<)z44()ZWZMGZ3lh$cBMk&o$?NX5twz6x-Hqq=}zaOh^<}RLE z;bE!Y{!wC~%a&`4AFtV1Z~j*Q*Zp(*pC*R51aVHW5(xRC%(N<4wCG{j2JM8TX&b}l zI?7~!Pg>jCY8Wmi`!Q^(_M^9DJzAAli+xin<4s2V+TXtaTfkfw! zqtP!n9$L3fvrt_$HYVWxVUev}VjJ?hw7b@(W-*n0JgWW3rZqc;>*mUrT`Q)S+6&yi z%@nFUHKO`a>yL$3md9vj&#<=%EoyFz3Hf$3Cj2<4xnH_W>(%_-T)Uq(hJ6ToyH9J2 zocg2tBGwb?7QdHRdW_X}Qu&yRMouCVhuHvBU>-|{F`1`c3uQ2qwsgifsFw|qE*Y~60SCUpo z?&b;DWx5P>GW3@6*Im0iK7bY@Id*Mv@6+0%@Y;coH8v(RF1J^T)eyOn8W^8>p$k?hNN7M@_(;B;jcpCmY~x?x2mgx-V4jO{^9&P z?LfJ|%IU(1;mm>CG&8O|TJ2gGdO&cW*6w9LR_}9X+L5%j>&t=FFS}w~4YU(3gNJ;J z-ga&C{FxAX;O#!m{5NmR6E&c8ul~4fp+l4f0Qvw%?~ z8m#_*O+($3FM03Bu#H|vgS({4BCb!K#n`oCO7;A$5s&{fwAp`l_|MRG_++5rp^f?+ z2SP#jyM&8^+8vs$Q4*_5J|0*bz!Q2TShUn`V%LtI&?AYVd;DWUK}*?w^MvmD@o23u z=r)d3<>r~Wl2gwgzQA~8-YG+-3+>xlZ}xnbzqetjwZ=ck{|wTJ>Wc!|3|tMg7mG-& z`V)HPI6nr(w=%1xhL!X4uj@+&t zQV+wvFVlKAW8sZe?{2KFf15O2$T}gcQTAhaNU(@?P3VHyVmje`-B#)@6)>M zzBODlC#hW+w7l`+(J0@OM?-oM}Q`@<#Oj9k~V{>vJ^zjCwI zdTH|6{P#uW{TqI`nQd8}o6fuA?=7w0J>pp%oL$imLG6pMg9p}qI~sc$bZJ}IHjB_j zn%gw8*B`1XIU3@+o;kwP_qG4c{|t?XR{z^15cII3Z%*6em;Yii!%e&%Pny+y;j4tu zE3L*8mqiOR&YCY1jXJY9!SiU$rjIvY_b%MOCj3qBhFj|*XS`Y6yJ}VVw`~@ocMiVy z3AphRw8`*jjIUMFy2o8xuP+lZzwo|m_te6$!#$y;c5gx#ZqvG%6S}DOV|dtpo6vO* zr5~4RZR}7lYz@<0Rr=Vex_5t=)((f$-(vps{aD>Gv6}6tRNWq~?bjdgZnEot*|lxb z>c36=m%CQwckM_FXYSg)jJ41XvG9<5{Fo)dZ?FaBi zDGU$ZruBH6X#TQ)6019oMy*s9&0e0vwFA_+U0{ARoOdIr#kWl}x-o3$ZP6S(tsVR_ zS{E!9mgj_CJ+uzAX32YH*Vg0Pv|fEX8n!{UFudewbkrQK%cmyJvSz3~r?ugXM2+I? z7YqI~v_I~Wjf~#3{>=5S^)Z|=8;onWsXzVjpW*EN4>v?BT1BpCupfC>_wCr#{lT?o zGrOYgZmeGU>z!O?1-^Q9XV`;X_`YW{-tGf(d+^&!bxbeiA$-~p6ADtd(Ul!Rl zWA*mepb^w{+PArO&9BqCTQ|8e?Ca5xymdSrsYRmf#n+Z^kiE^U%JF#Ci{f3Yj$Uzp z{4ZqxSO0(9TwFR^{rfaZHLr`7+WiT=^0rY|%yhxgXz8SNwwhhLJC@xD-K5>MH4b#} ze00*@zJ-U_@++Z%*7|>io+l|#O zQooZ{cPuy>aDBfJ$MLtj^dHAxF<2P;+9`aUW^q6KWbzZ_V5n?H4M};9K1+8fvCF>PG*%pR| z%COy7xK-hOqjuvmt#=Vi&t;e$4O4!F|OLJMs-hIKM0Z`0bgW9c%P_U&z2Eq!jAr?~vSy>pTI zr^)|b=YOi7ETa4(d>za73rTB(_8P2qW&(|BfwDM5V%SdoKCM^b%d{R?Cxi=j?f9Lv zy4(VkEled=yCvA3)4IOqaY_7s5ygG09`c{^Knsqv6t1ia2CCV&r zna95HKSSXDY^l(C8P1#lnb38~qS>&MB4T>v*xuZta>l_T=v}p#g6{A6Un{O|wkv6;HscN8s_fpdC_=)|TAhN?IHK z;%Ln2*uEdD4odYk%~Rjo})auta`(BPqQ?$F*=~?(dq+lyVflO9df!VF?4ON}voCFjI;pvdHp!L3X0S01bCi#PIreK6a5 z+C39{uEtNyqM-_mKA{`8X=bmFo3U_lAn3@B;EGEQfvq85H1?k_2j`(OTCR#e`j@=(KSPuCqg6fG z_eCR)d_Nj{B5Cd9t}SjiR)^f0vFgH?8;@2WX1?$+>^CUmzwFupUYWVlM4y}l!+Et2t7Jd{b;Sp6j58luqmHJ?}N@T+uF6|$XAx6RpG*G zI8vrGtnN2;jym>TPj4N&6#w1jpZcHuXNcV}cbk)mehp`gVd$2H-wv&AJg{yZXk|c` zRO+F%LHl(=uY5cj_Tm0o!_bFJJ)w(i48yK+fDVqS4i@#!y?HNv25;ZtCkCr@?r4bG z8fY!aktmYoW7)=A82UrBlHcJ$wR+aE79V8)cfV;J@;3Dj24NT^B(eYi1n>%ybq;oG!syljoK2)%M!v>@t_ z`aX@!09{7Y1+NNL`_veQ@~;Zq>Ee@qd->hV(&1uL&1MwIpV@!3{@I+MMcbVZNR=I! z5|X9z!s4=sNqAMMa*ozYk;FPxQ{@#$xqqH~xJ|U!Eme8K0y&9=6(RA9xwe(xNm}i& z;%GQe=v{-=?xF=2pmlnnqh3BN(|UB}sIK@?UN+s!IiVZo{Rqtrs(!TkW!H|Cwq{4e z!*;A**%-ajV%4$jp5_UBTFbv$aVZ%K||Jytag zn--SWG-K7HBZ*;$AGIA^acHgKx*H1@$L(0UE2*vXm%-}Jqp{mWGwgFh_w87nw$DN| zQ}n)Qx!{GQ)tccyc|wCltfm}|dQ_FP_CinSjnKu9482|Z9d{m$as{P=*PlU+%p5(f zM>bZER+lp`(|T3$Xtf8ZjTn0S(b~56UE8ncgdV>yvRky=C*XYzs7SdknlG{&wEEr7 z?#F7^?CVThC6^svo)cQXP3u*-XinpuN2@D&v>p|P?W{;zr+epZ*V?b)OC5jacdhWP znpnHw+3woOe==J`1D_OVEOh_r3%VqI&i+RctDd&rers#zz<>QTlXz{ceb(B48~@1~ zhFul4JJtG=t8Puug(%Qgv!mL7XD5U$aIuGz4SY3KF zrtJICm_y5^E@RoI>9-YpiQ%iHwbyp6cIgQ{V`H#7x^Kto4WK(`t=|=fnoVR}c+}+9 z$%Qtq%hKvuJfR5_WDgz<*A8FyW7SvrI@a>jTwDEatZwhqy8rdSTKV0g8E-F(tUJmp z+!e#$r}cJs(%SO%7rVC9{z_U^)Xo0+5`97!lrOL0y7Ap&)rE)K zq#t;lZaSr5el+040{MJ2wfoP<(2L9dyzE-d!d~1ME*L*eBWsH3(P*|s zJ66qf@?0kx!tLm{Tx55zxrAuWhE9=Vk5=6leB8D2pt9l@Ra2865&tgyXP9;U+r|*5 z3f?xYo8ON{zrHM*y-sW6{k{X?qPf2A+e8aH{c}Q3Ev$=Jy{9mAP3F!6Ypc3JtN$Ln zDPw+lG>qYmhl#w7)(#i`sL5UH9{bG@c>B6*_xhO7oQ*204<68}mI+!E7G1wNGFf(i zMos_Q{|rYqER5n@JTqHzt<~?E<2jrmFW)xCuoi{~gHHFBmkD@vnQKSVG*HE{L-;z= z?z$VRT~`=}ZdG6I!?pW)*EU{r3()=EceSr`t=PKrO~I=3zSp;D?NwbK&%?F#OmU4d zgL_urkJV0Br_{YXYt8nf{m<3^47^=C_N@H-NUCDpyK>Edht%ke?#`$`|nsL(XD#dQIq+KZRj4ek83HJ!#z&v^wh1I+LSO>W4-1`?T&FXlG@DM(c8f zFC?vdRQ2s`*VfNRqmM@YOj-wCL~_25HTu_v)%z+|&6!k{9sGqS)J;V9_whUPW`u^< zgdV89v3hz<=$?Rw+kUK0o3T3j(ex@%zo`&Z)Q0~42)@01ooMhRgDS1R3JIb1t5mZ> z>mGKktiRM^oo%l}@hf6%6N{aUK5^6P&AN5f{%JpX(3 zKbgd(g*#^d{raDQ&v0qRdHam^Kk|QWH%(n=@}J@TR>(;-25;6G-I;&G@!y&M3}+=o zPph7Pt5g30bU@eRO*=fTOE~N%ckPy!e2d;e!(1SRIxQkL<_s_dKk zAIF65cRl`l>%XV+AJ=I;7POXBv46AjKZBsetuGR6(AJ-m>f_A9 z=6=m+cZvGbW)>P6Hk*O{G*b-Q??-EUwC;j-=B=*R3C%SOTiF^@Q|R3A@n}q8=-#qJ z>)1teWC9*(cZFH$tV*5`BIv}&>U>l?+Mp@pQp6Mi{?EX6pU=PLtJ6L4$y{O);s@*0K>?-}`V~NW8qXF!cCs(I_|8jM^KaS3bUMjXh9z za+%iKW31&dp_%JMql2vSySA;3?T-m9{B~e%FxU3mIiZU*zdTx-)GpYn|Nnv(S8>2I z&9hccmX^yKUiqI$_L{!;>tVAGlldDGB>pq3{m)?XWQEoqtEu~MBqiCOdffl`TS391 zi;G%9@@(8#b{BWaM#*U1P)S-V6LjAv^v>?2wR1m)?UDgqyu0_D)*H||?c<`^m%kt7 z_F&$p^>E*frGAxj$^>)Px8;SlSp0G{cS)}HD1IJio={>bb^~25JydSjuGvE77D2b( zUuRnPvQgWc^=P#2_H7!0yJuf++3`DM!OyvE0#iiS?z+8JAg^jt^^*y!?#myt=i%C$ zYVf8^PC_(L&so0XGE*Q|mf3;T4a>AZC#|x6JQ~gua6d-ty{G?a(HM3?pU_2yq3gN! z9TzQfS-DL#_S?3jvD+_qE$#okHlV^={*h6v;8pqKN>dMni{{M;xM~>o@^RO$rm06` zefNG0FI;zAG-GXncGKSua>G^UpjQbFppJ#DFqo zQRk>@H+xrqkzQzf{L`Q7oFVRJ>)Twly0p92Ez^2c2D%P)W7zN9))>%@K72=`tn<6J zc&OLS2rZ2I^0I4puNml`@ZODKoun)TDR0HY3=2Dnb1|B`-|Qly8$}ebyqfU$y60 zLkj$kFn6sLJHeaj{C1nxZ5MvG{Oi9ytd5)0yqNj3{AJNXq3;28?!S7twqH?xtIR*` zKf_0v(8Z+^zuo)K1b=<7bgPR--AVQ*g`p3{53gg{4Z7x2q4a3%%O0%@jy?f5d^fCa zYQ8R7&UjliyG`rCKI?GNn9SC&t!zIQZZ-M&Xx(ejQj85YRSBUIjVjx;R%q~P-SyA? z7!%sAwlJKzl~4EaWzpr==}}#iQ;Un(FE_@h@qR1+#d$RPS^boMYeKI~=sW!K&^m*ScQ*WD(|YewuJYI9 zZ^Y`jrqZSU`~EYm7mc&$;d<`yV0GSdQ77fC3m^SHdgDiZnuyZhRJk9byCz>=rkU}! zYuhT0b*$xw%q&(XP5FK_nr(OQF|Bv*%QQ1)eLb++e|t>m#>ZV-PWe|Qt<}1`w=nG2 z??#&J9rlRyUin8c_*2?{hFRkOq*YdJj5sV^tgvVPndcKh zm&4z9uq9|`{(g})>Y`DXTJOx_;o6v{JSVXPk_Mg{X>wdHc zM&)n2v5;@OQA}4fALl(c`A?bE{~6ZZ=kuDdl6Ol%^MSnE)2t`epUMd>7pkjRddK6y zx}}C;eXKFOhTh%RMGF=l4G$L0XWBI*bid)tBCBdkwUfO4RIrwD$60 z(TwV()f+>PW_PVk^a;)8%5Mz$w}F*EYTk`iPv=+%B&}+wNLm*YdZ+BZ$d>zUtP!td zy|%lF91S^oFjZ7u;KrY0Hx_Q4ep@tV6Prz;*H;<08={*QysLh+%1y-dR=a4Hhse4^ z%S9t5gqI!FI+|f8!*xUSb!*6z@+blAPY2eyJ>My^Olw6*=~}~Zsj{Qd@@*m}{xzW~ zJ)xD=B}W4`#vZK=2{_PuP@&28;IU~J1^tfv%Kvs?{h4}$1FKdz9+-A>W!Dzz!(6+k znp>>)c~CB~I&RfFR{zsn;zjBSnq6ycI+kX3trZMkr?oFT1uM zuL)hn6S^^O#_DZHqhEGyjd}!HpSI=8wAOcpdGZwHypoz{ zv1;P>)O+U2H}`?=aRc2K%&b+rWc{vL{}~Q#)4H+KsbaF*2W$D`qOqr$)-fc8mx>-( z%eYT7L-vFA>bM=N9{SB#oit%IJ8{xg|%E5j!R)Y>IWEaf` z%_)~ltX@@>v<@^NEA_T(q2t$Cd)u_u2HqAe^*prJ;Dhy})e|n{|43T*gzdP9NnzN* zLu-Y*w)p*iG_7&H-;9MfgmwtF@`j6+`-I*x^tvt~a3NkMv><-J$hyZ}JJuFxPc!1v z+M%a)UnX>)^rN+)2_L52%VR<_CVD=qdbBPw#p@TzL*{jyVfikoN(sAH_>%k zEdr;sLZs#dt?IN%&iz-h>Z9RW8G(X@!S_X@&WRUy?GPxJe&7vSZ?bxYcGnJ`&?|@9 zR(8cUMp>**xDMJG(s-0RJARtheI3w!EXty#2CEzHi{?!^ur_FS(p1Z&NRi_TtLAXE zwVvTqoN?9f#D9j5tLvw>avYc;bf57`(mE}x2jQ$oqtvEItZsGRr**fcFl?1!*un1y z*0vpu=Isg>_M2-M9)6f<*W%?qq1zIgCtCB%h)fl%>D{8Z#Qq6a{}26*{~37OTe+{U zo0EG;5!4*~xT^lhhYQipTU+I?R^2iG6M6fu{|!lPC$n3REbByXtPimk{CAv@JEJwR zQCGMz?9#p;p{s%xJP6&Bc{wL^?Z1lE%^{cfY2;kn5xO7~bQj)bsYlZ~8Io2zgE}D# ztmlNT65RF9FuZE_N82jU9g`x~qGejwKo<;ORMl6Rt?2Rt*C-Q||O zGx^HAVMo49{m0Eu z)@=)^+{SW6b`#gCjUV54g$KxJM7_ShOlw(%+3|H+`!CCvXdXx@_v+gl^WbJ;t&{CF;_S)rpO-yP|Bh8v}&x*B2-R zhISO?bNxFf>dL}~@uHB+#cMDeUezdl3P3XS) zI-&R1i)hB(>R$55tn{vbRWJ8hc;F#QbQ?ZLZ0!Azjnf+EuLj(zASTVW

    SVmpZqhV8*`-GMq2uW&}|MoG& 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 literal 0 HcmV?d00001 diff --git a/ifield/viewer/common.py b/ifield/viewer/common.py new file mode 100644 index 0000000..b2f3bff --- /dev/null +++ b/ifield/viewer/common.py @@ -0,0 +1,430 @@ +from ..utils import geometry +from abc import ABC, abstractmethod +from datetime import datetime +from pathlib import Path +from pytorch3d.transforms import euler_angles_to_matrix +from tqdm import tqdm +from typing import Sequence, Callable, TypedDict +import imageio +import shlex +import json +import numpy as np +import os +import time +import torch +os.environ["PYGAME_HIDE_SUPPORT_PROMPT"] = "1" +import pygame + +IVec2 = tuple[int, int] +IVec3 = tuple[int, int, int] +Vec2 = tuple[float|int, float|int] +Vec3 = tuple[float|int, float|int, float|int] + +class CamState(TypedDict, total=False): + distance : float + pos_x : float + pos_y : float + pos_z : float + rot_x : float + rot_y : float + fov_y : float + + + +class InteractiveViewer(ABC): + constants = pygame.constants # saves an import + + # realtime + t : float # time since start + td : float # time delta since last frame + + # offline + is_headless : bool + fps : int + frame_idx : int + + fill_color = (255, 255, 255) + + def __init__(self, name: str, res: IVec2 = (640, 480), scale: int= 1, screenshot_dir: Path = "."): + self.name = name + self.res = res + self.scale = scale + self.screenshot_dir = Path(screenshot_dir) + + self.is_headless = False + + self.cam_distance = 2.0 + self.cam_pos_x = 0.0 # look-at and rotation pivot + self.cam_pos_y = 0.0 # look-at and rotation pivot + self.cam_pos_z = 0.0 # look-at and rotation pivot + self.cam_rot_x = 0.5 * torch.pi # radians + self.cam_rot_y = -0.5 * torch.pi # radians + self.cam_fov_y = 60.0 / 180.0 * 3.1415 # radians + self.keep_rotating = False + self.initial_camera_state = self.cam_state + self.fps_cap = None + + @property + def cam_state(self) -> CamState: + return dict( + distance = self.cam_distance, + pos_x = self.cam_pos_x, + pos_y = self.cam_pos_y, + pos_z = self.cam_pos_z, + rot_x = self.cam_rot_x, + rot_y = self.cam_rot_y, + fov_y = self.cam_fov_y, + ) + + @cam_state.setter + def cam_state(self, new_state: CamState): + self.cam_distance = new_state.get("distance", self.cam_distance) + self.cam_pos_x = new_state.get("pos_x", self.cam_pos_x) + self.cam_pos_y = new_state.get("pos_y", self.cam_pos_y) + self.cam_pos_z = new_state.get("pos_z", self.cam_pos_z) + self.cam_rot_x = new_state.get("rot_x", self.cam_rot_x) + self.cam_rot_y = new_state.get("rot_y", self.cam_rot_y) + self.cam_fov_y = new_state.get("fov_y", self.cam_fov_y) + + @property + def scaled_res(self) -> IVec2: + return ( + self.res[0] * self.scale, + self.res[1] * self.scale, + ) + + def setup(self): + pass + + def teardown(self): + pass + + @abstractmethod + def render_frame(self, pixel_view: np.ndarray): # (W, H, 3) dtype=uint8 + ... + + def handle_key_up(self, key: int, keys_pressed: Sequence[bool]): + pass + + def handle_key_down(self, key: int, keys_pressed: Sequence[bool]): + mod = keys_pressed[pygame.K_LSHIFT] or keys_pressed[pygame.K_RSHIFT] + mod2 = keys_pressed[pygame.K_LCTRL] or keys_pressed[pygame.K_RCTRL] + if key == pygame.K_r: + self.keep_rotating = True + self.cam_rot_x += self.td + if key == pygame.K_MINUS: + self.scale += 1 + if __debug__: print() + print(f"== Scale = {self.scale} ==") + if key == pygame.K_PLUS and self.scale > 1: + self.scale -= 1 + if __debug__: print() + print(f"== Scale = {self.scale} ==") + if key == pygame.K_RETURN: + self.cam_state = self.initial_camera_state + if key == pygame.K_h: + if mod2: + print(shlex.quote(json.dumps(self.cam_state))) + elif mod: + with (self.screenshot_dir / "camera.json").open("w") as f: + json.dump(self.cam_state, f) + print("Wrote", self.screenshot_dir / "camera.json") + else: + with (self.screenshot_dir / "camera.json").open("r") as f: + self.cam_state = json.load(f) + print("Read", self.screenshot_dir / "camera.json") + + def handle_keys_pressed(self, pressed: Sequence[bool]) -> float: + mod1 = pressed[pygame.K_LCTRL] or pressed[pygame.K_RCTRL] + mod2 = pressed[pygame.K_LSHIFT] or pressed[pygame.K_RSHIFT] + mod3 = pressed[pygame.K_LALT] or pressed[pygame.K_RALT] + td = self.td * (0.5 if mod2 else (6 if mod1 else 2)) + + if pressed[pygame.K_UP]: self.cam_rot_y += td + if pressed[pygame.K_DOWN]: self.cam_rot_y -= td + if pressed[pygame.K_LEFT]: self.cam_rot_x += td + if pressed[pygame.K_RIGHT]: self.cam_rot_x -= td + if pressed[pygame.K_PAGEUP] and mod3: self.cam_distance -= td + if pressed[pygame.K_PAGEDOWN] and mod3: self.cam_distance += td + + if any(pressed[i] for i in [pygame.K_UP, pygame.K_DOWN, pygame.K_LEFT, pygame.K_RIGHT]): + self.keep_rotating = False + if self.keep_rotating: self.cam_rot_x += self.td * 0.25 + + if pressed[pygame.K_w]: self.cam_pos_x -= td * np.cos(-self.cam_rot_x) + if pressed[pygame.K_w]: self.cam_pos_y += td * np.sin(-self.cam_rot_x) + if pressed[pygame.K_s]: self.cam_pos_x += td * np.cos(-self.cam_rot_x) + if pressed[pygame.K_s]: self.cam_pos_y -= td * np.sin(-self.cam_rot_x) + if pressed[pygame.K_a]: self.cam_pos_x += td * np.sin(self.cam_rot_x) + if pressed[pygame.K_a]: self.cam_pos_y -= td * np.cos(self.cam_rot_x) + if pressed[pygame.K_d]: self.cam_pos_x -= td * np.sin(self.cam_rot_x) + if pressed[pygame.K_d]: self.cam_pos_y += td * np.cos(self.cam_rot_x) + if pressed[pygame.K_PAGEUP] and not mod3: self.cam_pos_z -= td + if pressed[pygame.K_PAGEDOWN] and not mod3: self.cam_pos_z += td + + return td + + def handle_mouse_button_up(self, pos: IVec2, button: int, keys_pressed: Sequence[bool]): + pass + + def handle_mouse_button_down(self, pos: IVec2, button: int, keys_pressed: Sequence[bool]): + pass + + def handle_mouse_motion(self, pos: IVec2, rel: IVec2, buttons: Sequence[bool], keys_pressed: Sequence[bool]): + pass + + def handle_mousewheel(self, flipped: bool, x: int, y: int, keys_pressed: Sequence[bool]): + if keys_pressed[pygame.K_LALT] or keys_pressed[pygame.K_RALT]: + self.cam_fov_y -= y * 0.015 + else: + self.cam_distance -= y * 0.2 + + _current_caption = None + def set_caption(self, title: str, *a, **kw): + if self._current_caption != title and not self.is_headless: + print(f"set_caption: {title!r}") + self._current_caption = title + return pygame.display.set_caption(title, *a, **kw) + + @property + def mouse_position(self) -> IVec2: + mx, my = pygame.mouse.get_pos() if not self.is_headless else (0, 0) + return ( + mx // self.scale, + my // self.scale, + ) + + @property + def uvs(self) -> torch.Tensor: # (w, h, 2) dtype=float32 + res = tuple(self.res) + if not getattr(self, "_uvs_res", None) == res: + U, V = torch.meshgrid( + torch.arange(self.res[1]).to(torch.float32), + torch.arange(self.res[0]).to(torch.float32), + indexing="xy", + ) + self._uvs_res, self._uvs = res, torch.stack((U, V), dim=-1) + return self._uvs + + @property + def cam2world(self) -> torch.Tensor: # (4, 4) dtype=float32 + if getattr(self, "_cam2world_cam_rot_y", None) is not self.cam_rot_y \ + or getattr(self, "_cam2world_cam_rot_x", None) is not self.cam_rot_x \ + or getattr(self, "_cam2world_cam_pos_x", None) is not self.cam_pos_x \ + or getattr(self, "_cam2world_cam_pos_y", None) is not self.cam_pos_y \ + or getattr(self, "_cam2world_cam_pos_z", None) is not self.cam_pos_z \ + or getattr(self, "_cam2world_cam_distance", None) is not self.cam_distance: + self._cam2world_cam_rot_y = self.cam_rot_y + self._cam2world_cam_rot_x = self.cam_rot_x + self._cam2world_cam_pos_x = self.cam_pos_x + self._cam2world_cam_pos_y = self.cam_pos_y + self._cam2world_cam_pos_z = self.cam_pos_z + self._cam2world_cam_distance = self.cam_distance + + a = torch.eye(4) + a[2, 3] = self.cam_distance + b = torch.eye(4) + b[:3, :3] = euler_angles_to_matrix(torch.tensor((self.cam_rot_x, self.cam_rot_y, 0)), "ZYX") + b[0:3, 3] -= torch.tensor(( self.cam_pos_x, self.cam_pos_y, self.cam_pos_z, )) + self._cam2world = b @ a + + self._cam2world_inv = None + return self._cam2world + + @property + def cam2world_inv(self) -> torch.Tensor: # (4, 4) dtype=float32 + if getattr(self, "_cam2world_inv", None) is None: + self._cam2world_inv = torch.linalg.inv(self._cam2world) + return self._cam2world_inv + + @property + def intrinsics(self) -> torch.Tensor: # (3, 3) dtype=float32 + if getattr(self, "_intrinsics_res", None) is not self.res \ + or getattr(self, "_intrinsics_cam_fov_y", None) is not self.cam_fov_y: + self._intrinsics_res = res = self.res + self._intrinsics_cam_fov_y = cam_fov_y = self.cam_fov_y + + self._intrinsics = torch.eye(3) + p = torch.sin(torch.tensor(cam_fov_y / 2)) + s = (res[1] / 2) + self._intrinsics[0, 0] = s/p # fx - focal length x + self._intrinsics[1, 1] = s/p # fy - focal length y + self._intrinsics[0, 2] = (res[1] - 1) / 2 # cx - optical center x + self._intrinsics[1, 2] = (res[0] - 1) / 2 # cy - optical center y + return self._intrinsics + + @property + def raydirs_and_cam(self) -> tuple[torch.Tensor, torch.Tensor]: # (w, h, 3) and (3) dtype=float32 + if getattr(self, "_raydirs_and_cam_cam2world", None) is not self.cam2world \ + or getattr(self, "_raydirs_and_cam_intrinsics", None) is not self.intrinsics \ + or getattr(self, "_raydirs_and_cam_uvs", None) is not self.uvs: + self._raydirs_and_cam_cam2world = cam2world = self.cam2world + self._raydirs_and_cam_intrinsics = intrinsics = self.intrinsics + self._raydirs_and_cam_uvs = uvs = self.uvs + + #cam_pos = (cam2world @ torch.tensor([0, 0, 0, 1], dtype=torch.float32))[:3] + cam_pos = cam2world[:3, -1] + + dirs = -geometry.get_ray_directions(uvs, cam2world[None, ...], intrinsics[None, ...]).squeeze(-1) + + self._raydirs_and_cam = (dirs, cam_pos) + return ( + self._raydirs_and_cam[0], + self._raydirs_and_cam[1], + ) + + def run(self): + self.is_headless = False + pygame.display.init() # we do not use the mixer, which often hangs on quit + try: + window = pygame.display.set_mode(self.scaled_res, flags=pygame.RESIZABLE) + buffer = pygame.surface.Surface(self.res) + + window.fill(self.fill_color) + buffer.fill(self.fill_color) + pygame.display.flip() + + pixel_view = pygame.surfarray.pixels3d(buffer) # (W, H, 3) + + current_scale = self.scale + def remake_window_buffer(window_size: IVec2): + nonlocal buffer, pixel_view, current_scale + self.res = ( + window_size[0] // self.scale, + window_size[1] // self.scale, + ) + buffer = pygame.surface.Surface(self.res) + pixel_view = pygame.surfarray.pixels3d(buffer) + current_scale = self.scale + + print() + + self.setup() + + is_running = True + clock = pygame.time.Clock() + epoch = t_prev = time.time() + self.frame_idx = -1 + while is_running: + self.frame_idx += 1 + if not self.fps_cap is None: clock.tick(self.fps_cap) + t = time.time() + self.td = t - t_prev + t_prev = t + self.t = t - epoch + print("\rFPS:", 1/self.td, " "*10, end="") + + self.render_frame(pixel_view) + + pygame.transform.scale(buffer, window.get_size(), window) + pygame.display.flip() + + keys_pressed = pygame.key.get_pressed() + self.handle_keys_pressed(keys_pressed) + + for event in pygame.event.get(): + if event.type == pygame.VIDEORESIZE: + print() + print("== resize window ==") + remake_window_buffer(event.size) + elif event.type == pygame.QUIT: + is_running = False + elif event.type == pygame.KEYUP: + self.handle_key_up(event.key, keys_pressed) + elif event.type == pygame.KEYDOWN: + self.handle_key_down(event.key, keys_pressed) + if event.key == pygame.K_q: + is_running = False + elif event.key == pygame.K_y: + fname = self.mk_dump_fname("png") + fname.parent.mkdir(parents=True, exist_ok=True) + pygame.image.save(buffer.copy(), fname) + print() + print("Saved", fname) + elif event.type == pygame.MOUSEBUTTONUP: + self.handle_mouse_button_up(event.pos, event.button, keys_pressed) + elif event.type == pygame.MOUSEBUTTONDOWN: + self.handle_mouse_button_down(event.pos, event.button, keys_pressed) + elif event.type == pygame.MOUSEMOTION: + self.handle_mouse_motion(event.pos, event.rel, event.buttons, keys_pressed) + elif event.type == pygame.MOUSEWHEEL: + self.handle_mousewheel(event.flipped, event.x, event.y, keys_pressed) + + if current_scale != self.scale: + remake_window_buffer(window.get_size()) + + finally: + self.teardown() + print() + pygame.quit() + + def render_headless(self, output_path: str, *, n_frames: int, fps: int, state_callback: Callable[["InteractiveViewer", int], None] | None, resolution=None, bitrate=None, **kw): + self.is_headless = True + self.fps = fps + + buffer = pygame.surface.Surface(self.res if resolution is None else resolution) + pixel_view = pygame.surfarray.pixels3d(buffer) # (W, H, 3) + + def do(): + try: + self.setup() + for frame in tqdm(range(n_frames), **kw, disable=n_frames==1): + self.frame_idx = frame + if state_callback is not None: + state_callback(self, frame) + + self.render_frame(pixel_view) + + yield pixel_view.copy().swapaxes(0,1) + finally: + self.teardown() + + output_path = Path(output_path) + if output_path.suffix == ".png": + if n_frames > 1 and "%" not in output_path.name: raise ValueError + output_path.parent.mkdir(parents=True, exist_ok=True) + for i, framebuffer in enumerate(do()): + with imageio.get_writer(output_path.parent / output_path.name.replace("%", f"{i:04}")) as writer: + writer.append_data(framebuffer) + else: # ffmpeg - https://imageio.readthedocs.io/en/v2.9.0/format_ffmpeg.html#ffmpeg + with imageio.get_writer(output_path, fps=fps, bitrate=bitrate) as writer: + for framebuffer in do(): + writer.append_data(framebuffer) + + def load_sphere_map(self, fname): + self._sphere_surf = pygame.image.load(fname) + self._sphere_map = pygame.surfarray.pixels3d(self._sphere_surf) + + def lookup_sphere_map_dirs(self, dirs, origins): + near, far = geometry.ray_sphere_intersect( + torch.tensor(origins), + torch.tensor(dirs), + sphere_radii = torch.tensor(origins).norm(dim=-1) * 2, + ) + hits = far.detach() + + x = hits[..., 0] + y = hits[..., 1] + z = hits[..., 2] + theta = (z / hits.norm(dim=-1)).acos() + phi = (y/x).atan() + phi[(x<0) & (y>=0)] += 3.14 + phi[(x<0) & (y< 0)] -= 3.14 + + w, h = self._sphere_map.shape[:2] + + return self._sphere_map[ + ((phi / (2*torch.pi) * w).int() % w).cpu(), + ((theta / (1*torch.pi) * h).int() % h).cpu(), + ] + + def blit_sphere_map_mask(self, pixel_view, mask=None): + dirs, origin = self.raydirs_and_cam + if mask is None: mask = (slice(None), slice(None)) + pixel_view[mask] \ + = self.lookup_sphere_map_dirs(dirs, origin[None, None, :]) + + def mk_dump_fname(self, suffix: str, uid=None) -> Path: + name = self.name.split("-")[-1] if len(self.name) > 160 else self.name + if uid is not None: name = f"{name}-{uid}" + return self.screenshot_dir / f"pygame-viewer-{datetime.now():%Y%m%d-%H%M%S}-{name}.{suffix}" diff --git a/ifield/viewer/ray_field.py b/ifield/viewer/ray_field.py new file mode 100644 index 0000000..a0919df --- /dev/null +++ b/ifield/viewer/ray_field.py @@ -0,0 +1,792 @@ +from ..data.common.scan import SingleViewUVScan +import mesh_to_sdf.scan as sdf_scan +from ..models import intersection_fields +from ..utils import geometry, helpers +from ..utils.operators import diff +from .common import InteractiveViewer +from matplotlib import cm +import matplotlib.colors as mcolors +from concurrent.futures import ThreadPoolExecutor +from textwrap import dedent +from typing import Hashable, Optional, Callable +from munch import Munch +import functools +import itertools +import numpy as np +import random +from pathlib import Path +import shutil +import subprocess +import torch +from trimesh import Trimesh +import trimesh.transformations as T + + +class ModelViewer(InteractiveViewer): + lambertian_color = (1.0, 1.0, 1.0) + max_cols = 200 + max_cols = 32 + + def __init__(self, + model : intersection_fields.IntersectionFieldAutoDecoderModel, + start_uid : Hashable, + skyward : str = "+Z", + mesh_gt_getter: Callable[[Hashable], Trimesh] | None = None, + *a, **kw): + self.model = model + self.model.eval() + self.current_uid = self._prev_uid = start_uid + self.all_uids = list(model.keys()) + + self.mesh_gt_getter = mesh_gt_getter + self.current_gt_mesh: tuple[Hashable, Trimesh] = (None, None) + + self.display_mode_normals = self.vizmodes_normals .index("medial" if self.model.hparams.output_mode == "medial_sphere" else "analytical") + self.display_mode_shading = self.vizmodes_shading .index("lambertian") + self.display_mode_centroid = self.vizmodes_centroids.index("best-centroids-colored") + self.display_mode_spheres = self.vizmodes_spheres .index(None) + self.display_mode_variation = 0 + + self.display_sphere_map_bg = True + self.atom_radius_offset = 0 + self.atom_index_solo = None + self.export_medial_surface_mesh = False + + self.light_angle1 = 0 + self.light_angle2 = 0 + + self.obj_rot = { + "-X": torch.tensor(T.rotation_matrix(angle= np.pi/2, direction=(0, 1, 0))[:3, :3], **model.device_and_dtype).T, + "+X": torch.tensor(T.rotation_matrix(angle=-np.pi/2, direction=(0, 1, 0))[:3, :3], **model.device_and_dtype).T, + "-Y": torch.tensor(T.rotation_matrix(angle= np.pi/2, direction=(1, 0, 0))[:3, :3], **model.device_and_dtype).T, + "+Y": torch.tensor(T.rotation_matrix(angle=-np.pi/2, direction=(1, 0, 0))[:3, :3], **model.device_and_dtype).T, + "-Z": torch.tensor(T.rotation_matrix(angle= np.pi, direction=(1, 0, 0))[:3, :3], **model.device_and_dtype).T, + "+Z": torch.eye(3, **model.device_and_dtype), + }[str(skyward).upper()] + self.obj_rot_inv = torch.linalg.inv(self.obj_rot) + + super().__init__(*a, **kw) + + vizmodes_normals = ( + "medial", + "analytical", + "ground_truth", + ) + vizmodes_shading = ( + None, # just atoms or medial axis + "colored-lambertian", + "lambertian", + "shade-best-radii", + "shade-all-radii", + "translucent", + "normal", + "centroid-grad-norm", # backprop + "anisotropic", # backprop + "curvature", # backprop + "glass", + "double-glass", + ) + vizmodes_centroids = ( + None, + "best-centroids", + "all-centroids", + "best-centroids-colored", + "all-centroids-colored", + "miss-centroids-colored", + "all-miss-centroids-colored", + ) + vizmodes_spheres = ( + None, + "intersecting-sphere", + "intersecting-sphere-colored", + "best-sphere", + "best-sphere-colored", + "all-spheres-colored", + ) + + def get_display_mode(self) -> tuple[str, str, Optional[str], Optional[str]]: + MARF = self.model.hparams.output_mode == "medial_sphere" + if isinstance(self.display_mode_normals, str): self.display_mode_normals = self.vizmodes_shading .index(self.display_mode_normals) + if isinstance(self.display_mode_shading, str): self.display_mode_shading = self.vizmodes_shading .index(self.display_mode_shading) + if isinstance(self.display_mode_centroid, str): self.display_mode_centroid = self.vizmodes_centroids.index(self.display_mode_centroid) + if isinstance(self.display_mode_spheres, str): self.display_mode_spheres = self.vizmodes_spheres .index(self.display_mode_spheres) + out = ( + self.vizmodes_normals [self.display_mode_normals % len(self.vizmodes_normals)], + self.vizmodes_shading [self.display_mode_shading % len(self.vizmodes_shading)], + self.vizmodes_centroids[self.display_mode_centroid % len(self.vizmodes_centroids)] if MARF else None, + self.vizmodes_spheres [self.display_mode_spheres % len(self.vizmodes_spheres)] if MARF else None, + ) + self.set_caption(" & ".join(i for i in out if i is not None)) + return out + + @property + def cam_state(self): + return super().cam_state | { + "light_angle1" : self.light_angle1, + "light_angle2" : self.light_angle2, + } + + @cam_state.setter + def cam_state(self, new_state): + InteractiveViewer.cam_state.fset(self, new_state) + self.light_angle1 = new_state.get("light_angle1", self.light_angle1) + self.light_angle2 = new_state.get("light_angle2", self.light_angle2) + + def get_current_conditioning(self) -> Optional[torch.Tensor]: + if not self.model.is_conditioned: + return None + + prev_uid = self._prev_uid # to determine if target has changed + next_z = self.model[prev_uid].detach() # interpolation target + prev_z = getattr(self, "_prev_z", next_z) # interpolation source + epoch = getattr(self, "_prev_epoch", 0) # interpolation factor + + if not self.is_headless: + now = self.t + t = (now - epoch) / 1 # 1 second + else: + now = self.frame_idx + t = (now - epoch) / self.fps # 1 second + assert t >= 0 + + if t < 1: + next_z = next_z*t + prev_z*(1-t) + + if prev_uid != self.current_uid: + self._prev_uid = self.current_uid + self._prev_z = next_z + self._prev_epoch = now + + return next_z + + def get_current_ground_truth(self) -> Trimesh | None: + if self.mesh_gt_getter is None: + return None + uid, mesh = self.current_gt_mesh + try: + if uid != self.current_uid: + print("Loading ground truth mesh...") + mesh = self.mesh_gt_getter(self.current_uid) + self.current_gt_mesh = self.current_uid, mesh + except NotImplementedError: + self.current_gt_mesh = self.current_uid, None + return None + return mesh + + def handle_keys_pressed(self, pressed): + td = super().handle_keys_pressed(pressed) + mod = pressed[self.constants.K_LALT] or pressed[self.constants.K_RALT] + if not mod and pressed[self.constants.K_f]: self.light_angle1 -= td * 0.5 + if not mod and pressed[self.constants.K_g]: self.light_angle1 += td * 0.5 + if mod and pressed[self.constants.K_f]: self.light_angle2 += td * 0.5 + if mod and pressed[self.constants.K_g]: self.light_angle2 -= td * 0.5 + return td + + def handle_key_down(self, key, keys_pressed): + super().handle_key_down(key, keys_pressed) + shift = keys_pressed[self.constants.K_LSHIFT] or keys_pressed[self.constants.K_RSHIFT] + if key == self.constants.K_o: + i = self.all_uids.index(self.current_uid) + i = (i - 1) % len(self.all_uids) + self.current_uid = self.all_uids[i] + print(self.current_uid) + if key == self.constants.K_p: + i = self.all_uids.index(self.current_uid) + i = (i + 1) % len(self.all_uids) + self.current_uid = self.all_uids[i] + print(self.current_uid) + if key == self.constants.K_SPACE: + self.display_sphere_map_bg = { + True : 255, + 255 : 0, + 0 : True, + }.get(self.display_sphere_map_bg, True) + if key == self.constants.K_u: self.export_medial_surface_mesh = True + if key == self.constants.K_x: self.display_mode_normals += -1 if shift else 1 + if key == self.constants.K_c: self.display_mode_shading += -1 if shift else 1 + if key == self.constants.K_v: self.display_mode_centroid += -1 if shift else 1 + if key == self.constants.K_b: self.display_mode_spheres += -1 if shift else 1 + if key == self.constants.K_e: self.display_mode_variation+= -1 if shift else 1 + if key == self.constants.K_c: self.display_mode_variation = 0 + if key == self.constants.K_0: self.atom_index_solo = None + if key == self.constants.K_1: self.atom_index_solo = 0 if self.atom_index_solo != 0 else None + if key == self.constants.K_2: self.atom_index_solo = 1 if self.atom_index_solo != 1 else None + if key == self.constants.K_3: self.atom_index_solo = 2 if self.atom_index_solo != 2 else None + if key == self.constants.K_4: self.atom_index_solo = 3 if self.atom_index_solo != 3 else None + if key == self.constants.K_5: self.atom_index_solo = 4 if self.atom_index_solo != 4 else None + if key == self.constants.K_6: self.atom_index_solo = 5 if self.atom_index_solo != 5 else None + if key == self.constants.K_7: self.atom_index_solo = 6 if self.atom_index_solo != 6 else None + if key == self.constants.K_8: self.atom_index_solo = 7 if self.atom_index_solo != 7 else None + if key == self.constants.K_9: self.atom_index_solo = self.atom_index_solo + (-1 if shift else 1) if self.atom_index_solo is not None else 0 + + def handle_mouse_button_down(self, pos, button, keys_pressed): + super().handle_mouse_button_down(pos, button, keys_pressed) + if button in (1, 3): + self.display_mode_spheres += 1 if button == 1 else -1 + + def handle_mousewheel(self, flipped, x, y, keys_pressed): + shift = keys_pressed[self.constants.K_LSHIFT] or keys_pressed[self.constants.K_RSHIFT] + if not shift: + super().handle_mousewheel(flipped, x, y, keys_pressed) + else: + self.atom_radius_offset += 0.005 * y + print() + print("atom_radius_offset:", self.atom_radius_offset) + + def setup(self): + if not self.is_headless: + print(dedent(""" + WASD + PG Up/Down - translate + ARROWS - rotate + + (SHIFT+) C - Next/(Prev) shading mode + (SHIFT+) V - Next/(Prev) centroids mode + (SHIFT+) B - Next/(Prev) sphere mode + Mouse L/ R - Next/ Prev sphere mode + (SHIFT+) E - Next/(Prev) variation (for quick experimentation within a shading mode) + SHIFT + Scroll - Offset atom radius + ALT + Scroll - Modify FoV (_true_ zoom) + Mouse Scroll - Translate in/out ("zoom", moves camera to/from to point of focus) + Alt+PG Up/Down - Translate in/out ("zoom", moves camera to/from to point of focus) + + F / G - rotate light left / right + ALT+ F / G - rotate light up / down + CTRL / SHIFT - faster/slower rotation + O / P - prev/next object + 1-9 - solo atom + 0 - show all atoms + + / - - decrease/increase pixel scale + R - rotate continuously + H / SHIFT+H / CTRL+H - load/save/print camera state + Enter - reset camera state + Y - save screenshot + U - save mesh of centroids + Space - cycle sphere map background + Q - quit + """).strip()) + + fname = Path(__file__).parent.resolve() / "assets/texturify_pano-1-4.jpg" + self.load_sphere_map(fname) + + if self.model.hparams.output_mode == "medial_sphere": + @self.model.net.register_forward_hook + def atom_offset_radius_and_solo(model, input, output): + slice = (..., [i+3 for i in range(0, output.shape[-1], 4)]) + output[slice] += self.atom_radius_offset * output[slice].sign() + if self.atom_index_solo is not None: + x = self.atom_index_solo * 4 + x = x % output.shape[-1] + output = output[..., list(range(x, x+4))] + return output + self._atom_offset_radius_and_solo_hook = atom_offset_radius_and_solo + + def teardown(self): + if hasattr(self, "_atom_offset_radius_and_solo_hook"): + self._atom_offset_radius_and_solo_hook.remove() + del self._atom_offset_radius_and_solo_hook + + @torch.no_grad() + def render_frame(self, pixel_view: np.ndarray): # (W, H, 3) dtype=uint8 + MARF = self.model.hparams.output_mode == "medial_sphere" + PRIF = self.model.hparams.output_mode == "orthogonal_plane" + assert (MARF or PRIF) and MARF != PRIF + device_and_dtype = self.model.device_and_dtype + device = self.model.device + dtype = self.model.dtype + + ( + vizmode_normals, + vizmode_shading, + vizmode_centroids, + vizmode_spheres, + ) = self.get_display_mode() + + dirs, origins = self.raydirs_and_cam + origins = origins.detach().clone().to(**device_and_dtype) + dirs = dirs .detach().clone().to(**device_and_dtype) + + if vizmode_normals != "ground_truth" or self.get_current_ground_truth() is None: + + # enable grad or not + do_jac = PRIF or vizmode_normals == "analytical" + do_jac_medial = MARF and "centroid-grad-norm" in (vizmode_shading or "") + do_shape_operator = "anisotropic" in (vizmode_shading or "") or "curvature" in (vizmode_shading or "") + do_grad = do_jac or do_jac_medial or do_shape_operator + if do_grad: + origins = origins.broadcast_to(dirs.shape) + + self.model.eval() + latent = self.get_current_conditioning() + if self.max_cols is None or self.max_cols > dirs.shape[0]: + chunks = [slice(None)] + else: + chunks = [slice(col, col+self.max_cols) for col in range(0, dirs.shape[0], self.max_cols)] + forward_chunks = [] + for chunk in chunks: + self.model.zero_grad() + origins_chunk = origins[chunk if origins.ndim != 1 else slice(None)] @ self.obj_rot + dirs_chunk = dirs [chunk] @ self.obj_rot + if do_grad: + origins_chunk.requires_grad = dirs_chunk.requires_grad = True + + @forward_chunks.append + @(lambda f: f(origins_chunk, dirs_chunk)) + @torch.set_grad_enabled(do_grad) + def forward_chunk(origins, dirs) -> Munch: + if PRIF: + intersections, is_intersecting = self.model(dict(origins=origins, dirs=dirs), z=latent, normalize_origins=True) + is_intersecting = is_intersecting > 0.5 + elif MARF: + ( + depths, silhouettes, intersections, + intersection_normals, is_intersecting, + sphere_centers, sphere_radii, + + atom_indices, + all_intersections, all_intersection_normals, all_depths, all_silhouettes, all_is_intersecting, + all_sphere_centers, all_sphere_radii, + ) = self.model.forward(dict(origins=origins, dirs=dirs), z=latent, + intersections_only = False, + return_all_atoms = True, + ) + + if do_jac: + jac = diff.jacobian(intersections, origins, detach=not do_shape_operator) + intersection_normals = self.model.compute_normals_from_intersection_origin_jacobian(jac, dirs.detach()) + + if do_jac_medial: + sphere_centers_jac = diff.jacobian(sphere_centers, origins, detach=True) + + if do_shape_operator: + hess = diff.jacobian(intersection_normals, origins, detach=True)[is_intersecting, :, :] + N = intersection_normals.detach()[is_intersecting, :] + TM = (torch.eye(3, device=device) - N[..., None, :]*N[..., :, None]) # projection onto tangent plane + # shape operator, i.e. total derivative of the surface normal w.r.t. the tangent space + shape_operator = hess @ TM + + return Munch((k, v.detach()) for k, v in locals().items() if isinstance(v, torch.Tensor)) + + intersections = torch.cat([chunk.intersections for chunk in forward_chunks], dim=0) + is_intersecting = torch.cat([chunk.is_intersecting for chunk in forward_chunks], dim=0) + intersection_normals = torch.cat([chunk.intersection_normals for chunk in forward_chunks], dim=0) + if MARF: + all_sphere_centers = torch.cat([chunk.all_sphere_centers for chunk in forward_chunks], dim=0) + all_sphere_radii = torch.cat([chunk.all_sphere_radii for chunk in forward_chunks], dim=0) + atom_indices = torch.cat([chunk.atom_indices for chunk in forward_chunks], dim=0) + silhouettes = torch.cat([chunk.silhouettes for chunk in forward_chunks], dim=0) + sphere_centers = torch.cat([chunk.sphere_centers for chunk in forward_chunks], dim=0) + sphere_radii = torch.cat([chunk.sphere_radii for chunk in forward_chunks], dim=0) + if do_jac_medial: + sphere_centers_jac = torch.cat([chunk.sphere_centers_jac for chunk in forward_chunks], dim=0) + if do_shape_operator: + shape_operator = torch.cat([chunk.shape_operator for chunk in forward_chunks], dim=0) + + n_atoms = all_sphere_centers.shape[-2] if MARF else 1 + + intersections = intersections @ self.obj_rot_inv + intersection_normals = intersection_normals @ self.obj_rot_inv + sphere_centers = sphere_centers @ self.obj_rot_inv if sphere_centers is not None else None + all_sphere_centers = all_sphere_centers @ self.obj_rot_inv if all_sphere_centers is not None else None + + else: # render ground truth mesh + # HACK: we use a thread to not break the pygame opengl context + with ThreadPoolExecutor(max_workers=1) as p: + scan = p.submit(sdf_scan.Scan, self.get_current_ground_truth(), + camera_transform = self.cam2world.numpy(), + resolution = self.res[1], + calculate_normals = True, + fov = self.cam_fov_y, + z_near = 0.001, + z_far = 50, + no_flip_backfaced_normals = True + ).result() + n_atoms, MARF, PRIF = 1, False, True + is_intersecting = torch.zeros(self.res, dtype=bool) + is_intersecting[ (self.res[0]-self.res[1]) // 2 : (self.res[0]-self.res[1]) // 2 + self.res[1], : ] = torch.tensor(scan.depth_buffer != 0, dtype=bool) + intersections = torch.zeros((*is_intersecting.shape, 3), dtype=dtype) + intersection_normals = torch.zeros((*is_intersecting.shape, 3), dtype=dtype) + intersections [is_intersecting] = torch.tensor(scan.points, dtype=dtype) + intersection_normals[is_intersecting] = torch.tensor(scan.normals, dtype=dtype) + is_intersecting = is_intersecting .flip(1).to(device) + intersections = intersections .flip(1).to(device) + intersection_normals = intersection_normals.flip(1).to(device) + + mask = is_intersecting.cpu() + + mx, my = self.mouse_position + w, h = dirs.shape[:2] + + # fill white + if self.display_sphere_map_bg == True: + self.blit_sphere_map_mask(pixel_view) + else: + pixel_view[:] = self.display_sphere_map_bg + + # draw to buffer + + to_cam = -dirs.detach() + + # light direction + extra = np.pi if vizmode_shading == "translucent" else 0 + LM = torch.tensor(T.rotation_matrix(angle=self.light_angle2, direction=(0, 1, 0))[:3, :3], dtype=dtype) + LM = torch.tensor(T.rotation_matrix(angle=self.light_angle1 + extra, direction=(1, 0, 0))[:3, :3], dtype=dtype) @ LM + to_light = (self.cam2world[:3, :3] @ LM @ torch.tensor((1, 1, 3), dtype=dtype)).to(device)[None, :] + to_light = to_light / to_light.norm(dim=-1, keepdim=True) + + # used to color different atom candidates + color_set = tuple(map(helpers.hex2tuple, + itertools.chain( + mcolors.TABLEAU_COLORS.values(), + #list(mcolors.TABLEAU_COLORS.values())[::-1], + #['#f8481c', '#c20078', '#35530a', '#010844', '#a8ff04'], + mcolors.XKCD_COLORS.values(), + ) + )) + color_per_atom = (*zip(*zip(range(n_atoms), itertools.cycle(color_set))),)[1] + + + # shade hits + + if vizmode_shading is None: + pass + elif vizmode_shading == "colored-lambertian": + if n_atoms > 1: + color = torch.tensor(color_per_atom, device=device)[(*atom_indices[is_intersecting].T,)] + else: + color = torch.tensor(color_set[(0 if self.atom_index_solo is None else self.atom_index_solo) % len(color_set)], device=device) + lambertian = torch.einsum("id,id->i", + intersection_normals[is_intersecting, :], + to_light, + )[..., None] + + pixel_view[mask, :] = (color * + torch.einsum("id,id->i", + intersection_normals[is_intersecting, :], + to_cam[is_intersecting, :], + )[..., None]).int().cpu() + pixel_view[mask, :] = ( + 255 * lambertian.clamp(0, 1).pow(32) + + color * (lambertian + 0.25).clamp(0, 1) * (1-lambertian.clamp(0, 1).pow(32)) + ).cpu() + elif vizmode_shading == "lambertian": + lambertian = torch.einsum("id,id->i", + intersection_normals[is_intersecting, :], + to_light, + )[..., None].clamp(0, 1) + + if self.lambertian_color == (1.0, 1.0, 1.0): + pixel_view[mask, :] = (255 * lambertian).cpu() + else: + color = 255*torch.tensor(self.lambertian_color, device=device) + pixel_view[mask, :] = (color * + torch.einsum("id,id->i", + intersection_normals[is_intersecting, :], + to_cam[is_intersecting, :], + )[..., None]).int().cpu() + pixel_view[mask, :] = ( + 255 * lambertian.clamp(0, 1).pow(32) + + color * (lambertian + 0.25).clamp(0, 1) * (1-lambertian.clamp(0, 1).pow(32)) + ).cpu() + elif vizmode_shading == "translucent" and MARF: + lambertian = torch.einsum("id,id->i", + intersection_normals[is_intersecting, :], + to_light, + )[..., None].abs().clamp(0, 1) + + distortion = 0.08 + power = 16 + ambient = 0 + thickness = sphere_radii[is_intersecting].detach() + if self.display_mode_variation % 2: + thickness = thickness.mean() + + color1 = torch.tensor((1, 0.5, 0.5), **device_and_dtype) # subsurface + color2 = torch.tensor((0, 1, 1), **device_and_dtype) # diffuse + + l = to_light + intersection_normals[is_intersecting, :] * distortion + d = (to_cam[is_intersecting, :] * -l).sum(dim=-1).clamp(0, None).pow(power) + f = (d + ambient) * (1/(0.05 + thickness)) + + pixel_view[((dirs * to_light).sum(dim=-1) > 0.99).cpu(), :] = 255 # draw light source + + pixel_view[mask, :] = (255 * ( + color2 * (0.05 + lambertian*0.15) + + color1 * 0.3 * f[..., None] + ).clamp(0, 1)).cpu() + elif vizmode_shading == "anisotropic" and vizmode_normals != "ground_truth": + eigvals, eigvecs = torch.linalg.eig(shape_operator.mT) # slow, complex output, not sorted + eigvals, indices = eigvals.abs().sort(dim=-1) + eigvecs = (eigvecs.abs() * eigvecs.real.sign()).take_along_dim(indices[..., None, :], dim=-1) + eigvecs = eigvecs.mT + + s = self.display_mode_variation % 5 + if s in (0, 1): + # try to keep these below 0.2: + if s == 0: a1, a2 = 0.05, 0.3 + if s == 1: a1, a2 = 0.3, 0.05 + + # == Ward anisotropic specular reflectance == + + # G.J. Ward, Measuring and modeling anisotropic reflection, in: + # Proceedings of the 19th Annual Conference on Computer Graphics and + # Interactive Techniques, 1992: pp. 265–272. + + eigvecs /= eigvecs.norm(dim=-1, keepdim=True) + + N = intersection_normals[is_intersecting, :] + H = to_cam[is_intersecting, :] + to_light + H = H / H.norm(dim=-1, keepdim=True) + specular = (1/(4*torch.pi * a1*a2 * torch.sqrt(( + (N * to_cam[is_intersecting, :]).sum(dim=-1) * + (N * to_light ).sum(dim=-1) + )))) * torch.exp( + -2 * ( + ((H * eigvecs[..., 2, :]).sum(dim=-1) / a1).pow(2) + + + ((H * eigvecs[..., 1, :]).sum(dim=-1) / a2).pow(2) + ) / ( + 1 + (N * H).sum(dim=-1) + ) + ) + specular = specular.clamp(0, None).nan_to_num(0, 0, 0) + lambertian = torch.einsum("id,id->i", N, to_light ).clamp(0, None) + + color1 = 0.4 * torch.tensor((1, 1, 1), **device_and_dtype) # specular + color2 = 0.4 * torch.tensor((0, 1, 1), **device_and_dtype) # diffuse + pixel_view[mask, :] = (255 * ( + color1 * specular [..., None] + + color2 * lambertian[..., None] + ).clamp(0, 1)).int().cpu() + if s == 2: + pixel_view[mask, :] = (255 * ( + eigvecs[..., 2, :].abs().clamp(0, 1) # orientation only + )).int().cpu() + elif s == 3: + pixel_view[mask, :] = (255 * ( + eigvecs[..., 1, :].abs().clamp(0, 1) # orientation only + )).int().cpu() + elif s == 4: + pixel_view[mask, :] = (255 * ( + eigvecs[..., 0, :].abs().clamp(0, 1) # orientation only + )).int().cpu() + elif vizmode_shading == "shade-best-radii" and MARF: + lambertian = torch.einsum("id,id->i", + intersection_normals[is_intersecting, :], + to_light, + )[..., None] + + radii = sphere_radii[is_intersecting] + radii = radii - 0.04 + radii = radii / 0.4 + + colors = cm.plasma(radii.clamp(0, 1).cpu())[..., :3] + pixel_view[mask, :] = 255 * ( + lambertian.pow(32).clamp(0, 1).cpu().numpy() + + colors * (lambertian + 0.25).clamp(0, 1).cpu().numpy() * (1-lambertian.pow(32).clamp(0, 1)).cpu().numpy() + ) + elif vizmode_shading == "shade-all-radii" and MARF: + radii = sphere_radii[is_intersecting][..., None] + radii /= radii.max() + if n_atoms > 1: + color = torch.tensor(color_per_atom, device=device)[(*atom_indices[is_intersecting].T,)] + else: + color = torch.tensor(color_set[(0 if self.atom_index_solo is None else self.atom_index_solo) % len(color_set)], device=device) + pixel_view[mask, :] = (color * radii).int().cpu() + elif vizmode_shading == "normal": + normal = intersection_normals[is_intersecting, :] + pixel_view[mask, :] = (255 * (normal * 0.5 + 0.5) ).int().cpu() + elif vizmode_shading == "curvature" and vizmode_normals != "ground_truth": + eigvals = torch.linalg.eigvals(shape_operator.mT) # complex output, not sorted + + # we sort them by absolute magnitude, not the real component + _, indices = (eigvals.abs() * eigvals.real.sign()).sort(dim=-1) + eigvals = eigvals.real.take_along_dim(indices, dim=-1) + + s = self.display_mode_variation % (6 if MARF else 5) + if s==0: out = (eigvals[..., [0, 2]].mean(dim=-1, keepdim=True) / 25).tanh() # mean curvature + if s==1: out = (eigvals[..., [0, 2]].prod(dim=-1, keepdim=True) / 25).tanh() # gaussian curvature + if s==2: out = (eigvals[..., [2]] / 25).tanh() # maximum principal curvature - k1 + if s==3: out = (eigvals[..., [1]] / 25).tanh() # some curvature + if s==4: out = (eigvals[..., [0]] / 25).tanh() # minimum principal curvature - k2 + if s==5: out = ((sphere_radii[is_intersecting][..., None].detach() - 1 / eigvals[..., [2]].clamp(1e-8, None)) * 5).tanh().clamp(0, None) + + lambertian = torch.einsum("id,id->i", + intersection_normals[is_intersecting, :], + to_light, + )[..., None] + + pixel_view[mask, :] = (255 * (lambertian+0.5).clamp(0, 1) * torch.cat(( + 1+out.clamp(-1, 0), + 1-out.abs(), + 1-out.clamp(0, 1), + ), dim=-1)).int().cpu() + elif vizmode_shading == "centroid-grad-norm" and MARF: + asd = sphere_centers_jac[is_intersecting, :, :].norm(dim=-2).mean(dim=-1, keepdim=True) + asd -= asd.min() + asd /= asd.max() + pixel_view[mask, :] = (255 * asd).cpu() + elif "glass" in vizmode_shading: + normals = intersection_normals[is_intersecting, :] + to_cam_ = to_cam [is_intersecting, :] + # "Empiricial Approximation" of fresnel + # https://developer.download.nvidia.com/CgTutorial/cg_tutorial_chapter07.html via + # http://kylehalladay.com/blog/tutorial/2014/02/18/Fresnel-Shaders-From-The-Ground-Up.html + cos = torch.einsum("id,id->i", normals, to_cam_ )[..., None] + bias, scale, power = 0, 4, 3 + fresnel = (bias + scale*(1-cos)**power).clamp(0, 1) + + #reflection + reflection = -to_cam_ - 2*(-cos)*normals + + #refraction + r = 1 / 1.5 # refractive index, air -> glass + refraction = -r*to_cam_ + (r*cos - (1-r**2*(1-cos**2)).sqrt()) * normals + exit_point = intersections[is_intersecting, :] + + # reflect the refraction over the plane defined by the refraction direction and the sphere center, resulting in the second refraction + if vizmode_shading == "double-glass" and MARF: + cos2 = torch.einsum("id,id->i", refraction, -to_cam_ )[..., None] + pn = -to_cam_ - cos2*refraction + pn /= pn.norm(dim=-1, keepdim=True) + + refraction = -to_cam_ - 2*torch.einsum("id,id->i", pn, -to_cam_ )[..., None]*pn + + exit_point -= sphere_centers[is_intersecting, :] + exit_point = exit_point - 2*torch.einsum("id,id->i", pn, exit_point )[..., None]*pn + exit_point += sphere_centers[is_intersecting, :] + + fresnel = np.asanyarray(fresnel.cpu()) + pixel_view[mask, :] \ + = self.lookup_sphere_map_dirs(reflection, intersections[is_intersecting, :]) * fresnel \ + + self.lookup_sphere_map_dirs(refraction, exit_point) * (1-fresnel) + else: # flat + pixel_view[mask, :] = 80 + + if not MARF: return + + # overlay medial atoms + + if vizmode_spheres is not None: + # show miss distance in red + s = silhouettes.detach()[~is_intersecting].clamp(0, 1) + s /= s.max() + pixel_view[~mask, 1] = (s * 255).cpu() + pixel_view[:, 2] = pixel_view[:, 1] + + mouse_hits = 0 <= mx < w and 0 <= my < h and mask[mx, my] + draw_intersecting = "intersecting-sphere" in vizmode_spheres + draw_best = "best-sphere" in vizmode_spheres + draw_color = "-sphere-colored" in vizmode_spheres + draw_all = "all-spheres-colored" in vizmode_spheres + + def get_nears(): + if draw_all: + projected, near, far, is_intersecting = geometry.ray_sphere_intersect( + torch.tensor(origins), + torch.tensor(dirs[..., None, :]), + sphere_centers = all_sphere_centers[mx, my][None, None, ...], + sphere_radii = all_sphere_radii [mx, my][None, None, ...], + allow_nans = False, + return_parts = True, + ) + + depths = (near - origins).norm(dim=-1) + atom_indices_ = torch.where(is_intersecting, depths.detach(), depths.detach()+100).argmin(dim=-1, keepdim=True) + is_intersecting = is_intersecting.any(dim=-1) + projected = None + near = near.take_along_dim(atom_indices_[..., None], -2).squeeze(-2) + far = None + sphere_centers_ = all_sphere_centers[mx, my][None, None, ...].take_along_dim(atom_indices_[..., None], -2).squeeze(-2) + + normals = near[is_intersecting, :] - sphere_centers_[is_intersecting, :] + normals /= torch.linalg.norm(normals, dim=-1)[..., None] + + color = torch.tensor(color_per_atom, device=device)[(*atom_indices_[is_intersecting].T,)] + yield color, projected, near, far, is_intersecting, normals + + if (mouse_hits and draw_intersecting) or draw_best: + projected, near, far, is_intersecting = geometry.ray_sphere_intersect( + torch.tensor(origins), + torch.tensor(dirs), + # unit-sphere by default + sphere_centers = sphere_centers[mx, my][None, None, ...], + sphere_radii = sphere_radii [mx, my][None, None, ...], + return_parts = True, + ) + + normals = near[is_intersecting, :] - sphere_centers[mx, my][None, ...] + normals /= torch.linalg.norm(normals, dim=-1)[..., None] + color = (255, 255, 255) if not draw_color else color_per_atom[atom_indices[mx, my]] + yield torch.tensor(color, device=device), projected, near, far, is_intersecting, normals + + # draw sphere with lambertian shading + for color, projected, near, far, is_intersecting_2, normals in get_nears(): + lambertian = torch.einsum("...id,...id->...i", normals, to_light )[..., None] + pixel_view[is_intersecting_2.cpu(), :] = ( + 255*lambertian.pow(32).clamp(0, 1) + + color * (lambertian + 0.25).clamp(0, 1) * (1-lambertian.pow(32).clamp(0, 1)) + ).cpu() + + # overlay points / sphere centers + + if vizmode_centroids is not None: + cam2world_inv = torch.tensor(self.cam2world_inv, **device_and_dtype) + intrinsics = torch.tensor(self.intrinsics, **device_and_dtype) + + def get_coords(): + miss_centroid = "miss-centroids" in vizmode_centroids + mask = is_intersecting if not miss_centroid else ~is_intersecting + if vizmode_centroids in ("all-centroids-colored", "all-miss-centroids-colored"): + # we use temporal dithering to the show all overlapping centers + for color, atom_index in sorted(zip(itertools.chain(color_set), range(n_atoms)), key=lambda x: random.random()): + yield color, all_sphere_centers[..., atom_index, :][mask], mask + elif "all-centroids" in vizmode_centroids: + yield (80, 150, 80), all_sphere_centers[mask].reshape(-1, 3), mask # [:, 3] + + if "centroids-colored" in vizmode_centroids: + if n_atoms == 1: + color = color_set[(0 if self.atom_index_solo is None else self.atom_index_solo) % len(color_set)] + else: + color = torch.tensor(color_per_atom, device=device)[(*atom_indices[mask].T,)].cpu() + else: + color = (0, 0, 0) + yield color, sphere_centers[mask], mask + + for i, (color, coords, coord_mask) in enumerate(get_coords()): + if self.export_medial_surface_mesh: + fname = self.mk_dump_fname("ply", uid=i) + p = torch.zeros_like(sphere_centers) + c = torch.zeros_like(sphere_centers) + p[coord_mask, :] = coords + c[coord_mask, :] = torch.tensor(color, device=p.device) / 255 + SingleViewUVScan( + hits = ( mask).numpy(), + miss = (~mask).numpy(), + points = p.cpu().numpy(), + colors = c.cpu().numpy(), + normals=None, distances=None, cam_pos=None, + cam_mat4=None, proj_mat4=None, transforms=None, + ).to_mesh().export(str(fname), file_type="ply") + print("dumped", fname) + if shutil.which("f3d"): + subprocess.Popen(["f3d", "-gsy", "--up=+z", "--bg-color=1,1,1", fname], close_fds=True) + + coords = torch.cat((coords, torch.ones((*coords.shape[:-1], 1), **device_and_dtype)), dim=-1) + + coords = torch.einsum("...ij,...kj->...ki", cam2world_inv, coords)[..., :3] + coords = geometry.project(coords[..., 0], coords[..., 1], coords[..., 2], intrinsics) + + in_view = functools.reduce(torch.mul, ( + coords[:, 0] < pixel_view.shape[1], + coords[:, 0] >= 0, + coords[:, 1] < pixel_view.shape[0], + coords[:, 1] >= 0, + )).cpu() + + coords = coords[in_view, :] + if not isinstance(color, tuple): + color = color[in_view, :] + + pixel_view[(*coords[..., [1, 0]].int().T.cpu(),)] = color + + self.export_medial_surface_mesh = False diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..96a9658 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,6369 @@ +# This file is automatically @generated by Poetry and should not be changed by hand. + +[[package]] +name = "absl-py" +version = "1.4.0" +description = "Abseil Python Common Libraries, see https://github.com/abseil/abseil-py." +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "absl-py-1.4.0.tar.gz", hash = "sha256:d2c244d01048ba476e7c080bd2c6df5e141d211de80223460d5b3b8a2a58433d"}, + {file = "absl_py-1.4.0-py3-none-any.whl", hash = "sha256:0d3fe606adfa4f7db64792dd4c7aee4ee0c38ab75dfd353b7a83ed3e957fcb47"}, +] + +[[package]] +name = "aiofiles" +version = "22.1.0" +description = "File support for asyncio." +category = "dev" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "aiofiles-22.1.0-py3-none-any.whl", hash = "sha256:1142fa8e80dbae46bb6339573ad4c8c0841358f79c6eb50a493dceca14621bad"}, + {file = "aiofiles-22.1.0.tar.gz", hash = "sha256:9107f1ca0b2a5553987a94a3c9959fe5b491fdf731389aa5b7b1bd0733e32de6"}, +] + +[[package]] +name = "aiohttp" +version = "3.8.4" +description = "Async http client/server framework (asyncio)" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "aiohttp-3.8.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5ce45967538fb747370308d3145aa68a074bdecb4f3a300869590f725ced69c1"}, + {file = "aiohttp-3.8.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b744c33b6f14ca26b7544e8d8aadff6b765a80ad6164fb1a430bbadd593dfb1a"}, + {file = "aiohttp-3.8.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1a45865451439eb320784918617ba54b7a377e3501fb70402ab84d38c2cd891b"}, + {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a86d42d7cba1cec432d47ab13b6637bee393a10f664c425ea7b305d1301ca1a3"}, + {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee3c36df21b5714d49fc4580247947aa64bcbe2939d1b77b4c8dcb8f6c9faecc"}, + {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:176a64b24c0935869d5bbc4c96e82f89f643bcdf08ec947701b9dbb3c956b7dd"}, + {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c844fd628851c0bc309f3c801b3a3d58ce430b2ce5b359cd918a5a76d0b20cb5"}, + {file = "aiohttp-3.8.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5393fb786a9e23e4799fec788e7e735de18052f83682ce2dfcabaf1c00c2c08e"}, + {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e4b09863aae0dc965c3ef36500d891a3ff495a2ea9ae9171e4519963c12ceefd"}, + {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:adfbc22e87365a6e564c804c58fc44ff7727deea782d175c33602737b7feadb6"}, + {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:147ae376f14b55f4f3c2b118b95be50a369b89b38a971e80a17c3fd623f280c9"}, + {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:eafb3e874816ebe2a92f5e155f17260034c8c341dad1df25672fb710627c6949"}, + {file = "aiohttp-3.8.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c6cc15d58053c76eacac5fa9152d7d84b8d67b3fde92709195cb984cfb3475ea"}, + {file = "aiohttp-3.8.4-cp310-cp310-win32.whl", hash = "sha256:59f029a5f6e2d679296db7bee982bb3d20c088e52a2977e3175faf31d6fb75d1"}, + {file = "aiohttp-3.8.4-cp310-cp310-win_amd64.whl", hash = "sha256:fe7ba4a51f33ab275515f66b0a236bcde4fb5561498fe8f898d4e549b2e4509f"}, + {file = "aiohttp-3.8.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3d8ef1a630519a26d6760bc695842579cb09e373c5f227a21b67dc3eb16cfea4"}, + {file = "aiohttp-3.8.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b3f2e06a512e94722886c0827bee9807c86a9f698fac6b3aee841fab49bbfb4"}, + {file = "aiohttp-3.8.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a80464982d41b1fbfe3154e440ba4904b71c1a53e9cd584098cd41efdb188ef"}, + {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b631e26df63e52f7cce0cce6507b7a7f1bc9b0c501fcde69742130b32e8782f"}, + {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f43255086fe25e36fd5ed8f2ee47477408a73ef00e804cb2b5cba4bf2ac7f5e"}, + {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4d347a172f866cd1d93126d9b239fcbe682acb39b48ee0873c73c933dd23bd0f"}, + {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3fec6a4cb5551721cdd70473eb009d90935b4063acc5f40905d40ecfea23e05"}, + {file = "aiohttp-3.8.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80a37fe8f7c1e6ce8f2d9c411676e4bc633a8462844e38f46156d07a7d401654"}, + {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d1e6a862b76f34395a985b3cd39a0d949ca80a70b6ebdea37d3ab39ceea6698a"}, + {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cd468460eefef601ece4428d3cf4562459157c0f6523db89365202c31b6daebb"}, + {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:618c901dd3aad4ace71dfa0f5e82e88b46ef57e3239fc7027773cb6d4ed53531"}, + {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:652b1bff4f15f6287550b4670546a2947f2a4575b6c6dff7760eafb22eacbf0b"}, + {file = "aiohttp-3.8.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80575ba9377c5171407a06d0196b2310b679dc752d02a1fcaa2bc20b235dbf24"}, + {file = "aiohttp-3.8.4-cp311-cp311-win32.whl", hash = "sha256:bbcf1a76cf6f6dacf2c7f4d2ebd411438c275faa1dc0c68e46eb84eebd05dd7d"}, + {file = "aiohttp-3.8.4-cp311-cp311-win_amd64.whl", hash = "sha256:6e74dd54f7239fcffe07913ff8b964e28b712f09846e20de78676ce2a3dc0bfc"}, + {file = "aiohttp-3.8.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:880e15bb6dad90549b43f796b391cfffd7af373f4646784795e20d92606b7a51"}, + {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb96fa6b56bb536c42d6a4a87dfca570ff8e52de2d63cabebfd6fb67049c34b6"}, + {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a6cadebe132e90cefa77e45f2d2f1a4b2ce5c6b1bfc1656c1ddafcfe4ba8131"}, + {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f352b62b45dff37b55ddd7b9c0c8672c4dd2eb9c0f9c11d395075a84e2c40f75"}, + {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ab43061a0c81198d88f39aaf90dae9a7744620978f7ef3e3708339b8ed2ef01"}, + {file = "aiohttp-3.8.4-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9cb1565a7ad52e096a6988e2ee0397f72fe056dadf75d17fa6b5aebaea05622"}, + {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:1b3ea7edd2d24538959c1c1abf97c744d879d4e541d38305f9bd7d9b10c9ec41"}, + {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:7c7837fe8037e96b6dd5cfcf47263c1620a9d332a87ec06a6ca4564e56bd0f36"}, + {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:3b90467ebc3d9fa5b0f9b6489dfb2c304a1db7b9946fa92aa76a831b9d587e99"}, + {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:cab9401de3ea52b4b4c6971db5fb5c999bd4260898af972bf23de1c6b5dd9d71"}, + {file = "aiohttp-3.8.4-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d1f9282c5f2b5e241034a009779e7b2a1aa045f667ff521e7948ea9b56e0c5ff"}, + {file = "aiohttp-3.8.4-cp36-cp36m-win32.whl", hash = "sha256:5e14f25765a578a0a634d5f0cd1e2c3f53964553a00347998dfdf96b8137f777"}, + {file = "aiohttp-3.8.4-cp36-cp36m-win_amd64.whl", hash = "sha256:4c745b109057e7e5f1848c689ee4fb3a016c8d4d92da52b312f8a509f83aa05e"}, + {file = "aiohttp-3.8.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:aede4df4eeb926c8fa70de46c340a1bc2c6079e1c40ccf7b0eae1313ffd33519"}, + {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ddaae3f3d32fc2cb4c53fab020b69a05c8ab1f02e0e59665c6f7a0d3a5be54f"}, + {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4eb3b82ca349cf6fadcdc7abcc8b3a50ab74a62e9113ab7a8ebc268aad35bb9"}, + {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bcb89336efa095ea21b30f9e686763f2be4478f1b0a616969551982c4ee4c3b"}, + {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c08e8ed6fa3d477e501ec9db169bfac8140e830aa372d77e4a43084d8dd91ab"}, + {file = "aiohttp-3.8.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c6cd05ea06daca6ad6a4ca3ba7fe7dc5b5de063ff4daec6170ec0f9979f6c332"}, + {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7a00a9ed8d6e725b55ef98b1b35c88013245f35f68b1b12c5cd4100dddac333"}, + {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:de04b491d0e5007ee1b63a309956eaed959a49f5bb4e84b26c8f5d49de140fa9"}, + {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:40653609b3bf50611356e6b6554e3a331f6879fa7116f3959b20e3528783e699"}, + {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dbf3a08a06b3f433013c143ebd72c15cac33d2914b8ea4bea7ac2c23578815d6"}, + {file = "aiohttp-3.8.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:854f422ac44af92bfe172d8e73229c270dc09b96535e8a548f99c84f82dde241"}, + {file = "aiohttp-3.8.4-cp37-cp37m-win32.whl", hash = "sha256:aeb29c84bb53a84b1a81c6c09d24cf33bb8432cc5c39979021cc0f98c1292a1a"}, + {file = "aiohttp-3.8.4-cp37-cp37m-win_amd64.whl", hash = "sha256:db3fc6120bce9f446d13b1b834ea5b15341ca9ff3f335e4a951a6ead31105480"}, + {file = "aiohttp-3.8.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fabb87dd8850ef0f7fe2b366d44b77d7e6fa2ea87861ab3844da99291e81e60f"}, + {file = "aiohttp-3.8.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:91f6d540163f90bbaef9387e65f18f73ffd7c79f5225ac3d3f61df7b0d01ad15"}, + {file = "aiohttp-3.8.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d265f09a75a79a788237d7f9054f929ced2e69eb0bb79de3798c468d8a90f945"}, + {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d89efa095ca7d442a6d0cbc755f9e08190ba40069b235c9886a8763b03785da"}, + {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4dac314662f4e2aa5009977b652d9b8db7121b46c38f2073bfeed9f4049732cd"}, + {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe11310ae1e4cd560035598c3f29d86cef39a83d244c7466f95c27ae04850f10"}, + {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ddb2a2026c3f6a68c3998a6c47ab6795e4127315d2e35a09997da21865757f8"}, + {file = "aiohttp-3.8.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e75b89ac3bd27d2d043b234aa7b734c38ba1b0e43f07787130a0ecac1e12228a"}, + {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6e601588f2b502c93c30cd5a45bfc665faaf37bbe835b7cfd461753068232074"}, + {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a5d794d1ae64e7753e405ba58e08fcfa73e3fad93ef9b7e31112ef3c9a0efb52"}, + {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:a1f4689c9a1462f3df0a1f7e797791cd6b124ddbee2b570d34e7f38ade0e2c71"}, + {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3032dcb1c35bc330134a5b8a5d4f68c1a87252dfc6e1262c65a7e30e62298275"}, + {file = "aiohttp-3.8.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8189c56eb0ddbb95bfadb8f60ea1b22fcfa659396ea36f6adcc521213cd7b44d"}, + {file = "aiohttp-3.8.4-cp38-cp38-win32.whl", hash = "sha256:33587f26dcee66efb2fff3c177547bd0449ab7edf1b73a7f5dea1e38609a0c54"}, + {file = "aiohttp-3.8.4-cp38-cp38-win_amd64.whl", hash = "sha256:e595432ac259af2d4630008bf638873d69346372d38255774c0e286951e8b79f"}, + {file = "aiohttp-3.8.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5a7bdf9e57126dc345b683c3632e8ba317c31d2a41acd5800c10640387d193ed"}, + {file = "aiohttp-3.8.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:22f6eab15b6db242499a16de87939a342f5a950ad0abaf1532038e2ce7d31567"}, + {file = "aiohttp-3.8.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7235604476a76ef249bd64cb8274ed24ccf6995c4a8b51a237005ee7a57e8643"}, + {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea9eb976ffdd79d0e893869cfe179a8f60f152d42cb64622fca418cd9b18dc2a"}, + {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92c0cea74a2a81c4c76b62ea1cac163ecb20fb3ba3a75c909b9fa71b4ad493cf"}, + {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:493f5bc2f8307286b7799c6d899d388bbaa7dfa6c4caf4f97ef7521b9cb13719"}, + {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a63f03189a6fa7c900226e3ef5ba4d3bd047e18f445e69adbd65af433add5a2"}, + {file = "aiohttp-3.8.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10c8cefcff98fd9168cdd86c4da8b84baaa90bf2da2269c6161984e6737bf23e"}, + {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bca5f24726e2919de94f047739d0a4fc01372801a3672708260546aa2601bf57"}, + {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:03baa76b730e4e15a45f81dfe29a8d910314143414e528737f8589ec60cf7391"}, + {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:8c29c77cc57e40f84acef9bfb904373a4e89a4e8b74e71aa8075c021ec9078c2"}, + {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:03543dcf98a6619254b409be2d22b51f21ec66272be4ebda7b04e6412e4b2e14"}, + {file = "aiohttp-3.8.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:17b79c2963db82086229012cff93ea55196ed31f6493bb1ccd2c62f1724324e4"}, + {file = "aiohttp-3.8.4-cp39-cp39-win32.whl", hash = "sha256:34ce9f93a4a68d1272d26030655dd1b58ff727b3ed2a33d80ec433561b03d67a"}, + {file = "aiohttp-3.8.4-cp39-cp39-win_amd64.whl", hash = "sha256:41a86a69bb63bb2fc3dc9ad5ea9f10f1c9c8e282b471931be0268ddd09430b04"}, + {file = "aiohttp-3.8.4.tar.gz", hash = "sha256:bf2e1a9162c1e441bf805a1fd166e249d574ca04e03b34f97e2928769e91ab5c"}, +] + +[package.dependencies] +aiosignal = ">=1.1.2" +async-timeout = ">=4.0.0a3,<5.0" +attrs = ">=17.3.0" +charset-normalizer = ">=2.0,<4.0" +frozenlist = ">=1.1.1" +multidict = ">=4.5,<7.0" +yarl = ">=1.0,<2.0" + +[package.extras] +speedups = ["Brotli", "aiodns", "cchardet"] + +[[package]] +name = "aiosignal" +version = "1.3.1" +description = "aiosignal: a list of registered asynchronous callbacks" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, + {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, +] + +[package.dependencies] +frozenlist = ">=1.1.0" + +[[package]] +name = "aiosqlite" +version = "0.18.0" +description = "asyncio bridge to the standard sqlite3 module" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "aiosqlite-0.18.0-py3-none-any.whl", hash = "sha256:c3511b841e3a2c5614900ba1d179f366826857586f78abd75e7cbeb88e75a557"}, + {file = "aiosqlite-0.18.0.tar.gz", hash = "sha256:faa843ef5fb08bafe9a9b3859012d3d9d6f77ce3637899de20606b7fc39aa213"}, +] + +[[package]] +name = "ansiwrap" +version = "0.8.4" +description = "textwrap, but savvy to ANSI colors and styles" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "ansiwrap-0.8.4-py2.py3-none-any.whl", hash = "sha256:7b053567c88e1ad9eed030d3ac41b722125e4c1271c8a99ade797faff1f49fb1"}, + {file = "ansiwrap-0.8.4.zip", hash = "sha256:ca0c740734cde59bf919f8ff2c386f74f9a369818cdc60efe94893d01ea8d9b7"}, +] + +[package.dependencies] +textwrap3 = ">=0.9.2" + +[[package]] +name = "anyio" +version = "3.6.2" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +category = "dev" +optional = false +python-versions = ">=3.6.2" +files = [ + {file = "anyio-3.6.2-py3-none-any.whl", hash = "sha256:fbbe32bd270d2a2ef3ed1c5d45041250284e31fc0a4df4a5a6071842051a51e3"}, + {file = "anyio-3.6.2.tar.gz", hash = "sha256:25ea0d673ae30af41a0c442f81cf3b38c7e79fdc7b60335a4c14e05eb0947421"}, +] + +[package.dependencies] +idna = ">=2.8" +sniffio = ">=1.1" + +[package.extras] +doc = ["packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["contextlib2", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (<0.15)", "uvloop (>=0.15)"] +trio = ["trio (>=0.16,<0.22)"] + +[[package]] +name = "appdirs" +version = "1.4.4" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, + {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, +] + +[[package]] +name = "appnope" +version = "0.1.3" +description = "Disable App Nap on macOS >= 10.9" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, + {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, +] + +[[package]] +name = "argon2-cffi" +version = "21.3.0" +description = "The secure Argon2 password hashing algorithm." +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "argon2-cffi-21.3.0.tar.gz", hash = "sha256:d384164d944190a7dd7ef22c6aa3ff197da12962bd04b17f64d4e93d934dba5b"}, + {file = "argon2_cffi-21.3.0-py3-none-any.whl", hash = "sha256:8c976986f2c5c0e5000919e6de187906cfd81fb1c72bf9d88c01177e77da7f80"}, +] + +[package.dependencies] +argon2-cffi-bindings = "*" + +[package.extras] +dev = ["cogapp", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "pre-commit", "pytest", "sphinx", "sphinx-notfound-page", "tomli"] +docs = ["furo", "sphinx", "sphinx-notfound-page"] +tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pytest"] + +[[package]] +name = "argon2-cffi-bindings" +version = "21.2.0" +description = "Low-level CFFI bindings for Argon2" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_i686.whl", hash = "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win32.whl", hash = "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f"}, + {file = "argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3e385d1c39c520c08b53d63300c3ecc28622f076f4c2b0e6d7e796e9f6502194"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c3e3cc67fdb7d82c4718f19b4e7a87123caf8a93fde7e23cf66ac0337d3cb3f"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a22ad9800121b71099d0fb0a65323810a15f2e292f2ba450810a7316e128ee5"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9f8b450ed0547e3d473fdc8612083fd08dd2120d6ac8f73828df9b7d45bb351"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:93f9bf70084f97245ba10ee36575f0c3f1e7d7724d67d8e5b08e61787c320ed7"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3b9ef65804859d335dc6b31582cad2c5166f0c3e7975f324d9ffaa34ee7e6583"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4966ef5848d820776f5f562a7d45fdd70c2f330c961d0d745b784034bd9f48d"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20ef543a89dee4db46a1a6e206cd015360e5a75822f76df533845c3cbaf72670"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed2937d286e2ad0cc79a7087d3c272832865f779430e0cc2b4f3718d3159b0cb"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5e00316dabdaea0b2dd82d141cc66889ced0cdcbfa599e8b471cf22c620c329a"}, +] + +[package.dependencies] +cffi = ">=1.0.1" + +[package.extras] +dev = ["cogapp", "pre-commit", "pytest", "wheel"] +tests = ["pytest"] + +[[package]] +name = "arrow" +version = "1.2.3" +description = "Better dates & times for Python" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "arrow-1.2.3-py3-none-any.whl", hash = "sha256:5a49ab92e3b7b71d96cd6bfcc4df14efefc9dfa96ea19045815914a6ab6b1fe2"}, + {file = "arrow-1.2.3.tar.gz", hash = "sha256:3934b30ca1b9f292376d9db15b19446088d12ec58629bc3f0da28fd55fb633a1"}, +] + +[package.dependencies] +python-dateutil = ">=2.7.0" + +[[package]] +name = "astroid" +version = "2.15.0" +description = "An abstract syntax tree for Python with inference support." +category = "dev" +optional = false +python-versions = ">=3.7.2" +files = [ + {file = "astroid-2.15.0-py3-none-any.whl", hash = "sha256:e3e4d0ffc2d15d954065579689c36aac57a339a4679a679579af6401db4d3fdb"}, + {file = "astroid-2.15.0.tar.gz", hash = "sha256:525f126d5dc1b8b0b6ee398b33159105615d92dc4a17f2cd064125d57f6186fa"}, +] + +[package.dependencies] +lazy-object-proxy = ">=1.4.0" +typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} +wrapt = {version = ">=1.11,<2", markers = "python_version < \"3.11\""} + +[[package]] +name = "asttokens" +version = "2.2.1" +description = "Annotate AST trees with source code positions" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "asttokens-2.2.1-py2.py3-none-any.whl", hash = "sha256:6b0ac9e93fb0335014d382b8fa9b3afa7df546984258005da0b9e7095b3deb1c"}, + {file = "asttokens-2.2.1.tar.gz", hash = "sha256:4622110b2a6f30b77e1473affaa97e711bc2f07d3f10848420ff1898edbe94f3"}, +] + +[package.dependencies] +six = "*" + +[package.extras] +test = ["astroid", "pytest"] + +[[package]] +name = "async-timeout" +version = "4.0.2" +description = "Timeout context manager for asyncio programs" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, + {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, +] + +[[package]] +name = "attrs" +version = "22.2.0" +description = "Classes Without Boilerplate" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "attrs-22.2.0-py3-none-any.whl", hash = "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836"}, + {file = "attrs-22.2.0.tar.gz", hash = "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99"}, +] + +[package.extras] +cov = ["attrs[tests]", "coverage-enable-subprocess", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope.interface"] +tests = ["attrs[tests-no-zope]", "zope.interface"] +tests-no-zope = ["cloudpickle", "cloudpickle", "hypothesis", "hypothesis", "mypy (>=0.971,<0.990)", "mypy (>=0.971,<0.990)", "pympler", "pympler", "pytest (>=4.3.0)", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-mypy-plugins", "pytest-xdist[psutil]", "pytest-xdist[psutil]"] + +[[package]] +name = "autopep8" +version = "1.6.0" +description = "A tool that automatically formats Python code to conform to the PEP 8 style guide" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "autopep8-1.6.0-py2.py3-none-any.whl", hash = "sha256:ed77137193bbac52d029a52c59bec1b0629b5a186c495f1eb21b126ac466083f"}, + {file = "autopep8-1.6.0.tar.gz", hash = "sha256:44f0932855039d2c15c4510d6df665e4730f2b8582704fa48f9c55bd3e17d979"}, +] + +[package.dependencies] +pycodestyle = ">=2.8.0" +toml = "*" + +[[package]] +name = "babel" +version = "2.12.1" +description = "Internationalization utilities" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Babel-2.12.1-py3-none-any.whl", hash = "sha256:b4246fb7677d3b98f501a39d43396d3cafdc8eadb045f4a31be01863f655c610"}, + {file = "Babel-2.12.1.tar.gz", hash = "sha256:cc2d99999cd01d44420ae725a21c9e3711b3aadc7976d6147f622d8581963455"}, +] + +[[package]] +name = "backcall" +version = "0.2.0" +description = "Specifications for callback functions passed in to an API" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, + {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, +] + +[[package]] +name = "baron" +version = "0.10.1" +description = "Full Syntax Tree for python to make writing refactoring code a realist task" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "baron-0.10.1-py2.py3-none-any.whl", hash = "sha256:befb33f4b9e832c7cd1e3cf0eafa6dd3cb6ed4cb2544245147c019936f4e0a8a"}, + {file = "baron-0.10.1.tar.gz", hash = "sha256:af822ad44d4eb425c8516df4239ac4fdba9fdb398ef77e4924cd7c9b4045bc2f"}, +] + +[package.dependencies] +rply = "*" + +[[package]] +name = "beautifulsoup4" +version = "4.12.0" +description = "Screen-scraping library" +category = "dev" +optional = false +python-versions = ">=3.6.0" +files = [ + {file = "beautifulsoup4-4.12.0-py3-none-any.whl", hash = "sha256:2130a5ad7f513200fae61a17abb5e338ca980fa28c439c0571014bc0217e9591"}, + {file = "beautifulsoup4-4.12.0.tar.gz", hash = "sha256:c5fceeaec29d09c84970e47c65f2f0efe57872f7cff494c9691a26ec0ff13234"}, +] + +[package.dependencies] +soupsieve = ">1.2" + +[package.extras] +html5lib = ["html5lib"] +lxml = ["lxml"] + +[[package]] +name = "bleach" +version = "6.0.0" +description = "An easy safelist-based HTML-sanitizing tool." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "bleach-6.0.0-py3-none-any.whl", hash = "sha256:33c16e3353dbd13028ab4799a0f89a83f113405c766e9c122df8a06f5b85b3f4"}, + {file = "bleach-6.0.0.tar.gz", hash = "sha256:1a1a85c1595e07d8db14c5f09f09e6433502c51c595970edc090551f0db99414"}, +] + +[package.dependencies] +six = ">=1.9.0" +webencodings = "*" + +[package.extras] +css = ["tinycss2 (>=1.1.0,<1.2)"] + +[[package]] +name = "cachetools" +version = "5.3.0" +description = "Extensible memoizing collections and decorators" +category = "dev" +optional = false +python-versions = "~=3.7" +files = [ + {file = "cachetools-5.3.0-py3-none-any.whl", hash = "sha256:429e1a1e845c008ea6c85aa35d4b98b65d6a9763eeef3e37e92728a12d1de9d4"}, + {file = "cachetools-5.3.0.tar.gz", hash = "sha256:13dfddc7b8df938c21a940dfa6557ce6e94a2f1cdfa58eb90c805721d58f2c14"}, +] + +[[package]] +name = "certifi" +version = "2022.12.7" +description = "Python package for providing Mozilla's CA Bundle." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"}, + {file = "certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"}, +] + +[[package]] +name = "cffi" +version = "1.15.1" +description = "Foreign Function Interface for Python calling C code." +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, + {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, + {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, + {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, + {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, + {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, + {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, + {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, + {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, + {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, + {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, + {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, + {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, + {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, + {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, + {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, + {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, + {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, + {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "charset-normalizer" +version = "3.1.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "main" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, + {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, +] + +[[package]] +name = "click" +version = "8.1.3" +description = "Composable command line interface toolkit" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "comm" +version = "0.1.3" +description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "comm-0.1.3-py3-none-any.whl", hash = "sha256:16613c6211e20223f215fc6d3b266a247b6e2641bf4e0a3ad34cb1aff2aa3f37"}, + {file = "comm-0.1.3.tar.gz", hash = "sha256:a61efa9daffcfbe66fd643ba966f846a624e4e6d6767eda9cf6e993aadaab93e"}, +] + +[package.dependencies] +traitlets = ">=5.3" + +[package.extras] +lint = ["black (>=22.6.0)", "mdformat (>0.7)", "mdformat-gfm (>=0.3.5)", "ruff (>=0.0.156)"] +test = ["pytest"] +typing = ["mypy (>=0.990)"] + +[[package]] +name = "contourpy" +version = "1.0.7" +description = "Python library for calculating contours of 2D quadrilateral grids" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "contourpy-1.0.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:95c3acddf921944f241b6773b767f1cbce71d03307270e2d769fd584d5d1092d"}, + {file = "contourpy-1.0.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fc1464c97579da9f3ab16763c32e5c5d5bb5fa1ec7ce509a4ca6108b61b84fab"}, + {file = "contourpy-1.0.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8acf74b5d383414401926c1598ed77825cd530ac7b463ebc2e4f46638f56cce6"}, + {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c71fdd8f1c0f84ffd58fca37d00ca4ebaa9e502fb49825484da075ac0b0b803"}, + {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f99e9486bf1bb979d95d5cffed40689cb595abb2b841f2991fc894b3452290e8"}, + {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87f4d8941a9564cda3f7fa6a6cd9b32ec575830780677932abdec7bcb61717b0"}, + {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9e20e5a1908e18aaa60d9077a6d8753090e3f85ca25da6e25d30dc0a9e84c2c6"}, + {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a877ada905f7d69b2a31796c4b66e31a8068b37aa9b78832d41c82fc3e056ddd"}, + {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6381fa66866b0ea35e15d197fc06ac3840a9b2643a6475c8fff267db8b9f1e69"}, + {file = "contourpy-1.0.7-cp310-cp310-win32.whl", hash = "sha256:3c184ad2433635f216645fdf0493011a4667e8d46b34082f5a3de702b6ec42e3"}, + {file = "contourpy-1.0.7-cp310-cp310-win_amd64.whl", hash = "sha256:3caea6365b13119626ee996711ab63e0c9d7496f65641f4459c60a009a1f3e80"}, + {file = "contourpy-1.0.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ed33433fc3820263a6368e532f19ddb4c5990855e4886088ad84fd7c4e561c71"}, + {file = "contourpy-1.0.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:38e2e577f0f092b8e6774459317c05a69935a1755ecfb621c0a98f0e3c09c9a5"}, + {file = "contourpy-1.0.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ae90d5a8590e5310c32a7630b4b8618cef7563cebf649011da80874d0aa8f414"}, + {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:130230b7e49825c98edf0b428b7aa1125503d91732735ef897786fe5452b1ec2"}, + {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58569c491e7f7e874f11519ef46737cea1d6eda1b514e4eb5ac7dab6aa864d02"}, + {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54d43960d809c4c12508a60b66cb936e7ed57d51fb5e30b513934a4a23874fae"}, + {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:152fd8f730c31fd67fe0ffebe1df38ab6a669403da93df218801a893645c6ccc"}, + {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:9056c5310eb1daa33fc234ef39ebfb8c8e2533f088bbf0bc7350f70a29bde1ac"}, + {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a9d7587d2fdc820cc9177139b56795c39fb8560f540bba9ceea215f1f66e1566"}, + {file = "contourpy-1.0.7-cp311-cp311-win32.whl", hash = "sha256:4ee3ee247f795a69e53cd91d927146fb16c4e803c7ac86c84104940c7d2cabf0"}, + {file = "contourpy-1.0.7-cp311-cp311-win_amd64.whl", hash = "sha256:5caeacc68642e5f19d707471890f037a13007feba8427eb7f2a60811a1fc1350"}, + {file = "contourpy-1.0.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fd7dc0e6812b799a34f6d12fcb1000539098c249c8da54f3566c6a6461d0dbad"}, + {file = "contourpy-1.0.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0f9d350b639db6c2c233d92c7f213d94d2e444d8e8fc5ca44c9706cf72193772"}, + {file = "contourpy-1.0.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e96a08b62bb8de960d3a6afbc5ed8421bf1a2d9c85cc4ea73f4bc81b4910500f"}, + {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:031154ed61f7328ad7f97662e48660a150ef84ee1bc8876b6472af88bf5a9b98"}, + {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e9ebb4425fc1b658e13bace354c48a933b842d53c458f02c86f371cecbedecc"}, + {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efb8f6d08ca7998cf59eaf50c9d60717f29a1a0a09caa46460d33b2924839dbd"}, + {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6c180d89a28787e4b73b07e9b0e2dac7741261dbdca95f2b489c4f8f887dd810"}, + {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b8d587cc39057d0afd4166083d289bdeff221ac6d3ee5046aef2d480dc4b503c"}, + {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:769eef00437edf115e24d87f8926955f00f7704bede656ce605097584f9966dc"}, + {file = "contourpy-1.0.7-cp38-cp38-win32.whl", hash = "sha256:62398c80ef57589bdbe1eb8537127321c1abcfdf8c5f14f479dbbe27d0322e66"}, + {file = "contourpy-1.0.7-cp38-cp38-win_amd64.whl", hash = "sha256:57119b0116e3f408acbdccf9eb6ef19d7fe7baf0d1e9aaa5381489bc1aa56556"}, + {file = "contourpy-1.0.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:30676ca45084ee61e9c3da589042c24a57592e375d4b138bd84d8709893a1ba4"}, + {file = "contourpy-1.0.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e927b3868bd1e12acee7cc8f3747d815b4ab3e445a28d2e5373a7f4a6e76ba1"}, + {file = "contourpy-1.0.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:366a0cf0fc079af5204801786ad7a1c007714ee3909e364dbac1729f5b0849e5"}, + {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89ba9bb365446a22411f0673abf6ee1fea3b2cf47b37533b970904880ceb72f3"}, + {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:71b0bf0c30d432278793d2141362ac853859e87de0a7dee24a1cea35231f0d50"}, + {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7281244c99fd7c6f27c1c6bfafba878517b0b62925a09b586d88ce750a016d2"}, + {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b6d0f9e1d39dbfb3977f9dd79f156c86eb03e57a7face96f199e02b18e58d32a"}, + {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7f6979d20ee5693a1057ab53e043adffa1e7418d734c1532e2d9e915b08d8ec2"}, + {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5dd34c1ae752515318224cba7fc62b53130c45ac6a1040c8b7c1a223c46e8967"}, + {file = "contourpy-1.0.7-cp39-cp39-win32.whl", hash = "sha256:c5210e5d5117e9aec8c47d9156d1d3835570dd909a899171b9535cb4a3f32693"}, + {file = "contourpy-1.0.7-cp39-cp39-win_amd64.whl", hash = "sha256:60835badb5ed5f4e194a6f21c09283dd6e007664a86101431bf870d9e86266c4"}, + {file = "contourpy-1.0.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ce41676b3d0dd16dbcfabcc1dc46090aaf4688fd6e819ef343dbda5a57ef0161"}, + {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a011cf354107b47c58ea932d13b04d93c6d1d69b8b6dce885e642531f847566"}, + {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:31a55dccc8426e71817e3fe09b37d6d48ae40aae4ecbc8c7ad59d6893569c436"}, + {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69f8ff4db108815addd900a74df665e135dbbd6547a8a69333a68e1f6e368ac2"}, + {file = "contourpy-1.0.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efe99298ba37e37787f6a2ea868265465410822f7bea163edcc1bd3903354ea9"}, + {file = "contourpy-1.0.7-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a1e97b86f73715e8670ef45292d7cc033548266f07d54e2183ecb3c87598888f"}, + {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc331c13902d0f50845099434cd936d49d7a2ca76cb654b39691974cb1e4812d"}, + {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24847601071f740837aefb730e01bd169fbcaa610209779a78db7ebb6e6a7051"}, + {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abf298af1e7ad44eeb93501e40eb5a67abbf93b5d90e468d01fc0c4451971afa"}, + {file = "contourpy-1.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:64757f6460fc55d7e16ed4f1de193f362104285c667c112b50a804d482777edd"}, + {file = "contourpy-1.0.7.tar.gz", hash = "sha256:d8165a088d31798b59e91117d1f5fc3df8168d8b48c4acc10fc0df0d0bdbcc5e"}, +] + +[package.dependencies] +numpy = ">=1.16" + +[package.extras] +bokeh = ["bokeh", "chromedriver", "selenium"] +docs = ["furo", "sphinx-copybutton"] +mypy = ["contourpy[bokeh]", "docutils-stubs", "mypy (==0.991)", "types-Pillow"] +test = ["Pillow", "matplotlib", "pytest"] +test-no-images = ["pytest"] + +[[package]] +name = "cycler" +version = "0.11.0" +description = "Composable style cycles" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "cycler-0.11.0-py3-none-any.whl", hash = "sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3"}, + {file = "cycler-0.11.0.tar.gz", hash = "sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f"}, +] + +[[package]] +name = "cython" +version = "0.29.33" +description = "The Cython compiler for writing C extensions for the Python language." +category = "main" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "Cython-0.29.33-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:286cdfb193e23799e113b7bd5ac74f58da5e9a77c70e3b645b078836b896b165"}, + {file = "Cython-0.29.33-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:8507279a4f86ed8365b96603d5ad155888d4d01b72a9bbf0615880feda5a11d4"}, + {file = "Cython-0.29.33-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5bf5ffd96957a595441cca2fc78470d93fdc40dfe5449881b812ea6045d7e9be"}, + {file = "Cython-0.29.33-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d2019a7e54ba8b253f44411863b8f8c0b6cd623f7a92dc0ccb83892358c4283a"}, + {file = "Cython-0.29.33-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:190e60b7505d3b9b60130bcc2251c01b9ef52603420829c19d3c3ede4ac2763a"}, + {file = "Cython-0.29.33-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0168482495b75fea1c97a9641a95bac991f313e85f378003f9a4909fdeb3d454"}, + {file = "Cython-0.29.33-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:090556e41f2b30427dd3a1628d3613177083f47567a30148b6b7b8c7a5862187"}, + {file = "Cython-0.29.33-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:19c9913e9304bf97f1d2c357438895466f99aa2707d3c7a5e9de60c259e1ca1d"}, + {file = "Cython-0.29.33-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:afc9b6ab20889676c76e700ae6967aa6886a7efe5b05ef6d5b744a6ca793cc43"}, + {file = "Cython-0.29.33-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:49fb45b2bf12d6e2060bbd64506c06ac90e254f3a4bceb32c717f4964a1ae812"}, + {file = "Cython-0.29.33-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:5430f38d3d01c4715ec2aef5c41e02a2441c1c3a0149359c7a498e4c605b8e6c"}, + {file = "Cython-0.29.33-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c4d315443c7f4c61180b6c3ea9a9717ee7c901cc9db8d1d46fdf6556613840ed"}, + {file = "Cython-0.29.33-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6b4e6481e3e7e4d345640fe2fdc6dc57c94369b467f3dc280949daa8e9fd13b9"}, + {file = "Cython-0.29.33-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:060a2568ef80116a0a9dcaf3218a61c6007be0e0b77c5752c094ce5187a4d63c"}, + {file = "Cython-0.29.33-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:b67ddd32eaa2932a66bf8121accc36a7b3078593805519b0f00040f2b10a6a52"}, + {file = "Cython-0.29.33-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:1b507236ba3ca94170ce0a504dd03acf77307d4bfbc5a010a8031673f6b213a9"}, + {file = "Cython-0.29.33-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:581efc0622a9be05714222f2b4ac96a5419de58d5949517282d8df38155c8b9d"}, + {file = "Cython-0.29.33-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6b8bcbf8f1c3c46d6184be1e559e3a3fb8cdf27c6d507d8bc8ae04cfcbfd75f5"}, + {file = "Cython-0.29.33-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1ca93bbe584aee92094fd4fb6acc5cb6500acf98d4f57cc59244f0a598b0fcf6"}, + {file = "Cython-0.29.33-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:da490129e1e4ffaf3f88bfb46d338549a2150f60f809a63d385b83e00960d11a"}, + {file = "Cython-0.29.33-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:4cadf5250eda0c5cdaf4c3a29b52be3e0695f4a2bf1ccd49b638d239752ea513"}, + {file = "Cython-0.29.33-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:bcb1a84fd2bd7885d572adc180e24fd8a7d4b0c104c144e33ccf84a1ab4eb2b8"}, + {file = "Cython-0.29.33-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:d78147ad8a3417ae6b371bbc5bfc6512f6ad4ad3fb71f5eef42e136e4ed14970"}, + {file = "Cython-0.29.33-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dd96b06b93c0e5fa4fc526c5be37c13a93e2fe7c372b5f358277ebe9e1620957"}, + {file = "Cython-0.29.33-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:959f0092d58e7fa00fd3434f7ff32fb78be7c2fa9f8e0096326343159477fe45"}, + {file = "Cython-0.29.33-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0455d5b92f461218bcf173a149a88b7396c3a109066274ccab5eff58db0eae32"}, + {file = "Cython-0.29.33-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:a9b0b890656e9d18a18e1efe26ea3d2d0f3e525a07a2a853592b0afc56a15c89"}, + {file = "Cython-0.29.33-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:b5e8ce3039ff64000d58cd45b3f6f83e13f032dde7f27bb1ab96070d9213550b"}, + {file = "Cython-0.29.33-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:e8922fa3d7e76b7186bbd0810e170ca61f83661ab1b29dc75e88ff2327aaf49d"}, + {file = "Cython-0.29.33-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f67b7306fd00d55f271009335cecadc506d144205c7891070aad889928d85750"}, + {file = "Cython-0.29.33-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:f271f90005064c49b47a93f456dc6cf0a21d21ef835bd33ac1e0db10ad51f84f"}, + {file = "Cython-0.29.33-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d4457d417ffbb94abc42adcd63a03b24ff39cf090f3e9eca5e10cfb90766cbe3"}, + {file = "Cython-0.29.33-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:0b53e017522feb8dcc2189cf1d2d344bab473c5bba5234390b5666d822992c7c"}, + {file = "Cython-0.29.33-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:4f88c2dc0653eef6468848eb8022faf64115b39734f750a1c01a7ba7eb04d89f"}, + {file = "Cython-0.29.33-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl", hash = "sha256:1900d862a4a537d2125706740e9f3b016e80f7bbf7b54db6b3cc3d0bdf0f5c3a"}, + {file = "Cython-0.29.33-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:37bfca4f9f26361343d8c678f8178321e4ae5b919523eed05d2cd8ddbe6b06ec"}, + {file = "Cython-0.29.33-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a9863f8238642c0b1ef8069d99da5ade03bfe2225a64b00c5ae006d95f142a73"}, + {file = "Cython-0.29.33-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1dd503408924723b0bb10c0013b76e324eeee42db6deced9b02b648f1415d94c"}, + {file = "Cython-0.29.33-py2.py3-none-any.whl", hash = "sha256:8b99252bde8ff51cd06a3fe4aeacd3af9b4ff4a4e6b701ac71bddc54f5da61d6"}, + {file = "Cython-0.29.33.tar.gz", hash = "sha256:5040764c4a4d2ce964a395da24f0d1ae58144995dab92c6b96f44c3f4d72286a"}, +] + +[[package]] +name = "debugpy" +version = "1.6.6" +description = "An implementation of the Debug Adapter Protocol for Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "debugpy-1.6.6-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:0ea1011e94416e90fb3598cc3ef5e08b0a4dd6ce6b9b33ccd436c1dffc8cd664"}, + {file = "debugpy-1.6.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dff595686178b0e75580c24d316aa45a8f4d56e2418063865c114eef651a982e"}, + {file = "debugpy-1.6.6-cp310-cp310-win32.whl", hash = "sha256:87755e173fcf2ec45f584bb9d61aa7686bb665d861b81faa366d59808bbd3494"}, + {file = "debugpy-1.6.6-cp310-cp310-win_amd64.whl", hash = "sha256:72687b62a54d9d9e3fb85e7a37ea67f0e803aaa31be700e61d2f3742a5683917"}, + {file = "debugpy-1.6.6-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:78739f77c58048ec006e2b3eb2e0cd5a06d5f48c915e2fc7911a337354508110"}, + {file = "debugpy-1.6.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23c29e40e39ad7d869d408ded414f6d46d82f8a93b5857ac3ac1e915893139ca"}, + {file = "debugpy-1.6.6-cp37-cp37m-win32.whl", hash = "sha256:7aa7e103610e5867d19a7d069e02e72eb2b3045b124d051cfd1538f1d8832d1b"}, + {file = "debugpy-1.6.6-cp37-cp37m-win_amd64.whl", hash = "sha256:f6383c29e796203a0bba74a250615ad262c4279d398e89d895a69d3069498305"}, + {file = "debugpy-1.6.6-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:23363e6d2a04d726bbc1400bd4e9898d54419b36b2cdf7020e3e215e1dcd0f8e"}, + {file = "debugpy-1.6.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b5d1b13d7c7bf5d7cf700e33c0b8ddb7baf030fcf502f76fc061ddd9405d16c"}, + {file = "debugpy-1.6.6-cp38-cp38-win32.whl", hash = "sha256:70ab53918fd907a3ade01909b3ed783287ede362c80c75f41e79596d5ccacd32"}, + {file = "debugpy-1.6.6-cp38-cp38-win_amd64.whl", hash = "sha256:c05349890804d846eca32ce0623ab66c06f8800db881af7a876dc073ac1c2225"}, + {file = "debugpy-1.6.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a771739902b1ae22a120dbbb6bd91b2cae6696c0e318b5007c5348519a4211c6"}, + {file = "debugpy-1.6.6-cp39-cp39-win32.whl", hash = "sha256:549ae0cb2d34fc09d1675f9b01942499751d174381b6082279cf19cdb3c47cbe"}, + {file = "debugpy-1.6.6-cp39-cp39-win_amd64.whl", hash = "sha256:de4a045fbf388e120bb6ec66501458d3134f4729faed26ff95de52a754abddb1"}, + {file = "debugpy-1.6.6-py2.py3-none-any.whl", hash = "sha256:be596b44448aac14eb3614248c91586e2bc1728e020e82ef3197189aae556115"}, + {file = "debugpy-1.6.6.zip", hash = "sha256:b9c2130e1c632540fbf9c2c88341493797ddf58016e7cba02e311de9b0a96b67"}, +] + +[[package]] +name = "decorator" +version = "5.1.1" +description = "Decorators for Humans" +category = "dev" +optional = false +python-versions = ">=3.5" +files = [ + {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, + {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, +] + +[[package]] +name = "defusedxml" +version = "0.7.1" +description = "XML bomb protection for Python stdlib modules" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, + {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, +] + +[[package]] +name = "dill" +version = "0.3.6" +description = "serialize all of python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "dill-0.3.6-py3-none-any.whl", hash = "sha256:a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0"}, + {file = "dill-0.3.6.tar.gz", hash = "sha256:e5db55f3687856d8fbdab002ed78544e1c4559a130302693d839dfe8f93f2373"}, +] + +[package.extras] +graph = ["objgraph (>=1.7.2)"] + +[[package]] +name = "docstring-to-markdown" +version = "0.12" +description = "On the fly conversion of Python docstrings to markdown" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "docstring-to-markdown-0.12.tar.gz", hash = "sha256:40004224b412bd6f64c0f3b85bb357a41341afd66c4b4896709efa56827fb2bb"}, + {file = "docstring_to_markdown-0.12-py3-none-any.whl", hash = "sha256:7df6311a887dccf9e770f51242ec002b19f0591994c4783be49d24cdc1df3737"}, +] + +[[package]] +name = "entrypoints" +version = "0.4" +description = "Discover and load entry points from installed packages." +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "entrypoints-0.4-py3-none-any.whl", hash = "sha256:f174b5ff827504fd3cd97cc3f8649f3693f51538c7e4bdf3ef002c8429d42f9f"}, + {file = "entrypoints-0.4.tar.gz", hash = "sha256:b706eddaa9218a19ebcd67b56818f05bb27589b1ca9e8d797b74affad4ccacd4"}, +] + +[[package]] +name = "executing" +version = "1.2.0" +description = "Get the currently executing AST node of a frame, and other information" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "executing-1.2.0-py2.py3-none-any.whl", hash = "sha256:0314a69e37426e3608aada02473b4161d4caf5a4b244d1d0c48072b8fee7bacc"}, + {file = "executing-1.2.0.tar.gz", hash = "sha256:19da64c18d2d851112f09c287f8d3dbbdf725ab0e569077efb6cdcbd3497c107"}, +] + +[package.extras] +tests = ["asttokens", "littleutils", "pytest", "rich"] + +[[package]] +name = "faiss-cpu" +version = "1.7.3" +description = "A library for efficient similarity search and clustering of dense vectors." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "faiss-cpu-1.7.3.tar.gz", hash = "sha256:cb71fe3f2934732d157d9d8cfb6ed2dd4020a0065571c84842ff6a3f0beab310"}, + {file = "faiss_cpu-1.7.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:343f025e0846239d987d0c719772387ad685b74e5ef62b2e5616cabef9062729"}, + {file = "faiss_cpu-1.7.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8b7b1cf693d7c24b5a633ff024717bd715fec501af4854357da0805b4899bcec"}, + {file = "faiss_cpu-1.7.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c37e5fc0a266839844798a53dd42dd6afbee0c5905611f3f278297053fccbd7"}, + {file = "faiss_cpu-1.7.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0628f7b0c6263ef4431995bb4f5f39833f999e96e6663935cbf0a1f2243dc4ac"}, + {file = "faiss_cpu-1.7.3-cp310-cp310-win_amd64.whl", hash = "sha256:e22d1887c617156a673665c913ee82a30bfc1a3bc939ba8500b61328bce5a625"}, + {file = "faiss_cpu-1.7.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6d411449a5f3c3abfcafadaac3190ab1ab206023fc9110da86649506dcbe8a27"}, + {file = "faiss_cpu-1.7.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a10ea8622908f9f9ca4003e66da809dfad4af5c7d9fb7f582722d703bbc6c8bd"}, + {file = "faiss_cpu-1.7.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c5ced43ae058a62f63b12194ec9aa4c34066b0ea813ecbd936c65b7d52848c8"}, + {file = "faiss_cpu-1.7.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3df6371012248dea8e9509949e2d2c6d73dea7c1bdaa4ba4563eb1c3cd8021a6"}, + {file = "faiss_cpu-1.7.3-cp311-cp311-win_amd64.whl", hash = "sha256:8b6ff7854c3f46104718c6b34e81cd48c156d970dd87703c5122ca90217bb8dc"}, + {file = "faiss_cpu-1.7.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ab6314a8fbcce11dc3ecb6f48dda8c4ec274ed11c1f336f599f480bf0561442c"}, + {file = "faiss_cpu-1.7.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:877c0bbf4c4a1806d88e091aba4c91ff3fa35c3ede5663b7fafc5b39247a369e"}, + {file = "faiss_cpu-1.7.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6f199be10d30ecc6ed65350931006eca01b7bb8faa27d63069318eea0f6a0c1"}, + {file = "faiss_cpu-1.7.3-cp37-cp37m-win_amd64.whl", hash = "sha256:1ca2b7cdbfdcc6a2e8fa75a09594916b50ec8260913ca48334dc3ce797179b5f"}, + {file = "faiss_cpu-1.7.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7b3f91856c19cfb8464178bab7e8ea94a391f6947b556be6754f9fc10b3c25fb"}, + {file = "faiss_cpu-1.7.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7a238a0ef4d36c614d6f60e1ea308288b3920091638a3687f708de6071d007c1"}, + {file = "faiss_cpu-1.7.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:af53bee502c629eaaaf8b5ec648484a726be0fd2768ad4ef2bd4b829384b2682"}, + {file = "faiss_cpu-1.7.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:441d1c305595d925138f2cde63dabe8c10ee05fc8ad66bf750e278a7e8c409bd"}, + {file = "faiss_cpu-1.7.3-cp38-cp38-win_amd64.whl", hash = "sha256:2766cc14b9004c1aae3b3943e693c3a9566eb1a25168b681981f9048276fe1e7"}, + {file = "faiss_cpu-1.7.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:20ef191bb6164c8e794b11d20427568a75d15980b6d66732071e9aa57ea06e2d"}, + {file = "faiss_cpu-1.7.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c57c293c4682066955626c2a2956be9a3b92594f69ed1a33abd72260a6911b69"}, + {file = "faiss_cpu-1.7.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd128170446ff3c3e28d89e813d32cd04f17fa3025794778a01a0d81524275dc"}, + {file = "faiss_cpu-1.7.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a14d832b5361ce9af21977eb1dcdebe23b9edcc12aad40316df7ca1bd86bc6b5"}, + {file = "faiss_cpu-1.7.3-cp39-cp39-win_amd64.whl", hash = "sha256:52df8895c5e59d1c9eda368a63790381a6f7fceddb22bed08f9c90a706d8a148"}, +] + +[[package]] +name = "fastjsonschema" +version = "2.16.3" +description = "Fastest Python implementation of JSON schema" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "fastjsonschema-2.16.3-py3-none-any.whl", hash = "sha256:04fbecc94300436f628517b05741b7ea009506ce8f946d40996567c669318490"}, + {file = "fastjsonschema-2.16.3.tar.gz", hash = "sha256:4a30d6315a68c253cfa8f963b9697246315aa3db89f98b97235e345dedfb0b8e"}, +] + +[package.extras] +devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] + +[[package]] +name = "fix-my-functions" +version = "0.1.3" +description = "" +category = "dev" +optional = false +python-versions = ">=3.9" +files = [ + {file = "fix-my-functions-0.1.3.tar.gz", hash = "sha256:3668905cf84f76f6e3f72059881456b47af4ae3763da0cd2a37200c87ad75adf"}, + {file = "fix_my_functions-0.1.3-py3-none-any.whl", hash = "sha256:ace77267430050e979615c944f69adae6f80542e138e1be03deddfd4143ff9c9"}, +] + +[package.dependencies] +colorama = ">=0.4.4" +redbaron = ">=0.9.2" + +[[package]] +name = "flake8" +version = "6.0.0" +description = "the modular source code checker: pep8 pyflakes and co" +category = "dev" +optional = false +python-versions = ">=3.8.1" +files = [ + {file = "flake8-6.0.0-py2.py3-none-any.whl", hash = "sha256:3833794e27ff64ea4e9cf5d410082a8b97ff1a06c16aa3d2027339cd0f1195c7"}, + {file = "flake8-6.0.0.tar.gz", hash = "sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181"}, +] + +[package.dependencies] +mccabe = ">=0.7.0,<0.8.0" +pycodestyle = ">=2.10.0,<2.11.0" +pyflakes = ">=3.0.0,<3.1.0" + +[[package]] +name = "fonttools" +version = "4.39.2" +description = "Tools to manipulate font files" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fonttools-4.39.2-py3-none-any.whl", hash = "sha256:85245aa2fd4cf502a643c9a9a2b5a393703e150a6eaacc3e0e84bb448053f061"}, + {file = "fonttools-4.39.2.zip", hash = "sha256:e2d9f10337c9e3b17f9bce17a60a16a885a7d23b59b7f45ce07ea643e5580439"}, +] + +[package.extras] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.0.0)", "xattr", "zopfli (>=0.1.4)"] +graphite = ["lz4 (>=1.7.4.2)"] +interpolatable = ["munkres", "scipy"] +lxml = ["lxml (>=4.0,<5)"] +pathops = ["skia-pathops (>=0.5.0)"] +plot = ["matplotlib"] +repacker = ["uharfbuzz (>=0.23.0)"] +symfont = ["sympy"] +type1 = ["xattr"] +ufo = ["fs (>=2.2.0,<3)"] +unicode = ["unicodedata2 (>=15.0.0)"] +woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] + +[[package]] +name = "fqdn" +version = "1.5.1" +description = "Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0, !=3.1, !=3.2, !=3.3, !=3.4, <4" +files = [ + {file = "fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014"}, + {file = "fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f"}, +] + +[[package]] +name = "freetype-py" +version = "2.3.0" +description = "Freetype python bindings" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "freetype-py-2.3.0.zip", hash = "sha256:f9b64ce3272a5c358dcee824800a32d70997fb872a0965a557adca20fce7a5d0"}, + {file = "freetype_py-2.3.0-py3-none-macosx_10_9_universal2.whl", hash = "sha256:ca7155de937af6f26bfd9f9089a6e9b01fa8f9d3040a3ddc0aeb3a53cf88f428"}, + {file = "freetype_py-2.3.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ccdb1616794a8ad48beaa9e29d3494e6643d24d8e925cc39263de21c062ea5a7"}, + {file = "freetype_py-2.3.0-py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c8f17c3ac35dc7cc9571ac37a00a6daa428a1a6d0fe6926a77d16066865ed5ef"}, + {file = "freetype_py-2.3.0-py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:89cee8f4e7cf0a37b73a43a08c88703d84e3b9f9243fc665d8dc0b72a5d206a8"}, + {file = "freetype_py-2.3.0-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:b95ccd52ff7e9bef34505f8af724cee114a3c3cc9cf13e0fd406fa0cc92b988a"}, + {file = "freetype_py-2.3.0-py3-none-win_amd64.whl", hash = "sha256:3a552265b06c2cb3fa54f86ed6fcbf045d8dc8176f9475bedddf9a1b31f5402f"}, +] + +[[package]] +name = "frozenlist" +version = "1.3.3" +description = "A list-like structure which implements collections.abc.MutableSequence" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "frozenlist-1.3.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff8bf625fe85e119553b5383ba0fb6aa3d0ec2ae980295aaefa552374926b3f4"}, + {file = "frozenlist-1.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dfbac4c2dfcc082fcf8d942d1e49b6aa0766c19d3358bd86e2000bf0fa4a9cf0"}, + {file = "frozenlist-1.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b1c63e8d377d039ac769cd0926558bb7068a1f7abb0f003e3717ee003ad85530"}, + {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fdfc24dcfce5b48109867c13b4cb15e4660e7bd7661741a391f821f23dfdca7"}, + {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2c926450857408e42f0bbc295e84395722ce74bae69a3b2aa2a65fe22cb14b99"}, + {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1841e200fdafc3d51f974d9d377c079a0694a8f06de2e67b48150328d66d5483"}, + {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f470c92737afa7d4c3aacc001e335062d582053d4dbe73cda126f2d7031068dd"}, + {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:783263a4eaad7c49983fe4b2e7b53fa9770c136c270d2d4bbb6d2192bf4d9caf"}, + {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:924620eef691990dfb56dc4709f280f40baee568c794b5c1885800c3ecc69816"}, + {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ae4dc05c465a08a866b7a1baf360747078b362e6a6dbeb0c57f234db0ef88ae0"}, + {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:bed331fe18f58d844d39ceb398b77d6ac0b010d571cba8267c2e7165806b00ce"}, + {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:02c9ac843e3390826a265e331105efeab489ffaf4dd86384595ee8ce6d35ae7f"}, + {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9545a33965d0d377b0bc823dcabf26980e77f1b6a7caa368a365a9497fb09420"}, + {file = "frozenlist-1.3.3-cp310-cp310-win32.whl", hash = "sha256:d5cd3ab21acbdb414bb6c31958d7b06b85eeb40f66463c264a9b343a4e238642"}, + {file = "frozenlist-1.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:b756072364347cb6aa5b60f9bc18e94b2f79632de3b0190253ad770c5df17db1"}, + {file = "frozenlist-1.3.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b4395e2f8d83fbe0c627b2b696acce67868793d7d9750e90e39592b3626691b7"}, + {file = "frozenlist-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14143ae966a6229350021384870458e4777d1eae4c28d1a7aa47f24d030e6678"}, + {file = "frozenlist-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5d8860749e813a6f65bad8285a0520607c9500caa23fea6ee407e63debcdbef6"}, + {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23d16d9f477bb55b6154654e0e74557040575d9d19fe78a161bd33d7d76808e8"}, + {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb82dbba47a8318e75f679690190c10a5e1f447fbf9df41cbc4c3afd726d88cb"}, + {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9309869032abb23d196cb4e4db574232abe8b8be1339026f489eeb34a4acfd91"}, + {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a97b4fe50b5890d36300820abd305694cb865ddb7885049587a5678215782a6b"}, + {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c188512b43542b1e91cadc3c6c915a82a5eb95929134faf7fd109f14f9892ce4"}, + {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:303e04d422e9b911a09ad499b0368dc551e8c3cd15293c99160c7f1f07b59a48"}, + {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0771aed7f596c7d73444c847a1c16288937ef988dc04fb9f7be4b2aa91db609d"}, + {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:66080ec69883597e4d026f2f71a231a1ee9887835902dbe6b6467d5a89216cf6"}, + {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:41fe21dc74ad3a779c3d73a2786bdf622ea81234bdd4faf90b8b03cad0c2c0b4"}, + {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f20380df709d91525e4bee04746ba612a4df0972c1b8f8e1e8af997e678c7b81"}, + {file = "frozenlist-1.3.3-cp311-cp311-win32.whl", hash = "sha256:f30f1928162e189091cf4d9da2eac617bfe78ef907a761614ff577ef4edfb3c8"}, + {file = "frozenlist-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:a6394d7dadd3cfe3f4b3b186e54d5d8504d44f2d58dcc89d693698e8b7132b32"}, + {file = "frozenlist-1.3.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8df3de3a9ab8325f94f646609a66cbeeede263910c5c0de0101079ad541af332"}, + {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0693c609e9742c66ba4870bcee1ad5ff35462d5ffec18710b4ac89337ff16e27"}, + {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd4210baef299717db0a600d7a3cac81d46ef0e007f88c9335db79f8979c0d3d"}, + {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:394c9c242113bfb4b9aa36e2b80a05ffa163a30691c7b5a29eba82e937895d5e"}, + {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6327eb8e419f7d9c38f333cde41b9ae348bec26d840927332f17e887a8dcb70d"}, + {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e24900aa13212e75e5b366cb9065e78bbf3893d4baab6052d1aca10d46d944c"}, + {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3843f84a6c465a36559161e6c59dce2f2ac10943040c2fd021cfb70d58c4ad56"}, + {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:84610c1502b2461255b4c9b7d5e9c48052601a8957cd0aea6ec7a7a1e1fb9420"}, + {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:c21b9aa40e08e4f63a2f92ff3748e6b6c84d717d033c7b3438dd3123ee18f70e"}, + {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:efce6ae830831ab6a22b9b4091d411698145cb9b8fc869e1397ccf4b4b6455cb"}, + {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:40de71985e9042ca00b7953c4f41eabc3dc514a2d1ff534027f091bc74416401"}, + {file = "frozenlist-1.3.3-cp37-cp37m-win32.whl", hash = "sha256:180c00c66bde6146a860cbb81b54ee0df350d2daf13ca85b275123bbf85de18a"}, + {file = "frozenlist-1.3.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9bbbcedd75acdfecf2159663b87f1bb5cfc80e7cd99f7ddd9d66eb98b14a8411"}, + {file = "frozenlist-1.3.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:034a5c08d36649591be1cbb10e09da9f531034acfe29275fc5454a3b101ce41a"}, + {file = "frozenlist-1.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba64dc2b3b7b158c6660d49cdb1d872d1d0bf4e42043ad8d5006099479a194e5"}, + {file = "frozenlist-1.3.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:47df36a9fe24054b950bbc2db630d508cca3aa27ed0566c0baf661225e52c18e"}, + {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:008a054b75d77c995ea26629ab3a0c0d7281341f2fa7e1e85fa6153ae29ae99c"}, + {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:841ea19b43d438a80b4de62ac6ab21cfe6827bb8a9dc62b896acc88eaf9cecba"}, + {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e235688f42b36be2b6b06fc37ac2126a73b75fb8d6bc66dd632aa35286238703"}, + {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca713d4af15bae6e5d79b15c10c8522859a9a89d3b361a50b817c98c2fb402a2"}, + {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ac5995f2b408017b0be26d4a1d7c61bce106ff3d9e3324374d66b5964325448"}, + {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a4ae8135b11652b08a8baf07631d3ebfe65a4c87909dbef5fa0cdde440444ee4"}, + {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4ea42116ceb6bb16dbb7d526e242cb6747b08b7710d9782aa3d6732bd8d27649"}, + {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:810860bb4bdce7557bc0febb84bbd88198b9dbc2022d8eebe5b3590b2ad6c842"}, + {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:ee78feb9d293c323b59a6f2dd441b63339a30edf35abcb51187d2fc26e696d13"}, + {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0af2e7c87d35b38732e810befb9d797a99279cbb85374d42ea61c1e9d23094b3"}, + {file = "frozenlist-1.3.3-cp38-cp38-win32.whl", hash = "sha256:899c5e1928eec13fd6f6d8dc51be23f0d09c5281e40d9cf4273d188d9feeaf9b"}, + {file = "frozenlist-1.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:7f44e24fa70f6fbc74aeec3e971f60a14dde85da364aa87f15d1be94ae75aeef"}, + {file = "frozenlist-1.3.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2b07ae0c1edaa0a36339ec6cce700f51b14a3fc6545fdd32930d2c83917332cf"}, + {file = "frozenlist-1.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ebb86518203e12e96af765ee89034a1dbb0c3c65052d1b0c19bbbd6af8a145e1"}, + {file = "frozenlist-1.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5cf820485f1b4c91e0417ea0afd41ce5cf5965011b3c22c400f6d144296ccbc0"}, + {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c11e43016b9024240212d2a65043b70ed8dfd3b52678a1271972702d990ac6d"}, + {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8fa3c6e3305aa1146b59a09b32b2e04074945ffcfb2f0931836d103a2c38f936"}, + {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:352bd4c8c72d508778cf05ab491f6ef36149f4d0cb3c56b1b4302852255d05d5"}, + {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65a5e4d3aa679610ac6e3569e865425b23b372277f89b5ef06cf2cdaf1ebf22b"}, + {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e2c1185858d7e10ff045c496bbf90ae752c28b365fef2c09cf0fa309291669"}, + {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f163d2fd041c630fed01bc48d28c3ed4a3b003c00acd396900e11ee5316b56bb"}, + {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:05cdb16d09a0832eedf770cb7bd1fe57d8cf4eaf5aced29c4e41e3f20b30a784"}, + {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:8bae29d60768bfa8fb92244b74502b18fae55a80eac13c88eb0b496d4268fd2d"}, + {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:eedab4c310c0299961ac285591acd53dc6723a1ebd90a57207c71f6e0c2153ab"}, + {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3bbdf44855ed8f0fbcd102ef05ec3012d6a4fd7c7562403f76ce6a52aeffb2b1"}, + {file = "frozenlist-1.3.3-cp39-cp39-win32.whl", hash = "sha256:efa568b885bca461f7c7b9e032655c0c143d305bf01c30caf6db2854a4532b38"}, + {file = "frozenlist-1.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:cfe33efc9cb900a4c46f91a5ceba26d6df370ffddd9ca386eb1d4f0ad97b9ea9"}, + {file = "frozenlist-1.3.3.tar.gz", hash = "sha256:58bcc55721e8a90b88332d6cd441261ebb22342e238296bb330968952fbb3a6a"}, +] + +[[package]] +name = "fsspec" +version = "2023.3.0" +description = "File-system specification" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fsspec-2023.3.0-py3-none-any.whl", hash = "sha256:bf57215e19dbfa4fe7edae53040cc1deef825e3b1605cca9a8d2c2fadd2328a0"}, + {file = "fsspec-2023.3.0.tar.gz", hash = "sha256:24e635549a590d74c6c18274ddd3ffab4753341753e923408b1904eaabafe04d"}, +] + +[package.dependencies] +aiohttp = {version = "<4.0.0a0 || >4.0.0a0,<4.0.0a1 || >4.0.0a1", optional = true, markers = "extra == \"http\""} +requests = {version = "*", optional = true, markers = "extra == \"http\""} + +[package.extras] +abfs = ["adlfs"] +adl = ["adlfs"] +arrow = ["pyarrow (>=1)"] +dask = ["dask", "distributed"] +dropbox = ["dropbox", "dropboxdrivefs", "requests"] +fuse = ["fusepy"] +gcs = ["gcsfs"] +git = ["pygit2"] +github = ["requests"] +gs = ["gcsfs"] +gui = ["panel"] +hdfs = ["pyarrow (>=1)"] +http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "requests"] +libarchive = ["libarchive-c"] +oci = ["ocifs"] +s3 = ["s3fs"] +sftp = ["paramiko"] +smb = ["smbprotocol"] +ssh = ["paramiko"] +tqdm = ["tqdm"] + +[[package]] +name = "fvcore" +version = "0.1.5.post20221221" +description = "Collection of common code shared among different research projects in FAIR computer vision team" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "fvcore-0.1.5.post20221221.tar.gz", hash = "sha256:f2fb0bb90572ae651c11c78e20493ed19b2240550a7e4bbb2d6de87bdd037860"}, +] + +[package.dependencies] +iopath = ">=0.1.7" +numpy = "*" +Pillow = "*" +pyyaml = ">=5.1" +tabulate = "*" +termcolor = ">=1.1" +tqdm = "*" +yacs = ">=0.1.6" + +[package.extras] +all = ["shapely"] + +[[package]] +name = "geomloss" +version = "0.2.4" +description = "Geometric loss functions between point clouds, images and volumes." +category = "main" +optional = false +python-versions = ">=3" +files = [ + {file = "geomloss-0.2.4-py3-none-any.whl", hash = "sha256:1e4b4a53d1798f7927f2a15f6fb533675d8f172d9de4f0eaf959eb120ab8c9f5"}, + {file = "geomloss-0.2.4.tar.gz", hash = "sha256:3d6cc5a358b854429619fc180f1e7a3ab31a0b50742d7196042adf5134065dfa"}, +] + +[package.dependencies] +numpy = "*" + +[package.extras] +full = ["cmake (>=3.18)", "pykeops[full]"] + +[[package]] +name = "google-auth" +version = "2.16.2" +description = "Google Authentication Library" +category = "dev" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*" +files = [ + {file = "google-auth-2.16.2.tar.gz", hash = "sha256:07e14f34ec288e3f33e00e2e3cc40c8942aa5d4ceac06256a28cd8e786591420"}, + {file = "google_auth-2.16.2-py2.py3-none-any.whl", hash = "sha256:2fef3cf94876d1a0e204afece58bb4d83fb57228aaa366c64045039fda6770a2"}, +] + +[package.dependencies] +cachetools = ">=2.0.0,<6.0" +pyasn1-modules = ">=0.2.1" +rsa = {version = ">=3.1.4,<5", markers = "python_version >= \"3.6\""} +six = ">=1.9.0" + +[package.extras] +aiohttp = ["aiohttp (>=3.6.2,<4.0.0dev)", "requests (>=2.20.0,<3.0.0dev)"] +enterprise-cert = ["cryptography (==36.0.2)", "pyopenssl (==22.0.0)"] +pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] +reauth = ["pyu2f (>=0.1.5)"] +requests = ["requests (>=2.20.0,<3.0.0dev)"] + +[[package]] +name = "google-auth-oauthlib" +version = "0.4.6" +description = "Google Authentication Library" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "google-auth-oauthlib-0.4.6.tar.gz", hash = "sha256:a90a072f6993f2c327067bf65270046384cda5a8ecb20b94ea9a687f1f233a7a"}, + {file = "google_auth_oauthlib-0.4.6-py2.py3-none-any.whl", hash = "sha256:3f2a6e802eebbb6fb736a370fbf3b055edcb6b52878bf2f26330b5e041316c73"}, +] + +[package.dependencies] +google-auth = ">=1.0.0" +requests-oauthlib = ">=0.7.0" + +[package.extras] +tool = ["click (>=6.0.0)"] + +[[package]] +name = "graphviz" +version = "0.20.1" +description = "Simple Python interface for Graphviz" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "graphviz-0.20.1-py3-none-any.whl", hash = "sha256:587c58a223b51611c0cf461132da386edd896a029524ca61a1462b880bf97977"}, + {file = "graphviz-0.20.1.zip", hash = "sha256:8c58f14adaa3b947daf26c19bc1e98c4e0702cdc31cf99153e6f06904d492bf8"}, +] + +[package.extras] +dev = ["flake8", "pep8-naming", "tox (>=3)", "twine", "wheel"] +docs = ["sphinx (>=5)", "sphinx-autodoc-typehints", "sphinx-rtd-theme"] +test = ["coverage", "mock (>=4)", "pytest (>=7)", "pytest-cov", "pytest-mock (>=3)"] + +[[package]] +name = "grpcio" +version = "1.51.3" +description = "HTTP/2-based RPC framework" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "grpcio-1.51.3-cp310-cp310-linux_armv7l.whl", hash = "sha256:f601aaeae18dab81930fb8d4f916b0da21e89bb4b5f7367ef793f46b4a76b7b0"}, + {file = "grpcio-1.51.3-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:eef0450a4b5ed11feab639bf3eb1b6e23d0efa9b911bf7b06fb60e14f5f8a585"}, + {file = "grpcio-1.51.3-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:82b0ad8ac825d4bb31bff9f638557c045f4a6d824d84b21e893968286f88246b"}, + {file = "grpcio-1.51.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3667c06e37d6cd461afdd51cefe6537702f3d1dc5ff4cac07e88d8b4795dc16f"}, + {file = "grpcio-1.51.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3709048fe0aa23dda09b3e69849a12055790171dab9e399a72ea8f9dfbf9ac80"}, + {file = "grpcio-1.51.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:200d69857f9910f7458b39b9bcf83ee4a180591b40146ba9e49314e3a7419313"}, + {file = "grpcio-1.51.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cd9a5e68e79c5f031500e67793048a90209711e0854a9ddee8a3ce51728de4e5"}, + {file = "grpcio-1.51.3-cp310-cp310-win32.whl", hash = "sha256:6604f614016127ae10969176bbf12eb0e03d2fb3d643f050b3b69e160d144fb4"}, + {file = "grpcio-1.51.3-cp310-cp310-win_amd64.whl", hash = "sha256:e95c7ccd4c5807adef1602005513bf7c7d14e5a41daebcf9d8d30d8bf51b8f81"}, + {file = "grpcio-1.51.3-cp311-cp311-linux_armv7l.whl", hash = "sha256:5e77ee138100f0bb55cbd147840f87ee6241dbd25f09ea7cd8afe7efff323449"}, + {file = "grpcio-1.51.3-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:68a7514b754e38e8de9075f7bb4dee919919515ec68628c43a894027e40ddec4"}, + {file = "grpcio-1.51.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c1b9f8afa62ff265d86a4747a2990ec5a96e4efce5d5888f245a682d66eca47"}, + {file = "grpcio-1.51.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8de30f0b417744288cec65ec8cf84b8a57995cf7f1e84ccad2704d93f05d0aae"}, + {file = "grpcio-1.51.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b69c7adc7ed60da1cb1b502853db61f453fc745f940cbcc25eb97c99965d8f41"}, + {file = "grpcio-1.51.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d81528ffe0e973dc840ec73a4132fd18b8203ad129d7410155d951a0a7e4f5d0"}, + {file = "grpcio-1.51.3-cp311-cp311-win32.whl", hash = "sha256:040eb421613b57c696063abde405916dd830203c184c9000fc8c3b3b3c950325"}, + {file = "grpcio-1.51.3-cp311-cp311-win_amd64.whl", hash = "sha256:2a8e17286c4240137d933b8ca506465472248b4ce0fe46f3404459e708b65b68"}, + {file = "grpcio-1.51.3-cp37-cp37m-linux_armv7l.whl", hash = "sha256:d5cd1389669a847555df54177b911d9ff6f17345b2a6f19388707b7a9f724c88"}, + {file = "grpcio-1.51.3-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:be1bf35ce82cdbcac14e39d5102d8de4079a1c1a6a06b68e41fcd9ef64f9dd28"}, + {file = "grpcio-1.51.3-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:5eed34994c095e2bf7194ffac7381c6068b057ef1e69f8f08db77771350a7566"}, + {file = "grpcio-1.51.3-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3f9a7d88082b2a17ae7bd3c2354d13bab0453899e0851733f6afa6918373f476"}, + {file = "grpcio-1.51.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c8abbc5f837111e7bd619612eedc223c290b0903b952ce0c7b00840ea70f14"}, + {file = "grpcio-1.51.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:165b05af77e6aecb4210ae7663e25acf234ba78a7c1c157fa5f2efeb0d6ec53c"}, + {file = "grpcio-1.51.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:54e36c2ee304ff15f2bfbdc43d2b56c63331c52d818c364e5b5214e5bc2ad9f6"}, + {file = "grpcio-1.51.3-cp37-cp37m-win32.whl", hash = "sha256:cd0daac21d9ef5e033a5100c1d3aa055bbed28bfcf070b12d8058045c4e821b1"}, + {file = "grpcio-1.51.3-cp37-cp37m-win_amd64.whl", hash = "sha256:2fdd6333ce96435408565a9dbbd446212cd5d62e4d26f6a3c0feb1e3c35f1cc8"}, + {file = "grpcio-1.51.3-cp38-cp38-linux_armv7l.whl", hash = "sha256:54b0c29bdd9a3b1e1b61443ab152f060fc719f1c083127ab08d03fac5efd51be"}, + {file = "grpcio-1.51.3-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:ffaaf7e93fcb437356b5a4b23bf36e8a3d0221399ff77fd057e4bc77776a24be"}, + {file = "grpcio-1.51.3-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:eafbe7501a3268d05f2e450e1ddaffb950d842a8620c13ec328b501d25d2e2c3"}, + {file = "grpcio-1.51.3-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:881ecb34feabf31c6b3b9bbbddd1a5b57e69f805041e5a2c6c562a28574f71c4"}, + {file = "grpcio-1.51.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e860a3222139b41d430939bbec2ec9c3f6c740938bf7a04471a9a8caaa965a2e"}, + {file = "grpcio-1.51.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:49ede0528e9dac7e8a9fe30b16c73b630ddd9a576bf4b675eb6b0c53ee5ca00f"}, + {file = "grpcio-1.51.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6972b009638b40a448d10e1bc18e2223143b8a7aa20d7def0d78dd4af4126d12"}, + {file = "grpcio-1.51.3-cp38-cp38-win32.whl", hash = "sha256:5694448256e3cdfe5bd358f1574a3f2f51afa20cc834713c4b9788d60b7cc646"}, + {file = "grpcio-1.51.3-cp38-cp38-win_amd64.whl", hash = "sha256:3ea4341efe603b049e8c9a5f13c696ca37fcdf8a23ca35f650428ad3606381d9"}, + {file = "grpcio-1.51.3-cp39-cp39-linux_armv7l.whl", hash = "sha256:6c677581ce129f5fa228b8f418cee10bd28dd449f3a544ea73c8ba590ee49d0b"}, + {file = "grpcio-1.51.3-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:30e09b5e0531685e176f49679b6a3b190762cc225f4565e55a899f5e14b3aa62"}, + {file = "grpcio-1.51.3-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:c831f31336e81243f85b6daff3e5e8a123302ce0ea1f2726ad752fd7a59f3aee"}, + {file = "grpcio-1.51.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2cd2e4cefb724cab1ba2df4b7535a9980531b9ec51b4dbb5f137a1f3a3754ef0"}, + {file = "grpcio-1.51.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7a0d0bf44438869d307f85a54f25a896ad6b4b0ca12370f76892ad732928d87"}, + {file = "grpcio-1.51.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c02abd55409bfb293371554adf6a4401197ec2133dd97727c01180889014ba4d"}, + {file = "grpcio-1.51.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2f8ff75e61e1227ba7a3f16b2eadbcc11d0a54096d52ab75a6b88cfbe56f55d1"}, + {file = "grpcio-1.51.3-cp39-cp39-win32.whl", hash = "sha256:6c99a73a6260bdf844b2e5ddad02dcd530310f80e1fa72c300fa19c1c7496962"}, + {file = "grpcio-1.51.3-cp39-cp39-win_amd64.whl", hash = "sha256:22bdfac4f7f27acdd4da359b5e7e1973dc74bf1ed406729b07d0759fde2f064b"}, + {file = "grpcio-1.51.3.tar.gz", hash = "sha256:be7b2265b7527bb12109a7727581e274170766d5b3c9258d4e466f4872522d7a"}, +] + +[package.extras] +protobuf = ["grpcio-tools (>=1.51.3)"] + +[[package]] +name = "h5py" +version = "3.8.0" +description = "Read and write HDF5 files from Python" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h5py-3.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:533d7dad466ddb7e3b30af274b630eb7c1a6e4ddf01d1c373a0334dc2152110a"}, + {file = "h5py-3.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c873ba9fd4fa875ad62ce0e4891725e257a8fe7f5abdbc17e51a5d54819be55c"}, + {file = "h5py-3.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98a240cd4c1bfd568aaa52ec42d263131a2582dab82d74d3d42a0d954cac12be"}, + {file = "h5py-3.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3389b63222b1c7a158bb7fe69d11ca00066740ec5574596d47a2fe5317f563a"}, + {file = "h5py-3.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:7f3350fc0a8407d668b13247861c2acd23f7f5fe7d060a3ad9b0820f5fcbcae0"}, + {file = "h5py-3.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:db03e3f2c716205fbdabb34d0848459840585225eb97b4f08998c743821ca323"}, + {file = "h5py-3.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:36761693efbe53df179627a775476dcbc37727d6e920958277a7efbc18f1fb73"}, + {file = "h5py-3.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a506fc223def428f4329e7e1f9fe1c8c593eab226e7c0942c8d75308ad49950"}, + {file = "h5py-3.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33b15aae79e9147aebe1d0e54099cbcde8d65e3e227cd5b59e49b1272aa0e09d"}, + {file = "h5py-3.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:9f6f6ffadd6bfa9b2c5b334805eb4b19ca0a5620433659d8f7fb86692c40a359"}, + {file = "h5py-3.8.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8f55d9c6c84d7d09c79fb85979e97b81ec6071cc776a97eb6b96f8f6ec767323"}, + {file = "h5py-3.8.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b685453e538b2b5934c58a644ac3f3b3d0cec1a01b6fb26d57388e9f9b674ad0"}, + {file = "h5py-3.8.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:377865821fe80ad984d003723d6f8890bd54ceeb5981b43c0313b9df95411b30"}, + {file = "h5py-3.8.0-cp37-cp37m-win_amd64.whl", hash = "sha256:0fef76e10b9216657fa37e7edff6d8be0709b25bd5066474c229b56cf0098df9"}, + {file = "h5py-3.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:26ffc344ec9984d2cd3ca0265007299a8bac8d85c1ad48f4639d8d3aed2af171"}, + {file = "h5py-3.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bacaa1c16810dd2b3e4417f8e730971b7c4d53d234de61fe4a918db78e80e1e4"}, + {file = "h5py-3.8.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bae730580ae928de409d63cbe4fdca4c82c3ad2bed30511d19d34e995d63c77e"}, + {file = "h5py-3.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f47f757d1b76f0ecb8aa0508ec8d1b390df67a8b67ee2515dc1b046f3a1596ea"}, + {file = "h5py-3.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:f891b17e3a3e974e93f9e34e7cca9f530806543571ce078998676a555837d91d"}, + {file = "h5py-3.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:290e00fa2de74a10688d1bac98d5a9cdd43f14f58e562c580b5b3dfbd358ecae"}, + {file = "h5py-3.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:03890b1c123d024fb0239a3279737d5432498c1901c354f8b10d8221d1d16235"}, + {file = "h5py-3.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7865de06779b14d98068da387333ad9bf2756b5b579cc887fac169bc08f87c3"}, + {file = "h5py-3.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49bc857635f935fa30e92e61ac1e87496df8f260a6945a3235e43a9890426866"}, + {file = "h5py-3.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:5fd2252d1fc364ba0e93dd0b7089f4906b66805cb4e6aca7fa8874ac08649647"}, + {file = "h5py-3.8.0.tar.gz", hash = "sha256:6fead82f0c4000cf38d53f9c030780d81bfa0220218aee13b90b7701c937d95f"}, +] + +[package.dependencies] +numpy = ">=1.14.5" + +[[package]] +name = "hdf5plugin" +version = "4.1.1" +description = "HDF5 Plugins for Windows, MacOS, and Linux" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "hdf5plugin-4.1.1-py3-none-macosx_10_9_universal2.whl", hash = "sha256:02fa82fbe5b6608b8c5371bd2a2dbe780abdafe30f2830e0ca658b6b59da6225"}, + {file = "hdf5plugin-4.1.1-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a23463b1f70c3bfe3654299a397e97d074f1f8122d60fc4fc72c0005abf3900f"}, + {file = "hdf5plugin-4.1.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0a6906054df13341999c56f2301ae55f86499aebeec286612b6479453868d335"}, + {file = "hdf5plugin-4.1.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16a8936f38890ce3a4dc10375adfb19dbf315e44cc7f099aafd1232e7ec75854"}, + {file = "hdf5plugin-4.1.1-py3-none-win_amd64.whl", hash = "sha256:11c3fffe14aaf8ebd84729c2f110a3f2e4965b164484c0ef67005dc376f82b10"}, + {file = "hdf5plugin-4.1.1.tar.gz", hash = "sha256:96a989679f1f38251e0dcae363180d382ba402f6c89aab73ca351a391ac23b36"}, +] + +[package.dependencies] +h5py = "*" + +[package.extras] +dev = ["sphinx", "sphinx-rtd-theme"] + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "imageio" +version = "2.26.1" +description = "Library for reading and writing a wide range of image, video, scientific, and volumetric data formats." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "imageio-2.26.1-py3-none-any.whl", hash = "sha256:df56ade8a9b43476ce020be0202b09a3a4cc0c7a079f8fe5ee4b87105eff4237"}, + {file = "imageio-2.26.1.tar.gz", hash = "sha256:7f7bc13254a311f298bc64d60c2690dd3460fd412532717e2c51715daed17fc5"}, +] + +[package.dependencies] +numpy = "*" +pillow = ">=8.3.2" + +[package.extras] +all-plugins = ["astropy", "av", "imageio-ffmpeg", "psutil", "tifffile"] +all-plugins-pypy = ["av", "imageio-ffmpeg", "psutil", "tifffile"] +build = ["wheel"] +dev = ["black", "flake8", "fsspec[github]", "invoke", "pytest", "pytest-cov"] +docs = ["numpydoc", "pydata-sphinx-theme", "sphinx (<6)"] +ffmpeg = ["imageio-ffmpeg", "psutil"] +fits = ["astropy"] +full = ["astropy", "av", "black", "flake8", "fsspec[github]", "gdal", "imageio-ffmpeg", "invoke", "itk", "numpydoc", "psutil", "pydata-sphinx-theme", "pytest", "pytest-cov", "sphinx (<6)", "tifffile", "wheel"] +gdal = ["gdal"] +itk = ["itk"] +linting = ["black", "flake8"] +pyav = ["av"] +test = ["fsspec[github]", "invoke", "pytest", "pytest-cov"] +tifffile = ["tifffile"] + +[[package]] +name = "imageio-ffmpeg" +version = "0.4.8" +description = "FFMPEG wrapper for Python" +category = "dev" +optional = false +python-versions = ">=3.5" +files = [ + {file = "imageio-ffmpeg-0.4.8.tar.gz", hash = "sha256:fdaa05ad10fe070b7fa8e5f615cb0d28f3b9b791d00af6d2a11e694158d10aa9"}, + {file = "imageio_ffmpeg-0.4.8-py3-none-macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:dba439a303d65061aef17d2ee9324ecfa9c6b4752bd0953b309fdbb79b38451e"}, + {file = "imageio_ffmpeg-0.4.8-py3-none-manylinux2010_x86_64.whl", hash = "sha256:7caa9ce9fc0d7e2f3160ce8cb70a115e5211e0f048e5c1509163d8f89d1080df"}, + {file = "imageio_ffmpeg-0.4.8-py3-none-manylinux2014_aarch64.whl", hash = "sha256:dd3ef9835df91570a1cbd9e36dfbc7d228fca42dbb11636e20df75d719de2949"}, + {file = "imageio_ffmpeg-0.4.8-py3-none-win32.whl", hash = "sha256:0e2688120b3bdb367897450d07c1b1300e96a0bace03ba7de2eb8d738237ea9a"}, + {file = "imageio_ffmpeg-0.4.8-py3-none-win_amd64.whl", hash = "sha256:120d70e6448617cad6213e47dee3a3310117c230f532dd614ed3059a78acf13a"}, +] + +[[package]] +name = "importlib-metadata" +version = "6.1.0" +description = "Read metadata from Python packages" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "importlib_metadata-6.1.0-py3-none-any.whl", hash = "sha256:ff80f3b5394912eb1b108fcfd444dc78b7f1f3e16b16188054bd01cb9cb86f09"}, + {file = "importlib_metadata-6.1.0.tar.gz", hash = "sha256:43ce9281e097583d758c2c708c4376371261a02c34682491a8e98352365aad20"}, +] + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +perf = ["ipython"] +testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] + +[[package]] +name = "iopath" +version = "0.1.10" +description = "A library for providing I/O abstraction." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "iopath-0.1.10.tar.gz", hash = "sha256:3311c16a4d9137223e20f141655759933e1eda24f8bff166af834af3c645ef01"}, +] + +[package.dependencies] +portalocker = "*" +tqdm = "*" +typing_extensions = "*" + +[package.extras] +aws = ["boto3"] + +[[package]] +name = "ipykernel" +version = "6.22.0" +description = "IPython Kernel for Jupyter" +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "ipykernel-6.22.0-py3-none-any.whl", hash = "sha256:1ae6047c1277508933078163721bbb479c3e7292778a04b4bacf0874550977d6"}, + {file = "ipykernel-6.22.0.tar.gz", hash = "sha256:302558b81f1bc22dc259fb2a0c5c7cf2f4c0bdb21b50484348f7bafe7fb71421"}, +] + +[package.dependencies] +appnope = {version = "*", markers = "platform_system == \"Darwin\""} +comm = ">=0.1.1" +debugpy = ">=1.6.5" +ipython = ">=7.23.1" +jupyter-client = ">=6.1.12" +jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" +matplotlib-inline = ">=0.1" +nest-asyncio = "*" +packaging = "*" +psutil = "*" +pyzmq = ">=20" +tornado = ">=6.1" +traitlets = ">=5.4.0" + +[package.extras] +cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] +pyqt5 = ["pyqt5"] +pyside6 = ["pyside6"] +test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "ipython" +version = "8.11.0" +description = "IPython: Productive Interactive Computing" +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "ipython-8.11.0-py3-none-any.whl", hash = "sha256:5b54478e459155a326bf5f42ee4f29df76258c0279c36f21d71ddb560f88b156"}, + {file = "ipython-8.11.0.tar.gz", hash = "sha256:735cede4099dbc903ee540307b9171fbfef4aa75cfcacc5a273b2cda2f02be04"}, +] + +[package.dependencies] +appnope = {version = "*", markers = "sys_platform == \"darwin\""} +backcall = "*" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +decorator = "*" +jedi = ">=0.16" +matplotlib-inline = "*" +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} +pickleshare = "*" +prompt-toolkit = ">=3.0.30,<3.0.37 || >3.0.37,<3.1.0" +pygments = ">=2.4.0" +stack-data = "*" +traitlets = ">=5" + +[package.extras] +all = ["black", "curio", "docrepr", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.21)", "pandas", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] +black = ["black"] +doc = ["docrepr", "ipykernel", "matplotlib", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] +kernel = ["ipykernel"] +nbconvert = ["nbconvert"] +nbformat = ["nbformat"] +notebook = ["ipywidgets", "notebook"] +parallel = ["ipyparallel"] +qtconsole = ["qtconsole"] +test = ["pytest (<7.1)", "pytest-asyncio", "testpath"] +test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pandas", "pytest (<7.1)", "pytest-asyncio", "testpath", "trio"] + +[[package]] +name = "ipython-genutils" +version = "0.2.0" +description = "Vestigial utilities from IPython" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "ipython_genutils-0.2.0-py2.py3-none-any.whl", hash = "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8"}, + {file = "ipython_genutils-0.2.0.tar.gz", hash = "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"}, +] + +[[package]] +name = "ipywidgets" +version = "8.0.5" +description = "Jupyter interactive widgets" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "ipywidgets-8.0.5-py3-none-any.whl", hash = "sha256:a6e5c0392f86207fae304688a670afb26b2fd819592cfc0812777c2fdf22dbad"}, + {file = "ipywidgets-8.0.5.tar.gz", hash = "sha256:89a1930b9ef255838571a2415cc4a15e824e4316b8f067805d1d03b98b6a8c5f"}, +] + +[package.dependencies] +ipython = ">=6.1.0" +jupyterlab-widgets = ">=3.0,<4.0" +traitlets = ">=4.3.1" +widgetsnbextension = ">=4.0,<5.0" + +[package.extras] +test = ["ipykernel", "jsonschema", "pytest (>=3.6.0)", "pytest-cov", "pytz"] + +[[package]] +name = "isoduration" +version = "20.11.0" +description = "Operations with ISO 8601 durations" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042"}, + {file = "isoduration-20.11.0.tar.gz", hash = "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9"}, +] + +[package.dependencies] +arrow = ">=0.15.0" + +[[package]] +name = "isort" +version = "5.12.0" +description = "A Python utility / library to sort Python imports." +category = "dev" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, + {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, +] + +[package.extras] +colors = ["colorama (>=0.4.3)"] +pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] +plugins = ["setuptools"] +requirements-deprecated-finder = ["pip-api", "pipreqs"] + +[[package]] +name = "jedi" +version = "0.18.2" +description = "An autocompletion tool for Python that can be used for text editors." +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "jedi-0.18.2-py2.py3-none-any.whl", hash = "sha256:203c1fd9d969ab8f2119ec0a3342e0b49910045abe6af0a3ae83a5764d54639e"}, + {file = "jedi-0.18.2.tar.gz", hash = "sha256:bae794c30d07f6d910d32a7048af09b5a39ed740918da923c6b780790ebac612"}, +] + +[package.dependencies] +parso = ">=0.8.0,<0.9.0" + +[package.extras] +docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] +qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] +testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] + +[[package]] +name = "jinja2" +version = "3.1.2" +description = "A very fast and expressive template engine." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "joblib" +version = "1.2.0" +description = "Lightweight pipelining with Python functions" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "joblib-1.2.0-py3-none-any.whl", hash = "sha256:091138ed78f800342968c523bdde947e7a305b8594b910a0fea2ab83c3c6d385"}, + {file = "joblib-1.2.0.tar.gz", hash = "sha256:e1cee4a79e4af22881164f218d4311f60074197fb707e082e803b61f6d137018"}, +] + +[[package]] +name = "json5" +version = "0.9.11" +description = "A Python implementation of the JSON5 data format." +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "json5-0.9.11-py2.py3-none-any.whl", hash = "sha256:1aa54b80b5e507dfe31d12b7743a642e2ffa6f70bf73b8e3d7d1d5fba83d99bd"}, + {file = "json5-0.9.11.tar.gz", hash = "sha256:4f1e196acc55b83985a51318489f345963c7ba84aa37607e49073066c562e99b"}, +] + +[package.extras] +dev = ["hypothesis"] + +[[package]] +name = "jsonpointer" +version = "2.3" +description = "Identify specific nodes in a JSON document (RFC 6901)" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "jsonpointer-2.3-py2.py3-none-any.whl", hash = "sha256:51801e558539b4e9cd268638c078c6c5746c9ac96bc38152d443400e4f3793e9"}, + {file = "jsonpointer-2.3.tar.gz", hash = "sha256:97cba51526c829282218feb99dab1b1e6bdf8efd1c43dc9d57be093c0d69c99a"}, +] + +[[package]] +name = "jsonschema" +version = "4.17.3" +description = "An implementation of JSON Schema validation for Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jsonschema-4.17.3-py3-none-any.whl", hash = "sha256:a870ad254da1a8ca84b6a2905cac29d265f805acc57af304784962a2aa6508f6"}, + {file = "jsonschema-4.17.3.tar.gz", hash = "sha256:0f864437ab8b6076ba6707453ef8f98a6a0d512a80e93f8abdb676f737ecb60d"}, +] + +[package.dependencies] +attrs = ">=17.4.0" +fqdn = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +idna = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +isoduration = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +jsonpointer = {version = ">1.13", optional = true, markers = "extra == \"format-nongpl\""} +pyrsistent = ">=0.14.0,<0.17.0 || >0.17.0,<0.17.1 || >0.17.1,<0.17.2 || >0.17.2" +rfc3339-validator = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +rfc3986-validator = {version = ">0.1.0", optional = true, markers = "extra == \"format-nongpl\""} +uri-template = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +webcolors = {version = ">=1.11", optional = true, markers = "extra == \"format-nongpl\""} + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] + +[[package]] +name = "jupyter" +version = "1.0.0" +description = "Jupyter metapackage. Install all the Jupyter components in one go." +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "jupyter-1.0.0-py2.py3-none-any.whl", hash = "sha256:5b290f93b98ffbc21c0c7e749f054b3267782166d72fa5e3ed1ed4eaf34a2b78"}, + {file = "jupyter-1.0.0.tar.gz", hash = "sha256:d9dc4b3318f310e34c82951ea5d6683f67bed7def4b259fafbfe4f1beb1d8e5f"}, + {file = "jupyter-1.0.0.zip", hash = "sha256:3e1f86076bbb7c8c207829390305a2b1fe836d471ed54be66a3b8c41e7f46cc7"}, +] + +[package.dependencies] +ipykernel = "*" +ipywidgets = "*" +jupyter-console = "*" +nbconvert = "*" +notebook = "*" +qtconsole = "*" + +[[package]] +name = "jupyter-client" +version = "8.1.0" +description = "Jupyter protocol implementation and client libraries" +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_client-8.1.0-py3-none-any.whl", hash = "sha256:d5b8e739d7816944be50f81121a109788a3d92732ecf1ad1e4dadebc948818fe"}, + {file = "jupyter_client-8.1.0.tar.gz", hash = "sha256:3fbab64100a0dcac7701b1e0f1a4412f1ccb45546ff2ad9bc4fcbe4e19804811"}, +] + +[package.dependencies] +jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" +python-dateutil = ">=2.8.2" +pyzmq = ">=23.0" +tornado = ">=6.2" +traitlets = ">=5.3" + +[package.extras] +docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["codecov", "coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] + +[[package]] +name = "jupyter-console" +version = "6.6.3" +description = "Jupyter terminal console" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jupyter_console-6.6.3-py3-none-any.whl", hash = "sha256:309d33409fcc92ffdad25f0bcdf9a4a9daa61b6f341177570fdac03de5352485"}, + {file = "jupyter_console-6.6.3.tar.gz", hash = "sha256:566a4bf31c87adbfadf22cdf846e3069b59a71ed5da71d6ba4d8aaad14a53539"}, +] + +[package.dependencies] +ipykernel = ">=6.14" +ipython = "*" +jupyter-client = ">=7.0.0" +jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" +prompt-toolkit = ">=3.0.30" +pygments = "*" +pyzmq = ">=17" +traitlets = ">=5.4" + +[package.extras] +test = ["flaky", "pexpect", "pytest"] + +[[package]] +name = "jupyter-contrib-core" +version = "0.4.2" +description = "Common utilities for jupyter-contrib projects." +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "jupyter_contrib_core-0.4.2.tar.gz", hash = "sha256:1887212f3ca9d4487d624c0705c20dfdf03d5a0b9ea2557d3aaeeb4c38bdcabb"}, +] + +[package.dependencies] +jupyter_core = "*" +notebook = ">=4.0" +setuptools = "*" +tornado = "*" +traitlets = "*" + +[package.extras] +testing-utils = ["mock", "nose"] + +[[package]] +name = "jupyter-contrib-nbextensions" +version = "0.7.0" +description = "A collection of Jupyter nbextensions." +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "jupyter_contrib_nbextensions-0.7.0.tar.gz", hash = "sha256:06e33f005885eb92f89cbe82711e921278201298d08ab0d886d1ba09e8c3e9ca"}, +] + +[package.dependencies] +ipython_genutils = "*" +jupyter_contrib_core = ">=0.3.3" +jupyter_core = "*" +jupyter_highlight_selected_word = ">=0.1.1" +jupyter_nbextensions_configurator = ">=0.4.0" +lxml = "*" +nbconvert = ">=6.0" +notebook = ">=6.0" +tornado = "*" +traitlets = ">=4.1" + +[package.extras] +test = ["mock", "nbformat", "nose", "pip", "requests"] + +[[package]] +name = "jupyter-core" +version = "5.3.0" +description = "Jupyter core package. A base package on which Jupyter projects rely." +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_core-5.3.0-py3-none-any.whl", hash = "sha256:d4201af84559bc8c70cead287e1ab94aeef3c512848dde077b7684b54d67730d"}, + {file = "jupyter_core-5.3.0.tar.gz", hash = "sha256:6db75be0c83edbf1b7c9f91ec266a9a24ef945da630f3120e1a0046dc13713fc"}, +] + +[package.dependencies] +platformdirs = ">=2.5" +pywin32 = {version = ">=300", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} +traitlets = ">=5.3" + +[package.extras] +docs = ["myst-parser", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] +test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "jupyter-events" +version = "0.6.3" +description = "Jupyter Event System library" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jupyter_events-0.6.3-py3-none-any.whl", hash = "sha256:57a2749f87ba387cd1bfd9b22a0875b889237dbf2edc2121ebb22bde47036c17"}, + {file = "jupyter_events-0.6.3.tar.gz", hash = "sha256:9a6e9995f75d1b7146b436ea24d696ce3a35bfa8bfe45e0c33c334c79464d0b3"}, +] + +[package.dependencies] +jsonschema = {version = ">=3.2.0", extras = ["format-nongpl"]} +python-json-logger = ">=2.0.4" +pyyaml = ">=5.3" +rfc3339-validator = "*" +rfc3986-validator = ">=0.1.1" +traitlets = ">=5.3" + +[package.extras] +cli = ["click", "rich"] +docs = ["jupyterlite-sphinx", "myst-parser", "pydata-sphinx-theme", "sphinxcontrib-spelling"] +test = ["click", "coverage", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.19.0)", "pytest-console-scripts", "pytest-cov", "rich"] + +[[package]] +name = "jupyter-highlight-selected-word" +version = "0.2.0" +description = "Jupyter notebook extension that enables highlighting every instance of the current word in the notebook." +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "jupyter_highlight_selected_word-0.2.0-py2.py3-none-any.whl", hash = "sha256:9545dfa9cb057eebe3a5795604dcd3a5294ea18637e553f61a0b67c1b5903c58"}, + {file = "jupyter_highlight_selected_word-0.2.0.tar.gz", hash = "sha256:9fa740424859a807950ca08d2bfd28a35154cd32dd6d50ac4e0950022adc0e7b"}, +] + +[[package]] +name = "jupyter-nbextensions-configurator" +version = "0.6.1" +description = "jupyter serverextension providing configuration interfaces for nbextensions." +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "jupyter_nbextensions_configurator-0.6.1.tar.gz", hash = "sha256:4b9e1270ccc1f8e0a421efb8979a737f586813023a4855b9453f61c3ca599b82"}, +] + +[package.dependencies] +jupyter_contrib_core = ">=0.3.3" +jupyter_core = "*" +notebook = ">=6.0" +pyyaml = "*" +tornado = "*" +traitlets = "*" + +[package.extras] +test = ["jupyter_contrib_core[testing-utils]", "mock", "nose", "requests", "selenium"] + +[[package]] +name = "jupyter-server" +version = "2.5.0" +description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_server-2.5.0-py3-none-any.whl", hash = "sha256:e6bc1e9e96d7c55b9ce9699ff6cb9a910581fe7349e27c40389acb67632e24c0"}, + {file = "jupyter_server-2.5.0.tar.gz", hash = "sha256:9fde612791f716fd34d610cd939704a9639643744751ba66e7ee8fdc9cead07e"}, +] + +[package.dependencies] +anyio = ">=3.1.0" +argon2-cffi = "*" +jinja2 = "*" +jupyter-client = ">=7.4.4" +jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" +jupyter-events = ">=0.4.0" +jupyter-server-terminals = "*" +nbconvert = ">=6.4.4" +nbformat = ">=5.3.0" +packaging = "*" +prometheus-client = "*" +pywinpty = {version = "*", markers = "os_name == \"nt\""} +pyzmq = ">=24" +send2trash = "*" +terminado = ">=0.8.3" +tornado = ">=6.2.0" +traitlets = ">=5.6.0" +websocket-client = "*" + +[package.extras] +docs = ["docutils (<0.20)", "ipykernel", "jinja2", "jupyter-client", "jupyter-server", "mistune (<1.0.0)", "myst-parser", "nbformat", "prometheus-client", "pydata-sphinx-theme", "send2trash", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-openapi", "sphinxcontrib-spelling", "sphinxemoji", "tornado", "typing-extensions"] +test = ["ipykernel", "pre-commit", "pytest (>=7.0)", "pytest-console-scripts", "pytest-jupyter[server] (>=0.4)", "pytest-timeout", "requests"] + +[[package]] +name = "jupyter-server-fileid" +version = "0.8.0" +description = "" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jupyter_server_fileid-0.8.0-py3-none-any.whl", hash = "sha256:6092ef114eddccf6cba69c0f0feb612c2f476f2e9467828809edb854c18806bb"}, + {file = "jupyter_server_fileid-0.8.0.tar.gz", hash = "sha256:1e0816d0857f490fadea11348570f0cba03f70f315c9842225aecfa45882b6af"}, +] + +[package.dependencies] +jupyter-events = ">=0.5.0" +jupyter-server = ">=1.15,<3" + +[package.extras] +cli = ["click"] +test = ["jupyter-server[test] (>=1.15,<3)", "pytest", "pytest-cov"] + +[[package]] +name = "jupyter-server-terminals" +version = "0.4.4" +description = "A Jupyter Server Extension Providing Terminals." +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_server_terminals-0.4.4-py3-none-any.whl", hash = "sha256:75779164661cec02a8758a5311e18bb8eb70c4e86c6b699403100f1585a12a36"}, + {file = "jupyter_server_terminals-0.4.4.tar.gz", hash = "sha256:57ab779797c25a7ba68e97bcfb5d7740f2b5e8a83b5e8102b10438041a7eac5d"}, +] + +[package.dependencies] +pywinpty = {version = ">=2.0.3", markers = "os_name == \"nt\""} +terminado = ">=0.8.3" + +[package.extras] +docs = ["jinja2", "jupyter-server", "mistune (<3.0)", "myst-parser", "nbformat", "packaging", "pydata-sphinx-theme", "sphinxcontrib-github-alt", "sphinxcontrib-openapi", "sphinxcontrib-spelling", "sphinxemoji", "tornado"] +test = ["coverage", "jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-cov", "pytest-jupyter[server] (>=0.5.3)", "pytest-timeout"] + +[[package]] +name = "jupyter-server-ydoc" +version = "0.8.0" +description = "A Jupyter Server Extension Providing Y Documents." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jupyter_server_ydoc-0.8.0-py3-none-any.whl", hash = "sha256:969a3a1a77ed4e99487d60a74048dc9fa7d3b0dcd32e60885d835bbf7ba7be11"}, + {file = "jupyter_server_ydoc-0.8.0.tar.gz", hash = "sha256:a6fe125091792d16c962cc3720c950c2b87fcc8c3ecf0c54c84e9a20b814526c"}, +] + +[package.dependencies] +jupyter-server-fileid = ">=0.6.0,<1" +jupyter-ydoc = ">=0.2.0,<0.4.0" +ypy-websocket = ">=0.8.2,<0.9.0" + +[package.extras] +test = ["coverage", "jupyter-server[test] (>=2.0.0a0)", "pytest (>=7.0)", "pytest-cov", "pytest-timeout", "pytest-tornasync"] + +[[package]] +name = "jupyter-ydoc" +version = "0.2.3" +description = "Document structures for collaborative editing using Ypy" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jupyter_ydoc-0.2.3-py3-none-any.whl", hash = "sha256:3ac51abfe378c6aeb62a449e8f0241bede1205f0199b0d27429140cbba950f79"}, + {file = "jupyter_ydoc-0.2.3.tar.gz", hash = "sha256:98db7785215873c64d7dfcb1b741f41df11994c4b3d7e2957e004b392d6f11ea"}, +] + +[package.dependencies] +y-py = ">=0.5.3,<0.6.0" + +[package.extras] +dev = ["click", "jupyter-releaser"] +test = ["pre-commit", "pytest", "pytest-asyncio", "websockets (>=10.0)", "ypy-websocket (>=0.3.1,<0.4.0)"] + +[[package]] +name = "jupyterlab" +version = "3.6.2" +description = "JupyterLab computational environment" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jupyterlab-3.6.2-py3-none-any.whl", hash = "sha256:6c87c5910f886a14009352bc63f640961b206f73ed650dcf94d65f9dfcb30f95"}, + {file = "jupyterlab-3.6.2.tar.gz", hash = "sha256:e55bc40c36c2a52b76cf301138507a5488eb769137dd39d9f31a6259a00c6b03"}, +] + +[package.dependencies] +ipython = "*" +jinja2 = ">=2.1" +jupyter-core = "*" +jupyter-server = ">=1.16.0,<3" +jupyter-server-ydoc = ">=0.8.0,<0.9.0" +jupyter-ydoc = ">=0.2.3,<0.3.0" +jupyterlab-server = ">=2.19,<3.0" +nbclassic = "*" +notebook = "<7" +packaging = "*" +tomli = {version = "*", markers = "python_version < \"3.11\""} +tornado = ">=6.1.0" + +[package.extras] +test = ["check-manifest", "coverage", "jupyterlab-server[test]", "pre-commit", "pytest (>=6.0)", "pytest-check-links (>=0.5)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter (>=0.5.3)", "requests", "requests-cache", "virtualenv"] + +[[package]] +name = "jupyterlab-pygments" +version = "0.2.2" +description = "Pygments theme using JupyterLab CSS variables" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jupyterlab_pygments-0.2.2-py2.py3-none-any.whl", hash = "sha256:2405800db07c9f770863bcf8049a529c3dd4d3e28536638bd7c1c01d2748309f"}, + {file = "jupyterlab_pygments-0.2.2.tar.gz", hash = "sha256:7405d7fde60819d905a9fa8ce89e4cd830e318cdad22a0030f7a901da705585d"}, +] + +[[package]] +name = "jupyterlab-server" +version = "2.21.0" +description = "A set of server components for JupyterLab and JupyterLab like applications." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jupyterlab_server-2.21.0-py3-none-any.whl", hash = "sha256:ff1e7a81deb2dcb433215d469000988590fd5a5733574aa2698d643a6c9b3ace"}, + {file = "jupyterlab_server-2.21.0.tar.gz", hash = "sha256:b4f5b48eaae1be83e2fd6fb77ac49d9b639be4ca4bd2e05b5368d29632a93725"}, +] + +[package.dependencies] +babel = ">=2.10" +jinja2 = ">=3.0.3" +json5 = ">=0.9.0" +jsonschema = ">=4.17.3" +jupyter-server = ">=1.21,<3" +packaging = ">=21.3" +requests = ">=2.28" + +[package.extras] +docs = ["autodoc-traits", "docutils (<0.20)", "jinja2 (<3.2.0)", "mistune (<3)", "myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-copybutton", "sphinxcontrib-openapi"] +openapi = ["openapi-core (>=0.16.1,<0.17.0)", "ruamel-yaml"] +test = ["codecov", "hatch", "ipykernel", "jupyterlab-server[openapi]", "openapi-spec-validator (>=0.5.1,<0.6.0)", "pytest (>=7.0)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter[server] (>=0.6.2)", "pytest-timeout", "requests-mock", "sphinxcontrib-spelling", "strict-rfc3339", "werkzeug"] + +[[package]] +name = "jupyterlab-widgets" +version = "3.0.6" +description = "Jupyter interactive widgets for JupyterLab" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jupyterlab_widgets-3.0.6-py3-none-any.whl", hash = "sha256:e95d08adf4f9c37a57da5fff8a65d00480199885fd2ecd2583fd9560b594b4e9"}, + {file = "jupyterlab_widgets-3.0.6.tar.gz", hash = "sha256:a464d68a7b9ebabdc135196389381412a39503d89302be0867d0ff3b2428ebb8"}, +] + +[[package]] +name = "jupyterthemes" +version = "0.20.0" +description = "Select and install a Jupyter notebook theme" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "jupyterthemes-0.20.0-py2.py3-none-any.whl", hash = "sha256:4bd42fc88a06e3afabbe70c2ee25e6467147512993a3cbd9bec57ae3fd2e2fb1"}, + {file = "jupyterthemes-0.20.0.tar.gz", hash = "sha256:2a8ebc0c84b212ab99b9f1757fc0582a3f53930d3a75b2492d91a7c8b36ab41e"}, +] + +[package.dependencies] +ipython = ">=5.4.1" +jupyter-core = "*" +lesscpy = ">=0.11.2" +matplotlib = ">=1.4.3" +notebook = ">=5.6.0" + +[[package]] +name = "keopscore" +version = "2.1.1" +description = "keopscore is the KeOps meta programming engine. This python module should be used through a binder (e.g. pykeops or rkeops)" +category = "main" +optional = false +python-versions = ">=3" +files = [ + {file = "keopscore-2.1.1.tar.gz", hash = "sha256:07b4d254a28a9d4a43153663856677263dd7112912efacbad83c2a76ea0836f0"}, +] + +[[package]] +name = "kiwisolver" +version = "1.4.4" +description = "A fast implementation of the Cassowary constraint solver" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2f5e60fabb7343a836360c4f0919b8cd0d6dbf08ad2ca6b9cf90bf0c76a3c4f6"}, + {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:10ee06759482c78bdb864f4109886dff7b8a56529bc1609d4f1112b93fe6423c"}, + {file = "kiwisolver-1.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c79ebe8f3676a4c6630fd3f777f3cfecf9289666c84e775a67d1d358578dc2e3"}, + {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:abbe9fa13da955feb8202e215c4018f4bb57469b1b78c7a4c5c7b93001699938"}, + {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7577c1987baa3adc4b3c62c33bd1118c3ef5c8ddef36f0f2c950ae0b199e100d"}, + {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ad8285b01b0d4695102546b342b493b3ccc6781fc28c8c6a1bb63e95d22f09"}, + {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ed58b8acf29798b036d347791141767ccf65eee7f26bde03a71c944449e53de"}, + {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a68b62a02953b9841730db7797422f983935aeefceb1679f0fc85cbfbd311c32"}, + {file = "kiwisolver-1.4.4-cp310-cp310-win32.whl", hash = "sha256:e92a513161077b53447160b9bd8f522edfbed4bd9759e4c18ab05d7ef7e49408"}, + {file = "kiwisolver-1.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:3fe20f63c9ecee44560d0e7f116b3a747a5d7203376abeea292ab3152334d004"}, + {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ea21f66820452a3f5d1655f8704a60d66ba1191359b96541eaf457710a5fc6"}, + {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bc9db8a3efb3e403e4ecc6cd9489ea2bac94244f80c78e27c31dcc00d2790ac2"}, + {file = "kiwisolver-1.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d5b61785a9ce44e5a4b880272baa7cf6c8f48a5180c3e81c59553ba0cb0821ca"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c2dbb44c3f7e6c4d3487b31037b1bdbf424d97687c1747ce4ff2895795c9bf69"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6295ecd49304dcf3bfbfa45d9a081c96509e95f4b9d0eb7ee4ec0530c4a96514"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4bd472dbe5e136f96a4b18f295d159d7f26fd399136f5b17b08c4e5f498cd494"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf7d9fce9bcc4752ca4a1b80aabd38f6d19009ea5cbda0e0856983cf6d0023f5"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78d6601aed50c74e0ef02f4204da1816147a6d3fbdc8b3872d263338a9052c51"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:877272cf6b4b7e94c9614f9b10140e198d2186363728ed0f701c6eee1baec1da"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:db608a6757adabb32f1cfe6066e39b3706d8c3aa69bbc353a5b61edad36a5cb4"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5853eb494c71e267912275e5586fe281444eb5e722de4e131cddf9d442615626"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f0a1dbdb5ecbef0d34eb77e56fcb3e95bbd7e50835d9782a45df81cc46949750"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:283dffbf061a4ec60391d51e6155e372a1f7a4f5b15d59c8505339454f8989e4"}, + {file = "kiwisolver-1.4.4-cp311-cp311-win32.whl", hash = "sha256:d06adcfa62a4431d404c31216f0f8ac97397d799cd53800e9d3efc2fbb3cf14e"}, + {file = "kiwisolver-1.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:e7da3fec7408813a7cebc9e4ec55afed2d0fd65c4754bc376bf03498d4e92686"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:62ac9cc684da4cf1778d07a89bf5f81b35834cb96ca523d3a7fb32509380cbf6"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41dae968a94b1ef1897cb322b39360a0812661dba7c682aa45098eb8e193dbdf"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02f79693ec433cb4b5f51694e8477ae83b3205768a6fb48ffba60549080e295b"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d0611a0a2a518464c05ddd5a3a1a0e856ccc10e67079bb17f265ad19ab3c7597"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:db5283d90da4174865d520e7366801a93777201e91e79bacbac6e6927cbceede"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1041feb4cda8708ce73bb4dcb9ce1ccf49d553bf87c3954bdfa46f0c3f77252c"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-win32.whl", hash = "sha256:a553dadda40fef6bfa1456dc4be49b113aa92c2a9a9e8711e955618cd69622e3"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-win_amd64.whl", hash = "sha256:03baab2d6b4a54ddbb43bba1a3a2d1627e82d205c5cf8f4c924dc49284b87166"}, + {file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:841293b17ad704d70c578f1f0013c890e219952169ce8a24ebc063eecf775454"}, + {file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f4f270de01dd3e129a72efad823da90cc4d6aafb64c410c9033aba70db9f1ff0"}, + {file = "kiwisolver-1.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f9f39e2f049db33a908319cf46624a569b36983c7c78318e9726a4cb8923b26c"}, + {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c97528e64cb9ebeff9701e7938653a9951922f2a38bd847787d4a8e498cc83ae"}, + {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d1573129aa0fd901076e2bfb4275a35f5b7aa60fbfb984499d661ec950320b0"}, + {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ad881edc7ccb9d65b0224f4e4d05a1e85cf62d73aab798943df6d48ab0cd79a1"}, + {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b428ef021242344340460fa4c9185d0b1f66fbdbfecc6c63eff4b7c29fad429d"}, + {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2e407cb4bd5a13984a6c2c0fe1845e4e41e96f183e5e5cd4d77a857d9693494c"}, + {file = "kiwisolver-1.4.4-cp38-cp38-win32.whl", hash = "sha256:75facbe9606748f43428fc91a43edb46c7ff68889b91fa31f53b58894503a191"}, + {file = "kiwisolver-1.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:5bce61af018b0cb2055e0e72e7d65290d822d3feee430b7b8203d8a855e78766"}, + {file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8c808594c88a025d4e322d5bb549282c93c8e1ba71b790f539567932722d7bd8"}, + {file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0a71d85ecdd570ded8ac3d1c0f480842f49a40beb423bb8014539a9f32a5897"}, + {file = "kiwisolver-1.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b533558eae785e33e8c148a8d9921692a9fe5aa516efbdff8606e7d87b9d5824"}, + {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:efda5fc8cc1c61e4f639b8067d118e742b812c930f708e6667a5ce0d13499e29"}, + {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7c43e1e1206cd421cd92e6b3280d4385d41d7166b3ed577ac20444b6995a445f"}, + {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc8d3bd6c72b2dd9decf16ce70e20abcb3274ba01b4e1c96031e0c4067d1e7cd"}, + {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ea39b0ccc4f5d803e3337dd46bcce60b702be4d86fd0b3d7531ef10fd99a1ac"}, + {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:968f44fdbf6dd757d12920d63b566eeb4d5b395fd2d00d29d7ef00a00582aac9"}, + {file = "kiwisolver-1.4.4-cp39-cp39-win32.whl", hash = "sha256:da7e547706e69e45d95e116e6939488d62174e033b763ab1496b4c29b76fabea"}, + {file = "kiwisolver-1.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:ba59c92039ec0a66103b1d5fe588fa546373587a7d68f5c96f743c3396afc04b"}, + {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:91672bacaa030f92fc2f43b620d7b337fd9a5af28b0d6ed3f77afc43c4a64b5a"}, + {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:787518a6789009c159453da4d6b683f468ef7a65bbde796bcea803ccf191058d"}, + {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da152d8cdcab0e56e4f45eb08b9aea6455845ec83172092f09b0e077ece2cf7a"}, + {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ecb1fa0db7bf4cff9dac752abb19505a233c7f16684c5826d1f11ebd9472b871"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:28bc5b299f48150b5f822ce68624e445040595a4ac3d59251703779836eceff9"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:81e38381b782cc7e1e46c4e14cd997ee6040768101aefc8fa3c24a4cc58e98f8"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2a66fdfb34e05b705620dd567f5a03f239a088d5a3f321e7b6ac3239d22aa286"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:872b8ca05c40d309ed13eb2e582cab0c5a05e81e987ab9c521bf05ad1d5cf5cb"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:70e7c2e7b750585569564e2e5ca9845acfaa5da56ac46df68414f29fea97be9f"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9f85003f5dfa867e86d53fac6f7e6f30c045673fa27b603c397753bebadc3008"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e307eb9bd99801f82789b44bb45e9f541961831c7311521b13a6c85afc09767"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1792d939ec70abe76f5054d3f36ed5656021dcad1322d1cc996d4e54165cef9"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6cb459eea32a4e2cf18ba5fcece2dbdf496384413bc1bae15583f19e567f3b2"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36dafec3d6d6088d34e2de6b85f9d8e2324eb734162fba59d2ba9ed7a2043d5b"}, + {file = "kiwisolver-1.4.4.tar.gz", hash = "sha256:d41997519fcba4a1e46eb4a2fe31bc12f0ff957b2b81bac28db24744f333e955"}, +] + +[[package]] +name = "lazy-object-proxy" +version = "1.9.0" +description = "A fast and thorough lazy object proxy." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "lazy-object-proxy-1.9.0.tar.gz", hash = "sha256:659fb5809fa4629b8a1ac5106f669cfc7bef26fbb389dda53b3e010d1ac4ebae"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b40387277b0ed2d0602b8293b94d7257e17d1479e257b4de114ea11a8cb7f2d7"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8c6cfb338b133fbdbc5cfaa10fe3c6aeea827db80c978dbd13bc9dd8526b7d4"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:721532711daa7db0d8b779b0bb0318fa87af1c10d7fe5e52ef30f8eff254d0cd"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:66a3de4a3ec06cd8af3f61b8e1ec67614fbb7c995d02fa224813cb7afefee701"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1aa3de4088c89a1b69f8ec0dcc169aa725b0ff017899ac568fe44ddc1396df46"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-win32.whl", hash = "sha256:f0705c376533ed2a9e5e97aacdbfe04cecd71e0aa84c7c0595d02ef93b6e4455"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:ea806fd4c37bf7e7ad82537b0757999264d5f70c45468447bb2b91afdbe73a6e"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:946d27deaff6cf8452ed0dba83ba38839a87f4f7a9732e8f9fd4107b21e6ff07"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79a31b086e7e68b24b99b23d57723ef7e2c6d81ed21007b6281ebcd1688acb0a"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f699ac1c768270c9e384e4cbd268d6e67aebcfae6cd623b4d7c3bfde5a35db59"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bfb38f9ffb53b942f2b5954e0f610f1e721ccebe9cce9025a38c8ccf4a5183a4"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:189bbd5d41ae7a498397287c408617fe5c48633e7755287b21d741f7db2706a9"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-win32.whl", hash = "sha256:81fc4d08b062b535d95c9ea70dbe8a335c45c04029878e62d744bdced5141586"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:f2457189d8257dd41ae9b434ba33298aec198e30adf2dcdaaa3a28b9994f6adb"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9e25ef10a39e8afe59a5c348a4dbf29b4868ab76269f81ce1674494e2565a6e"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cbf9b082426036e19c6924a9ce90c740a9861e2bdc27a4834fd0a910742ac1e8"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f5fa4a61ce2438267163891961cfd5e32ec97a2c444e5b842d574251ade27d2"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8fa02eaab317b1e9e03f69aab1f91e120e7899b392c4fc19807a8278a07a97e8"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e7c21c95cae3c05c14aafffe2865bbd5e377cfc1348c4f7751d9dc9a48ca4bda"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win32.whl", hash = "sha256:f12ad7126ae0c98d601a7ee504c1122bcef553d1d5e0c3bfa77b16b3968d2734"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:edd20c5a55acb67c7ed471fa2b5fb66cb17f61430b7a6b9c3b4a1e40293b1671"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0daa332786cf3bb49e10dc6a17a52f6a8f9601b4cf5c295a4f85854d61de63"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cd077f3d04a58e83d04b20e334f678c2b0ff9879b9375ed107d5d07ff160171"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c94ea760b3ce47d1855a30984c78327500493d396eac4dfd8bd82041b22be"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:212774e4dfa851e74d393a2370871e174d7ff0ebc980907723bb67d25c8a7c30"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0117049dd1d5635bbff65444496c90e0baa48ea405125c088e93d9cf4525b11"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-win32.whl", hash = "sha256:0a891e4e41b54fd5b8313b96399f8b0e173bbbfc03c7631f01efbe29bb0bcf82"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:9990d8e71b9f6488e91ad25f322898c136b008d87bf852ff65391b004da5e17b"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9e7551208b2aded9c1447453ee366f1c4070602b3d932ace044715d89666899b"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f83ac4d83ef0ab017683d715ed356e30dd48a93746309c8f3517e1287523ef4"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7322c3d6f1766d4ef1e51a465f47955f1e8123caee67dd641e67d539a534d006"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:18b78ec83edbbeb69efdc0e9c1cb41a3b1b1ed11ddd8ded602464c3fc6020494"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:09763491ce220c0299688940f8dc2c5d05fd1f45af1e42e636b2e8b2303e4382"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-win32.whl", hash = "sha256:9090d8e53235aa280fc9239a86ae3ea8ac58eff66a705fa6aa2ec4968b95c821"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:db1c1722726f47e10e0b5fdbf15ac3b8adb58c091d12b3ab713965795036985f"}, +] + +[[package]] +name = "lesscpy" +version = "0.15.1" +description = "Python LESS compiler" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "lesscpy-0.15.1-py2.py3-none-any.whl", hash = "sha256:8d26e58ed4812b345c2896daea435a28cb3182f87ae3391157085255d4c37dff"}, + {file = "lesscpy-0.15.1.tar.gz", hash = "sha256:1045d17a98f688646ca758dff254e6e9c03745648e051a081b0395c3b77c824c"}, +] + +[package.dependencies] +ply = "*" + +[[package]] +name = "lightning-utilities" +version = "0.8.0" +description = "PyTorch Lightning Sample project." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "lightning-utilities-0.8.0.tar.gz", hash = "sha256:8e5d95c7c57f026cdfed7c154303e88c93a7a5e868c9944cb02cf71f1db29720"}, + {file = "lightning_utilities-0.8.0-py3-none-any.whl", hash = "sha256:22aa107b51c8f50ccef54d08885eb370903eb04148cddb2891b9c65c59de2a6e"}, +] + +[package.dependencies] +packaging = ">=17.1" +typing-extensions = "*" + +[package.extras] +cli = ["fire"] +docs = ["sphinx (>=4.0,<5.0)"] +test = ["coverage (==6.5.0)"] +typing = ["mypy (>=1.0.0)"] + +[[package]] +name = "llvmlite" +version = "0.39.1" +description = "lightweight wrapper around basic LLVM functionality" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "llvmlite-0.39.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6717c7a6e93c9d2c3d07c07113ec80ae24af45cde536b34363d4bcd9188091d9"}, + {file = "llvmlite-0.39.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ddab526c5a2c4ccb8c9ec4821fcea7606933dc53f510e2a6eebb45a418d3488a"}, + {file = "llvmlite-0.39.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3f331a323d0f0ada6b10d60182ef06c20a2f01be21699999d204c5750ffd0b4"}, + {file = "llvmlite-0.39.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2c00ff204afa721b0bb9835b5bf1ba7fba210eefcec5552a9e05a63219ba0dc"}, + {file = "llvmlite-0.39.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16f56eb1eec3cda3a5c526bc3f63594fc24e0c8d219375afeb336f289764c6c7"}, + {file = "llvmlite-0.39.1-cp310-cp310-win32.whl", hash = "sha256:d0bfd18c324549c0fec2c5dc610fd024689de6f27c6cc67e4e24a07541d6e49b"}, + {file = "llvmlite-0.39.1-cp310-cp310-win_amd64.whl", hash = "sha256:7ebf1eb9badc2a397d4f6a6c8717447c81ac011db00064a00408bc83c923c0e4"}, + {file = "llvmlite-0.39.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6546bed4e02a1c3d53a22a0bced254b3b6894693318b16c16c8e43e29d6befb6"}, + {file = "llvmlite-0.39.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1578f5000fdce513712e99543c50e93758a954297575610f48cb1fd71b27c08a"}, + {file = "llvmlite-0.39.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3803f11ad5f6f6c3d2b545a303d68d9fabb1d50e06a8d6418e6fcd2d0df00959"}, + {file = "llvmlite-0.39.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50aea09a2b933dab7c9df92361b1844ad3145bfb8dd2deb9cd8b8917d59306fb"}, + {file = "llvmlite-0.39.1-cp37-cp37m-win32.whl", hash = "sha256:b1a0bbdb274fb683f993198775b957d29a6f07b45d184c571ef2a721ce4388cf"}, + {file = "llvmlite-0.39.1-cp37-cp37m-win_amd64.whl", hash = "sha256:e172c73fccf7d6db4bd6f7de963dedded900d1a5c6778733241d878ba613980e"}, + {file = "llvmlite-0.39.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e31f4b799d530255aaf0566e3da2df5bfc35d3cd9d6d5a3dcc251663656c27b1"}, + {file = "llvmlite-0.39.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:62c0ea22e0b9dffb020601bb65cb11dd967a095a488be73f07d8867f4e327ca5"}, + {file = "llvmlite-0.39.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ffc84ade195abd4abcf0bd3b827b9140ae9ef90999429b9ea84d5df69c9058c"}, + {file = "llvmlite-0.39.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c0f158e4708dda6367d21cf15afc58de4ebce979c7a1aa2f6b977aae737e2a54"}, + {file = "llvmlite-0.39.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22d36591cd5d02038912321d9ab8e4668e53ae2211da5523f454e992b5e13c36"}, + {file = "llvmlite-0.39.1-cp38-cp38-win32.whl", hash = "sha256:4c6ebace910410daf0bebda09c1859504fc2f33d122e9a971c4c349c89cca630"}, + {file = "llvmlite-0.39.1-cp38-cp38-win_amd64.whl", hash = "sha256:fb62fc7016b592435d3e3a8f680e3ea8897c3c9e62e6e6cc58011e7a4801439e"}, + {file = "llvmlite-0.39.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fa9b26939ae553bf30a9f5c4c754db0fb2d2677327f2511e674aa2f5df941789"}, + {file = "llvmlite-0.39.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e4f212c018db951da3e1dc25c2651abc688221934739721f2dad5ff1dd5f90e7"}, + {file = "llvmlite-0.39.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39dc2160aed36e989610fc403487f11b8764b6650017ff367e45384dff88ffbf"}, + {file = "llvmlite-0.39.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1ec3d70b3e507515936e475d9811305f52d049281eaa6c8273448a61c9b5b7e2"}, + {file = "llvmlite-0.39.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60f8dd1e76f47b3dbdee4b38d9189f3e020d22a173c00f930b52131001d801f9"}, + {file = "llvmlite-0.39.1-cp39-cp39-win32.whl", hash = "sha256:03aee0ccd81735696474dc4f8b6be60774892a2929d6c05d093d17392c237f32"}, + {file = "llvmlite-0.39.1-cp39-cp39-win_amd64.whl", hash = "sha256:3fc14e757bc07a919221f0cbaacb512704ce5774d7fcada793f1996d6bc75f2a"}, + {file = "llvmlite-0.39.1.tar.gz", hash = "sha256:b43abd7c82e805261c425d50335be9a6c4f84264e34d6d6e475207300005d572"}, +] + +[[package]] +name = "lxml" +version = "4.9.2" +description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" +files = [ + {file = "lxml-4.9.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:76cf573e5a365e790396a5cc2b909812633409306c6531a6877c59061e42c4f2"}, + {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b1f42b6921d0e81b1bcb5e395bc091a70f41c4d4e55ba99c6da2b31626c44892"}, + {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9f102706d0ca011de571de32c3247c6476b55bb6bc65a20f682f000b07a4852a"}, + {file = "lxml-4.9.2-cp27-cp27m-win32.whl", hash = "sha256:8d0b4612b66ff5d62d03bcaa043bb018f74dfea51184e53f067e6fdcba4bd8de"}, + {file = "lxml-4.9.2-cp27-cp27m-win_amd64.whl", hash = "sha256:4c8f293f14abc8fd3e8e01c5bd86e6ed0b6ef71936ded5bf10fe7a5efefbaca3"}, + {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2899456259589aa38bfb018c364d6ae7b53c5c22d8e27d0ec7609c2a1ff78b50"}, + {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6749649eecd6a9871cae297bffa4ee76f90b4504a2a2ab528d9ebe912b101975"}, + {file = "lxml-4.9.2-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:a08cff61517ee26cb56f1e949cca38caabe9ea9fbb4b1e10a805dc39844b7d5c"}, + {file = "lxml-4.9.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:85cabf64adec449132e55616e7ca3e1000ab449d1d0f9d7f83146ed5bdcb6d8a"}, + {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8340225bd5e7a701c0fa98284c849c9b9fc9238abf53a0ebd90900f25d39a4e4"}, + {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:1ab8f1f932e8f82355e75dda5413a57612c6ea448069d4fb2e217e9a4bed13d4"}, + {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:699a9af7dffaf67deeae27b2112aa06b41c370d5e7633e0ee0aea2e0b6c211f7"}, + {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9cc34af337a97d470040f99ba4282f6e6bac88407d021688a5d585e44a23184"}, + {file = "lxml-4.9.2-cp310-cp310-win32.whl", hash = "sha256:d02a5399126a53492415d4906ab0ad0375a5456cc05c3fc0fc4ca11771745cda"}, + {file = "lxml-4.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:a38486985ca49cfa574a507e7a2215c0c780fd1778bb6290c21193b7211702ab"}, + {file = "lxml-4.9.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:c83203addf554215463b59f6399835201999b5e48019dc17f182ed5ad87205c9"}, + {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:2a87fa548561d2f4643c99cd13131acb607ddabb70682dcf1dff5f71f781a4bf"}, + {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:d6b430a9938a5a5d85fc107d852262ddcd48602c120e3dbb02137c83d212b380"}, + {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3efea981d956a6f7173b4659849f55081867cf897e719f57383698af6f618a92"}, + {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:df0623dcf9668ad0445e0558a21211d4e9a149ea8f5666917c8eeec515f0a6d1"}, + {file = "lxml-4.9.2-cp311-cp311-win32.whl", hash = "sha256:da248f93f0418a9e9d94b0080d7ebc407a9a5e6d0b57bb30db9b5cc28de1ad33"}, + {file = "lxml-4.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:3818b8e2c4b5148567e1b09ce739006acfaa44ce3156f8cbbc11062994b8e8dd"}, + {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ca989b91cf3a3ba28930a9fc1e9aeafc2a395448641df1f387a2d394638943b0"}, + {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:822068f85e12a6e292803e112ab876bc03ed1f03dddb80154c395f891ca6b31e"}, + {file = "lxml-4.9.2-cp35-cp35m-win32.whl", hash = "sha256:be7292c55101e22f2a3d4d8913944cbea71eea90792bf914add27454a13905df"}, + {file = "lxml-4.9.2-cp35-cp35m-win_amd64.whl", hash = "sha256:998c7c41910666d2976928c38ea96a70d1aa43be6fe502f21a651e17483a43c5"}, + {file = "lxml-4.9.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:b26a29f0b7fc6f0897f043ca366142d2b609dc60756ee6e4e90b5f762c6adc53"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:ab323679b8b3030000f2be63e22cdeea5b47ee0abd2d6a1dc0c8103ddaa56cd7"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:689bb688a1db722485e4610a503e3e9210dcc20c520b45ac8f7533c837be76fe"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:f49e52d174375a7def9915c9f06ec4e569d235ad428f70751765f48d5926678c"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:36c3c175d34652a35475a73762b545f4527aec044910a651d2bf50de9c3352b1"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a35f8b7fa99f90dd2f5dc5a9fa12332642f087a7641289ca6c40d6e1a2637d8e"}, + {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:58bfa3aa19ca4c0f28c5dde0ff56c520fbac6f0daf4fac66ed4c8d2fb7f22e74"}, + {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc718cd47b765e790eecb74d044cc8d37d58562f6c314ee9484df26276d36a38"}, + {file = "lxml-4.9.2-cp36-cp36m-win32.whl", hash = "sha256:d5bf6545cd27aaa8a13033ce56354ed9e25ab0e4ac3b5392b763d8d04b08e0c5"}, + {file = "lxml-4.9.2-cp36-cp36m-win_amd64.whl", hash = "sha256:3ab9fa9d6dc2a7f29d7affdf3edebf6ece6fb28a6d80b14c3b2fb9d39b9322c3"}, + {file = "lxml-4.9.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:05ca3f6abf5cf78fe053da9b1166e062ade3fa5d4f92b4ed688127ea7d7b1d03"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:a5da296eb617d18e497bcf0a5c528f5d3b18dadb3619fbdadf4ed2356ef8d941"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:04876580c050a8c5341d706dd464ff04fd597095cc8c023252566a8826505726"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c9ec3eaf616d67db0764b3bb983962b4f385a1f08304fd30c7283954e6a7869b"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2a29ba94d065945944016b6b74e538bdb1751a1db6ffb80c9d3c2e40d6fa9894"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a82d05da00a58b8e4c0008edbc8a4b6ec5a4bc1e2ee0fb6ed157cf634ed7fa45"}, + {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:223f4232855ade399bd409331e6ca70fb5578efef22cf4069a6090acc0f53c0e"}, + {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d17bc7c2ccf49c478c5bdd447594e82692c74222698cfc9b5daae7ae7e90743b"}, + {file = "lxml-4.9.2-cp37-cp37m-win32.whl", hash = "sha256:b64d891da92e232c36976c80ed7ebb383e3f148489796d8d31a5b6a677825efe"}, + {file = "lxml-4.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:a0a336d6d3e8b234a3aae3c674873d8f0e720b76bc1d9416866c41cd9500ffb9"}, + {file = "lxml-4.9.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:da4dd7c9c50c059aba52b3524f84d7de956f7fef88f0bafcf4ad7dde94a064e8"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:821b7f59b99551c69c85a6039c65b75f5683bdc63270fec660f75da67469ca24"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:e5168986b90a8d1f2f9dc1b841467c74221bd752537b99761a93d2d981e04889"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:8e20cb5a47247e383cf4ff523205060991021233ebd6f924bca927fcf25cf86f"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:13598ecfbd2e86ea7ae45ec28a2a54fb87ee9b9fdb0f6d343297d8e548392c03"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:880bbbcbe2fca64e2f4d8e04db47bcdf504936fa2b33933efd945e1b429bea8c"}, + {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7d2278d59425777cfcb19735018d897ca8303abe67cc735f9f97177ceff8027f"}, + {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5344a43228767f53a9df6e5b253f8cdca7dfc7b7aeae52551958192f56d98457"}, + {file = "lxml-4.9.2-cp38-cp38-win32.whl", hash = "sha256:925073b2fe14ab9b87e73f9a5fde6ce6392da430f3004d8b72cc86f746f5163b"}, + {file = "lxml-4.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:9b22c5c66f67ae00c0199f6055705bc3eb3fcb08d03d2ec4059a2b1b25ed48d7"}, + {file = "lxml-4.9.2-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:5f50a1c177e2fa3ee0667a5ab79fdc6b23086bc8b589d90b93b4bd17eb0e64d1"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:090c6543d3696cbe15b4ac6e175e576bcc3f1ccfbba970061b7300b0c15a2140"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:63da2ccc0857c311d764e7d3d90f429c252e83b52d1f8f1d1fe55be26827d1f4"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:5b4545b8a40478183ac06c073e81a5ce4cf01bf1734962577cf2bb569a5b3bbf"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2e430cd2824f05f2d4f687701144556646bae8f249fd60aa1e4c768ba7018947"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6804daeb7ef69e7b36f76caddb85cccd63d0c56dedb47555d2fc969e2af6a1a5"}, + {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a6e441a86553c310258aca15d1c05903aaf4965b23f3bc2d55f200804e005ee5"}, + {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ca34efc80a29351897e18888c71c6aca4a359247c87e0b1c7ada14f0ab0c0fb2"}, + {file = "lxml-4.9.2-cp39-cp39-win32.whl", hash = "sha256:6b418afe5df18233fc6b6093deb82a32895b6bb0b1155c2cdb05203f583053f1"}, + {file = "lxml-4.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:f1496ea22ca2c830cbcbd473de8f114a320da308438ae65abad6bab7867fe38f"}, + {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b264171e3143d842ded311b7dccd46ff9ef34247129ff5bf5066123c55c2431c"}, + {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0dc313ef231edf866912e9d8f5a042ddab56c752619e92dfd3a2c277e6a7299a"}, + {file = "lxml-4.9.2-pp38-pypy38_pp73-macosx_10_15_x86_64.whl", hash = "sha256:16efd54337136e8cd72fb9485c368d91d77a47ee2d42b057564aae201257d419"}, + {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:0f2b1e0d79180f344ff9f321327b005ca043a50ece8713de61d1cb383fb8ac05"}, + {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:7b770ed79542ed52c519119473898198761d78beb24b107acf3ad65deae61f1f"}, + {file = "lxml-4.9.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efa29c2fe6b4fdd32e8ef81c1528506895eca86e1d8c4657fda04c9b3786ddf9"}, + {file = "lxml-4.9.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7e91ee82f4199af8c43d8158024cbdff3d931df350252288f0d4ce656df7f3b5"}, + {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b23e19989c355ca854276178a0463951a653309fb8e57ce674497f2d9f208746"}, + {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:01d36c05f4afb8f7c20fd9ed5badca32a2029b93b1750f571ccc0b142531caf7"}, + {file = "lxml-4.9.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7b515674acfdcadb0eb5d00d8a709868173acece5cb0be3dd165950cbfdf5409"}, + {file = "lxml-4.9.2.tar.gz", hash = "sha256:2455cfaeb7ac70338b3257f41e21f0724f4b5b0c0e7702da67ee6c3640835b67"}, +] + +[package.extras] +cssselect = ["cssselect (>=0.7)"] +html5 = ["html5lib"] +htmlsoup = ["BeautifulSoup4"] +source = ["Cython (>=0.29.7)"] + +[[package]] +name = "mako" +version = "1.2.4" +description = "A super-fast templating language that borrows the best ideas from the existing templating languages." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Mako-1.2.4-py3-none-any.whl", hash = "sha256:c97c79c018b9165ac9922ae4f32da095ffd3c4e6872b45eded42926deea46818"}, + {file = "Mako-1.2.4.tar.gz", hash = "sha256:d60a3903dc3bb01a18ad6a89cdbe2e4eadc69c0bc8ef1e3773ba53d44c3f7a34"}, +] + +[package.dependencies] +MarkupSafe = ">=0.9.2" + +[package.extras] +babel = ["Babel"] +lingua = ["lingua"] +testing = ["pytest"] + +[[package]] +name = "markdown" +version = "3.4.3" +description = "Python implementation of John Gruber's Markdown." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Markdown-3.4.3-py3-none-any.whl", hash = "sha256:065fd4df22da73a625f14890dd77eb8040edcbd68794bcd35943be14490608b2"}, + {file = "Markdown-3.4.3.tar.gz", hash = "sha256:8bf101198e004dc93e84a12a7395e31aac6a9c9942848ae1d99b9d72cf9b3520"}, +] + +[package.extras] +testing = ["coverage", "pyyaml"] + +[[package]] +name = "markdown-it-py" +version = "2.2.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "markdown-it-py-2.2.0.tar.gz", hash = "sha256:7c9a5e412688bc771c67432cbfebcdd686c93ce6484913dccf06cb5a0bea35a1"}, + {file = "markdown_it_py-2.2.0-py3-none-any.whl", hash = "sha256:5a35f8d1870171d9acc47b99612dc146129b631baf04970128b568f190d0cc30"}, +] + +[package.dependencies] +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code-style = ["pre-commit (>=3.0,<4.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["attrs", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "markupsafe" +version = "2.1.2" +description = "Safely add untrusted strings to HTML/XML markup." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:665a36ae6f8f20a4676b53224e33d456a6f5a72657d9c83c2aa00765072f31f7"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:340bea174e9761308703ae988e982005aedf427de816d1afe98147668cc03036"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22152d00bf4a9c7c83960521fc558f55a1adbc0631fbb00a9471e097b19d72e1"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28057e985dace2f478e042eaa15606c7efccb700797660629da387eb289b9323"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca244fa73f50a800cf8c3ebf7fd93149ec37f5cb9596aa8873ae2c1d23498601"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d9d971ec1e79906046aa3ca266de79eac42f1dbf3612a05dc9368125952bd1a1"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7e007132af78ea9df29495dbf7b5824cb71648d7133cf7848a2a5dd00d36f9ff"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7313ce6a199651c4ed9d7e4cfb4aa56fe923b1adf9af3b420ee14e6d9a73df65"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-win32.whl", hash = "sha256:c4a549890a45f57f1ebf99c067a4ad0cb423a05544accaf2b065246827ed9603"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:835fb5e38fd89328e9c81067fd642b3593c33e1e17e2fdbf77f5676abb14a156"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2ec4f2d48ae59bbb9d1f9d7efb9236ab81429a764dedca114f5fdabbc3788013"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:608e7073dfa9e38a85d38474c082d4281f4ce276ac0010224eaba11e929dd53a"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65608c35bfb8a76763f37036547f7adfd09270fbdbf96608be2bead319728fcd"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2bfb563d0211ce16b63c7cb9395d2c682a23187f54c3d79bfec33e6705473c6"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da25303d91526aac3672ee6d49a2f3db2d9502a4a60b55519feb1a4c7714e07d"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9cad97ab29dfc3f0249b483412c85c8ef4766d96cdf9dcf5a1e3caa3f3661cf1"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:085fd3201e7b12809f9e6e9bc1e5c96a368c8523fad5afb02afe3c051ae4afcc"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1bea30e9bf331f3fef67e0a3877b2288593c98a21ccb2cf29b74c581a4eb3af0"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-win32.whl", hash = "sha256:7df70907e00c970c60b9ef2938d894a9381f38e6b9db73c5be35e59d92e06625"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:e55e40ff0cc8cc5c07996915ad367fa47da6b3fc091fdadca7f5403239c5fec3"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a6e40afa7f45939ca356f348c8e23048e02cb109ced1eb8420961b2f40fb373a"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf877ab4ed6e302ec1d04952ca358b381a882fbd9d1b07cccbfd61783561f98a"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63ba06c9941e46fa389d389644e2d8225e0e3e5ebcc4ff1ea8506dce646f8c8a"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f1cd098434e83e656abf198f103a8207a8187c0fc110306691a2e94a78d0abb2"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:55f44b440d491028addb3b88f72207d71eeebfb7b5dbf0643f7c023ae1fba619"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a6f2fcca746e8d5910e18782f976489939d54a91f9411c32051b4aab2bd7c513"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0b462104ba25f1ac006fdab8b6a01ebbfbce9ed37fd37fd4acd70c67c973e460"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-win32.whl", hash = "sha256:7668b52e102d0ed87cb082380a7e2e1e78737ddecdde129acadb0eccc5423859"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6d6607f98fcf17e534162f0709aaad3ab7a96032723d8ac8750ffe17ae5a0666"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a806db027852538d2ad7555b203300173dd1b77ba116de92da9afbc3a3be3eed"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a4abaec6ca3ad8660690236d11bfe28dfd707778e2442b45addd2f086d6ef094"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f03a532d7dee1bed20bc4884194a16160a2de9ffc6354b3878ec9682bb623c54"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cf06cdc1dda95223e9d2d3c58d3b178aa5dacb35ee7e3bbac10e4e1faacb419"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22731d79ed2eb25059ae3df1dfc9cb1546691cc41f4e3130fe6bfbc3ecbbecfa"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f8ffb705ffcf5ddd0e80b65ddf7bed7ee4f5a441ea7d3419e861a12eaf41af58"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8db032bf0ce9022a8e41a22598eefc802314e81b879ae093f36ce9ddf39ab1ba"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2298c859cfc5463f1b64bd55cb3e602528db6fa0f3cfd568d3605c50678f8f03"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-win32.whl", hash = "sha256:50c42830a633fa0cf9e7d27664637532791bfc31c731a87b202d2d8ac40c3ea2"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:bb06feb762bade6bf3c8b844462274db0c76acc95c52abe8dbed28ae3d44a147"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99625a92da8229df6d44335e6fcc558a5037dd0a760e11d84be2260e6f37002f"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8bca7e26c1dd751236cfb0c6c72d4ad61d986e9a41bbf76cb445f69488b2a2bd"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40627dcf047dadb22cd25ea7ecfe9cbf3bbbad0482ee5920b582f3809c97654f"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40dfd3fefbef579ee058f139733ac336312663c6706d1163b82b3003fb1925c4"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:090376d812fb6ac5f171e5938e82e7f2d7adc2b629101cec0db8b267815c85e2"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2e7821bffe00aa6bd07a23913b7f4e01328c3d5cc0b40b36c0bd81d362faeb65"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c0a33bc9f02c2b17c3ea382f91b4db0e6cde90b63b296422a939886a7a80de1c"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b8526c6d437855442cdd3d87eede9c425c4445ea011ca38d937db299382e6fa3"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-win32.whl", hash = "sha256:137678c63c977754abe9086a3ec011e8fd985ab90631145dfb9294ad09c102a7"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:0576fe974b40a400449768941d5d0858cc624e3249dfd1e0c33674e5c7ca7aed"}, + {file = "MarkupSafe-2.1.2.tar.gz", hash = "sha256:abcabc8c2b26036d62d4c746381a6f7cf60aafcc653198ad678306986b09450d"}, +] + +[[package]] +name = "matplotlib" +version = "3.7.1" +description = "Python plotting package" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "matplotlib-3.7.1-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:95cbc13c1fc6844ab8812a525bbc237fa1470863ff3dace7352e910519e194b1"}, + {file = "matplotlib-3.7.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:08308bae9e91aca1ec6fd6dda66237eef9f6294ddb17f0d0b3c863169bf82353"}, + {file = "matplotlib-3.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:544764ba51900da4639c0f983b323d288f94f65f4024dc40ecb1542d74dc0500"}, + {file = "matplotlib-3.7.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56d94989191de3fcc4e002f93f7f1be5da476385dde410ddafbb70686acf00ea"}, + {file = "matplotlib-3.7.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e99bc9e65901bb9a7ce5e7bb24af03675cbd7c70b30ac670aa263240635999a4"}, + {file = "matplotlib-3.7.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb7d248c34a341cd4c31a06fd34d64306624c8cd8d0def7abb08792a5abfd556"}, + {file = "matplotlib-3.7.1-cp310-cp310-win32.whl", hash = "sha256:ce463ce590f3825b52e9fe5c19a3c6a69fd7675a39d589e8b5fbe772272b3a24"}, + {file = "matplotlib-3.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:3d7bc90727351fb841e4d8ae620d2d86d8ed92b50473cd2b42ce9186104ecbba"}, + {file = "matplotlib-3.7.1-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:770a205966d641627fd5cf9d3cb4b6280a716522cd36b8b284a8eb1581310f61"}, + {file = "matplotlib-3.7.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f67bfdb83a8232cb7a92b869f9355d677bce24485c460b19d01970b64b2ed476"}, + {file = "matplotlib-3.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2bf092f9210e105f414a043b92af583c98f50050559616930d884387d0772aba"}, + {file = "matplotlib-3.7.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89768d84187f31717349c6bfadc0e0d8c321e8eb34522acec8a67b1236a66332"}, + {file = "matplotlib-3.7.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83111e6388dec67822e2534e13b243cc644c7494a4bb60584edbff91585a83c6"}, + {file = "matplotlib-3.7.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a867bf73a7eb808ef2afbca03bcdb785dae09595fbe550e1bab0cd023eba3de0"}, + {file = "matplotlib-3.7.1-cp311-cp311-win32.whl", hash = "sha256:fbdeeb58c0cf0595efe89c05c224e0a502d1aa6a8696e68a73c3efc6bc354304"}, + {file = "matplotlib-3.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:c0bd19c72ae53e6ab979f0ac6a3fafceb02d2ecafa023c5cca47acd934d10be7"}, + {file = "matplotlib-3.7.1-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:6eb88d87cb2c49af00d3bbc33a003f89fd9f78d318848da029383bfc08ecfbfb"}, + {file = "matplotlib-3.7.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:cf0e4f727534b7b1457898c4f4ae838af1ef87c359b76dcd5330fa31893a3ac7"}, + {file = "matplotlib-3.7.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:46a561d23b91f30bccfd25429c3c706afe7d73a5cc64ef2dfaf2b2ac47c1a5dc"}, + {file = "matplotlib-3.7.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8704726d33e9aa8a6d5215044b8d00804561971163563e6e6591f9dcf64340cc"}, + {file = "matplotlib-3.7.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4cf327e98ecf08fcbb82685acaf1939d3338548620ab8dfa02828706402c34de"}, + {file = "matplotlib-3.7.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:617f14ae9d53292ece33f45cba8503494ee199a75b44de7717964f70637a36aa"}, + {file = "matplotlib-3.7.1-cp38-cp38-win32.whl", hash = "sha256:7c9a4b2da6fac77bcc41b1ea95fadb314e92508bf5493ceff058e727e7ecf5b0"}, + {file = "matplotlib-3.7.1-cp38-cp38-win_amd64.whl", hash = "sha256:14645aad967684e92fc349493fa10c08a6da514b3d03a5931a1bac26e6792bd1"}, + {file = "matplotlib-3.7.1-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:81a6b377ea444336538638d31fdb39af6be1a043ca5e343fe18d0f17e098770b"}, + {file = "matplotlib-3.7.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:28506a03bd7f3fe59cd3cd4ceb2a8d8a2b1db41afede01f66c42561b9be7b4b7"}, + {file = "matplotlib-3.7.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8c587963b85ce41e0a8af53b9b2de8dddbf5ece4c34553f7bd9d066148dc719c"}, + {file = "matplotlib-3.7.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8bf26ade3ff0f27668989d98c8435ce9327d24cffb7f07d24ef609e33d582439"}, + {file = "matplotlib-3.7.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:def58098f96a05f90af7e92fd127d21a287068202aa43b2a93476170ebd99e87"}, + {file = "matplotlib-3.7.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f883a22a56a84dba3b588696a2b8a1ab0d2c3d41be53264115c71b0a942d8fdb"}, + {file = "matplotlib-3.7.1-cp39-cp39-win32.whl", hash = "sha256:4f99e1b234c30c1e9714610eb0c6d2f11809c9c78c984a613ae539ea2ad2eb4b"}, + {file = "matplotlib-3.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:3ba2af245e36990facf67fde840a760128ddd71210b2ab6406e640188d69d136"}, + {file = "matplotlib-3.7.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3032884084f541163f295db8a6536e0abb0db464008fadca6c98aaf84ccf4717"}, + {file = "matplotlib-3.7.1-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a2cb34336110e0ed8bb4f650e817eed61fa064acbefeb3591f1b33e3a84fd96"}, + {file = "matplotlib-3.7.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b867e2f952ed592237a1828f027d332d8ee219ad722345b79a001f49df0936eb"}, + {file = "matplotlib-3.7.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:57bfb8c8ea253be947ccb2bc2d1bb3862c2bccc662ad1b4626e1f5e004557042"}, + {file = "matplotlib-3.7.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:438196cdf5dc8d39b50a45cb6e3f6274edbcf2254f85fa9b895bf85851c3a613"}, + {file = "matplotlib-3.7.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:21e9cff1a58d42e74d01153360de92b326708fb205250150018a52c70f43c290"}, + {file = "matplotlib-3.7.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75d4725d70b7c03e082bbb8a34639ede17f333d7247f56caceb3801cb6ff703d"}, + {file = "matplotlib-3.7.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:97cc368a7268141afb5690760921765ed34867ffb9655dd325ed207af85c7529"}, + {file = "matplotlib-3.7.1.tar.gz", hash = "sha256:7b73305f25eab4541bd7ee0b96d87e53ae9c9f1823be5659b806cd85786fe882"}, +] + +[package.dependencies] +contourpy = ">=1.0.1" +cycler = ">=0.10" +fonttools = ">=4.22.0" +kiwisolver = ">=1.0.1" +numpy = ">=1.20" +packaging = ">=20.0" +pillow = ">=6.2.0" +pyparsing = ">=2.3.1" +python-dateutil = ">=2.7" + +[[package]] +name = "matplotlib-inline" +version = "0.1.6" +description = "Inline Matplotlib backend for Jupyter" +category = "dev" +optional = false +python-versions = ">=3.5" +files = [ + {file = "matplotlib-inline-0.1.6.tar.gz", hash = "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"}, + {file = "matplotlib_inline-0.1.6-py3-none-any.whl", hash = "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311"}, +] + +[package.dependencies] +traitlets = "*" + +[[package]] +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + +[[package]] +name = "mesh-to-sdf" +version = "0.0.14" +description = "Calculate signed distance fields for arbitrary meshes" +category = "main" +optional = false +python-versions = ">=3.5" +files = [] +develop = false + +[package.dependencies] +pyopengl = "*" +pyrender = "*" +scikit-image = "*" +scikit-learn = "*" + +[package.source] +type = "git" +url = "https://github.com/pbsds/mesh_to_sdf" +reference = "no_flip_normals" +resolved_reference = "c5e9a53425108008065c66f927ffe68d9c01453e" + +[[package]] +name = "methodtools" +version = "0.4.7" +description = "Expand standard functools to methods" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "methodtools-0.4.7.tar.gz", hash = "sha256:e213439dd64cfe60213f7015da6efe5dd4003fd89376db3baa09fe13ec2bb0ba"}, +] + +[package.dependencies] +wirerope = ">=0.4.7" + +[package.extras] +doc = ["sphinx"] +test = ["functools32 (>=3.2.3-2)", "pytest (>=4.6.7)", "pytest-cov (>=2.6.1)"] + +[[package]] +name = "mistune" +version = "0.8.4" +description = "The fastest markdown parser in pure Python" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "mistune-0.8.4-py2.py3-none-any.whl", hash = "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"}, + {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"}, +] + +[[package]] +name = "more-itertools" +version = "9.1.0" +description = "More routines for operating on iterables, beyond itertools" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "more-itertools-9.1.0.tar.gz", hash = "sha256:cabaa341ad0389ea83c17a94566a53ae4c9d07349861ecb14dc6d0345cf9ac5d"}, + {file = "more_itertools-9.1.0-py3-none-any.whl", hash = "sha256:d2bc7f02446e86a68911e58ded76d6561eea00cddfb2a91e7019bbb586c799f3"}, +] + +[[package]] +name = "mpmath" +version = "1.3.0" +description = "Python library for arbitrary-precision floating-point arithmetic" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, + {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, +] + +[package.extras] +develop = ["codecov", "pycodestyle", "pytest (>=4.6)", "pytest-cov", "wheel"] +docs = ["sphinx"] +gmpy = ["gmpy2 (>=2.1.0a4)"] +tests = ["pytest (>=4.6)"] + +[[package]] +name = "multidict" +version = "6.0.4" +description = "multidict implementation" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, + {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, + {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"}, + {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"}, + {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"}, + {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"}, + {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"}, + {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"}, + {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"}, + {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"}, + {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"}, + {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"}, + {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"}, + {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"}, + {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, +] + +[[package]] +name = "munch" +version = "2.5.0" +description = "A dot-accessible dictionary (a la JavaScript objects)" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "munch-2.5.0-py2.py3-none-any.whl", hash = "sha256:6f44af89a2ce4ed04ff8de41f70b226b984db10a91dcc7b9ac2efc1c77022fdd"}, + {file = "munch-2.5.0.tar.gz", hash = "sha256:2d735f6f24d4dba3417fa448cae40c6e896ec1fdab6cdb5e6510999758a4dbd2"}, +] + +[package.dependencies] +six = "*" + +[package.extras] +testing = ["astroid (>=1.5.3,<1.6.0)", "astroid (>=2.0)", "coverage", "pylint (>=1.7.2,<1.8.0)", "pylint (>=2.3.1,<2.4.0)", "pytest"] +yaml = ["PyYAML (>=5.1.0)"] + +[[package]] +name = "nbclassic" +version = "0.5.3" +description = "Jupyter Notebook as a Jupyter Server extension." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "nbclassic-0.5.3-py3-none-any.whl", hash = "sha256:e849277872d9ffd8fe4b39a8038d01ba82d6a1def9ce11b1b3c26c9546ed5131"}, + {file = "nbclassic-0.5.3.tar.gz", hash = "sha256:889772a7ba524eb781d2901f396540bcad41151e1f7e043f12ebc14a6540d342"}, +] + +[package.dependencies] +argon2-cffi = "*" +ipykernel = "*" +ipython-genutils = "*" +jinja2 = "*" +jupyter-client = ">=6.1.1" +jupyter-core = ">=4.6.1" +jupyter-server = ">=1.8" +nbconvert = ">=5" +nbformat = "*" +nest-asyncio = ">=1.5" +notebook-shim = ">=0.1.0" +prometheus-client = "*" +pyzmq = ">=17" +Send2Trash = ">=1.8.0" +terminado = ">=0.8.3" +tornado = ">=6.1" +traitlets = ">=4.2.1" + +[package.extras] +docs = ["myst-parser", "nbsphinx", "sphinx", "sphinx-rtd-theme", "sphinxcontrib-github-alt"] +json-logging = ["json-logging"] +test = ["coverage", "nbval", "pytest", "pytest-cov", "pytest-jupyter", "pytest-playwright", "pytest-tornasync", "requests", "requests-unixsocket", "testpath"] + +[[package]] +name = "nbclient" +version = "0.7.2" +description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." +category = "dev" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "nbclient-0.7.2-py3-none-any.whl", hash = "sha256:d97ac6257de2794f5397609df754fcbca1a603e94e924eb9b99787c031ae2e7c"}, + {file = "nbclient-0.7.2.tar.gz", hash = "sha256:884a3f4a8c4fc24bb9302f263e0af47d97f0d01fe11ba714171b320c8ac09547"}, +] + +[package.dependencies] +jupyter-client = ">=6.1.12" +jupyter-core = ">=4.12,<5.0.0 || >=5.1.0" +nbformat = ">=5.1" +traitlets = ">=5.3" + +[package.extras] +dev = ["pre-commit"] +docs = ["autodoc-traits", "mock", "moto", "myst-parser", "nbclient[test]", "sphinx (>=1.7)", "sphinx-book-theme"] +test = ["ipykernel", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"] + +[[package]] +name = "nbconvert" +version = "6.5.0" +description = "Converting Jupyter Notebooks" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "nbconvert-6.5.0-py3-none-any.whl", hash = "sha256:c56dd0b8978a1811a5654f74c727ff16ca87dd5a43abd435a1c49b840fcd8360"}, + {file = "nbconvert-6.5.0.tar.gz", hash = "sha256:223e46e27abe8596b8aed54301fadbba433b7ffea8196a68fd7b1ff509eee99d"}, +] + +[package.dependencies] +beautifulsoup4 = "*" +bleach = "*" +defusedxml = "*" +entrypoints = ">=0.2.2" +jinja2 = ">=3.0" +jupyter-core = ">=4.7" +jupyterlab-pygments = "*" +MarkupSafe = ">=2.0" +mistune = ">=0.8.1,<2" +nbclient = ">=0.5.0" +nbformat = ">=5.1" +packaging = "*" +pandocfilters = ">=1.4.1" +pygments = ">=2.4.1" +tinycss2 = "*" +traitlets = ">=5.0" + +[package.extras] +all = ["ipykernel", "ipython", "ipywidgets (>=7)", "nbsphinx (>=0.2.12)", "pre-commit", "pyppeteer (>=1,<1.1)", "pytest", "pytest-cov", "pytest-dependency", "sphinx (>=1.5.1)", "sphinx-rtd-theme", "tornado (>=6.1)"] +docs = ["ipython", "nbsphinx (>=0.2.12)", "sphinx (>=1.5.1)", "sphinx-rtd-theme"] +serve = ["tornado (>=6.1)"] +test = ["ipykernel", "ipywidgets (>=7)", "pre-commit", "pyppeteer (>=1,<1.1)", "pytest", "pytest-cov", "pytest-dependency"] +webpdf = ["pyppeteer (>=1,<1.1)"] + +[[package]] +name = "nbformat" +version = "5.8.0" +description = "The Jupyter Notebook format" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "nbformat-5.8.0-py3-none-any.whl", hash = "sha256:d910082bd3e0bffcf07eabf3683ed7dda0727a326c446eeb2922abe102e65162"}, + {file = "nbformat-5.8.0.tar.gz", hash = "sha256:46dac64c781f1c34dfd8acba16547024110348f9fc7eab0f31981c2a3dc48d1f"}, +] + +[package.dependencies] +fastjsonschema = "*" +jsonschema = ">=2.6" +jupyter-core = "*" +traitlets = ">=5.1" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["pep440", "pre-commit", "pytest", "testpath"] + +[[package]] +name = "nest-asyncio" +version = "1.5.6" +description = "Patch asyncio to allow nested event loops" +category = "dev" +optional = false +python-versions = ">=3.5" +files = [ + {file = "nest_asyncio-1.5.6-py3-none-any.whl", hash = "sha256:b9a953fb40dceaa587d109609098db21900182b16440652454a146cffb06e8b8"}, + {file = "nest_asyncio-1.5.6.tar.gz", hash = "sha256:d267cc1ff794403f7df692964d1d2a3fa9418ffea2a3f6859a439ff482fef290"}, +] + +[[package]] +name = "networkx" +version = "3.0" +description = "Python package for creating and manipulating graphs and networks" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "networkx-3.0-py3-none-any.whl", hash = "sha256:58058d66b1818043527244fab9d41a51fcd7dcc271748015f3c181b8a90c8e2e"}, + {file = "networkx-3.0.tar.gz", hash = "sha256:9a9992345353618ae98339c2b63d8201c381c2944f38a2ab49cb45a4c667e412"}, +] + +[package.extras] +default = ["matplotlib (>=3.4)", "numpy (>=1.20)", "pandas (>=1.3)", "scipy (>=1.8)"] +developer = ["mypy (>=0.991)", "pre-commit (>=2.20)"] +doc = ["nb2plots (>=0.6)", "numpydoc (>=1.5)", "pillow (>=9.2)", "pydata-sphinx-theme (>=0.11)", "sphinx (==5.2.3)", "sphinx-gallery (>=0.11)", "texext (>=0.6.7)"] +extra = ["lxml (>=4.6)", "pydot (>=1.4.2)", "pygraphviz (>=1.10)", "sympy (>=1.10)"] +test = ["codecov (>=2.1)", "pytest (>=7.2)", "pytest-cov (>=4.0)"] + +[[package]] +name = "notebook" +version = "6.5.3" +description = "A web-based notebook environment for interactive computing" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "notebook-6.5.3-py3-none-any.whl", hash = "sha256:50a334ad9d60b30cb759405168ef6fc3d60350ab5439fb1631544bb09dcb2cce"}, + {file = "notebook-6.5.3.tar.gz", hash = "sha256:b12bee3292211d85dd7e588a790ddce30cb3e8fbcfa1e803522a207f60819e05"}, +] + +[package.dependencies] +argon2-cffi = "*" +ipykernel = "*" +ipython-genutils = "*" +jinja2 = "*" +jupyter-client = ">=5.3.4" +jupyter-core = ">=4.6.1" +nbclassic = ">=0.4.7" +nbconvert = ">=5" +nbformat = "*" +nest-asyncio = ">=1.5" +prometheus-client = "*" +pyzmq = ">=17" +Send2Trash = ">=1.8.0" +terminado = ">=0.8.3" +tornado = ">=6.1" +traitlets = ">=4.2.1" + +[package.extras] +docs = ["myst-parser", "nbsphinx", "sphinx", "sphinx-rtd-theme", "sphinxcontrib-github-alt"] +json-logging = ["json-logging"] +test = ["coverage", "nbval", "pytest", "pytest-cov", "requests", "requests-unixsocket", "selenium (==4.1.5)", "testpath"] + +[[package]] +name = "notebook-shim" +version = "0.2.2" +description = "A shim layer for notebook traits and config" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "notebook_shim-0.2.2-py3-none-any.whl", hash = "sha256:9c6c30f74c4fbea6fce55c1be58e7fd0409b1c681b075dcedceb005db5026949"}, + {file = "notebook_shim-0.2.2.tar.gz", hash = "sha256:090e0baf9a5582ff59b607af523ca2db68ff216da0c69956b62cab2ef4fc9c3f"}, +] + +[package.dependencies] +jupyter-server = ">=1.8,<3" + +[package.extras] +test = ["pytest", "pytest-console-scripts", "pytest-tornasync"] + +[[package]] +name = "numba" +version = "0.56.4" +description = "compiling Python code using LLVM" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "numba-0.56.4-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:9f62672145f8669ec08762895fe85f4cf0ead08ce3164667f2b94b2f62ab23c3"}, + {file = "numba-0.56.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c602d015478b7958408d788ba00a50272649c5186ea8baa6cf71d4a1c761bba1"}, + {file = "numba-0.56.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:85dbaed7a05ff96492b69a8900c5ba605551afb9b27774f7f10511095451137c"}, + {file = "numba-0.56.4-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:f4cfc3a19d1e26448032049c79fc60331b104f694cf570a9e94f4e2c9d0932bb"}, + {file = "numba-0.56.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4e08e203b163ace08bad500b0c16f6092b1eb34fd1fce4feaf31a67a3a5ecf3b"}, + {file = "numba-0.56.4-cp310-cp310-win32.whl", hash = "sha256:0611e6d3eebe4cb903f1a836ffdb2bda8d18482bcd0a0dcc56e79e2aa3fefef5"}, + {file = "numba-0.56.4-cp310-cp310-win_amd64.whl", hash = "sha256:fbfb45e7b297749029cb28694abf437a78695a100e7c2033983d69f0ba2698d4"}, + {file = "numba-0.56.4-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:3cb1a07a082a61df80a468f232e452d818f5ae254b40c26390054e4e868556e0"}, + {file = "numba-0.56.4-cp37-cp37m-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d69ad934e13c15684e7887100a8f5f0f61d7a8e57e0fd29d9993210089a5b531"}, + {file = "numba-0.56.4-cp37-cp37m-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:dbcc847bac2d225265d054993a7f910fda66e73d6662fe7156452cac0325b073"}, + {file = "numba-0.56.4-cp37-cp37m-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8a95ca9cc77ea4571081f6594e08bd272b66060634b8324e99cd1843020364f9"}, + {file = "numba-0.56.4-cp37-cp37m-win32.whl", hash = "sha256:fcdf84ba3ed8124eb7234adfbb8792f311991cbf8aed1cad4b1b1a7ee08380c1"}, + {file = "numba-0.56.4-cp37-cp37m-win_amd64.whl", hash = "sha256:42f9e1be942b215df7e6cc9948cf9c15bb8170acc8286c063a9e57994ef82fd1"}, + {file = "numba-0.56.4-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:553da2ce74e8862e18a72a209ed3b6d2924403bdd0fb341fa891c6455545ba7c"}, + {file = "numba-0.56.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4373da9757049db7c90591e9ec55a2e97b2b36ba7ae3bf9c956a513374077470"}, + {file = "numba-0.56.4-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3a993349b90569518739009d8f4b523dfedd7e0049e6838c0e17435c3e70dcc4"}, + {file = "numba-0.56.4-cp38-cp38-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:720886b852a2d62619ae3900fe71f1852c62db4f287d0c275a60219e1643fc04"}, + {file = "numba-0.56.4-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e64d338b504c9394a4a34942df4627e1e6cb07396ee3b49fe7b8d6420aa5104f"}, + {file = "numba-0.56.4-cp38-cp38-win32.whl", hash = "sha256:03fe94cd31e96185cce2fae005334a8cc712fc2ba7756e52dff8c9400718173f"}, + {file = "numba-0.56.4-cp38-cp38-win_amd64.whl", hash = "sha256:91f021145a8081f881996818474ef737800bcc613ffb1e618a655725a0f9e246"}, + {file = "numba-0.56.4-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:d0ae9270a7a5cc0ede63cd234b4ff1ce166c7a749b91dbbf45e0000c56d3eade"}, + {file = "numba-0.56.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c75e8a5f810ce80a0cfad6e74ee94f9fde9b40c81312949bf356b7304ef20740"}, + {file = "numba-0.56.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a12ef323c0f2101529d455cfde7f4135eaa147bad17afe10b48634f796d96abd"}, + {file = "numba-0.56.4-cp39-cp39-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:03634579d10a6129181129de293dd6b5eaabee86881369d24d63f8fe352dd6cb"}, + {file = "numba-0.56.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0240f9026b015e336069329839208ebd70ec34ae5bfbf402e4fcc8e06197528e"}, + {file = "numba-0.56.4-cp39-cp39-win32.whl", hash = "sha256:14dbbabf6ffcd96ee2ac827389afa59a70ffa9f089576500434c34abf9b054a4"}, + {file = "numba-0.56.4-cp39-cp39-win_amd64.whl", hash = "sha256:0da583c532cd72feefd8e551435747e0e0fbb3c0530357e6845fcc11e38d6aea"}, + {file = "numba-0.56.4.tar.gz", hash = "sha256:32d9fef412c81483d7efe0ceb6cf4d3310fde8b624a9cecca00f790573ac96ee"}, +] + +[package.dependencies] +llvmlite = ">=0.39.0dev0,<0.40" +numpy = ">=1.18,<1.24" +setuptools = "*" + +[[package]] +name = "numpy" +version = "1.23.5" +description = "NumPy is the fundamental package for array computing with Python." +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "numpy-1.23.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9c88793f78fca17da0145455f0d7826bcb9f37da4764af27ac945488116efe63"}, + {file = "numpy-1.23.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e9f4c4e51567b616be64e05d517c79a8a22f3606499941d97bb76f2ca59f982d"}, + {file = "numpy-1.23.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7903ba8ab592b82014713c491f6c5d3a1cde5b4a3bf116404e08f5b52f6daf43"}, + {file = "numpy-1.23.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e05b1c973a9f858c74367553e236f287e749465f773328c8ef31abe18f691e1"}, + {file = "numpy-1.23.5-cp310-cp310-win32.whl", hash = "sha256:522e26bbf6377e4d76403826ed689c295b0b238f46c28a7251ab94716da0b280"}, + {file = "numpy-1.23.5-cp310-cp310-win_amd64.whl", hash = "sha256:dbee87b469018961d1ad79b1a5d50c0ae850000b639bcb1b694e9981083243b6"}, + {file = "numpy-1.23.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ce571367b6dfe60af04e04a1834ca2dc5f46004ac1cc756fb95319f64c095a96"}, + {file = "numpy-1.23.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56e454c7833e94ec9769fa0f86e6ff8e42ee38ce0ce1fa4cbb747ea7e06d56aa"}, + {file = "numpy-1.23.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5039f55555e1eab31124a5768898c9e22c25a65c1e0037f4d7c495a45778c9f2"}, + {file = "numpy-1.23.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58f545efd1108e647604a1b5aa809591ccd2540f468a880bedb97247e72db387"}, + {file = "numpy-1.23.5-cp311-cp311-win32.whl", hash = "sha256:b2a9ab7c279c91974f756c84c365a669a887efa287365a8e2c418f8b3ba73fb0"}, + {file = "numpy-1.23.5-cp311-cp311-win_amd64.whl", hash = "sha256:0cbe9848fad08baf71de1a39e12d1b6310f1d5b2d0ea4de051058e6e1076852d"}, + {file = "numpy-1.23.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f063b69b090c9d918f9df0a12116029e274daf0181df392839661c4c7ec9018a"}, + {file = "numpy-1.23.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0aaee12d8883552fadfc41e96b4c82ee7d794949e2a7c3b3a7201e968c7ecab9"}, + {file = "numpy-1.23.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92c8c1e89a1f5028a4c6d9e3ccbe311b6ba53694811269b992c0b224269e2398"}, + {file = "numpy-1.23.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d208a0f8729f3fb790ed18a003f3a57895b989b40ea4dce4717e9cf4af62c6bb"}, + {file = "numpy-1.23.5-cp38-cp38-win32.whl", hash = "sha256:06005a2ef6014e9956c09ba07654f9837d9e26696a0470e42beedadb78c11b07"}, + {file = "numpy-1.23.5-cp38-cp38-win_amd64.whl", hash = "sha256:ca51fcfcc5f9354c45f400059e88bc09215fb71a48d3768fb80e357f3b457e1e"}, + {file = "numpy-1.23.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8969bfd28e85c81f3f94eb4a66bc2cf1dbdc5c18efc320af34bffc54d6b1e38f"}, + {file = "numpy-1.23.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a7ac231a08bb37f852849bbb387a20a57574a97cfc7b6cabb488a4fc8be176de"}, + {file = "numpy-1.23.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf837dc63ba5c06dc8797c398db1e223a466c7ece27a1f7b5232ba3466aafe3d"}, + {file = "numpy-1.23.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33161613d2269025873025b33e879825ec7b1d831317e68f4f2f0f84ed14c719"}, + {file = "numpy-1.23.5-cp39-cp39-win32.whl", hash = "sha256:af1da88f6bc3d2338ebbf0e22fe487821ea4d8e89053e25fa59d1d79786e7481"}, + {file = "numpy-1.23.5-cp39-cp39-win_amd64.whl", hash = "sha256:09b7847f7e83ca37c6e627682f145856de331049013853f344f37b0c9690e3df"}, + {file = "numpy-1.23.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:abdde9f795cf292fb9651ed48185503a2ff29be87770c3b8e2a14b0cd7aa16f8"}, + {file = "numpy-1.23.5-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9a909a8bae284d46bbfdefbdd4a262ba19d3bc9921b1e76126b1d21c3c34135"}, + {file = "numpy-1.23.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:01dd17cbb340bf0fc23981e52e1d18a9d4050792e8fb8363cecbf066a84b827d"}, + {file = "numpy-1.23.5.tar.gz", hash = "sha256:1b1766d6f397c18153d40015ddfc79ddb715cabadc04d2d228d4e5a8bc4ded1a"}, +] + +[[package]] +name = "nvidia-cublas-cu11" +version = "11.10.3.66" +description = "CUBLAS native runtime libraries" +category = "main" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cublas_cu11-11.10.3.66-py3-none-manylinux1_x86_64.whl", hash = "sha256:d32e4d75f94ddfb93ea0a5dda08389bcc65d8916a25cb9f37ac89edaeed3bded"}, + {file = "nvidia_cublas_cu11-11.10.3.66-py3-none-win_amd64.whl", hash = "sha256:8ac17ba6ade3ed56ab898a036f9ae0756f1e81052a317bf98f8c6d18dc3ae49e"}, +] + +[package.dependencies] +setuptools = "*" +wheel = "*" + +[[package]] +name = "nvidia-cuda-nvrtc-cu11" +version = "11.7.99" +description = "NVRTC native runtime libraries" +category = "main" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cuda_nvrtc_cu11-11.7.99-2-py3-none-manylinux1_x86_64.whl", hash = "sha256:9f1562822ea264b7e34ed5930567e89242d266448e936b85bc97a3370feabb03"}, + {file = "nvidia_cuda_nvrtc_cu11-11.7.99-py3-none-manylinux1_x86_64.whl", hash = "sha256:f7d9610d9b7c331fa0da2d1b2858a4a8315e6d49765091d28711c8946e7425e7"}, + {file = "nvidia_cuda_nvrtc_cu11-11.7.99-py3-none-win_amd64.whl", hash = "sha256:f2effeb1309bdd1b3854fc9b17eaf997808f8b25968ce0c7070945c4265d64a3"}, +] + +[package.dependencies] +setuptools = "*" +wheel = "*" + +[[package]] +name = "nvidia-cuda-runtime-cu11" +version = "11.7.99" +description = "CUDA Runtime native Libraries" +category = "main" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cuda_runtime_cu11-11.7.99-py3-none-manylinux1_x86_64.whl", hash = "sha256:cc768314ae58d2641f07eac350f40f99dcb35719c4faff4bc458a7cd2b119e31"}, + {file = "nvidia_cuda_runtime_cu11-11.7.99-py3-none-win_amd64.whl", hash = "sha256:bc77fa59a7679310df9d5c70ab13c4e34c64ae2124dd1efd7e5474b71be125c7"}, +] + +[package.dependencies] +setuptools = "*" +wheel = "*" + +[[package]] +name = "nvidia-cudnn-cu11" +version = "8.5.0.96" +description = "cuDNN runtime libraries" +category = "main" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cudnn_cu11-8.5.0.96-2-py3-none-manylinux1_x86_64.whl", hash = "sha256:402f40adfc6f418f9dae9ab402e773cfed9beae52333f6d86ae3107a1b9527e7"}, + {file = "nvidia_cudnn_cu11-8.5.0.96-py3-none-manylinux1_x86_64.whl", hash = "sha256:71f8111eb830879ff2836db3cccf03bbd735df9b0d17cd93761732ac50a8a108"}, +] + +[package.dependencies] +setuptools = "*" +wheel = "*" + +[[package]] +name = "oauthlib" +version = "3.2.2" +description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca"}, + {file = "oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918"}, +] + +[package.extras] +rsa = ["cryptography (>=3.0.0)"] +signals = ["blinker (>=1.4.0)"] +signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] + +[[package]] +name = "ordered-set" +version = "4.1.0" +description = "An OrderedSet is a custom MutableSet that remembers its order, so that every" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "ordered-set-4.1.0.tar.gz", hash = "sha256:694a8e44c87657c59292ede72891eb91d34131f6531463aab3009191c77364a8"}, + {file = "ordered_set-4.1.0-py3-none-any.whl", hash = "sha256:046e1132c71fcf3330438a539928932caf51ddbc582496833e23de611de14562"}, +] + +[package.extras] +dev = ["black", "mypy", "pytest"] + +[[package]] +name = "packaging" +version = "23.0" +description = "Core utilities for Python packages" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.0-py3-none-any.whl", hash = "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2"}, + {file = "packaging-23.0.tar.gz", hash = "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97"}, +] + +[[package]] +name = "pandas" +version = "1.5.3" +description = "Powerful data structures for data analysis, time series, and statistics" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pandas-1.5.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3749077d86e3a2f0ed51367f30bf5b82e131cc0f14260c4d3e499186fccc4406"}, + {file = "pandas-1.5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:972d8a45395f2a2d26733eb8d0f629b2f90bebe8e8eddbb8829b180c09639572"}, + {file = "pandas-1.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:50869a35cbb0f2e0cd5ec04b191e7b12ed688874bd05dd777c19b28cbea90996"}, + {file = "pandas-1.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3ac844a0fe00bfaeb2c9b51ab1424e5c8744f89860b138434a363b1f620f354"}, + {file = "pandas-1.5.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a0a56cef15fd1586726dace5616db75ebcfec9179a3a55e78f72c5639fa2a23"}, + {file = "pandas-1.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:478ff646ca42b20376e4ed3fa2e8d7341e8a63105586efe54fa2508ee087f328"}, + {file = "pandas-1.5.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6973549c01ca91ec96199e940495219c887ea815b2083722821f1d7abfa2b4dc"}, + {file = "pandas-1.5.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c39a8da13cede5adcd3be1182883aea1c925476f4e84b2807a46e2775306305d"}, + {file = "pandas-1.5.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f76d097d12c82a535fda9dfe5e8dd4127952b45fea9b0276cb30cca5ea313fbc"}, + {file = "pandas-1.5.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e474390e60ed609cec869b0da796ad94f420bb057d86784191eefc62b65819ae"}, + {file = "pandas-1.5.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f2b952406a1588ad4cad5b3f55f520e82e902388a6d5a4a91baa8d38d23c7f6"}, + {file = "pandas-1.5.3-cp311-cp311-win_amd64.whl", hash = "sha256:bc4c368f42b551bf72fac35c5128963a171b40dce866fb066540eeaf46faa003"}, + {file = "pandas-1.5.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:14e45300521902689a81f3f41386dc86f19b8ba8dd5ac5a3c7010ef8d2932813"}, + {file = "pandas-1.5.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9842b6f4b8479e41968eced654487258ed81df7d1c9b7b870ceea24ed9459b31"}, + {file = "pandas-1.5.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:26d9c71772c7afb9d5046e6e9cf42d83dd147b5cf5bcb9d97252077118543792"}, + {file = "pandas-1.5.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fbcb19d6fceb9e946b3e23258757c7b225ba450990d9ed63ccceeb8cae609f7"}, + {file = "pandas-1.5.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:565fa34a5434d38e9d250af3c12ff931abaf88050551d9fbcdfafca50d62babf"}, + {file = "pandas-1.5.3-cp38-cp38-win32.whl", hash = "sha256:87bd9c03da1ac870a6d2c8902a0e1fd4267ca00f13bc494c9e5a9020920e1d51"}, + {file = "pandas-1.5.3-cp38-cp38-win_amd64.whl", hash = "sha256:41179ce559943d83a9b4bbacb736b04c928b095b5f25dd2b7389eda08f46f373"}, + {file = "pandas-1.5.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c74a62747864ed568f5a82a49a23a8d7fe171d0c69038b38cedf0976831296fa"}, + {file = "pandas-1.5.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c4c00e0b0597c8e4f59e8d461f797e5d70b4d025880516a8261b2817c47759ee"}, + {file = "pandas-1.5.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a50d9a4336a9621cab7b8eb3fb11adb82de58f9b91d84c2cd526576b881a0c5a"}, + {file = "pandas-1.5.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd05f7783b3274aa206a1af06f0ceed3f9b412cf665b7247eacd83be41cf7bf0"}, + {file = "pandas-1.5.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f69c4029613de47816b1bb30ff5ac778686688751a5e9c99ad8c7031f6508e5"}, + {file = "pandas-1.5.3-cp39-cp39-win32.whl", hash = "sha256:7cec0bee9f294e5de5bbfc14d0573f65526071029d036b753ee6507d2a21480a"}, + {file = "pandas-1.5.3-cp39-cp39-win_amd64.whl", hash = "sha256:dfd681c5dc216037e0b0a2c821f5ed99ba9f03ebcf119c7dac0e9a7b960b9ec9"}, + {file = "pandas-1.5.3.tar.gz", hash = "sha256:74a3fd7e5a7ec052f183273dc7b0acd3a863edf7520f5d3a1765c04ffdb3b0b1"}, +] + +[package.dependencies] +numpy = {version = ">=1.21.0", markers = "python_version >= \"3.10\""} +python-dateutil = ">=2.8.1" +pytz = ">=2020.1" + +[package.extras] +test = ["hypothesis (>=5.5.3)", "pytest (>=6.0)", "pytest-xdist (>=1.31)"] + +[[package]] +name = "pandocfilters" +version = "1.5.0" +description = "Utilities for writing pandoc filters in python" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pandocfilters-1.5.0-py2.py3-none-any.whl", hash = "sha256:33aae3f25fd1a026079f5d27bdd52496f0e0803b3469282162bafdcbdf6ef14f"}, + {file = "pandocfilters-1.5.0.tar.gz", hash = "sha256:0b679503337d233b4339a817bfc8c50064e2eff681314376a47cb582305a7a38"}, +] + +[[package]] +name = "papermill" +version = "2.4.0" +description = "Parametrize and run Jupyter and nteract Notebooks" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "papermill-2.4.0-py3-none-any.whl", hash = "sha256:baa76f0441257d9a25b3ad7c895e761341b94f9a70ca98cf419247fc728932d9"}, + {file = "papermill-2.4.0.tar.gz", hash = "sha256:6f8f8a9b06b39677f207c09100c8d386bcf592f0cbbdda9f0f50e81445697627"}, +] + +[package.dependencies] +ansiwrap = "*" +click = "*" +entrypoints = "*" +nbclient = ">=0.2.0" +nbformat = ">=5.1.2" +pyyaml = "*" +requests = "*" +tenacity = "*" +tqdm = ">=4.32.2" + +[package.extras] +all = ["azure-datalake-store (>=0.0.30)", "azure-storage-blob (>=12.1.0)", "black (>=19.3b0)", "boto3", "gcsfs (>=0.2.0)", "pyarrow (>=2.0)", "requests (>=2.21.0)"] +azure = ["azure-datalake-store (>=0.0.30)", "azure-storage-blob (>=12.1.0)", "requests (>=2.21.0)"] +black = ["black (>=19.3b0)"] +dev = ["attrs (>=17.4.0)", "azure-datalake-store (>=0.0.30)", "azure-storage-blob (>=12.1.0)", "black (>=19.3b0)", "boto3", "botocore", "bumpversion", "check-manifest", "codecov", "coverage", "flake8", "gcsfs (>=0.2.0)", "google-compute-engine", "ipython (>=5.0)", "ipywidgets", "moto", "notebook", "pip (>=18.1)", "pre-commit", "pyarrow (>=2.0)", "pytest (>=4.1)", "pytest-cov (>=2.6.1)", "pytest-env (>=0.6.2)", "pytest-mock (>=1.10)", "recommonmark", "requests (>=2.21.0)", "setuptools (>=38.6.0)", "tox", "twine (>=1.11.0)", "wheel (>=0.31.0)"] +gcs = ["gcsfs (>=0.2.0)"] +github = ["PyGithub (>=1.55)"] +hdfs = ["pyarrow (>=2.0)"] +s3 = ["boto3"] +test = ["attrs (>=17.4.0)", "azure-datalake-store (>=0.0.30)", "azure-storage-blob (>=12.1.0)", "black (>=19.3b0)", "boto3", "botocore", "bumpversion", "check-manifest", "codecov", "coverage", "flake8", "gcsfs (>=0.2.0)", "google-compute-engine", "ipython (>=5.0)", "ipywidgets", "moto", "notebook", "pip (>=18.1)", "pre-commit", "pyarrow (>=2.0)", "pytest (>=4.1)", "pytest-cov (>=2.6.1)", "pytest-env (>=0.6.2)", "pytest-mock (>=1.10)", "recommonmark", "requests (>=2.21.0)", "setuptools (>=38.6.0)", "tox", "twine (>=1.11.0)", "wheel (>=0.31.0)"] + +[[package]] +name = "parso" +version = "0.8.3" +description = "A Python Parser" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, + {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, +] + +[package.extras] +qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] +testing = ["docopt", "pytest (<6.0.0)"] + +[[package]] +name = "pdoc" +version = "12.3.1" +description = "API Documentation for Python Projects" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pdoc-12.3.1-py3-none-any.whl", hash = "sha256:c3f24f31286e634de9c76fa6e67bd5c0c5e74360b41dc91e6b82499831eb52d8"}, + {file = "pdoc-12.3.1.tar.gz", hash = "sha256:453236f225feddb8a9071428f1982a78d74b9b3da4bc4433aedb64dbd0cc87ab"}, +] + +[package.dependencies] +Jinja2 = ">=2.11.0" +MarkupSafe = "*" +pygments = ">=2.12.0" + +[package.extras] +dev = ["black", "hypothesis", "mypy", "pytest", "pytest-cov", "pytest-timeout", "ruff", "tox", "types-pygments"] + +[[package]] +name = "pdoc3" +version = "0.10.0" +description = "Auto-generate API documentation for Python projects." +category = "dev" +optional = false +python-versions = ">= 3.6" +files = [ + {file = "pdoc3-0.10.0-py3-none-any.whl", hash = "sha256:ba45d1ada1bd987427d2bf5cdec30b2631a3ff5fb01f6d0e77648a572ce6028b"}, + {file = "pdoc3-0.10.0.tar.gz", hash = "sha256:5f22e7bcb969006738e1aa4219c75a32f34c2d62d46dc9d2fb2d3e0b0287e4b7"}, +] + +[package.dependencies] +mako = "*" +markdown = ">=3.0" + +[[package]] +name = "pexpect" +version = "4.8.0" +description = "Pexpect allows easy control of interactive console applications." +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, + {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, +] + +[package.dependencies] +ptyprocess = ">=0.5" + +[[package]] +name = "pickleshare" +version = "0.7.5" +description = "Tiny 'shelve'-like database with concurrency support" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, + {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, +] + +[[package]] +name = "pillow" +version = "9.4.0" +description = "Python Imaging Library (Fork)" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Pillow-9.4.0-1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1b4b4e9dda4f4e4c4e6896f93e84a8f0bcca3b059de9ddf67dac3c334b1195e1"}, + {file = "Pillow-9.4.0-1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:fb5c1ad6bad98c57482236a21bf985ab0ef42bd51f7ad4e4538e89a997624e12"}, + {file = "Pillow-9.4.0-1-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:f0caf4a5dcf610d96c3bd32932bfac8aee61c96e60481c2a0ea58da435e25acd"}, + {file = "Pillow-9.4.0-1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:3f4cc516e0b264c8d4ccd6b6cbc69a07c6d582d8337df79be1e15a5056b258c9"}, + {file = "Pillow-9.4.0-1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:b8c2f6eb0df979ee99433d8b3f6d193d9590f735cf12274c108bd954e30ca858"}, + {file = "Pillow-9.4.0-1-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b70756ec9417c34e097f987b4d8c510975216ad26ba6e57ccb53bc758f490dab"}, + {file = "Pillow-9.4.0-1-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:43521ce2c4b865d385e78579a082b6ad1166ebed2b1a2293c3be1d68dd7ca3b9"}, + {file = "Pillow-9.4.0-2-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:9d9a62576b68cd90f7075876f4e8444487db5eeea0e4df3ba298ee38a8d067b0"}, + {file = "Pillow-9.4.0-2-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:87708d78a14d56a990fbf4f9cb350b7d89ee8988705e58e39bdf4d82c149210f"}, + {file = "Pillow-9.4.0-2-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:8a2b5874d17e72dfb80d917213abd55d7e1ed2479f38f001f264f7ce7bae757c"}, + {file = "Pillow-9.4.0-2-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:83125753a60cfc8c412de5896d10a0a405e0bd88d0470ad82e0869ddf0cb3848"}, + {file = "Pillow-9.4.0-2-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:9e5f94742033898bfe84c93c831a6f552bb629448d4072dd312306bab3bd96f1"}, + {file = "Pillow-9.4.0-2-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:013016af6b3a12a2f40b704677f8b51f72cb007dac785a9933d5c86a72a7fe33"}, + {file = "Pillow-9.4.0-2-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:99d92d148dd03fd19d16175b6d355cc1b01faf80dae93c6c3eb4163709edc0a9"}, + {file = "Pillow-9.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:2968c58feca624bb6c8502f9564dd187d0e1389964898f5e9e1fbc8533169157"}, + {file = "Pillow-9.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c5c1362c14aee73f50143d74389b2c158707b4abce2cb055b7ad37ce60738d47"}, + {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd752c5ff1b4a870b7661234694f24b1d2b9076b8bf337321a814c612665f343"}, + {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a3049a10261d7f2b6514d35bbb7a4dfc3ece4c4de14ef5876c4b7a23a0e566d"}, + {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16a8df99701f9095bea8a6c4b3197da105df6f74e6176c5b410bc2df2fd29a57"}, + {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:94cdff45173b1919350601f82d61365e792895e3c3a3443cf99819e6fbf717a5"}, + {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:ed3e4b4e1e6de75fdc16d3259098de7c6571b1a6cc863b1a49e7d3d53e036070"}, + {file = "Pillow-9.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5b2f8a31bd43e0f18172d8ac82347c8f37ef3e0b414431157718aa234991b28"}, + {file = "Pillow-9.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:09b89ddc95c248ee788328528e6a2996e09eaccddeeb82a5356e92645733be35"}, + {file = "Pillow-9.4.0-cp310-cp310-win32.whl", hash = "sha256:f09598b416ba39a8f489c124447b007fe865f786a89dbfa48bb5cf395693132a"}, + {file = "Pillow-9.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:f6e78171be3fb7941f9910ea15b4b14ec27725865a73c15277bc39f5ca4f8391"}, + {file = "Pillow-9.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:3fa1284762aacca6dc97474ee9c16f83990b8eeb6697f2ba17140d54b453e133"}, + {file = "Pillow-9.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:eaef5d2de3c7e9b21f1e762f289d17b726c2239a42b11e25446abf82b26ac132"}, + {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4dfdae195335abb4e89cc9762b2edc524f3c6e80d647a9a81bf81e17e3fb6f0"}, + {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6abfb51a82e919e3933eb137e17c4ae9c0475a25508ea88993bb59faf82f3b35"}, + {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:451f10ef963918e65b8869e17d67db5e2f4ab40e716ee6ce7129b0cde2876eab"}, + {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:6663977496d616b618b6cfa43ec86e479ee62b942e1da76a2c3daa1c75933ef4"}, + {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:60e7da3a3ad1812c128750fc1bc14a7ceeb8d29f77e0a2356a8fb2aa8925287d"}, + {file = "Pillow-9.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:19005a8e58b7c1796bc0167862b1f54a64d3b44ee5d48152b06bb861458bc0f8"}, + {file = "Pillow-9.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f715c32e774a60a337b2bb8ad9839b4abf75b267a0f18806f6f4f5f1688c4b5a"}, + {file = "Pillow-9.4.0-cp311-cp311-win32.whl", hash = "sha256:b222090c455d6d1a64e6b7bb5f4035c4dff479e22455c9eaa1bdd4c75b52c80c"}, + {file = "Pillow-9.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:ba6612b6548220ff5e9df85261bddc811a057b0b465a1226b39bfb8550616aee"}, + {file = "Pillow-9.4.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:5f532a2ad4d174eb73494e7397988e22bf427f91acc8e6ebf5bb10597b49c493"}, + {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dd5a9c3091a0f414a963d427f920368e2b6a4c2f7527fdd82cde8ef0bc7a327"}, + {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef21af928e807f10bf4141cad4746eee692a0dd3ff56cfb25fce076ec3cc8abe"}, + {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:847b114580c5cc9ebaf216dd8c8dbc6b00a3b7ab0131e173d7120e6deade1f57"}, + {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:653d7fb2df65efefbcbf81ef5fe5e5be931f1ee4332c2893ca638c9b11a409c4"}, + {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:46f39cab8bbf4a384ba7cb0bc8bae7b7062b6a11cfac1ca4bc144dea90d4a9f5"}, + {file = "Pillow-9.4.0-cp37-cp37m-win32.whl", hash = "sha256:7ac7594397698f77bce84382929747130765f66406dc2cd8b4ab4da68ade4c6e"}, + {file = "Pillow-9.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:46c259e87199041583658457372a183636ae8cd56dbf3f0755e0f376a7f9d0e6"}, + {file = "Pillow-9.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:0e51f608da093e5d9038c592b5b575cadc12fd748af1479b5e858045fff955a9"}, + {file = "Pillow-9.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:765cb54c0b8724a7c12c55146ae4647e0274a839fb6de7bcba841e04298e1011"}, + {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:519e14e2c49fcf7616d6d2cfc5c70adae95682ae20f0395e9280db85e8d6c4df"}, + {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d197df5489004db87d90b918033edbeee0bd6df3848a204bca3ff0a903bef837"}, + {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0845adc64fe9886db00f5ab68c4a8cd933ab749a87747555cec1c95acea64b0b"}, + {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:e1339790c083c5a4de48f688b4841f18df839eb3c9584a770cbd818b33e26d5d"}, + {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:a96e6e23f2b79433390273eaf8cc94fec9c6370842e577ab10dabdcc7ea0a66b"}, + {file = "Pillow-9.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7cfc287da09f9d2a7ec146ee4d72d6ea1342e770d975e49a8621bf54eaa8f30f"}, + {file = "Pillow-9.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d7081c084ceb58278dd3cf81f836bc818978c0ccc770cbbb202125ddabec6628"}, + {file = "Pillow-9.4.0-cp38-cp38-win32.whl", hash = "sha256:df41112ccce5d47770a0c13651479fbcd8793f34232a2dd9faeccb75eb5d0d0d"}, + {file = "Pillow-9.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:7a21222644ab69ddd9967cfe6f2bb420b460dae4289c9d40ff9a4896e7c35c9a"}, + {file = "Pillow-9.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0f3269304c1a7ce82f1759c12ce731ef9b6e95b6df829dccd9fe42912cc48569"}, + {file = "Pillow-9.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cb362e3b0976dc994857391b776ddaa8c13c28a16f80ac6522c23d5257156bed"}, + {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2e0f87144fcbbe54297cae708c5e7f9da21a4646523456b00cc956bd4c65815"}, + {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:28676836c7796805914b76b1837a40f76827ee0d5398f72f7dcc634bae7c6264"}, + {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0884ba7b515163a1a05440a138adeb722b8a6ae2c2b33aea93ea3118dd3a899e"}, + {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:53dcb50fbdc3fb2c55431a9b30caeb2f7027fcd2aeb501459464f0214200a503"}, + {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:e8c5cf126889a4de385c02a2c3d3aba4b00f70234bfddae82a5eaa3ee6d5e3e6"}, + {file = "Pillow-9.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6c6b1389ed66cdd174d040105123a5a1bc91d0aa7059c7261d20e583b6d8cbd2"}, + {file = "Pillow-9.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0dd4c681b82214b36273c18ca7ee87065a50e013112eea7d78c7a1b89a739153"}, + {file = "Pillow-9.4.0-cp39-cp39-win32.whl", hash = "sha256:6d9dfb9959a3b0039ee06c1a1a90dc23bac3b430842dcb97908ddde05870601c"}, + {file = "Pillow-9.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:54614444887e0d3043557d9dbc697dbb16cfb5a35d672b7a0fcc1ed0cf1c600b"}, + {file = "Pillow-9.4.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b9b752ab91e78234941e44abdecc07f1f0d8f51fb62941d32995b8161f68cfe5"}, + {file = "Pillow-9.4.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3b56206244dc8711f7e8b7d6cad4663917cd5b2d950799425076681e8766286"}, + {file = "Pillow-9.4.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aabdab8ec1e7ca7f1434d042bf8b1e92056245fb179790dc97ed040361f16bfd"}, + {file = "Pillow-9.4.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:db74f5562c09953b2c5f8ec4b7dfd3f5421f31811e97d1dbc0a7c93d6e3a24df"}, + {file = "Pillow-9.4.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e9d7747847c53a16a729b6ee5e737cf170f7a16611c143d95aa60a109a59c336"}, + {file = "Pillow-9.4.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b52ff4f4e002f828ea6483faf4c4e8deea8d743cf801b74910243c58acc6eda3"}, + {file = "Pillow-9.4.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:575d8912dca808edd9acd6f7795199332696d3469665ef26163cd090fa1f8bfa"}, + {file = "Pillow-9.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3c4ed2ff6760e98d262e0cc9c9a7f7b8a9f61aa4d47c58835cdaf7b0b8811bb"}, + {file = "Pillow-9.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e621b0246192d3b9cb1dc62c78cfa4c6f6d2ddc0ec207d43c0dedecb914f152a"}, + {file = "Pillow-9.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:8f127e7b028900421cad64f51f75c051b628db17fb00e099eb148761eed598c9"}, + {file = "Pillow-9.4.0.tar.gz", hash = "sha256:a1c2d7780448eb93fbcc3789bf3916aa5720d942e37945f4056680317f1cd23e"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-issues (>=3.0.1)", "sphinx-removed-in", "sphinxext-opengraph"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "platformdirs" +version = "3.1.1" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "platformdirs-3.1.1-py3-none-any.whl", hash = "sha256:e5986afb596e4bb5bde29a79ac9061aa955b94fca2399b7aaac4090860920dd8"}, + {file = "platformdirs-3.1.1.tar.gz", hash = "sha256:024996549ee88ec1a9aa99ff7f8fc819bb59e2c3477b410d90a16d32d6e707aa"}, +] + +[package.extras] +docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.2.2)", "pytest (>=7.2.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] + +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "ply" +version = "3.11" +description = "Python Lex & Yacc" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce"}, + {file = "ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3"}, +] + +[[package]] +name = "portalocker" +version = "2.7.0" +description = "Wraps the portalocker recipe for easy usage" +category = "main" +optional = false +python-versions = ">=3.5" +files = [ + {file = "portalocker-2.7.0-py2.py3-none-any.whl", hash = "sha256:a07c5b4f3985c3cf4798369631fb7011adb498e2a46d8440efc75a8f29a0f983"}, + {file = "portalocker-2.7.0.tar.gz", hash = "sha256:032e81d534a88ec1736d03f780ba073f047a06c478b06e2937486f334e955c51"}, +] + +[package.dependencies] +pywin32 = {version = ">=226", markers = "platform_system == \"Windows\""} + +[package.extras] +docs = ["sphinx (>=1.7.1)"] +redis = ["redis"] +tests = ["pytest (>=5.4.1)", "pytest-cov (>=2.8.1)", "pytest-mypy (>=0.8.0)", "pytest-timeout (>=2.1.0)", "redis", "sphinx (>=6.0.0)"] + +[[package]] +name = "prometheus-client" +version = "0.16.0" +description = "Python client for the Prometheus monitoring system." +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "prometheus_client-0.16.0-py3-none-any.whl", hash = "sha256:0836af6eb2c8f4fed712b2f279f6c0a8bbab29f9f4aa15276b91c7cb0d1616ab"}, + {file = "prometheus_client-0.16.0.tar.gz", hash = "sha256:a03e35b359f14dd1630898543e2120addfdeacd1a6069c1367ae90fd93ad3f48"}, +] + +[package.extras] +twisted = ["twisted"] + +[[package]] +name = "prompt-toolkit" +version = "3.0.38" +description = "Library for building powerful interactive command lines in Python" +category = "dev" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "prompt_toolkit-3.0.38-py3-none-any.whl", hash = "sha256:45ea77a2f7c60418850331366c81cf6b5b9cf4c7fd34616f733c5427e6abbb1f"}, + {file = "prompt_toolkit-3.0.38.tar.gz", hash = "sha256:23ac5d50538a9a38c8bde05fecb47d0b403ecd0662857a86f886f798563d5b9b"}, +] + +[package.dependencies] +wcwidth = "*" + +[[package]] +name = "protobuf" +version = "4.22.1" +description = "" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "protobuf-4.22.1-cp310-abi3-win32.whl", hash = "sha256:85aa9acc5a777adc0c21b449dafbc40d9a0b6413ff3a4f77ef9df194be7f975b"}, + {file = "protobuf-4.22.1-cp310-abi3-win_amd64.whl", hash = "sha256:8bc971d76c03f1dd49f18115b002254f2ddb2d4b143c583bb860b796bb0d399e"}, + {file = "protobuf-4.22.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:5917412347e1da08ce2939eb5cd60650dfb1a9ab4606a415b9278a1041fb4d19"}, + {file = "protobuf-4.22.1-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:9e12e2810e7d297dbce3c129ae5e912ffd94240b050d33f9ecf023f35563b14f"}, + {file = "protobuf-4.22.1-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:953fc7904ef46900262a26374b28c2864610b60cdc8b272f864e22143f8373c4"}, + {file = "protobuf-4.22.1-cp37-cp37m-win32.whl", hash = "sha256:6e100f7bc787cd0a0ae58dbf0ab8bbf1ee7953f862b89148b6cf5436d5e9eaa1"}, + {file = "protobuf-4.22.1-cp37-cp37m-win_amd64.whl", hash = "sha256:87a6393fa634f294bf24d1cfe9fdd6bb605cbc247af81b9b10c4c0f12dfce4b3"}, + {file = "protobuf-4.22.1-cp38-cp38-win32.whl", hash = "sha256:e3fb58076bdb550e75db06ace2a8b3879d4c4f7ec9dd86e4254656118f4a78d7"}, + {file = "protobuf-4.22.1-cp38-cp38-win_amd64.whl", hash = "sha256:651113695bc2e5678b799ee5d906b5d3613f4ccfa61b12252cfceb6404558af0"}, + {file = "protobuf-4.22.1-cp39-cp39-win32.whl", hash = "sha256:67b7d19da0fda2733702c2299fd1ef6cb4b3d99f09263eacaf1aa151d9d05f02"}, + {file = "protobuf-4.22.1-cp39-cp39-win_amd64.whl", hash = "sha256:b8700792f88e59ccecfa246fa48f689d6eee6900eddd486cdae908ff706c482b"}, + {file = "protobuf-4.22.1-py3-none-any.whl", hash = "sha256:3e19dcf4adbf608924d3486ece469dd4f4f2cf7d2649900f0efcd1a84e8fd3ba"}, + {file = "protobuf-4.22.1.tar.gz", hash = "sha256:dce7a55d501c31ecf688adb2f6c3f763cf11bc0be815d1946a84d74772ab07a7"}, +] + +[[package]] +name = "psutil" +version = "5.9.4" +description = "Cross-platform lib for process and system monitoring in Python." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "psutil-5.9.4-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:c1ca331af862803a42677c120aff8a814a804e09832f166f226bfd22b56feee8"}, + {file = "psutil-5.9.4-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:68908971daf802203f3d37e78d3f8831b6d1014864d7a85937941bb35f09aefe"}, + {file = "psutil-5.9.4-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:3ff89f9b835100a825b14c2808a106b6fdcc4b15483141482a12c725e7f78549"}, + {file = "psutil-5.9.4-cp27-cp27m-win32.whl", hash = "sha256:852dd5d9f8a47169fe62fd4a971aa07859476c2ba22c2254d4a1baa4e10b95ad"}, + {file = "psutil-5.9.4-cp27-cp27m-win_amd64.whl", hash = "sha256:9120cd39dca5c5e1c54b59a41d205023d436799b1c8c4d3ff71af18535728e94"}, + {file = "psutil-5.9.4-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:6b92c532979bafc2df23ddc785ed116fced1f492ad90a6830cf24f4d1ea27d24"}, + {file = "psutil-5.9.4-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:efeae04f9516907be44904cc7ce08defb6b665128992a56957abc9b61dca94b7"}, + {file = "psutil-5.9.4-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:54d5b184728298f2ca8567bf83c422b706200bcbbfafdc06718264f9393cfeb7"}, + {file = "psutil-5.9.4-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:16653106f3b59386ffe10e0bad3bb6299e169d5327d3f187614b1cb8f24cf2e1"}, + {file = "psutil-5.9.4-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54c0d3d8e0078b7666984e11b12b88af2db11d11249a8ac8920dd5ef68a66e08"}, + {file = "psutil-5.9.4-cp36-abi3-win32.whl", hash = "sha256:149555f59a69b33f056ba1c4eb22bb7bf24332ce631c44a319cec09f876aaeff"}, + {file = "psutil-5.9.4-cp36-abi3-win_amd64.whl", hash = "sha256:fd8522436a6ada7b4aad6638662966de0d61d241cb821239b2ae7013d41a43d4"}, + {file = "psutil-5.9.4-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:6001c809253a29599bc0dfd5179d9f8a5779f9dffea1da0f13c53ee568115e1e"}, + {file = "psutil-5.9.4.tar.gz", hash = "sha256:3d7f9739eb435d4b1338944abe23f49584bde5395f27487d2ee25ad9a8774a62"}, +] + +[package.extras] +test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] + +[[package]] +name = "ptpython" +version = "3.0.23" +description = "Python REPL build on top of prompt_toolkit" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "ptpython-3.0.23-py2.py3-none-any.whl", hash = "sha256:51069503684169b21e1980734a9ba2e104643b7e6a50d3ca0e5669ea70d9e21c"}, + {file = "ptpython-3.0.23.tar.gz", hash = "sha256:9fc9bec2cc51bc4000c1224d8c56241ce8a406b3d49ec8dc266f78cd3cd04ba4"}, +] + +[package.dependencies] +appdirs = "*" +jedi = ">=0.16.0" +prompt-toolkit = ">=3.0.28,<3.1.0" +pygments = "*" + +[package.extras] +all = ["black"] +ptipython = ["ipython"] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] + +[[package]] +name = "pudb" +version = "2022.1.3" +description = "A full-screen, console-based Python debugger" +category = "dev" +optional = false +python-versions = "~=3.6" +files = [ + {file = "pudb-2022.1.3.tar.gz", hash = "sha256:58e83ada9e19ffe92c1fdc78ae5458ef91aeb892a5b8f0e7379e6fa61e0e664a"}, +] + +[package.dependencies] +jedi = ">=0.18,<1" +packaging = ">=20.0" +pygments = ">=2.7.4" +urwid = ">=1.1.1" +urwid_readline = "*" + +[package.extras] +completion = ["shtab"] + +[[package]] +name = "pure-eval" +version = "0.2.2" +description = "Safely evaluate AST nodes without side effects" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, + {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, +] + +[package.extras] +tests = ["pytest"] + +[[package]] +name = "pyasn1" +version = "0.4.8" +description = "ASN.1 types and codecs" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "pyasn1-0.4.8-py2.py3-none-any.whl", hash = "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d"}, + {file = "pyasn1-0.4.8.tar.gz", hash = "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba"}, +] + +[[package]] +name = "pyasn1-modules" +version = "0.2.8" +description = "A collection of ASN.1-based protocols modules." +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "pyasn1-modules-0.2.8.tar.gz", hash = "sha256:905f84c712230b2c592c19470d3ca8d552de726050d1d1716282a1f6146be65e"}, + {file = "pyasn1_modules-0.2.8-py2.py3-none-any.whl", hash = "sha256:a50b808ffeb97cb3601dd25981f6b016cbb3d31fbf57a8b8a87428e6158d0c74"}, +] + +[package.dependencies] +pyasn1 = ">=0.4.6,<0.5.0" + +[[package]] +name = "pybind11" +version = "2.10.4" +description = "Seamless operability between C++11 and Python" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pybind11-2.10.4-py3-none-any.whl", hash = "sha256:ec9be0c45061c829648d7e8c98a7d041768b768c934acd15196e0f1943d9a818"}, + {file = "pybind11-2.10.4.tar.gz", hash = "sha256:0bb621d3c45a049aa5923debb87c5c0e2668227905c55ebe8af722608d8ed927"}, +] + +[package.extras] +global = ["pybind11-global (==2.10.4)"] + +[[package]] +name = "pycodestyle" +version = "2.10.0" +description = "Python style guide checker" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pycodestyle-2.10.0-py2.py3-none-any.whl", hash = "sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610"}, + {file = "pycodestyle-2.10.0.tar.gz", hash = "sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053"}, +] + +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] + +[[package]] +name = "pydantic" +version = "1.10.7" +description = "Data validation and settings management using python type hints" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pydantic-1.10.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e79e999e539872e903767c417c897e729e015872040e56b96e67968c3b918b2d"}, + {file = "pydantic-1.10.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:01aea3a42c13f2602b7ecbbea484a98169fb568ebd9e247593ea05f01b884b2e"}, + {file = "pydantic-1.10.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:516f1ed9bc2406a0467dd777afc636c7091d71f214d5e413d64fef45174cfc7a"}, + {file = "pydantic-1.10.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae150a63564929c675d7f2303008d88426a0add46efd76c3fc797cd71cb1b46f"}, + {file = "pydantic-1.10.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ecbbc51391248116c0a055899e6c3e7ffbb11fb5e2a4cd6f2d0b93272118a209"}, + {file = "pydantic-1.10.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f4a2b50e2b03d5776e7f21af73e2070e1b5c0d0df255a827e7c632962f8315af"}, + {file = "pydantic-1.10.7-cp310-cp310-win_amd64.whl", hash = "sha256:a7cd2251439988b413cb0a985c4ed82b6c6aac382dbaff53ae03c4b23a70e80a"}, + {file = "pydantic-1.10.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:68792151e174a4aa9e9fc1b4e653e65a354a2fa0fed169f7b3d09902ad2cb6f1"}, + {file = "pydantic-1.10.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe2507b8ef209da71b6fb5f4e597b50c5a34b78d7e857c4f8f3115effaef5fe"}, + {file = "pydantic-1.10.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10a86d8c8db68086f1e30a530f7d5f83eb0685e632e411dbbcf2d5c0150e8dcd"}, + {file = "pydantic-1.10.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d75ae19d2a3dbb146b6f324031c24f8a3f52ff5d6a9f22f0683694b3afcb16fb"}, + {file = "pydantic-1.10.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:464855a7ff7f2cc2cf537ecc421291b9132aa9c79aef44e917ad711b4a93163b"}, + {file = "pydantic-1.10.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:193924c563fae6ddcb71d3f06fa153866423ac1b793a47936656e806b64e24ca"}, + {file = "pydantic-1.10.7-cp311-cp311-win_amd64.whl", hash = "sha256:b4a849d10f211389502059c33332e91327bc154acc1845f375a99eca3afa802d"}, + {file = "pydantic-1.10.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cc1dde4e50a5fc1336ee0581c1612215bc64ed6d28d2c7c6f25d2fe3e7c3e918"}, + {file = "pydantic-1.10.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0cfe895a504c060e5d36b287ee696e2fdad02d89e0d895f83037245218a87fe"}, + {file = "pydantic-1.10.7-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:670bb4683ad1e48b0ecb06f0cfe2178dcf74ff27921cdf1606e527d2617a81ee"}, + {file = "pydantic-1.10.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:950ce33857841f9a337ce07ddf46bc84e1c4946d2a3bba18f8280297157a3fd1"}, + {file = "pydantic-1.10.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c15582f9055fbc1bfe50266a19771bbbef33dd28c45e78afbe1996fd70966c2a"}, + {file = "pydantic-1.10.7-cp37-cp37m-win_amd64.whl", hash = "sha256:82dffb306dd20bd5268fd6379bc4bfe75242a9c2b79fec58e1041fbbdb1f7914"}, + {file = "pydantic-1.10.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c7f51861d73e8b9ddcb9916ae7ac39fb52761d9ea0df41128e81e2ba42886cd"}, + {file = "pydantic-1.10.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6434b49c0b03a51021ade5c4daa7d70c98f7a79e95b551201fff682fc1661245"}, + {file = "pydantic-1.10.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64d34ab766fa056df49013bb6e79921a0265204c071984e75a09cbceacbbdd5d"}, + {file = "pydantic-1.10.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:701daea9ffe9d26f97b52f1d157e0d4121644f0fcf80b443248434958fd03dc3"}, + {file = "pydantic-1.10.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf135c46099ff3f919d2150a948ce94b9ce545598ef2c6c7bf55dca98a304b52"}, + {file = "pydantic-1.10.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0f85904f73161817b80781cc150f8b906d521fa11e3cdabae19a581c3606209"}, + {file = "pydantic-1.10.7-cp38-cp38-win_amd64.whl", hash = "sha256:9f6f0fd68d73257ad6685419478c5aece46432f4bdd8d32c7345f1986496171e"}, + {file = "pydantic-1.10.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c230c0d8a322276d6e7b88c3f7ce885f9ed16e0910354510e0bae84d54991143"}, + {file = "pydantic-1.10.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:976cae77ba6a49d80f461fd8bba183ff7ba79f44aa5cfa82f1346b5626542f8e"}, + {file = "pydantic-1.10.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d45fc99d64af9aaf7e308054a0067fdcd87ffe974f2442312372dfa66e1001d"}, + {file = "pydantic-1.10.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d2a5ebb48958754d386195fe9e9c5106f11275867051bf017a8059410e9abf1f"}, + {file = "pydantic-1.10.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:abfb7d4a7cd5cc4e1d1887c43503a7c5dd608eadf8bc615413fc498d3e4645cd"}, + {file = "pydantic-1.10.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:80b1fab4deb08a8292d15e43a6edccdffa5377a36a4597bb545b93e79c5ff0a5"}, + {file = "pydantic-1.10.7-cp39-cp39-win_amd64.whl", hash = "sha256:d71e69699498b020ea198468e2480a2f1e7433e32a3a99760058c6520e2bea7e"}, + {file = "pydantic-1.10.7-py3-none-any.whl", hash = "sha256:0cd181f1d0b1d00e2b705f1bf1ac7799a2d938cce3376b8007df62b29be3c2c6"}, + {file = "pydantic-1.10.7.tar.gz", hash = "sha256:cfc83c0678b6ba51b0532bea66860617c4cd4251ecf76e9846fa5a9f3454e97e"}, +] + +[package.dependencies] +typing-extensions = ">=4.2.0" + +[package.extras] +dotenv = ["python-dotenv (>=0.10.4)"] +email = ["email-validator (>=1.0.3)"] + +[[package]] +name = "pydocstyle" +version = "6.2.3" +description = "Python docstring style checker" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pydocstyle-6.2.3-py3-none-any.whl", hash = "sha256:a04ed1e6fe0be0970eddbb1681a7ab59b11eb92729fdb4b9b24f0eb11a25629e"}, + {file = "pydocstyle-6.2.3.tar.gz", hash = "sha256:d867acad25e48471f2ad8a40ef9813125e954ad675202245ca836cb6e28b2297"}, +] + +[package.dependencies] +snowballstemmer = ">=2.2.0" + +[package.extras] +toml = ["tomli (>=1.2.3)"] + +[[package]] +name = "pyembree" +version = "0.2.11" +description = "Python wrapper for Intel Embree 2.17.7" +category = "main" +optional = false +python-versions = ">=3.8,<3.11" +files = [ + {file = "pyembree-0.2.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fea0e9004fff0ca26854bd2bc5baa06fe7cc7816e6713f9505f652c25d8d8c9"}, +] + +[package.dependencies] +Cython = ">=0.29.28,<0.30.0" +numpy = ">=1.22.2,<2.0.0" +Rtree = ">=1.0.0,<2.0.0" +setuptools = ">=60.9.3,<61.0.0" +trimesh = ">=3.10.7,<4.0.0" +wheel = ">=0.37.1,<0.38.0" + +[package.source] +type = "url" +url = "https://folk.ntnu.no/pederbs/pypy/pep503/pyembree/pyembree-0.2.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + +[[package]] +name = "pyflakes" +version = "3.0.1" +description = "passive checker of Python programs" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pyflakes-3.0.1-py2.py3-none-any.whl", hash = "sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf"}, + {file = "pyflakes-3.0.1.tar.gz", hash = "sha256:ec8b276a6b60bd80defed25add7e439881c19e64850afd9b346283d4165fd0fd"}, +] + +[[package]] +name = "pygame" +version = "2.3.0" +description = "Python Game Development" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pygame-2.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3e9535cf1af0c6ca38d94e0b492fc41057d7bf05e9bd64d3ed3e216d336d6d11"}, + {file = "pygame-2.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:23bd3c3a6d4e8acddee2297d609dbc5953d6ba99b0f0cc5ccc2f567889db3785"}, + {file = "pygame-2.3.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:619eed2d97f28af9d4cdb217a5517fd6f59b873f2f1d31b4489ed852b9a175c3"}, + {file = "pygame-2.3.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9ccac73a8c913809ba2c1408d750abf14e45666b3c83493370441c52e99222b4"}, + {file = "pygame-2.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ec8e691407b6c91525b2d7c8386fd6232b97d8f8c33d134ec0c0165b1d52c24"}, + {file = "pygame-2.3.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8308b21804d137a3b7cafbd020d2159eb5bcc18ffc9c3993b20311069c326a2c"}, + {file = "pygame-2.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1d737db18f4c94b620613c6a047a3a1eecc0f36df7d5da4070de575930cc5f0"}, + {file = "pygame-2.3.0-cp310-cp310-win32.whl", hash = "sha256:788717d0b9a0d0828a763381e1eb6a127ceef815f9a91ff52217ed4b78df62fc"}, + {file = "pygame-2.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:e3948be800b5f251a0741ec3aab3ca508dfc391095726a69af7064fa4d3e0547"}, + {file = "pygame-2.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:82e5806fd797bd1b27fae705683f6822ae5276ec9cda42e6e21bba61985b763a"}, + {file = "pygame-2.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fab0457ab07e8abb99de2b83c0a71f98bdf79afb01ff611873e4333fd8649f02"}, + {file = "pygame-2.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad8fa7a91fa8f2a4fa46366142763675a0a11b7c34b06dfc20b1095d116da820"}, + {file = "pygame-2.3.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfff49dbb7fcc2a9a88e3f25fda7f181ee4957fd89df78c47fa64c689d19b8a9"}, + {file = "pygame-2.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5afd712bd7307d034e6940f3025c4b769656fd4cbb38fbdbd6af0f93d6c8386"}, + {file = "pygame-2.3.0-cp311-cp311-win32.whl", hash = "sha256:fa18acc2d6f0d09575802e1db11845fc0f83f9777cc385c51380125df92f3dc9"}, + {file = "pygame-2.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:101c57141d705ca1930377c324d2c7acd3099f1b4ac676981bdf5d5b329842c8"}, + {file = "pygame-2.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:17730a2ed1001e5876745702c92906ad31ecedc13825efba56a0cba92e273b7a"}, + {file = "pygame-2.3.0-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4b334f6dd6c1412dd4b161a8562b7a422db957f67b7eb93e927606e2dd435882"}, + {file = "pygame-2.3.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4db1b103025fd4b451dfa409c0da16d2ff31714ae82bdf45b1434863cd69370b"}, + {file = "pygame-2.3.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d339f90cc30de4b013670de84abd46de4be602d5c52bbe4e569fa15d17b204ca"}, + {file = "pygame-2.3.0-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7390815dad55a2db9f8daac6f2c2e593801daea2d674433a72b91ea1caee0d3"}, + {file = "pygame-2.3.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59a1e473c627acf369b30bb52fb5f39d1f68f8c204aa857578b72f07a23c952b"}, + {file = "pygame-2.3.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:228514c0d034c840b8ee6bf99185df34ac15e6a6a99684b8a3900124417c8d8f"}, + {file = "pygame-2.3.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a8b315203925724f89a81a741682589ba1c36ec858d98e6accb7501ece9e99a3"}, + {file = "pygame-2.3.0-cp36-cp36m-win32.whl", hash = "sha256:38642c6cc6477db6ebddd52be39bad0a9e19cf097f83feaaf8e7573b9a9d2405"}, + {file = "pygame-2.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:525e11a2b9182ec84d690634016009e382ab8b488593c3f150a0b8aae28aa165"}, + {file = "pygame-2.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:32bdf1d5d9e0763779d0b915d4617253949a6c118c4c6b5ae1a77cf1df964e4c"}, + {file = "pygame-2.3.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f57b1ee40387e43ab5c3cf20437283477b5ef52ead4bb1d9bff254ef9ee70623"}, + {file = "pygame-2.3.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6ccde93b51d2393216f98e8f81cf5cc628513d837c89dcf5b588f52031659c09"}, + {file = "pygame-2.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c60be419d7cca1222895dfe9d520628b7346015208382a19fa678356a22664b3"}, + {file = "pygame-2.3.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43f238229b3a9e5692ba5a31638f1c148257b37a49ef21f03b23b34d7f00b2d9"}, + {file = "pygame-2.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d628637d4f0c55613f258b84eef932faf89e683aa842f4fd483a676f44a38606"}, + {file = "pygame-2.3.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:35f5a9cc7a9a2ea3d048e418e79f30e1506cb47015939330903026c636761aab"}, + {file = "pygame-2.3.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:703d5def9d4dbe9c358f63151bee4a55e328dd7737e692f52522bc44be7c7c8c"}, + {file = "pygame-2.3.0-cp37-cp37m-win32.whl", hash = "sha256:53e9418c457fa549294feee7947bc0b24b048b4eba133f0e757dd2348d15af3b"}, + {file = "pygame-2.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:0a664cd6c50870f6749c389a8844318afc8a2d02f8cb7b05d67930fdf99252bd"}, + {file = "pygame-2.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bf236758429d9b9cdadd1fcf40901588818ee440178b932409c40157ab41e902"}, + {file = "pygame-2.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3d035ba196c258876a87451fa7de65b62c087d7016e51000e8d95bc67c8584f7"}, + {file = "pygame-2.3.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:57180b3aabbe17d8017aa724887019943d96ea69810f4315f5c1b7d4f64861f9"}, + {file = "pygame-2.3.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:246f75f67d2ad4c2dad21b1f35c6092d67c4c0db13b2fa0a42d794e6e2794f47"}, + {file = "pygame-2.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:033352321cc49d60fdc3c3ae4b3e10ecb6614846fb2eb3453c729aba48a2874d"}, + {file = "pygame-2.3.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ee86606c6c7f61176ed24b427fa230fe4fc9f552aa555b8db21ddb608b4ce88"}, + {file = "pygame-2.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d949e93fbdaf5b43f69a484639104c07028f93686c8305afb0d8e382fde8ff5d"}, + {file = "pygame-2.3.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f2acf958513bd1612960ec68aa5e388262218f7365db59e54e1ee68a55bc544b"}, + {file = "pygame-2.3.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6c5d33355dfb66382bcac1fcf3db64ba71bc9e97082db3ae45a7a0d335e73268"}, + {file = "pygame-2.3.0-cp38-cp38-win32.whl", hash = "sha256:1eda9f30d376d4205e8204e542ab1348dcbb31755c8ba38772e48a3b2f91b2fc"}, + {file = "pygame-2.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:b507df9ea606a87c29e5028b8de9f35066a15f6a5d7f3e5b47b3719e9403f924"}, + {file = "pygame-2.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:25c1b1819211aaa0f98264e6b670a496a9975079d5ae2dffd304b0aca6b1aa3c"}, + {file = "pygame-2.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e516bc6bba5455817bbb0038f4c44d1914aac13c7f7954dee9213c9ae28bd9ac"}, + {file = "pygame-2.3.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:740b9f311c693b00d86a89cc6846afc1d1e013b006975eb8be0b18d5481c5b32"}, + {file = "pygame-2.3.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:932034e1738873a55c4e2eb83b6e8c03f9a55feaa6a04a7da7b1e0e5a5050b4a"}, + {file = "pygame-2.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:774233845099d632de676ad4d4dd08ba27ebce5bfa550b1dc9f6cce145e21c35"}, + {file = "pygame-2.3.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f79a3c5e7f24474d6e722d597ee03d2b0d17958c77d4307787147cf339b4ad9"}, + {file = "pygame-2.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84fad9538012f1d6b298dcf690c4336e0317fe97ac10993b4d847ff547e919dd"}, + {file = "pygame-2.3.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:910678441d02c3b55ac59fcbc4220a824b094407de084734b5d84e0900d6448b"}, + {file = "pygame-2.3.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:653ec5102b9cb13a24e26663a81d7810790e56b88113b90aa5fdca681c01a5b9"}, + {file = "pygame-2.3.0-cp39-cp39-win32.whl", hash = "sha256:e62607c86e02d29ba5cb00837f73b1dce7b325a1f1f6d93150a0f96fa68da1a1"}, + {file = "pygame-2.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:90931a210325274184860d898df4e87a0972654edbb2a6185afcdce32244dfb6"}, + {file = "pygame-2.3.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:1dc89d825e0ccba5ba3605abbd83be1401e0a32de7ab64b9647a6bb1ecb0a4f7"}, + {file = "pygame-2.3.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e323b75abda43345aff5ab2f6b1c017135f937f8a114d7aac8d95a07d200e19f"}, + {file = "pygame-2.3.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e13de2947c496fcb600fa4b5cd00a5fa33d4b3af9d13c169a5f79268268de0a8"}, + {file = "pygame-2.3.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:555234ed6b08242af95406fd3eb43255c3ce8e915e8c751f2d411bd40d574df4"}, + {file = "pygame-2.3.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:858d3968aebaca5015ef0ec82c513114a3c3fe64ce910222cfa852a39f03b135"}, + {file = "pygame-2.3.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:250b3ec3f90b05ad50cb0070d994a0a1f39fffe8181fc9508b8749884c313431"}, + {file = "pygame-2.3.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a5e83bd89da26f8360e02d5de2d2575981b0ebad81ea6d48aba610dabf167b88"}, + {file = "pygame-2.3.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c2961d44593aaa99580971e4123db00d4ca72fb4b30fa56350b3f6792331a41e"}, + {file = "pygame-2.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:385163fd1ed8809a72be68fddc9c76876c304e8712695aff2ea49adf3831caf9"}, + {file = "pygame-2.3.0.tar.gz", hash = "sha256:884b92c9cbf0bfaf8b8dd0f75a746613c55447d307ddd1addf903709b3b9f89f"}, +] + +[[package]] +name = "pyglet" +version = "2.0.5" +description = "Cross-platform windowing and multimedia library" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "pyglet-2.0.5-py3-none-any.whl", hash = "sha256:b0b94d0a3f9d0016bee506566fd13d7c62b5b9d10b6e16d32765d654959ba4dc"}, + {file = "pyglet-2.0.5.zip", hash = "sha256:c47ff4eded95104d030e0697eedd6082b61dc987460bbca83ec47b6e7cbfd38a"}, +] + +[[package]] +name = "pygments" +version = "2.14.0" +description = "Pygments is a syntax highlighting package written in Python." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "Pygments-2.14.0-py3-none-any.whl", hash = "sha256:fa7bd7bd2771287c0de303af8bfdfc731f51bd2c6a47ab69d117138893b82717"}, + {file = "Pygments-2.14.0.tar.gz", hash = "sha256:b3ed06a9e8ac9a9aae5a6f5dbe78a8a58655d17b43b93c078f094ddc476ae297"}, +] + +[package.extras] +plugins = ["importlib-metadata"] + +[[package]] +name = "pykeops" +version = "2.1.1" +description = "Python bindings of KeOps: KErnel OPerationS, on CPUs and GPUs, with autodiff and without memory overflows" +category = "main" +optional = false +python-versions = ">=3" +files = [ + {file = "pykeops-2.1.1.tar.gz", hash = "sha256:1931823c746345ce5a5805adad6baa1add772c6fe1800375f7f9a3ddb38b6f71"}, +] + +[package.dependencies] +keopscore = "2.1.1" +numpy = "*" +pybind11 = "*" + +[package.extras] +full = ["breathe", "faiss", "gpytorch", "h5py", "imageio", "jax", "jaxlib", "matplotlib", "multiprocess", "recommonmark", "scikit-learn", "sphinx", "sphinx-gallery", "sphinx-prompt", "sphinx_rtd_theme", "sphinxcontrib-httpdomain", "torch"] +test = ["numpy", "pytest", "torch"] + +[[package]] +name = "pylint" +version = "2.17.1" +description = "python code static checker" +category = "dev" +optional = false +python-versions = ">=3.7.2" +files = [ + {file = "pylint-2.17.1-py3-none-any.whl", hash = "sha256:8660a54e3f696243d644fca98f79013a959c03f979992c1ab59c24d3f4ec2700"}, + {file = "pylint-2.17.1.tar.gz", hash = "sha256:d4d009b0116e16845533bc2163493d6681846ac725eab8ca8014afb520178ddd"}, +] + +[package.dependencies] +astroid = ">=2.15.0,<=2.17.0-dev0" +colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} +dill = {version = ">=0.2", markers = "python_version < \"3.11\""} +isort = ">=4.2.5,<6" +mccabe = ">=0.6,<0.8" +platformdirs = ">=2.2.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +tomlkit = ">=0.10.1" + +[package.extras] +spelling = ["pyenchant (>=3.2,<4.0)"] +testutils = ["gitpython (>3)"] + +[[package]] +name = "pyopengl" +version = "3.1.0" +description = "Standard OpenGL bindings for Python" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "PyOpenGL-3.1.0.tar.gz", hash = "sha256:9b47c5c3a094fa518ca88aeed35ae75834d53e4285512c61879f67a48c94ddaf"}, + {file = "PyOpenGL-3.1.0.zip", hash = "sha256:efa4e39a49b906ccbe66758812ca81ced13a6f26931ab2ba2dba2750c016c0d0"}, +] + +[[package]] +name = "pyparsing" +version = "3.0.9" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +category = "main" +optional = false +python-versions = ">=3.6.8" +files = [ + {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, + {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + +[[package]] +name = "pyqt5" +version = "5.15.9" +description = "Python bindings for the Qt cross platform application toolkit" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "PyQt5-5.15.9-cp37-abi3-macosx_10_13_x86_64.whl", hash = "sha256:883ba5c8a348be78c8be6a3d3ba014c798e679503bce00d76c666c2dc6afe828"}, + {file = "PyQt5-5.15.9-cp37-abi3-manylinux_2_17_x86_64.whl", hash = "sha256:dd5ce10e79fbf1df29507d2daf99270f2057cdd25e4de6fbf2052b46c652e3a5"}, + {file = "PyQt5-5.15.9-cp37-abi3-win32.whl", hash = "sha256:e45c5cc15d4fd26ab5cb0e5cdba60691a3e9086411f8e3662db07a5a4222a696"}, + {file = "PyQt5-5.15.9-cp37-abi3-win_amd64.whl", hash = "sha256:e030d795df4cbbfcf4f38b18e2e119bcc9e177ef658a5094b87bb16cac0ce4c5"}, + {file = "PyQt5-5.15.9.tar.gz", hash = "sha256:dc41e8401a90dc3e2b692b411bd5492ab559ae27a27424eed4bd3915564ec4c0"}, +] + +[package.dependencies] +PyQt5-Qt5 = ">=5.15.2" +PyQt5-sip = ">=12.11,<13" + +[[package]] +name = "pyqt5-qt5" +version = "5.15.2" +description = "The subset of a Qt installation needed by PyQt5." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "PyQt5_Qt5-5.15.2-py3-none-macosx_10_13_intel.whl", hash = "sha256:76980cd3d7ae87e3c7a33bfebfaee84448fd650bad6840471d6cae199b56e154"}, + {file = "PyQt5_Qt5-5.15.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:1988f364ec8caf87a6ee5d5a3a5210d57539988bf8e84714c7d60972692e2f4a"}, + {file = "PyQt5_Qt5-5.15.2-py3-none-win32.whl", hash = "sha256:9cc7a768b1921f4b982ebc00a318ccb38578e44e45316c7a4a850e953e1dd327"}, + {file = "PyQt5_Qt5-5.15.2-py3-none-win_amd64.whl", hash = "sha256:750b78e4dba6bdf1607febedc08738e318ea09e9b10aea9ff0d73073f11f6962"}, +] + +[[package]] +name = "pyqt5-sip" +version = "12.11.1" +description = "The sip module support for PyQt5" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "PyQt5_sip-12.11.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a40a39a6136a90e10c31510295c2be924564fc6260691501cdde669bdc5edea5"}, + {file = "PyQt5_sip-12.11.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:19b06164793177146c7f7604fe8389f44221a7bde196f2182457eb3e4229fa88"}, + {file = "PyQt5_sip-12.11.1-cp310-cp310-win32.whl", hash = "sha256:3afb1d1c07adcfef5c8bb12356a2ec2ec094f324af4417735d43b1ecaf1bb1a4"}, + {file = "PyQt5_sip-12.11.1-cp310-cp310-win_amd64.whl", hash = "sha256:54dad6c2e5dab14e46f6822a889bbb1515bbd2061762273af10d26566d649bd9"}, + {file = "PyQt5_sip-12.11.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7218f6a1cefeb0b2fc26b89f15011f841aa4cd77786ccd863bf9792347fa38a8"}, + {file = "PyQt5_sip-12.11.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6b1113538082a7dd63b908587f61ce28ba4c7b8341e801fdf305d53a50a878ab"}, + {file = "PyQt5_sip-12.11.1-cp311-cp311-win32.whl", hash = "sha256:ac5f7ed06213d3bb203e33037f7c1a0716584c21f4f0922dcc044750e3659b80"}, + {file = "PyQt5_sip-12.11.1-cp311-cp311-win_amd64.whl", hash = "sha256:4f0497e2f5eeaea9f5a67b0e55c501168efa86df4e53aace2a46498b87bc55c1"}, + {file = "PyQt5_sip-12.11.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b355d56483edc79dcba30be947a6b700856bb74beb90539e14cc4d92b9bad152"}, + {file = "PyQt5_sip-12.11.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:dd163d9cffc4a56ebb9dd6908c0f0cb0caff8080294d41f4fb60fc3be63ca434"}, + {file = "PyQt5_sip-12.11.1-cp37-cp37m-win32.whl", hash = "sha256:b714f550ea6ddae94fd7acae531971e535f4a4e7277b62eb44e7c649cf3f03d0"}, + {file = "PyQt5_sip-12.11.1-cp37-cp37m-win_amd64.whl", hash = "sha256:d09b2586235deab7a5f2e28e4bde9a70c0b3730fa84f2590804a9932414136a3"}, + {file = "PyQt5_sip-12.11.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9a6f9c058564d0ac573561036299f54c452ae78b7d2a65d7c2d01685e6dca50d"}, + {file = "PyQt5_sip-12.11.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:fc920c0e0d5050474d2d6282b478e4957548bf1dce58e1b0678914514dc70064"}, + {file = "PyQt5_sip-12.11.1-cp38-cp38-win32.whl", hash = "sha256:3358c584832f0ac9fd1ad3623d8a346c705f43414df1fcd0cb285a6ef51fec08"}, + {file = "PyQt5_sip-12.11.1-cp38-cp38-win_amd64.whl", hash = "sha256:f9691c6f4d899ca762dd54442a1be158c3e52017f583183da6ef37d5bae86595"}, + {file = "PyQt5_sip-12.11.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0bc81cb9e171d29302d393775f95cfa01b7a15f61b199ab1812976e5c4cb2cb9"}, + {file = "PyQt5_sip-12.11.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b077fb4383536f51382f5516f0347328a4f338c6ccc4c268cc358643bef1b838"}, + {file = "PyQt5_sip-12.11.1-cp39-cp39-win32.whl", hash = "sha256:5c152878443c3e951d5db7df53509d444708dc06a121c267b548146be06b87f8"}, + {file = "PyQt5_sip-12.11.1-cp39-cp39-win_amd64.whl", hash = "sha256:bd935cc46dfdbb89c21042c1db2e46a71f25693af57272f146d6d9418e2934f1"}, + {file = "PyQt5_sip-12.11.1.tar.gz", hash = "sha256:97d3fbda0f61edb1be6529ec2d5c7202ae83aee4353e4b264a159f8c9ada4369"}, +] + +[[package]] +name = "pyrender" +version = "0.1.45" +description = "Easy-to-use Python renderer for 3D visualization" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "pyrender-0.1.45-py3-none-any.whl", hash = "sha256:5cf751d1f21fba4640e830cef3a0b5a95ed0f05677bf92c6b8330056b4023aeb"}, + {file = "pyrender-0.1.45.tar.gz", hash = "sha256:284b2432bf6832f05c5216c4b979ceb514ea78163bf53b8ce2bdf0069cb3b92e"}, +] + +[package.dependencies] +freetype-py = "*" +imageio = "*" +networkx = "*" +numpy = "*" +Pillow = "*" +pyglet = ">=1.4.10" +PyOpenGL = "3.1.0" +scipy = "*" +six = "*" +trimesh = "*" + +[package.extras] +dev = ["flake8", "pre-commit", "pytest", "pytest-cov", "tox"] +docs = ["sphinx", "sphinx-automodapi", "sphinx-rtd-theme"] + +[[package]] +name = "pyrsistent" +version = "0.19.3" +description = "Persistent/Functional/Immutable data structures" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyrsistent-0.19.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:20460ac0ea439a3e79caa1dbd560344b64ed75e85d8703943e0b66c2a6150e4a"}, + {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c18264cb84b5e68e7085a43723f9e4c1fd1d935ab240ce02c0324a8e01ccb64"}, + {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b774f9288dda8d425adb6544e5903f1fb6c273ab3128a355c6b972b7df39dcf"}, + {file = "pyrsistent-0.19.3-cp310-cp310-win32.whl", hash = "sha256:5a474fb80f5e0d6c9394d8db0fc19e90fa540b82ee52dba7d246a7791712f74a"}, + {file = "pyrsistent-0.19.3-cp310-cp310-win_amd64.whl", hash = "sha256:49c32f216c17148695ca0e02a5c521e28a4ee6c5089f97e34fe24163113722da"}, + {file = "pyrsistent-0.19.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f0774bf48631f3a20471dd7c5989657b639fd2d285b861237ea9e82c36a415a9"}, + {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab2204234c0ecd8b9368dbd6a53e83c3d4f3cab10ecaf6d0e772f456c442393"}, + {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e42296a09e83028b3476f7073fcb69ffebac0e66dbbfd1bd847d61f74db30f19"}, + {file = "pyrsistent-0.19.3-cp311-cp311-win32.whl", hash = "sha256:64220c429e42a7150f4bfd280f6f4bb2850f95956bde93c6fda1b70507af6ef3"}, + {file = "pyrsistent-0.19.3-cp311-cp311-win_amd64.whl", hash = "sha256:016ad1afadf318eb7911baa24b049909f7f3bb2c5b1ed7b6a8f21db21ea3faa8"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4db1bd596fefd66b296a3d5d943c94f4fac5bcd13e99bffe2ba6a759d959a28"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aeda827381f5e5d65cced3024126529ddc4289d944f75e090572c77ceb19adbf"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:42ac0b2f44607eb92ae88609eda931a4f0dfa03038c44c772e07f43e738bcac9"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-win32.whl", hash = "sha256:e8f2b814a3dc6225964fa03d8582c6e0b6650d68a232df41e3cc1b66a5d2f8d1"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-win_amd64.whl", hash = "sha256:c9bb60a40a0ab9aba40a59f68214eed5a29c6274c83b2cc206a359c4a89fa41b"}, + {file = "pyrsistent-0.19.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a2471f3f8693101975b1ff85ffd19bb7ca7dd7c38f8a81701f67d6b4f97b87d8"}, + {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc5d149f31706762c1f8bda2e8c4f8fead6e80312e3692619a75301d3dbb819a"}, + {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3311cb4237a341aa52ab8448c27e3a9931e2ee09561ad150ba94e4cfd3fc888c"}, + {file = "pyrsistent-0.19.3-cp38-cp38-win32.whl", hash = "sha256:f0e7c4b2f77593871e918be000b96c8107da48444d57005b6a6bc61fb4331b2c"}, + {file = "pyrsistent-0.19.3-cp38-cp38-win_amd64.whl", hash = "sha256:c147257a92374fde8498491f53ffa8f4822cd70c0d85037e09028e478cababb7"}, + {file = "pyrsistent-0.19.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b735e538f74ec31378f5a1e3886a26d2ca6351106b4dfde376a26fc32a044edc"}, + {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99abb85579e2165bd8522f0c0138864da97847875ecbd45f3e7e2af569bfc6f2"}, + {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a8cb235fa6d3fd7aae6a4f1429bbb1fec1577d978098da1252f0489937786f3"}, + {file = "pyrsistent-0.19.3-cp39-cp39-win32.whl", hash = "sha256:c74bed51f9b41c48366a286395c67f4e894374306b197e62810e0fdaf2364da2"}, + {file = "pyrsistent-0.19.3-cp39-cp39-win_amd64.whl", hash = "sha256:878433581fc23e906d947a6814336eee031a00e6defba224234169ae3d3d6a98"}, + {file = "pyrsistent-0.19.3-py3-none-any.whl", hash = "sha256:ccf0d6bd208f8111179f0c26fdf84ed7c3891982f2edaeae7422575f47e66b64"}, + {file = "pyrsistent-0.19.3.tar.gz", hash = "sha256:1a2994773706bbb4995c31a97bc94f1418314923bd1048c6d964837040376440"}, +] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-json-logger" +version = "2.0.7" +description = "A python library adding a json log formatter" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "python-json-logger-2.0.7.tar.gz", hash = "sha256:23e7ec02d34237c5aa1e29a070193a4ea87583bb4e7f8fd06d3de8264c4b2e1c"}, + {file = "python_json_logger-2.0.7-py3-none-any.whl", hash = "sha256:f380b826a991ebbe3de4d897aeec42760035ac760345e57b812938dc8b35e2bd"}, +] + +[[package]] +name = "python-lsp-jsonrpc" +version = "1.0.0" +description = "JSON RPC 2.0 server library" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "python-lsp-jsonrpc-1.0.0.tar.gz", hash = "sha256:7bec170733db628d3506ea3a5288ff76aa33c70215ed223abdb0d95e957660bd"}, + {file = "python_lsp_jsonrpc-1.0.0-py3-none-any.whl", hash = "sha256:079b143be64b0a378bdb21dff5e28a8c1393fe7e8a654ef068322d754e545fc7"}, +] + +[package.dependencies] +ujson = ">=3.0.0" + +[package.extras] +test = ["coverage", "pycodestyle", "pyflakes", "pylint", "pytest", "pytest-cov"] + +[[package]] +name = "python-lsp-server" +version = "1.7.1" +description = "Python Language Server for the Language Server Protocol" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "python-lsp-server-1.7.1.tar.gz", hash = "sha256:67473bb301f35434b5fa8b21fc5ed5fac27dc8a8446ccec8bae456af52a0aef6"}, + {file = "python_lsp_server-1.7.1-py3-none-any.whl", hash = "sha256:8f8b382868b161199aa385659b28427890be628d86f54810463a4d0ee0d6d091"}, +] + +[package.dependencies] +autopep8 = {version = ">=1.6.0,<1.7.0", optional = true, markers = "extra == \"all\""} +docstring-to-markdown = "*" +flake8 = {version = ">=5.0.0,<7", optional = true, markers = "extra == \"all\""} +jedi = ">=0.17.2,<0.19.0" +mccabe = {version = ">=0.7.0,<0.8.0", optional = true, markers = "extra == \"all\""} +pluggy = ">=1.0.0" +pycodestyle = {version = ">=2.9.0,<2.11.0", optional = true, markers = "extra == \"all\""} +pydocstyle = {version = ">=6.2.0,<6.3.0", optional = true, markers = "extra == \"all\""} +pyflakes = {version = ">=2.5.0,<3.1.0", optional = true, markers = "extra == \"all\""} +pylint = {version = ">=2.5.0,<3", optional = true, markers = "extra == \"all\""} +python-lsp-jsonrpc = ">=1.0.0" +rope = {version = ">1.2.0", optional = true, markers = "extra == \"all\""} +setuptools = ">=39.0.0" +ujson = ">=3.0.0" +whatthepatch = {version = ">=1.0.2,<2.0.0", optional = true, markers = "extra == \"all\""} +yapf = {version = "*", optional = true, markers = "extra == \"all\""} + +[package.extras] +all = ["autopep8 (>=1.6.0,<1.7.0)", "flake8 (>=5.0.0,<7)", "mccabe (>=0.7.0,<0.8.0)", "pycodestyle (>=2.9.0,<2.11.0)", "pydocstyle (>=6.2.0,<6.3.0)", "pyflakes (>=2.5.0,<3.1.0)", "pylint (>=2.5.0,<3)", "rope (>1.2.0)", "whatthepatch (>=1.0.2,<2.0.0)", "yapf"] +autopep8 = ["autopep8 (>=1.6.0,<1.7.0)"] +flake8 = ["flake8 (>=5.0.0,<7)"] +mccabe = ["mccabe (>=0.7.0,<0.8.0)"] +pycodestyle = ["pycodestyle (>=2.9.0,<2.11.0)"] +pydocstyle = ["pydocstyle (>=6.2.0,<6.3.0)"] +pyflakes = ["pyflakes (>=2.5.0,<3.1.0)"] +pylint = ["pylint (>=2.5.0,<3)"] +rope = ["rope (>1.2.0)"] +test = ["coverage", "flaky", "matplotlib", "numpy", "pandas", "pylint (>=2.5.0,<3)", "pyqt5", "pytest", "pytest-cov"] +websockets = ["websockets (>=10.3)"] +yapf = ["whatthepatch (>=1.0.2,<2.0.0)", "yapf"] + +[[package]] +name = "pytoolconfig" +version = "1.2.5" +description = "Python tool configuration" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytoolconfig-1.2.5-py3-none-any.whl", hash = "sha256:239ba9d3e537b91d0243275a497700ea39a5e259ddb80421c366e3b288bf30fe"}, + {file = "pytoolconfig-1.2.5.tar.gz", hash = "sha256:a50f9dfe23b03a9d40414c1fdf902fefbeae12f2ac75a3c8f915944d6ffac279"}, +] + +[package.dependencies] +packaging = ">=22.0" +platformdirs = {version = ">=1.4.4", optional = true, markers = "extra == \"global\""} +tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} + +[package.extras] +doc = ["sphinx (>=4.5.0)", "tabulate (>=0.8.9)"] +gendocs = ["pytoolconfig[doc]", "sphinx (>=4.5.0)", "sphinx-autodoc-typehints (>=1.18.1)", "sphinx-rtd-theme (>=1.0.0)"] +global = ["platformdirs (>=1.4.4)"] +validation = ["pydantic (>=1.7.4)"] + +[[package]] +name = "pytorch-lightning" +version = "1.9.4" +description = "PyTorch Lightning is the lightweight PyTorch wrapper for ML researchers. Scale your models. Write less boilerplate." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytorch-lightning-1.9.4.tar.gz", hash = "sha256:188a7f4468acf23512e7f4903253d86fc7929a49f0c09d699872e364162001e8"}, + {file = "pytorch_lightning-1.9.4-py3-none-any.whl", hash = "sha256:a2d2bd7657716087c294b076fe385ed17879764d6daaad0a541394a8f7164f93"}, +] + +[package.dependencies] +fsspec = {version = ">2021.06.0", extras = ["http"]} +lightning-utilities = ">=0.6.0.post0" +numpy = ">=1.17.2" +packaging = ">=17.1" +PyYAML = ">=5.4" +torch = ">=1.10.0" +torchmetrics = ">=0.7.0" +tqdm = ">=4.57.0" +typing-extensions = ">=4.0.0" + +[package.extras] +all = ["colossalai (>=0.2.0)", "deepspeed (>=0.6.0)", "fairscale (>=0.4.5)", "gym[classic-control] (>=0.17.0)", "hivemind (==1.1.5)", "horovod (>=0.21.2,!=0.24.0)", "hydra-core (>=1.0.5)", "ipython[all] (<8.7.1)", "jsonargparse[signatures] (>=4.18.0)", "matplotlib (>3.1)", "omegaconf (>=2.0.5)", "rich (>=10.14.0,!=10.15.0.a)", "tensorboardX (>=2.2)", "torchvision (>=0.11.1)"] +colossalai = ["colossalai (>=0.2.0)"] +deepspeed = ["deepspeed (>=0.6.0)"] +dev = ["cloudpickle (>=1.3)", "codecov (==2.1.12)", "colossalai (>=0.2.0)", "coverage (==6.5.0)", "deepspeed (>=0.6.0)", "fairscale (>=0.4.5)", "fastapi (<0.87.0)", "gym[classic-control] (>=0.17.0)", "hivemind (==1.1.5)", "horovod (>=0.21.2,!=0.24.0)", "hydra-core (>=1.0.5)", "ipython[all] (<8.7.1)", "jsonargparse[signatures] (>=4.18.0)", "matplotlib (>3.1)", "omegaconf (>=2.0.5)", "onnxruntime (<1.14.0)", "pandas (>1.0)", "pre-commit (==2.20.0)", "protobuf (<=3.20.1)", "psutil (<5.9.5)", "pytest (==7.2.0)", "pytest-cov (==4.0.0)", "pytest-forked (==1.4.0)", "pytest-rerunfailures (==10.3)", "rich (>=10.14.0,!=10.15.0.a)", "scikit-learn (>0.22.1)", "tensorboard (>=2.9.1)", "tensorboardX (>=2.2)", "torchvision (>=0.11.1)", "uvicorn (<0.19.1)"] +examples = ["gym[classic-control] (>=0.17.0)", "ipython[all] (<8.7.1)", "torchvision (>=0.11.1)"] +extra = ["hydra-core (>=1.0.5)", "jsonargparse[signatures] (>=4.18.0)", "matplotlib (>3.1)", "omegaconf (>=2.0.5)", "rich (>=10.14.0,!=10.15.0.a)", "tensorboardX (>=2.2)"] +fairscale = ["fairscale (>=0.4.5)"] +hivemind = ["hivemind (==1.1.5)"] +horovod = ["horovod (>=0.21.2,!=0.24.0)"] +strategies = ["colossalai (>=0.2.0)", "deepspeed (>=0.6.0)", "fairscale (>=0.4.5)", "hivemind (==1.1.5)", "horovod (>=0.21.2,!=0.24.0)"] +test = ["cloudpickle (>=1.3)", "codecov (==2.1.12)", "coverage (==6.5.0)", "fastapi (<0.87.0)", "onnxruntime (<1.14.0)", "pandas (>1.0)", "pre-commit (==2.20.0)", "protobuf (<=3.20.1)", "psutil (<5.9.5)", "pytest (==7.2.0)", "pytest-cov (==4.0.0)", "pytest-forked (==1.4.0)", "pytest-rerunfailures (==10.3)", "scikit-learn (>0.22.1)", "tensorboard (>=2.9.1)", "uvicorn (<0.19.1)"] + +[[package]] +name = "pytorch3d" +version = "0.7.2" +description = "PyTorch3D is FAIR's library of reusable components for deep Learning with 3D data." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "pytorch3d-0.7.2-cp310-cp310-linux_x86_64.whl", hash = "sha256:52f9af847687efa608825452d6c54d398af56bccf72cfcb0a44bd06a67b8ee70"}, +] + +[package.dependencies] +fvcore = "*" +iopath = "*" + +[package.extras] +all = ["imageio", "ipywidgets", "matplotlib", "tqdm (>4.29.0)"] +dev = ["flake8", "usort"] +implicitron = ["accelerate", "hydra-core (>=1.1)", "lpips", "matplotlib", "tqdm (>4.29.0)", "visdom"] + +[package.source] +type = "url" +url = "https://dl.fbaipublicfiles.com/pytorch3d/packaging/wheels/py310_cu116_pyt1130/pytorch3d-0.7.2-cp310-cp310-linux_x86_64.whl" + +[[package]] +name = "pytz" +version = "2022.7.1" +description = "World timezone definitions, modern and historical" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "pytz-2022.7.1-py2.py3-none-any.whl", hash = "sha256:78f4f37d8198e0627c5f1143240bb0206b8691d8d7ac6d78fee88b78733f8c4a"}, + {file = "pytz-2022.7.1.tar.gz", hash = "sha256:01a0681c4b9684a28304615eba55d1ab31ae00bf68ec157ec3708a8182dbbcd0"}, +] + +[[package]] +name = "pywavelets" +version = "1.4.1" +description = "PyWavelets, wavelet transform module" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "PyWavelets-1.4.1-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:d854411eb5ee9cb4bc5d0e66e3634aeb8f594210f6a1bed96dbed57ec70f181c"}, + {file = "PyWavelets-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:231b0e0b1cdc1112f4af3c24eea7bf181c418d37922a67670e9bf6cfa2d544d4"}, + {file = "PyWavelets-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:754fa5085768227c4f4a26c1e0c78bc509a266d9ebd0eb69a278be7e3ece943c"}, + {file = "PyWavelets-1.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da7b9c006171be1f9ddb12cc6e0d3d703b95f7f43cb5e2c6f5f15d3233fcf202"}, + {file = "PyWavelets-1.4.1-cp310-cp310-win32.whl", hash = "sha256:67a0d28a08909f21400cb09ff62ba94c064882ffd9e3a6b27880a111211d59bd"}, + {file = "PyWavelets-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:91d3d393cffa634f0e550d88c0e3f217c96cfb9e32781f2960876f1808d9b45b"}, + {file = "PyWavelets-1.4.1-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:64c6bac6204327321db30b775060fbe8e8642316e6bff17f06b9f34936f88875"}, + {file = "PyWavelets-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3f19327f2129fb7977bc59b966b4974dfd72879c093e44a7287500a7032695de"}, + {file = "PyWavelets-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad987748f60418d5f4138db89d82ba0cb49b086e0cbb8fd5c3ed4a814cfb705e"}, + {file = "PyWavelets-1.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:875d4d620eee655346e3589a16a73790cf9f8917abba062234439b594e706784"}, + {file = "PyWavelets-1.4.1-cp311-cp311-win32.whl", hash = "sha256:7231461d7a8eb3bdc7aa2d97d9f67ea5a9f8902522818e7e2ead9c2b3408eeb1"}, + {file = "PyWavelets-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:daf0aa79842b571308d7c31a9c43bc99a30b6328e6aea3f50388cd8f69ba7dbc"}, + {file = "PyWavelets-1.4.1-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:ab7da0a17822cd2f6545626946d3b82d1a8e106afc4b50e3387719ba01c7b966"}, + {file = "PyWavelets-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:578af438a02a86b70f1975b546f68aaaf38f28fb082a61ceb799816049ed18aa"}, + {file = "PyWavelets-1.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb5ca8d11d3f98e89e65796a2125be98424d22e5ada360a0dbabff659fca0fc"}, + {file = "PyWavelets-1.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:058b46434eac4c04dd89aeef6fa39e4b6496a951d78c500b6641fd5b2cc2f9f4"}, + {file = "PyWavelets-1.4.1-cp38-cp38-win32.whl", hash = "sha256:de7cd61a88a982edfec01ea755b0740e94766e00a1ceceeafef3ed4c85c605cd"}, + {file = "PyWavelets-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:7ab8d9db0fe549ab2ee0bea61f614e658dd2df419d5b75fba47baa761e95f8f2"}, + {file = "PyWavelets-1.4.1-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:23bafd60350b2b868076d976bdd92f950b3944f119b4754b1d7ff22b7acbf6c6"}, + {file = "PyWavelets-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d0e56cd7a53aed3cceca91a04d62feb3a0aca6725b1912d29546c26f6ea90426"}, + {file = "PyWavelets-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:030670a213ee8fefa56f6387b0c8e7d970c7f7ad6850dc048bd7c89364771b9b"}, + {file = "PyWavelets-1.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71ab30f51ee4470741bb55fc6b197b4a2b612232e30f6ac069106f0156342356"}, + {file = "PyWavelets-1.4.1-cp39-cp39-win32.whl", hash = "sha256:47cac4fa25bed76a45bc781a293c26ac63e8eaae9eb8f9be961758d22b58649c"}, + {file = "PyWavelets-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:88aa5449e109d8f5e7f0adef85f7f73b1ab086102865be64421a3a3d02d277f4"}, + {file = "PyWavelets-1.4.1.tar.gz", hash = "sha256:6437af3ddf083118c26d8f97ab43b0724b956c9f958e9ea788659f6a2834ba93"}, +] + +[package.dependencies] +numpy = ">=1.17.3" + +[[package]] +name = "pywin32" +version = "305" +description = "Python for Window Extensions" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "pywin32-305-cp310-cp310-win32.whl", hash = "sha256:421f6cd86e84bbb696d54563c48014b12a23ef95a14e0bdba526be756d89f116"}, + {file = "pywin32-305-cp310-cp310-win_amd64.whl", hash = "sha256:73e819c6bed89f44ff1d690498c0a811948f73777e5f97c494c152b850fad478"}, + {file = "pywin32-305-cp310-cp310-win_arm64.whl", hash = "sha256:742eb905ce2187133a29365b428e6c3b9001d79accdc30aa8969afba1d8470f4"}, + {file = "pywin32-305-cp311-cp311-win32.whl", hash = "sha256:19ca459cd2e66c0e2cc9a09d589f71d827f26d47fe4a9d09175f6aa0256b51c2"}, + {file = "pywin32-305-cp311-cp311-win_amd64.whl", hash = "sha256:326f42ab4cfff56e77e3e595aeaf6c216712bbdd91e464d167c6434b28d65990"}, + {file = "pywin32-305-cp311-cp311-win_arm64.whl", hash = "sha256:4ecd404b2c6eceaca52f8b2e3e91b2187850a1ad3f8b746d0796a98b4cea04db"}, + {file = "pywin32-305-cp36-cp36m-win32.whl", hash = "sha256:48d8b1659284f3c17b68587af047d110d8c44837736b8932c034091683e05863"}, + {file = "pywin32-305-cp36-cp36m-win_amd64.whl", hash = "sha256:13362cc5aa93c2beaf489c9c9017c793722aeb56d3e5166dadd5ef82da021fe1"}, + {file = "pywin32-305-cp37-cp37m-win32.whl", hash = "sha256:a55db448124d1c1484df22fa8bbcbc45c64da5e6eae74ab095b9ea62e6d00496"}, + {file = "pywin32-305-cp37-cp37m-win_amd64.whl", hash = "sha256:109f98980bfb27e78f4df8a51a8198e10b0f347257d1e265bb1a32993d0c973d"}, + {file = "pywin32-305-cp38-cp38-win32.whl", hash = "sha256:9dd98384da775afa009bc04863426cb30596fd78c6f8e4e2e5bbf4edf8029504"}, + {file = "pywin32-305-cp38-cp38-win_amd64.whl", hash = "sha256:56d7a9c6e1a6835f521788f53b5af7912090674bb84ef5611663ee1595860fc7"}, + {file = "pywin32-305-cp39-cp39-win32.whl", hash = "sha256:9d968c677ac4d5cbdaa62fd3014ab241718e619d8e36ef8e11fb930515a1e918"}, + {file = "pywin32-305-cp39-cp39-win_amd64.whl", hash = "sha256:50768c6b7c3f0b38b7fb14dd4104da93ebced5f1a50dc0e834594bff6fbe1271"}, +] + +[[package]] +name = "pywinpty" +version = "2.0.10" +description = "Pseudo terminal support for Windows from Python." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pywinpty-2.0.10-cp310-none-win_amd64.whl", hash = "sha256:4c7d06ad10f6e92bc850a467f26d98f4f30e73d2fe5926536308c6ae0566bc16"}, + {file = "pywinpty-2.0.10-cp311-none-win_amd64.whl", hash = "sha256:7ffbd66310b83e42028fc9df7746118978d94fba8c1ebf15a7c1275fdd80b28a"}, + {file = "pywinpty-2.0.10-cp37-none-win_amd64.whl", hash = "sha256:38cb924f2778b5751ef91a75febd114776b3af0ae411bc667be45dd84fc881d3"}, + {file = "pywinpty-2.0.10-cp38-none-win_amd64.whl", hash = "sha256:902d79444b29ad1833b8d5c3c9aabdfd428f4f068504430df18074007c8c0de8"}, + {file = "pywinpty-2.0.10-cp39-none-win_amd64.whl", hash = "sha256:3c46aef80dd50979aff93de199e4a00a8ee033ba7a03cadf0a91fed45f0c39d7"}, + {file = "pywinpty-2.0.10.tar.gz", hash = "sha256:cdbb5694cf8c7242c2ecfaca35c545d31fa5d5814c3d67a4e628f803f680ebea"}, +] + +[[package]] +name = "pyyaml" +version = "6.0" +description = "YAML parser and emitter for Python" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, + {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, + {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, + {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, + {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, + {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, + {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, + {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, + {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, + {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, + {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, + {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, + {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, + {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, + {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, + {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, + {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, + {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, +] + +[[package]] +name = "pyzmq" +version = "25.0.2" +description = "Python bindings for 0MQ" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pyzmq-25.0.2-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:ac178e666c097c8d3deb5097b58cd1316092fc43e8ef5b5fdb259b51da7e7315"}, + {file = "pyzmq-25.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:659e62e1cbb063151c52f5b01a38e1df6b54feccfa3e2509d44c35ca6d7962ee"}, + {file = "pyzmq-25.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8280ada89010735a12b968ec3ea9a468ac2e04fddcc1cede59cb7f5178783b9c"}, + {file = "pyzmq-25.0.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9b5eeb5278a8a636bb0abdd9ff5076bcbb836cd2302565df53ff1fa7d106d54"}, + {file = "pyzmq-25.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a2e5fe42dfe6b73ca120b97ac9f34bfa8414feb15e00e37415dbd51cf227ef6"}, + {file = "pyzmq-25.0.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:827bf60e749e78acb408a6c5af6688efbc9993e44ecc792b036ec2f4b4acf485"}, + {file = "pyzmq-25.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7b504ae43d37e282301da586529e2ded8b36d4ee2cd5e6db4386724ddeaa6bbc"}, + {file = "pyzmq-25.0.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cb1f69a0a2a2b1aae8412979dd6293cc6bcddd4439bf07e4758d864ddb112354"}, + {file = "pyzmq-25.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2b9c9cc965cdf28381e36da525dcb89fc1571d9c54800fdcd73e3f73a2fc29bd"}, + {file = "pyzmq-25.0.2-cp310-cp310-win32.whl", hash = "sha256:24abbfdbb75ac5039205e72d6c75f10fc39d925f2df8ff21ebc74179488ebfca"}, + {file = "pyzmq-25.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6a821a506822fac55d2df2085a52530f68ab15ceed12d63539adc32bd4410f6e"}, + {file = "pyzmq-25.0.2-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:9af0bb0277e92f41af35e991c242c9c71920169d6aa53ade7e444f338f4c8128"}, + {file = "pyzmq-25.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:54a96cf77684a3a537b76acfa7237b1e79a8f8d14e7f00e0171a94b346c5293e"}, + {file = "pyzmq-25.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88649b19ede1cab03b96b66c364cbbf17c953615cdbc844f7f6e5f14c5e5261c"}, + {file = "pyzmq-25.0.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:715cff7644a80a7795953c11b067a75f16eb9fc695a5a53316891ebee7f3c9d5"}, + {file = "pyzmq-25.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:312b3f0f066b4f1d17383aae509bacf833ccaf591184a1f3c7a1661c085063ae"}, + {file = "pyzmq-25.0.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d488c5c8630f7e782e800869f82744c3aca4aca62c63232e5d8c490d3d66956a"}, + {file = "pyzmq-25.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:38d9f78d69bcdeec0c11e0feb3bc70f36f9b8c44fc06e5d06d91dc0a21b453c7"}, + {file = "pyzmq-25.0.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3059a6a534c910e1d5d068df42f60d434f79e6cc6285aa469b384fa921f78cf8"}, + {file = "pyzmq-25.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6526d097b75192f228c09d48420854d53dfbc7abbb41b0e26f363ccb26fbc177"}, + {file = "pyzmq-25.0.2-cp311-cp311-win32.whl", hash = "sha256:5c5fbb229e40a89a2fe73d0c1181916f31e30f253cb2d6d91bea7927c2e18413"}, + {file = "pyzmq-25.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:ed15e3a2c3c2398e6ae5ce86d6a31b452dfd6ad4cd5d312596b30929c4b6e182"}, + {file = "pyzmq-25.0.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:032f5c8483c85bf9c9ca0593a11c7c749d734ce68d435e38c3f72e759b98b3c9"}, + {file = "pyzmq-25.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:374b55516393bfd4d7a7daa6c3b36d6dd6a31ff9d2adad0838cd6a203125e714"}, + {file = "pyzmq-25.0.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:08bfcc21b5997a9be4fefa405341320d8e7f19b4d684fb9c0580255c5bd6d695"}, + {file = "pyzmq-25.0.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1a843d26a8da1b752c74bc019c7b20e6791ee813cd6877449e6a1415589d22ff"}, + {file = "pyzmq-25.0.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:b48616a09d7df9dbae2f45a0256eee7b794b903ddc6d8657a9948669b345f220"}, + {file = "pyzmq-25.0.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:d4427b4a136e3b7f85516c76dd2e0756c22eec4026afb76ca1397152b0ca8145"}, + {file = "pyzmq-25.0.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:26b0358e8933990502f4513c991c9935b6c06af01787a36d133b7c39b1df37fa"}, + {file = "pyzmq-25.0.2-cp36-cp36m-win32.whl", hash = "sha256:c8fedc3ccd62c6b77dfe6f43802057a803a411ee96f14e946f4a76ec4ed0e117"}, + {file = "pyzmq-25.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:2da6813b7995b6b1d1307329c73d3e3be2fd2d78e19acfc4eff2e27262732388"}, + {file = "pyzmq-25.0.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a35960c8b2f63e4ef67fd6731851030df68e4b617a6715dd11b4b10312d19fef"}, + {file = "pyzmq-25.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eef2a0b880ab40aca5a878933376cb6c1ec483fba72f7f34e015c0f675c90b20"}, + {file = "pyzmq-25.0.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:85762712b74c7bd18e340c3639d1bf2f23735a998d63f46bb6584d904b5e401d"}, + {file = "pyzmq-25.0.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:64812f29d6eee565e129ca14b0c785744bfff679a4727137484101b34602d1a7"}, + {file = "pyzmq-25.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:510d8e55b3a7cd13f8d3e9121edf0a8730b87d925d25298bace29a7e7bc82810"}, + {file = "pyzmq-25.0.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b164cc3c8acb3d102e311f2eb6f3c305865ecb377e56adc015cb51f721f1dda6"}, + {file = "pyzmq-25.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:28fdb9224a258134784a9cf009b59265a9dde79582fb750d4e88a6bcbc6fa3dc"}, + {file = "pyzmq-25.0.2-cp37-cp37m-win32.whl", hash = "sha256:dd771a440effa1c36d3523bc6ba4e54ff5d2e54b4adcc1e060d8f3ca3721d228"}, + {file = "pyzmq-25.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:9bdc40efb679b9dcc39c06d25629e55581e4c4f7870a5e88db4f1c51ce25e20d"}, + {file = "pyzmq-25.0.2-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:1f82906a2d8e4ee310f30487b165e7cc8ed09c009e4502da67178b03083c4ce0"}, + {file = "pyzmq-25.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:21ec0bf4831988af43c8d66ba3ccd81af2c5e793e1bf6790eb2d50e27b3c570a"}, + {file = "pyzmq-25.0.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:abbce982a17c88d2312ec2cf7673985d444f1beaac6e8189424e0a0e0448dbb3"}, + {file = "pyzmq-25.0.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9e1d2f2d86fc75ed7f8845a992c5f6f1ab5db99747fb0d78b5e4046d041164d2"}, + {file = "pyzmq-25.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2e92ff20ad5d13266bc999a29ed29a3b5b101c21fdf4b2cf420c09db9fb690e"}, + {file = "pyzmq-25.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:edbbf06cc2719889470a8d2bf5072bb00f423e12de0eb9ffec946c2c9748e149"}, + {file = "pyzmq-25.0.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:77942243ff4d14d90c11b2afd8ee6c039b45a0be4e53fb6fa7f5e4fd0b59da39"}, + {file = "pyzmq-25.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ab046e9cb902d1f62c9cc0eca055b1d11108bdc271caf7c2171487298f229b56"}, + {file = "pyzmq-25.0.2-cp38-cp38-win32.whl", hash = "sha256:ad761cfbe477236802a7ab2c080d268c95e784fe30cafa7e055aacd1ca877eb0"}, + {file = "pyzmq-25.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:8560756318ec7c4c49d2c341012167e704b5a46d9034905853c3d1ade4f55bee"}, + {file = "pyzmq-25.0.2-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:ab2c056ac503f25a63f6c8c6771373e2a711b98b304614151dfb552d3d6c81f6"}, + {file = "pyzmq-25.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cca8524b61c0eaaa3505382dc9b9a3bc8165f1d6c010fdd1452c224225a26689"}, + {file = "pyzmq-25.0.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cfb9f7eae02d3ac42fbedad30006b7407c984a0eb4189a1322241a20944d61e5"}, + {file = "pyzmq-25.0.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5eaeae038c68748082137d6896d5c4db7927e9349237ded08ee1bbd94f7361c9"}, + {file = "pyzmq-25.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a31992a8f8d51663ebf79df0df6a04ffb905063083d682d4380ab8d2c67257c"}, + {file = "pyzmq-25.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6a979e59d2184a0c8f2ede4b0810cbdd86b64d99d9cc8a023929e40dce7c86cc"}, + {file = "pyzmq-25.0.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1f124cb73f1aa6654d31b183810febc8505fd0c597afa127c4f40076be4574e0"}, + {file = "pyzmq-25.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:65c19a63b4a83ae45d62178b70223adeee5f12f3032726b897431b6553aa25af"}, + {file = "pyzmq-25.0.2-cp39-cp39-win32.whl", hash = "sha256:83d822e8687621bed87404afc1c03d83fa2ce39733d54c2fd52d8829edb8a7ff"}, + {file = "pyzmq-25.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:24683285cc6b7bf18ad37d75b9db0e0fefe58404e7001f1d82bf9e721806daa7"}, + {file = "pyzmq-25.0.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4a4b4261eb8f9ed71f63b9eb0198dd7c934aa3b3972dac586d0ef502ba9ab08b"}, + {file = "pyzmq-25.0.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:62ec8d979f56c0053a92b2b6a10ff54b9ec8a4f187db2b6ec31ee3dd6d3ca6e2"}, + {file = "pyzmq-25.0.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:affec1470351178e892121b3414c8ef7803269f207bf9bef85f9a6dd11cde264"}, + {file = "pyzmq-25.0.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffc71111433bd6ec8607a37b9211f4ef42e3d3b271c6d76c813669834764b248"}, + {file = "pyzmq-25.0.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:6fadc60970714d86eff27821f8fb01f8328dd36bebd496b0564a500fe4a9e354"}, + {file = "pyzmq-25.0.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:269968f2a76c0513490aeb3ba0dc3c77b7c7a11daa894f9d1da88d4a0db09835"}, + {file = "pyzmq-25.0.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f7c8b8368e84381ae7c57f1f5283b029c888504aaf4949c32e6e6fb256ec9bf0"}, + {file = "pyzmq-25.0.2-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:25e6873a70ad5aa31e4a7c41e5e8c709296edef4a92313e1cd5fc87bbd1874e2"}, + {file = "pyzmq-25.0.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b733076ff46e7db5504c5e7284f04a9852c63214c74688bdb6135808531755a3"}, + {file = "pyzmq-25.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:a6f6ae12478fdc26a6d5fdb21f806b08fa5403cd02fd312e4cb5f72df078f96f"}, + {file = "pyzmq-25.0.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:67da1c213fbd208906ab3470cfff1ee0048838365135a9bddc7b40b11e6d6c89"}, + {file = "pyzmq-25.0.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:531e36d9fcd66f18de27434a25b51d137eb546931033f392e85674c7a7cea853"}, + {file = "pyzmq-25.0.2-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34a6fddd159ff38aa9497b2e342a559f142ab365576284bc8f77cb3ead1f79c5"}, + {file = "pyzmq-25.0.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b491998ef886662c1f3d49ea2198055a9a536ddf7430b051b21054f2a5831800"}, + {file = "pyzmq-25.0.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:5d496815074e3e3d183fe2c7fcea2109ad67b74084c254481f87b64e04e9a471"}, + {file = "pyzmq-25.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:56a94ab1d12af982b55ca96c6853db6ac85505e820d9458ac76364c1998972f4"}, + {file = "pyzmq-25.0.2.tar.gz", hash = "sha256:6b8c1bbb70e868dc88801aa532cae6bd4e3b5233784692b786f17ad2962e5149"}, +] + +[package.dependencies] +cffi = {version = "*", markers = "implementation_name == \"pypy\""} + +[[package]] +name = "qtconsole" +version = "5.4.1" +description = "Jupyter Qt console" +category = "dev" +optional = false +python-versions = ">= 3.7" +files = [ + {file = "qtconsole-5.4.1-py3-none-any.whl", hash = "sha256:bae8c7e10170cdcdcaf7e6d53ad7d6a7412249b9b8310a0eaa6b6f3b260f32db"}, + {file = "qtconsole-5.4.1.tar.gz", hash = "sha256:f67a03f40f722e13261791280f73068dbaf9dafcc335cbba644ccc8f892640e5"}, +] + +[package.dependencies] +ipykernel = ">=4.1" +ipython-genutils = "*" +jupyter-client = ">=4.1" +jupyter-core = "*" +packaging = "*" +pygments = "*" +pyzmq = ">=17.1" +qtpy = ">=2.0.1" +traitlets = "<5.2.1 || >5.2.1,<5.2.2 || >5.2.2" + +[package.extras] +doc = ["Sphinx (>=1.3)"] +test = ["flaky", "pytest", "pytest-qt"] + +[[package]] +name = "qtpy" +version = "2.3.0" +description = "Provides an abstraction layer on top of the various Qt bindings (PyQt5/6 and PySide2/6)." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "QtPy-2.3.0-py3-none-any.whl", hash = "sha256:8d6d544fc20facd27360ea189592e6135c614785f0dec0b4f083289de6beb408"}, + {file = "QtPy-2.3.0.tar.gz", hash = "sha256:0603c9c83ccc035a4717a12908bf6bc6cb22509827ea2ec0e94c2da7c9ed57c5"}, +] + +[package.dependencies] +packaging = "*" + +[package.extras] +test = ["pytest (>=6,!=7.0.0,!=7.0.1)", "pytest-cov (>=3.0.0)", "pytest-qt"] + +[[package]] +name = "redbaron" +version = "0.9.2" +description = "Abstraction on top of baron, a FST for python to make writing refactoring code a realistic task" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "redbaron-0.9.2-py2.py3-none-any.whl", hash = "sha256:d01032b6a848b5521a8d6ef72486315c2880f420956870cdd742e2b5a09b9bab"}, + {file = "redbaron-0.9.2.tar.gz", hash = "sha256:472d0739ca6b2240bb2278ae428604a75472c9c12e86c6321e8c016139c0132f"}, +] + +[package.dependencies] +baron = ">=0.7" + +[package.extras] +notebook = ["pygments"] + +[[package]] +name = "remote-exec" +version = "1.11.0" +description = "A CLI to sync codebases and execute commands remotely" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [] +develop = false + +[package.dependencies] +click = ">=7.1.1" +pydantic = ">=1.5.1" +toml = ">=0.10.0" +watchdog = ">=0.10.3" + +[package.source] +type = "git" +url = "https://github.com/pbsds/remote" +reference = "whitespace-push" +resolved_reference = "84c9d9917f233e2acbded75692b7f7a235a169aa" + +[[package]] +name = "requests" +version = "2.28.2" +description = "Python HTTP for Humans." +category = "main" +optional = false +python-versions = ">=3.7, <4" +files = [ + {file = "requests-2.28.2-py3-none-any.whl", hash = "sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa"}, + {file = "requests-2.28.2.tar.gz", hash = "sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<1.27" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "requests-oauthlib" +version = "1.3.1" +description = "OAuthlib authentication support for Requests." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "requests-oauthlib-1.3.1.tar.gz", hash = "sha256:75beac4a47881eeb94d5ea5d6ad31ef88856affe2332b9aafb52c6452ccf0d7a"}, + {file = "requests_oauthlib-1.3.1-py2.py3-none-any.whl", hash = "sha256:2577c501a2fb8d05a304c09d090d6e47c306fef15809d102b327cf8364bddab5"}, +] + +[package.dependencies] +oauthlib = ">=3.0.0" +requests = ">=2.0.0" + +[package.extras] +rsa = ["oauthlib[signedtoken] (>=3.0.0)"] + +[[package]] +name = "rfc3339-validator" +version = "0.1.4" +description = "A pure python RFC3339 validator" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa"}, + {file = "rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b"}, +] + +[package.dependencies] +six = "*" + +[[package]] +name = "rfc3986-validator" +version = "0.1.1" +description = "Pure python rfc3986 validator" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9"}, + {file = "rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055"}, +] + +[[package]] +name = "rich" +version = "13.3.2" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +category = "main" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "rich-13.3.2-py3-none-any.whl", hash = "sha256:a104f37270bf677148d8acb07d33be1569eeee87e2d1beb286a4e9113caf6f2f"}, + {file = "rich-13.3.2.tar.gz", hash = "sha256:91954fe80cfb7985727a467ca98a7618e5dd15178cc2da10f553b36a93859001"}, +] + +[package.dependencies] +markdown-it-py = ">=2.2.0,<3.0.0" +pygments = ">=2.13.0,<3.0.0" + +[package.extras] +jupyter = ["ipywidgets (>=7.5.1,<9)"] + +[[package]] +name = "rope" +version = "1.7.0" +description = "a python refactoring library..." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "rope-1.7.0-py3-none-any.whl", hash = "sha256:893dd80ba7077fc9f6f42b0a849372076b70f1d6e405b9f0cc52781ffa0e6890"}, + {file = "rope-1.7.0.tar.gz", hash = "sha256:ba39581d0f8dee4ae8b5b5e82e35d03cebad965ccb127b7eaab9755cdc85e85a"}, +] + +[package.dependencies] +pytoolconfig = {version = ">=1.2.2", extras = ["global"]} + +[package.extras] +dev = ["build (>=0.7.0)", "pre-commit (>=2.20.0)", "pytest (>=7.0.1)", "pytest-timeout (>=2.1.0)"] +doc = ["pytoolconfig[doc]", "sphinx (>=4.5.0)", "sphinx-autodoc-typehints (>=1.18.1)", "sphinx-rtd-theme (>=1.0.0)"] + +[[package]] +name = "rply" +version = "0.7.8" +description = "A pure Python Lex/Yacc that works with RPython" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "rply-0.7.8-py2.py3-none-any.whl", hash = "sha256:28ffd11d656c48aeb8c508eb382acd6a0bd906662624b34388751732a27807e7"}, + {file = "rply-0.7.8.tar.gz", hash = "sha256:2a808ac25a4580a9991fc304d64434e299a8fc75760574492f242cbb5bb301c9"}, +] + +[package.dependencies] +appdirs = "*" + +[[package]] +name = "rsa" +version = "4.9" +description = "Pure-Python RSA implementation" +category = "dev" +optional = false +python-versions = ">=3.6,<4" +files = [ + {file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"}, + {file = "rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"}, +] + +[package.dependencies] +pyasn1 = ">=0.1.3" + +[[package]] +name = "rtree" +version = "1.0.1" +description = "R-Tree spatial index for Python GIS" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Rtree-1.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9855b8f11cdad99c56eb361b7b632a4fbd3d8cbe3f2081426b445f0cfb7fdca9"}, + {file = "Rtree-1.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:18ce7e4d04b85c48f2d364835620b3b20e38e199639746e7b12f07a2303e18ff"}, + {file = "Rtree-1.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:784efa6b7be9e99b33613ae8495931032689441eabb6120c9b3eb91188c33794"}, + {file = "Rtree-1.0.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:157207191aebdacbbdbb369e698cfbfebce53bc97114e96c8af5bed3126475f1"}, + {file = "Rtree-1.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5fb3671a8d440c24b1dd29ec621d4345ced7185e26f02abe98e85a6629fcb50"}, + {file = "Rtree-1.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:11d16f51cf9205cd6995af36e24efe8f184270f667fb49bb69b09fc46b97e7d4"}, + {file = "Rtree-1.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6db6a0a93e41594ffc14b053f386dd414ab5a82535bbd9aedafa6ac8dc0650d8"}, + {file = "Rtree-1.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c6e29e5eb3083ad12ac5c1ce6e37465ea3428d894d3466cc9c9e2ee4bf768e53"}, + {file = "Rtree-1.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:656b148589c0b5bab4a7db4d033634329f42a5feaac10ca40aceeca109d83c1f"}, + {file = "Rtree-1.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7b2c15f9373ba314c83a8df5cb6d99b4e3af23c376c6b1317add995432dd0970"}, + {file = "Rtree-1.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93c5e0bf31e76b4f92a6eec3d2891e938408774c75a8ed6ac3d2c8db04a2be33"}, + {file = "Rtree-1.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6792de0e3c2fd3ad7e069445027603bec7a47000432f49c80246886311f4f152"}, + {file = "Rtree-1.0.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:004e131b570dc360a49e7f3b60e7bc6517943a54df056587964d1cb903889e7e"}, + {file = "Rtree-1.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:becd711fe97c2e09b1b7969e83080a3c8012bce2d30f6db879aade255fcba5c1"}, + {file = "Rtree-1.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:015df09e1bc55ddf7c88799bf1515d058cd0ee78eacf4cd443a32876d3b3a863"}, + {file = "Rtree-1.0.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c2973b76f61669a85e160b4ad09879c4089fc0e3f20fd99adf161ca298fe8374"}, + {file = "Rtree-1.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e4335e131a58952635560a003458011d97f9ea6f3c010dc24906050b42ee2c03"}, + {file = "Rtree-1.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:e7ca5d743f6a1dc62653dfac8ee7ce2e1ba91be7cf97916a7f60b7cbe48fb48d"}, + {file = "Rtree-1.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2ee7165e9872a026ccb868c021711eba39cedf7d1820763c9de52d5324691a92"}, + {file = "Rtree-1.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8de99f28af0f1783eefb80918959903b4b18112f6a12b48f296ecb162804e69d"}, + {file = "Rtree-1.0.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a94e2f4bf74bd202ea8b67ea3d7c71e763ad41f79be1d6b72aa2c8d5a8e92c4"}, + {file = "Rtree-1.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5120da3a1b96f3a7a17dd6af0afdd4e6f3cc9baa87e9ee0a272882f01f980bb"}, + {file = "Rtree-1.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7e3d5f0e7b28250afbb290ab88b49aa0f121c9714d0da2080581783690347507"}, + {file = "Rtree-1.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:296203e933b6ec0dd07f6a7456c4f1492def95b6993f20cc61c92b0fee0aecc5"}, + {file = "Rtree-1.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:77908cd7acdd519a731979ebf5baff8afd102109c2f52864c1e6ee75d3ea2d87"}, + {file = "Rtree-1.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:1a213e5d385278ca7668bc5b27083f8d6e39996a9bd59b6528f3a30009dae4ed"}, + {file = "Rtree-1.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cfa8cffec5cb9fed494c4bb335ebdb69b3c26178b0b685f67f79296c6b3d800c"}, + {file = "Rtree-1.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b31fd22d214160859d038da7cb2aaa27acb71efc24a7bcc75c84b5e502721549"}, + {file = "Rtree-1.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d68a81ad419d5c2ea5fecc677e6c178666c057e2c7b24100a6c48392196f1e9"}, + {file = "Rtree-1.0.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62f38020af47b765adc6b0bc7c4e810c6c3d1eab44ba339b592ff25a4c0dc0a7"}, + {file = "Rtree-1.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50b658a6707f215a0056d52e9f83a97148c0af62dea07cf29b3789a2c429e78a"}, + {file = "Rtree-1.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3573cbb0de872f54d0a0c29596a84e8ac3939c47ca3bece4a82e92775730a0d0"}, + {file = "Rtree-1.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d5abe5a19d943a88bea14901970e4c53e4579fc2662404cdea6163bf4c04d49a"}, + {file = "Rtree-1.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1e894112cef4de6c518bdea0b43eada65f12888c3645cc437c3a677aa023039f"}, + {file = "Rtree-1.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:582854252b8fd5c8472478af060635434931fb55edd269bac128cbf2eef43620"}, + {file = "Rtree-1.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b54057e8a8ad92c1d8e9eaa5cf32aad70dde454abbf9b638e9d6024520a52c02"}, + {file = "Rtree-1.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:698de8ce6c62e159d93b35bacf64bcf3619077b5367bc88cd2cff5e0bc36169b"}, + {file = "Rtree-1.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:273ee61783de3a1664e5f868feebf5eea4629447137751bfa4087b0f82093082"}, + {file = "Rtree-1.0.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:16900ee02cf5c198a42b03635268a80f606aa102f3f7618b89f75023d406da1c"}, + {file = "Rtree-1.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ce4a6fdb63254a4c1efebe7a4f7a59b1c333c703bde4ae715d9ad88c833e10b"}, + {file = "Rtree-1.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5b20f69e040a05503b22297af223f336fe7047909b57e4b207b98292f33a229f"}, + {file = "Rtree-1.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:57128293dd625cb1f07726f32208097953e8854d70ab1fc55d6858733618b9ed"}, + {file = "Rtree-1.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e898d7409ab645c25e06d4e058f99271182601d70b2887aba3351bf08e09a0c6"}, + {file = "Rtree-1.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:ad9912faeddb1ddcec5e26b33089166d58a107af6862d8b7f1bb2b7c0002ab39"}, + {file = "Rtree-1.0.1.tar.gz", hash = "sha256:222121699c303a64065d849bf7038b1ecabc37b65c7fa340bedb38ef0e805429"}, +] + +[[package]] +name = "scikit-image" +version = "0.19.3" +description = "Image processing in Python" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "scikit-image-0.19.3.tar.gz", hash = "sha256:24b5367de1762da6ee126dd8f30cc4e7efda474e0d7d70685433f0e3aa2ec450"}, + {file = "scikit_image-0.19.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:3a01372ae4bca223873304b0bff79b9d92446ac6d6177f73d89b45561e2d09d8"}, + {file = "scikit_image-0.19.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:fdf48d9b1f13af69e4e2c78e05067e322e9c8c97463c315cd0ecb47a94e259fc"}, + {file = "scikit_image-0.19.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b6a8f98f2ac9bb73706461fd1dec875f6a5141759ed526850a5a49e90003d19"}, + {file = "scikit_image-0.19.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfbb073f23deb48e0e60c47f8741d8089121d89cc78629ea8c5b51096efc5be7"}, + {file = "scikit_image-0.19.3-cp310-cp310-win_amd64.whl", hash = "sha256:cc24177de3fdceca5d04807ad9c87d665f0bf01032ed94a9055cd1ed2b3f33e9"}, + {file = "scikit_image-0.19.3-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:fd9dd3994bb6f9f7a35f228323f3c4dc44b3cf2ff15fd72d895216e9333550c6"}, + {file = "scikit_image-0.19.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ad5d8000207a264d1a55681a9276e6a739d3f05cf4429004ad00d61d1892235f"}, + {file = "scikit_image-0.19.3-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:84baa3179f3ae983c3a5d81c1e404bc92dcf7daeb41bfe9369badcda3fb22b92"}, + {file = "scikit_image-0.19.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f9f8a1387afc6c70f2bed007c3854a2d7489f9f7713c242f16f32ee05934bc2"}, + {file = "scikit_image-0.19.3-cp37-cp37m-win32.whl", hash = "sha256:9fb0923a3bfa99457c5e17888f27b3b8a83a3600b4fef317992e7b7234764732"}, + {file = "scikit_image-0.19.3-cp37-cp37m-win_amd64.whl", hash = "sha256:ce3d2207f253b8eb2c824e30d145a9f07a34a14212d57f3beca9f7e03c383cbe"}, + {file = "scikit_image-0.19.3-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:2a02d1bd0e2b53e36b952bd5fd6118d9ccc3ee51de35705d63d8eb1f2e86adef"}, + {file = "scikit_image-0.19.3-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:03779a7e1736fdf89d83c0ba67d44110496edd736a3bfce61a2b5177a1c8a099"}, + {file = "scikit_image-0.19.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19a21a101a20c587a3b611a2cf6f86c35aae9f8d9563279b987e83ee1c9a9790"}, + {file = "scikit_image-0.19.3-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f50b923f8099c1045fcde7418d86b206c87e333e43da980f41d8577b9605245"}, + {file = "scikit_image-0.19.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e207c6ce5ce121d7d9b9d2b61b9adca57d1abed112c902d8ffbfdc20fb42c12b"}, + {file = "scikit_image-0.19.3-cp38-cp38-win32.whl", hash = "sha256:a7c3985c68bfe05f7571167ee021d14f5b8d1a4a250c91f0b13be7fb07e6af34"}, + {file = "scikit_image-0.19.3-cp38-cp38-win_amd64.whl", hash = "sha256:651de1c2ce1fbee834753b46b8e7d81cb12a5594898babba63ac82b30ddad49d"}, + {file = "scikit_image-0.19.3-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:8d8917fcf85b987b1f287f823f3a1a7dac38b70aaca759bc0200f3bc292d5ced"}, + {file = "scikit_image-0.19.3-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:0b0a199157ce8487c77de4fde0edc0b42d6d42818881c11f459262351d678b2d"}, + {file = "scikit_image-0.19.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33dfd463ee6cc509defa279b963829f2230c9e0639ccd3931045be055878eea6"}, + {file = "scikit_image-0.19.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a8714348ddd671f819457a797c97d4c672166f093def66d66c3254cbd1d43f83"}, + {file = "scikit_image-0.19.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff3b1025356508d41f4fe48528e509d95f9e4015e90cf158cd58c56dc63e0ac5"}, + {file = "scikit_image-0.19.3-cp39-cp39-win32.whl", hash = "sha256:9439e5294de3f18d6e82ec8eee2c46590231cf9c690da80545e83a0733b7a69e"}, + {file = "scikit_image-0.19.3-cp39-cp39-win_amd64.whl", hash = "sha256:32fb88cc36203b99c9672fb972c9ef98635deaa5fc889fe969f3e11c44f22919"}, +] + +[package.dependencies] +imageio = ">=2.4.1" +networkx = ">=2.2" +numpy = ">=1.17.0" +packaging = ">=20.0" +pillow = ">=6.1.0,<7.1.0 || >7.1.0,<7.1.1 || >7.1.1,<8.3.0 || >8.3.0" +PyWavelets = ">=1.1.1" +scipy = ">=1.4.1" +tifffile = ">=2019.7.26" + +[package.extras] +data = ["pooch (>=1.3.0)"] +docs = ["cloudpickle (>=0.2.1)", "dask[array] (>=0.15.0,!=2.17.0)", "ipywidgets", "kaleido", "matplotlib (>=3.3)", "myst-parser", "numpydoc (>=1.0)", "pandas (>=0.23.0)", "plotly (>=4.14.0)", "pooch (>=1.3.0)", "pytest-runner", "scikit-learn", "seaborn (>=0.7.1)", "sphinx (>=1.8)", "sphinx-copybutton", "sphinx-gallery (>=0.10.1)", "tifffile (>=2020.5.30)"] +optional = ["SimpleITK", "astropy (>=3.1.2)", "cloudpickle (>=0.2.1)", "dask[array] (>=1.0.0,!=2.17.0)", "matplotlib (>=3.0.3)", "pooch (>=1.3.0)", "pyamg", "qtpy"] +test = ["asv", "codecov", "flake8", "matplotlib (>=3.0.3)", "pooch (>=1.3.0)", "pytest (>=5.2.0)", "pytest-cov (>=2.7.0)", "pytest-faulthandler", "pytest-localserver"] + +[[package]] +name = "scikit-learn" +version = "1.2.2" +description = "A set of python modules for machine learning and data mining" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "scikit-learn-1.2.2.tar.gz", hash = "sha256:8429aea30ec24e7a8c7ed8a3fa6213adf3814a6efbea09e16e0a0c71e1a1a3d7"}, + {file = "scikit_learn-1.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99cc01184e347de485bf253d19fcb3b1a3fb0ee4cea5ee3c43ec0cc429b6d29f"}, + {file = "scikit_learn-1.2.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:e6e574db9914afcb4e11ade84fab084536a895ca60aadea3041e85b8ac963edb"}, + {file = "scikit_learn-1.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fe83b676f407f00afa388dd1fdd49e5c6612e551ed84f3b1b182858f09e987d"}, + {file = "scikit_learn-1.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e2642baa0ad1e8f8188917423dd73994bf25429f8893ddbe115be3ca3183584"}, + {file = "scikit_learn-1.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:ad66c3848c0a1ec13464b2a95d0a484fd5b02ce74268eaa7e0c697b904f31d6c"}, + {file = "scikit_learn-1.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dfeaf8be72117eb61a164ea6fc8afb6dfe08c6f90365bde2dc16456e4bc8e45f"}, + {file = "scikit_learn-1.2.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:fe0aa1a7029ed3e1dcbf4a5bc675aa3b1bc468d9012ecf6c6f081251ca47f590"}, + {file = "scikit_learn-1.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:065e9673e24e0dc5113e2dd2b4ca30c9d8aa2fa90f4c0597241c93b63130d233"}, + {file = "scikit_learn-1.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf036ea7ef66115e0d49655f16febfa547886deba20149555a41d28f56fd6d3c"}, + {file = "scikit_learn-1.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:8b0670d4224a3c2d596fd572fb4fa673b2a0ccfb07152688ebd2ea0b8c61025c"}, + {file = "scikit_learn-1.2.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9c710ff9f9936ba8a3b74a455ccf0dcf59b230caa1e9ba0223773c490cab1e51"}, + {file = "scikit_learn-1.2.2-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:2dd3ffd3950e3d6c0c0ef9033a9b9b32d910c61bd06cb8206303fb4514b88a49"}, + {file = "scikit_learn-1.2.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44b47a305190c28dd8dd73fc9445f802b6ea716669cfc22ab1eb97b335d238b1"}, + {file = "scikit_learn-1.2.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:953236889928d104c2ef14027539f5f2609a47ebf716b8cbe4437e85dce42744"}, + {file = "scikit_learn-1.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:7f69313884e8eb311460cc2f28676d5e400bd929841a2c8eb8742ae78ebf7c20"}, + {file = "scikit_learn-1.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8156db41e1c39c69aa2d8599ab7577af53e9e5e7a57b0504e116cc73c39138dd"}, + {file = "scikit_learn-1.2.2-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:fe175ee1dab589d2e1033657c5b6bec92a8a3b69103e3dd361b58014729975c3"}, + {file = "scikit_learn-1.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d5312d9674bed14f73773d2acf15a3272639b981e60b72c9b190a0cffed5bad"}, + {file = "scikit_learn-1.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea061bf0283bf9a9f36ea3c5d3231ba2176221bbd430abd2603b1c3b2ed85c89"}, + {file = "scikit_learn-1.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:6477eed40dbce190f9f9e9d0d37e020815825b300121307942ec2110302b66a3"}, +] + +[package.dependencies] +joblib = ">=1.1.1" +numpy = ">=1.17.3" +scipy = ">=1.3.2" +threadpoolctl = ">=2.0.0" + +[package.extras] +benchmark = ["matplotlib (>=3.1.3)", "memory-profiler (>=0.57.0)", "pandas (>=1.0.5)"] +docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.1.3)", "memory-profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.0.5)", "plotly (>=5.10.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)", "sphinx (>=4.0.1)", "sphinx-gallery (>=0.7.0)", "sphinx-prompt (>=1.3.0)", "sphinxext-opengraph (>=0.4.2)"] +examples = ["matplotlib (>=3.1.3)", "pandas (>=1.0.5)", "plotly (>=5.10.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)"] +tests = ["black (>=22.3.0)", "flake8 (>=3.8.2)", "matplotlib (>=3.1.3)", "mypy (>=0.961)", "numpydoc (>=1.2.0)", "pandas (>=1.0.5)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pytest (>=5.3.1)", "pytest-cov (>=2.9.0)", "scikit-image (>=0.16.2)"] + +[[package]] +name = "scipy" +version = "1.10.1" +description = "Fundamental algorithms for scientific computing in Python" +category = "main" +optional = false +python-versions = "<3.12,>=3.8" +files = [ + {file = "scipy-1.10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e7354fd7527a4b0377ce55f286805b34e8c54b91be865bac273f527e1b839019"}, + {file = "scipy-1.10.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:4b3f429188c66603a1a5c549fb414e4d3bdc2a24792e061ffbd607d3d75fd84e"}, + {file = "scipy-1.10.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1553b5dcddd64ba9a0d95355e63fe6c3fc303a8fd77c7bc91e77d61363f7433f"}, + {file = "scipy-1.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c0ff64b06b10e35215abce517252b375e580a6125fd5fdf6421b98efbefb2d2"}, + {file = "scipy-1.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:fae8a7b898c42dffe3f7361c40d5952b6bf32d10c4569098d276b4c547905ee1"}, + {file = "scipy-1.10.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0f1564ea217e82c1bbe75ddf7285ba0709ecd503f048cb1236ae9995f64217bd"}, + {file = "scipy-1.10.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:d925fa1c81b772882aa55bcc10bf88324dadb66ff85d548c71515f6689c6dac5"}, + {file = "scipy-1.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaea0a6be54462ec027de54fca511540980d1e9eea68b2d5c1dbfe084797be35"}, + {file = "scipy-1.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15a35c4242ec5f292c3dd364a7c71a61be87a3d4ddcc693372813c0b73c9af1d"}, + {file = "scipy-1.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:43b8e0bcb877faf0abfb613d51026cd5cc78918e9530e375727bf0625c82788f"}, + {file = "scipy-1.10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5678f88c68ea866ed9ebe3a989091088553ba12c6090244fdae3e467b1139c35"}, + {file = "scipy-1.10.1-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:39becb03541f9e58243f4197584286e339029e8908c46f7221abeea4b749fa88"}, + {file = "scipy-1.10.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bce5869c8d68cf383ce240e44c1d9ae7c06078a9396df68ce88a1230f93a30c1"}, + {file = "scipy-1.10.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07c3457ce0b3ad5124f98a86533106b643dd811dd61b548e78cf4c8786652f6f"}, + {file = "scipy-1.10.1-cp38-cp38-win_amd64.whl", hash = "sha256:049a8bbf0ad95277ffba9b3b7d23e5369cc39e66406d60422c8cfef40ccc8415"}, + {file = "scipy-1.10.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cd9f1027ff30d90618914a64ca9b1a77a431159df0e2a195d8a9e8a04c78abf9"}, + {file = "scipy-1.10.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:79c8e5a6c6ffaf3a2262ef1be1e108a035cf4f05c14df56057b64acc5bebffb6"}, + {file = "scipy-1.10.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51af417a000d2dbe1ec6c372dfe688e041a7084da4fdd350aeb139bd3fb55353"}, + {file = "scipy-1.10.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b4735d6c28aad3cdcf52117e0e91d6b39acd4272f3f5cd9907c24ee931ad601"}, + {file = "scipy-1.10.1-cp39-cp39-win_amd64.whl", hash = "sha256:7ff7f37b1bf4417baca958d254e8e2875d0cc23aaadbe65b3d5b3077b0eb23ea"}, + {file = "scipy-1.10.1.tar.gz", hash = "sha256:2cf9dfb80a7b4589ba4c40ce7588986d6d5cebc5457cad2c2880f6bc2d42f3a5"}, +] + +[package.dependencies] +numpy = ">=1.19.5,<1.27.0" + +[package.extras] +dev = ["click", "doit (>=0.36.0)", "flake8", "mypy", "pycodestyle", "pydevtool", "rich-click", "typing_extensions"] +doc = ["matplotlib (>2)", "numpydoc", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] +test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] + +[[package]] +name = "seaborn" +version = "0.12.2" +description = "Statistical data visualization" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "seaborn-0.12.2-py3-none-any.whl", hash = "sha256:ebf15355a4dba46037dfd65b7350f014ceb1f13c05e814eda2c9f5fd731afc08"}, + {file = "seaborn-0.12.2.tar.gz", hash = "sha256:374645f36509d0dcab895cba5b47daf0586f77bfe3b36c97c607db7da5be0139"}, +] + +[package.dependencies] +matplotlib = ">=3.1,<3.6.1 || >3.6.1" +numpy = ">=1.17,<1.24.0 || >1.24.0" +pandas = ">=0.25" + +[package.extras] +dev = ["flake8", "flit", "mypy", "pandas-stubs", "pre-commit", "pytest", "pytest-cov", "pytest-xdist"] +docs = ["ipykernel", "nbconvert", "numpydoc", "pydata_sphinx_theme (==0.10.0rc2)", "pyyaml", "sphinx-copybutton", "sphinx-design", "sphinx-issues"] +stats = ["scipy (>=1.3)", "statsmodels (>=0.10)"] + +[[package]] +name = "send2trash" +version = "1.8.0" +description = "Send file to trash natively under Mac OS X, Windows and Linux." +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "Send2Trash-1.8.0-py3-none-any.whl", hash = "sha256:f20eaadfdb517eaca5ce077640cb261c7d2698385a6a0f072a4a5447fd49fa08"}, + {file = "Send2Trash-1.8.0.tar.gz", hash = "sha256:d2c24762fd3759860a0aff155e45871447ea58d2be6bdd39b5c8f966a0c99c2d"}, +] + +[package.extras] +nativelib = ["pyobjc-framework-Cocoa", "pywin32"] +objc = ["pyobjc-framework-Cocoa"] +win32 = ["pywin32"] + +[[package]] +name = "serve-me-once" +version = "0.1.2" +description = "" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "serve-me-once-0.1.2.tar.gz", hash = "sha256:d2dcf4b218ccd6e47374dd7ceffdd349236fcbec8a0d4c9116311e4a0018ed21"}, + {file = "serve_me_once-0.1.2-py3-none-any.whl", hash = "sha256:de5f0eb96a1eedd9f1e3f36edd79f6f3416ce11febd39b423d59e2efe24b97cd"}, +] + +[[package]] +name = "setuptools" +version = "60.10.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "setuptools-60.10.0-py3-none-any.whl", hash = "sha256:782ef48d58982ddb49920c11a0c5c9c0b02e7d7d1c2ad0aa44e1a1e133051c96"}, + {file = "setuptools-60.10.0.tar.gz", hash = "sha256:6599055eeb23bfef457d5605d33a4d68804266e6cb430b0fb12417c5efeae36c"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx", "sphinx-favicon", "sphinx-inline-tabs", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mock", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-xdist", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "shapely" +version = "2.0.1" +description = "Manipulation and analysis of geometric objects" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "shapely-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b06d031bc64149e340448fea25eee01360a58936c89985cf584134171e05863f"}, + {file = "shapely-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9a6ac34c16f4d5d3c174c76c9d7614ec8fe735f8f82b6cc97a46b54f386a86bf"}, + {file = "shapely-2.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:865bc3d7cc0ea63189d11a0b1120d1307ed7a64720a8bfa5be2fde5fc6d0d33f"}, + {file = "shapely-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45b4833235b90bc87ee26c6537438fa77559d994d2d3be5190dd2e54d31b2820"}, + {file = "shapely-2.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce88ec79df55430e37178a191ad8df45cae90b0f6972d46d867bf6ebbb58cc4d"}, + {file = "shapely-2.0.1-cp310-cp310-win32.whl", hash = "sha256:01224899ff692a62929ef1a3f5fe389043e262698a708ab7569f43a99a48ae82"}, + {file = "shapely-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:da71de5bf552d83dcc21b78cc0020e86f8d0feea43e202110973987ffa781c21"}, + {file = "shapely-2.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:502e0a607f1dcc6dee0125aeee886379be5242c854500ea5fd2e7ac076b9ce6d"}, + {file = "shapely-2.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7d3bbeefd8a6a1a1017265d2d36f8ff2d79d0162d8c141aa0d37a87063525656"}, + {file = "shapely-2.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f470a130d6ddb05b810fc1776d918659407f8d025b7f56d2742a596b6dffa6c7"}, + {file = "shapely-2.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4641325e065fd3e07d55677849c9ddfd0cf3ee98f96475126942e746d55b17c8"}, + {file = "shapely-2.0.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:90cfa4144ff189a3c3de62e2f3669283c98fb760cfa2e82ff70df40f11cadb39"}, + {file = "shapely-2.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70a18fc7d6418e5aea76ac55dce33f98e75bd413c6eb39cfed6a1ba36469d7d4"}, + {file = "shapely-2.0.1-cp311-cp311-win32.whl", hash = "sha256:09d6c7763b1bee0d0a2b84bb32a4c25c6359ad1ac582a62d8b211e89de986154"}, + {file = "shapely-2.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:d8f55f355be7821dade839df785a49dc9f16d1af363134d07eb11e9207e0b189"}, + {file = "shapely-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:83a8ec0ee0192b6e3feee9f6a499d1377e9c295af74d7f81ecba5a42a6b195b7"}, + {file = "shapely-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a529218e72a3dbdc83676198e610485fdfa31178f4be5b519a8ae12ea688db14"}, + {file = "shapely-2.0.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91575d97fd67391b85686573d758896ed2fc7476321c9d2e2b0c398b628b961c"}, + {file = "shapely-2.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8b0d834b11be97d5ab2b4dceada20ae8e07bcccbc0f55d71df6729965f406ad"}, + {file = "shapely-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:b4f0711cc83734c6fad94fc8d4ec30f3d52c1787b17d9dca261dc841d4731c64"}, + {file = "shapely-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:05c51a29336e604c084fb43ae5dbbfa2c0ef9bd6fedeae0a0d02c7b57a56ba46"}, + {file = "shapely-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b519cf3726ddb6c67f6a951d1bb1d29691111eaa67ea19ddca4d454fbe35949c"}, + {file = "shapely-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:193a398d81c97a62fc3634a1a33798a58fd1dcf4aead254d080b273efbb7e3ff"}, + {file = "shapely-2.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e55698e0ed95a70fe9ff9a23c763acfe0bf335b02df12142f74e4543095e9a9b"}, + {file = "shapely-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f32a748703e7bf6e92dfa3d2936b2fbfe76f8ce5f756e24f49ef72d17d26ad02"}, + {file = "shapely-2.0.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a34a23d6266ca162499e4a22b79159dc0052f4973d16f16f990baa4d29e58b6"}, + {file = "shapely-2.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d173d24e85e51510e658fb108513d5bc11e3fd2820db6b1bd0522266ddd11f51"}, + {file = "shapely-2.0.1-cp38-cp38-win32.whl", hash = "sha256:3cb256ae0c01b17f7bc68ee2ffdd45aebf42af8992484ea55c29a6151abe4386"}, + {file = "shapely-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:c7eed1fb3008a8a4a56425334b7eb82651a51f9e9a9c2f72844a2fb394f38a6c"}, + {file = "shapely-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ac1dfc397475d1de485e76de0c3c91cc9d79bd39012a84bb0f5e8a199fc17bef"}, + {file = "shapely-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:33403b8896e1d98aaa3a52110d828b18985d740cc9f34f198922018b1e0f8afe"}, + {file = "shapely-2.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2569a4b91caeef54dd5ae9091ae6f63526d8ca0b376b5bb9fd1a3195d047d7d4"}, + {file = "shapely-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a70a614791ff65f5e283feed747e1cc3d9e6c6ba91556e640636bbb0a1e32a71"}, + {file = "shapely-2.0.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c43755d2c46b75a7b74ac6226d2cc9fa2a76c3263c5ae70c195c6fb4e7b08e79"}, + {file = "shapely-2.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad81f292fffbd568ae71828e6c387da7eb5384a79db9b4fde14dd9fdeffca9a"}, + {file = "shapely-2.0.1-cp39-cp39-win32.whl", hash = "sha256:b50c401b64883e61556a90b89948297f1714dbac29243d17ed9284a47e6dd731"}, + {file = "shapely-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:bca57b683e3d94d0919e2f31e4d70fdfbb7059650ef1b431d9f4e045690edcd5"}, + {file = "shapely-2.0.1.tar.gz", hash = "sha256:66a6b1a3e72ece97fc85536a281476f9b7794de2e646ca8a4517e2e3c1446893"}, +] + +[package.dependencies] +numpy = ">=1.14" + +[package.extras] +docs = ["matplotlib", "numpydoc (>=1.1.0,<1.2.0)", "sphinx", "sphinx-book-theme", "sphinx-remove-toctrees"] +test = ["pytest", "pytest-cov"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "sniffio" +version = "1.3.0" +description = "Sniff out which async library your code is running under" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, + {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, +] + +[[package]] +name = "snowballstemmer" +version = "2.2.0" +description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, + {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, +] + +[[package]] +name = "soupsieve" +version = "2.4" +description = "A modern CSS selector implementation for Beautiful Soup." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "soupsieve-2.4-py3-none-any.whl", hash = "sha256:49e5368c2cda80ee7e84da9dbe3e110b70a4575f196efb74e51b94549d921955"}, + {file = "soupsieve-2.4.tar.gz", hash = "sha256:e28dba9ca6c7c00173e34e4ba57448f0688bb681b7c5e8bf4971daafc093d69a"}, +] + +[[package]] +name = "stack-data" +version = "0.6.2" +description = "Extract data from python stack frames and tracebacks for informative displays" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "stack_data-0.6.2-py3-none-any.whl", hash = "sha256:cbb2a53eb64e5785878201a97ed7c7b94883f48b87bfb0bbe8b623c74679e4a8"}, + {file = "stack_data-0.6.2.tar.gz", hash = "sha256:32d2dd0376772d01b6cb9fc996f3c8b57a357089dec328ed4b6553d037eaf815"}, +] + +[package.dependencies] +asttokens = ">=2.1.0" +executing = ">=1.2.0" +pure-eval = "*" + +[package.extras] +tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] + +[[package]] +name = "sympy" +version = "1.11.1" +description = "Computer algebra system (CAS) in Python" +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "sympy-1.11.1-py3-none-any.whl", hash = "sha256:938f984ee2b1e8eae8a07b884c8b7a1146010040fccddc6539c54f401c8f6fcf"}, + {file = "sympy-1.11.1.tar.gz", hash = "sha256:e32380dce63cb7c0108ed525570092fd45168bdae2faa17e528221ef72e88658"}, +] + +[package.dependencies] +mpmath = ">=0.19" + +[[package]] +name = "tabulate" +version = "0.9.0" +description = "Pretty-print tabular data" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"}, + {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"}, +] + +[package.extras] +widechars = ["wcwidth"] + +[[package]] +name = "tenacity" +version = "8.2.2" +description = "Retry code until it succeeds" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "tenacity-8.2.2-py3-none-any.whl", hash = "sha256:2f277afb21b851637e8f52e6a613ff08734c347dc19ade928e519d7d2d8569b0"}, + {file = "tenacity-8.2.2.tar.gz", hash = "sha256:43af037822bd0029025877f3b2d97cc4d7bb0c2991000a3d59d71517c5c969e0"}, +] + +[package.extras] +doc = ["reno", "sphinx", "tornado (>=4.5)"] + +[[package]] +name = "tensorboard" +version = "2.12.0" +description = "TensorBoard lets you watch Tensors Flow" +category = "dev" +optional = false +python-versions = ">=3.8" +files = [ + {file = "tensorboard-2.12.0-py3-none-any.whl", hash = "sha256:3cbdc32448d7a28dc1bf0b1754760c08b8e0e2e37c451027ebd5ff4896613012"}, +] + +[package.dependencies] +absl-py = ">=0.4" +google-auth = ">=1.6.3,<3" +google-auth-oauthlib = ">=0.4.1,<0.5" +grpcio = ">=1.48.2" +markdown = ">=2.6.8" +numpy = ">=1.12.0" +protobuf = ">=3.19.6" +requests = ">=2.21.0,<3" +setuptools = ">=41.0.0" +tensorboard-data-server = ">=0.7.0,<0.8.0" +tensorboard-plugin-wit = ">=1.6.0" +werkzeug = ">=1.0.1" +wheel = ">=0.26" + +[[package]] +name = "tensorboard-data-server" +version = "0.7.0" +description = "Fast data loading for TensorBoard" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tensorboard_data_server-0.7.0-py3-none-any.whl", hash = "sha256:753d4214799b31da7b6d93837959abebbc6afa86e69eacf1e9a317a48daa31eb"}, + {file = "tensorboard_data_server-0.7.0-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:eb7fa518737944dbf4f0cf83c2e40a7ac346bf91be2e6a0215de98be74e85454"}, + {file = "tensorboard_data_server-0.7.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:64aa1be7c23e80b1a42c13b686eb0875bb70f5e755f4d2b8de5c1d880cf2267f"}, +] + +[[package]] +name = "tensorboard-plugin-wit" +version = "1.8.1" +description = "What-If Tool TensorBoard plugin." +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "tensorboard_plugin_wit-1.8.1-py3-none-any.whl", hash = "sha256:ff26bdd583d155aa951ee3b152b3d0cffae8005dc697f72b44a8e8c2a77a8cbe"}, +] + +[[package]] +name = "termcolor" +version = "2.2.0" +description = "ANSI color formatting for output in terminal" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "termcolor-2.2.0-py3-none-any.whl", hash = "sha256:91ddd848e7251200eac969846cbae2dacd7d71c2871e92733289e7e3666f48e7"}, + {file = "termcolor-2.2.0.tar.gz", hash = "sha256:dfc8ac3f350788f23b2947b3e6cfa5a53b630b612e6cd8965a015a776020b99a"}, +] + +[package.extras] +tests = ["pytest", "pytest-cov"] + +[[package]] +name = "terminado" +version = "0.17.1" +description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "terminado-0.17.1-py3-none-any.whl", hash = "sha256:8650d44334eba354dd591129ca3124a6ba42c3d5b70df5051b6921d506fdaeae"}, + {file = "terminado-0.17.1.tar.gz", hash = "sha256:6ccbbcd3a4f8a25a5ec04991f39a0b8db52dfcd487ea0e578d977e6752380333"}, +] + +[package.dependencies] +ptyprocess = {version = "*", markers = "os_name != \"nt\""} +pywinpty = {version = ">=1.1.0", markers = "os_name == \"nt\""} +tornado = ">=6.1.0" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["pre-commit", "pytest (>=7.0)", "pytest-timeout"] + +[[package]] +name = "textwrap3" +version = "0.9.2" +description = "textwrap from Python 3.6 backport (plus a few tweaks)" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "textwrap3-0.9.2-py2.py3-none-any.whl", hash = "sha256:bf5f4c40faf2a9ff00a9e0791fed5da7415481054cef45bb4a3cfb1f69044ae0"}, + {file = "textwrap3-0.9.2.zip", hash = "sha256:5008eeebdb236f6303dcd68f18b856d355f6197511d952ba74bc75e40e0c3414"}, +] + +[[package]] +name = "threadpoolctl" +version = "3.1.0" +description = "threadpoolctl" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "threadpoolctl-3.1.0-py3-none-any.whl", hash = "sha256:8b99adda265feb6773280df41eece7b2e6561b772d21ffd52e372f999024907b"}, + {file = "threadpoolctl-3.1.0.tar.gz", hash = "sha256:a335baacfaa4400ae1f0d8e3a58d6674d2f8828e3716bb2802c44955ad391380"}, +] + +[[package]] +name = "tifffile" +version = "2023.3.21" +description = "Read and write TIFF files" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "tifffile-2023.3.21-py3-none-any.whl", hash = "sha256:b83af3dbe914663aeaf250e9751ae503154f2599dd27ed7a4df1b2dc7c148efa"}, + {file = "tifffile-2023.3.21.tar.gz", hash = "sha256:16027be65e9d5a1b26bf106a98a639345fecf83ebac9004dc7e617647e4dbfeb"}, +] + +[package.dependencies] +numpy = "*" + +[package.extras] +all = ["defusedxml", "fsspec", "imagecodecs (>=2023.1.23)", "lxml", "matplotlib", "zarr"] + +[[package]] +name = "tinycss2" +version = "1.2.1" +description = "A tiny CSS parser" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tinycss2-1.2.1-py3-none-any.whl", hash = "sha256:2b80a96d41e7c3914b8cda8bc7f705a4d9c49275616e886103dd839dfc847847"}, + {file = "tinycss2-1.2.1.tar.gz", hash = "sha256:8cff3a8f066c2ec677c06dbc7b45619804a6938478d9d73c284b29d14ecb0627"}, +] + +[package.dependencies] +webencodings = ">=0.4" + +[package.extras] +doc = ["sphinx", "sphinx_rtd_theme"] +test = ["flake8", "isort", "pytest"] + +[[package]] +name = "toml" +version = "0.10.2" +description = "Python Library for Tom's Obvious, Minimal Language" +category = "dev" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "tomlkit" +version = "0.11.6" +description = "Style preserving TOML library" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "tomlkit-0.11.6-py3-none-any.whl", hash = "sha256:07de26b0d8cfc18f871aec595fda24d95b08fef89d147caa861939f37230bf4b"}, + {file = "tomlkit-0.11.6.tar.gz", hash = "sha256:71b952e5721688937fb02cf9d354dbcf0785066149d2855e44531ebdd2b65d73"}, +] + +[[package]] +name = "torch" +version = "1.13.1" +description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" +category = "main" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "torch-1.13.1-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:fd12043868a34a8da7d490bf6db66991108b00ffbeecb034228bfcbbd4197143"}, + {file = "torch-1.13.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:d9fe785d375f2e26a5d5eba5de91f89e6a3be5d11efb497e76705fdf93fa3c2e"}, + {file = "torch-1.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:98124598cdff4c287dbf50f53fb455f0c1e3a88022b39648102957f3445e9b76"}, + {file = "torch-1.13.1-cp310-none-macosx_10_9_x86_64.whl", hash = "sha256:393a6273c832e047581063fb74335ff50b4c566217019cc6ace318cd79eb0566"}, + {file = "torch-1.13.1-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:0122806b111b949d21fa1a5f9764d1fd2fcc4a47cb7f8ff914204fd4fc752ed5"}, + {file = "torch-1.13.1-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:22128502fd8f5b25ac1cd849ecb64a418382ae81dd4ce2b5cebaa09ab15b0d9b"}, + {file = "torch-1.13.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:76024be052b659ac1304ab8475ab03ea0a12124c3e7626282c9c86798ac7bc11"}, + {file = "torch-1.13.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:ea8dda84d796094eb8709df0fcd6b56dc20b58fdd6bc4e8d7109930dafc8e419"}, + {file = "torch-1.13.1-cp37-cp37m-win_amd64.whl", hash = "sha256:2ee7b81e9c457252bddd7d3da66fb1f619a5d12c24d7074de91c4ddafb832c93"}, + {file = "torch-1.13.1-cp37-none-macosx_10_9_x86_64.whl", hash = "sha256:0d9b8061048cfb78e675b9d2ea8503bfe30db43d583599ae8626b1263a0c1380"}, + {file = "torch-1.13.1-cp37-none-macosx_11_0_arm64.whl", hash = "sha256:f402ca80b66e9fbd661ed4287d7553f7f3899d9ab54bf5c67faada1555abde28"}, + {file = "torch-1.13.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:727dbf00e2cf858052364c0e2a496684b9cb5aa01dc8a8bc8bbb7c54502bdcdd"}, + {file = "torch-1.13.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:df8434b0695e9ceb8cc70650afc1310d8ba949e6db2a0525ddd9c3b2b181e5fe"}, + {file = "torch-1.13.1-cp38-cp38-win_amd64.whl", hash = "sha256:5e1e722a41f52a3f26f0c4fcec227e02c6c42f7c094f32e49d4beef7d1e213ea"}, + {file = "torch-1.13.1-cp38-none-macosx_10_9_x86_64.whl", hash = "sha256:33e67eea526e0bbb9151263e65417a9ef2d8fa53cbe628e87310060c9dcfa312"}, + {file = "torch-1.13.1-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:eeeb204d30fd40af6a2d80879b46a7efbe3cf43cdbeb8838dd4f3d126cc90b2b"}, + {file = "torch-1.13.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:50ff5e76d70074f6653d191fe4f6a42fdbe0cf942fbe2a3af0b75eaa414ac038"}, + {file = "torch-1.13.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:2c3581a3fd81eb1f0f22997cddffea569fea53bafa372b2c0471db373b26aafc"}, + {file = "torch-1.13.1-cp39-cp39-win_amd64.whl", hash = "sha256:0aa46f0ac95050c604bcf9ef71da9f1172e5037fdf2ebe051962d47b123848e7"}, + {file = "torch-1.13.1-cp39-none-macosx_10_9_x86_64.whl", hash = "sha256:6930791efa8757cb6974af73d4996b6b50c592882a324b8fb0589c6a9ba2ddaf"}, + {file = "torch-1.13.1-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:e0df902a7c7dd6c795698532ee5970ce898672625635d885eade9976e5a04949"}, +] + +[package.dependencies] +nvidia-cublas-cu11 = {version = "11.10.3.66", markers = "platform_system == \"Linux\""} +nvidia-cuda-nvrtc-cu11 = {version = "11.7.99", markers = "platform_system == \"Linux\""} +nvidia-cuda-runtime-cu11 = {version = "11.7.99", markers = "platform_system == \"Linux\""} +nvidia-cudnn-cu11 = {version = "8.5.0.96", markers = "platform_system == \"Linux\""} +typing-extensions = "*" + +[package.extras] +opt-einsum = ["opt-einsum (>=3.3)"] + +[[package]] +name = "torchmeta" +version = "1.8.0" +description = "Dataloaders for meta-learning in Pytorch" +category = "main" +optional = false +python-versions = "*" +files = [] +develop = false + +[package.dependencies] +h5py = "*" +numpy = ">=1.14.0" +ordered-set = "*" +Pillow = ">=7.0.0" +requests = "*" +torch = ">=1.4.0,<1.15.0" +torchvision = ">=0.5.0,<0.16.0" +tqdm = ">=4.0.0" + +[package.extras] +tcga = ["academictorrents (>=2.1.0,<2.2.0)", "pandas (>=0.24.0,<0.25.0)", "six (>=1.11.0,<1.12.0)"] +test = ["flaky"] + +[package.source] +type = "git" +url = "https://github.com/pbsds/pytorch-meta" +reference = "upgrade" +resolved_reference = "ef53cc17c9f645902c96ffc611ce3d2b5cd08e99" + +[[package]] +name = "torchmetrics" +version = "0.11.4" +description = "PyTorch native Metrics" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "torchmetrics-0.11.4-py3-none-any.whl", hash = "sha256:45f892f3534e91f3ad9e2488d1b05a93b7cb76b7d037969435a41a1f24750d9a"}, + {file = "torchmetrics-0.11.4.tar.gz", hash = "sha256:1fe45a14b44dd65d90199017dd5a4b5a128d56a8a311da7916c402c18c671494"}, +] + +[package.dependencies] +numpy = ">=1.17.2" +packaging = "*" +torch = ">=1.8.1" + +[package.extras] +all = ["lpips (<=0.1.4)", "nltk (>=3.6)", "pycocotools (>2.0.0)", "pystoi (<=0.3.3)", "regex (>=2021.9.24)", "scipy (>1.0.0)", "torch-fidelity (<=0.3.0)", "torchvision (>=0.8)", "tqdm (>=4.41.0)", "transformers (>=4.10.0)"] +audio = ["pystoi (<=0.3.3)"] +detection = ["pycocotools (>2.0.0)", "torchvision (>=0.8)"] +image = ["lpips (<=0.1.4)", "scipy (>1.0.0)", "torch-fidelity (<=0.3.0)", "torchvision (>=0.8)"] +multimodal = ["transformers (>=4.10.0)"] +test = ["bert-score (==0.3.13)", "cloudpickle (>1.3)", "coverage (>5.2)", "dython (<=0.7.3)", "fast-bss-eval (>=0.1.0)", "fire (<=0.5.0)", "huggingface-hub (<0.7)", "jiwer (>=2.3.0)", "kornia (>=0.6.7)", "mir-eval (>=0.6)", "mypy (==0.982)", "netcal (>1.0.0)", "pandas (>1.0.0)", "phmdoctest (>=1.1.1)", "psutil (<=5.9.4)", "pypesq (>1.2)", "pytest (>=6.0.0)", "pytest-cov (>2.10)", "pytest-doctestplus (>=0.9.0)", "pytest-rerunfailures (>=10.0)", "pytest-timeout (<=2.1.0)", "pytorch-msssim (==0.2.1)", "requests (<=2.28.2)", "rouge-score (>0.1.0)", "sacrebleu (>=2.0.0)", "scikit-image (>0.17.1)", "scikit-learn (>1.0)", "scipy (>1.0.0)", "torch-complex (<=0.4.3)", "transformers (>4.4.0)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] +text = ["nltk (>=3.6)", "regex (>=2021.9.24)", "tqdm (>=4.41.0)"] + +[[package]] +name = "torchvision" +version = "0.14.1" +description = "image and video datasets and models for torch deep learning" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "torchvision-0.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb05dd9dd3af5428fee525400759daf8da8e4caec45ddd6908cfb36571f6433"}, + {file = "torchvision-0.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8d0766ea92affa7af248e327dd85f7c9cfdf51a57530b43212d4e1858548e9d7"}, + {file = "torchvision-0.14.1-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:6d7b35653113664ea3fdcb71f515cfbf29d2fe393000fd8aaff27a1284de6908"}, + {file = "torchvision-0.14.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:8a9eb773a2fa8f516e404ac09c059fb14e6882c48fdbb9c946327d2ce5dba6cd"}, + {file = "torchvision-0.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:13986f0c15377ff23039e1401012ccb6ecf71024ce53def27139e4eac5a57592"}, + {file = "torchvision-0.14.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fb7a793fd33ce1abec24b42778419a3fb1e3159d7dfcb274a3ca8fb8cbc408dc"}, + {file = "torchvision-0.14.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:89fb0419780ec9a9eb9f7856a0149f6ac9f956b28f44b0c0080c6b5b48044db7"}, + {file = "torchvision-0.14.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:a2d4237d3c9705d7729eb4534e4eb06f1d6be7ff1df391204dfb51586d9b0ecb"}, + {file = "torchvision-0.14.1-cp37-cp37m-win_amd64.whl", hash = "sha256:92a324712a87957443cc34223274298ae9496853f115c252f8fc02b931f2340e"}, + {file = "torchvision-0.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:68ed03359dcd3da9cd21b8ab94da21158df8a6a0c5bad0bf4a42f0e448d28cb3"}, + {file = "torchvision-0.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:30fcf0e9fe57d4ac4ce6426659a57dce199637ccb6c70be1128670f177692624"}, + {file = "torchvision-0.14.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:0ed02aefd09bf1114d35f1aa7dce55aa61c2c7e57f9aa02dce362860be654e85"}, + {file = "torchvision-0.14.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:a541e49fc3c4e90e49e6988428ab047415ed52ea97d0c0bfd147d8bacb8f4df8"}, + {file = "torchvision-0.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:6099b3191dc2516099a32ae38a5fb349b42e863872a13545ab1a524b6567be60"}, + {file = "torchvision-0.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c5e744f56e5f5b452deb5fc0f3f2ba4d2f00612d14d8da0dbefea8f09ac7690b"}, + {file = "torchvision-0.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:758b20d079e810b4740bd60d1eb16e49da830e3360f9be379eb177ee221fa5d4"}, + {file = "torchvision-0.14.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:83045507ef8d3c015d4df6be79491375b2f901352cfca6e72b4723e9c4f9a55d"}, + {file = "torchvision-0.14.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:eaed58cf454323ed9222d4e0dd5fb897064f454b400696e03a5200e65d3a1e76"}, + {file = "torchvision-0.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:b337e1245ca4353623dd563c03cd8f020c2496a7c5d12bba4d2e381999c766e0"}, +] + +[package.dependencies] +numpy = "*" +pillow = ">=5.3.0,<8.3.0 || >=8.4.0" +requests = "*" +torch = "1.13.1" +typing-extensions = "*" + +[package.extras] +scipy = ["scipy"] + +[[package]] +name = "torchviz" +version = "0.0.2" +description = "A small package to create visualizations of PyTorch execution graphs" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "torchviz-0.0.2.tar.gz", hash = "sha256:c790b4c993f783433604bf610cfa58bb0a031260be4ee5196a00c0884e768051"}, +] + +[package.dependencies] +graphviz = "*" +torch = "*" + +[[package]] +name = "tornado" +version = "6.2" +description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +category = "dev" +optional = false +python-versions = ">= 3.7" +files = [ + {file = "tornado-6.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:20f638fd8cc85f3cbae3c732326e96addff0a15e22d80f049e00121651e82e72"}, + {file = "tornado-6.2-cp37-abi3-macosx_10_9_x86_64.whl", hash = "sha256:87dcafae3e884462f90c90ecc200defe5e580a7fbbb4365eda7c7c1eb809ebc9"}, + {file = "tornado-6.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba09ef14ca9893954244fd872798b4ccb2367c165946ce2dd7376aebdde8e3ac"}, + {file = "tornado-6.2-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b8150f721c101abdef99073bf66d3903e292d851bee51910839831caba341a75"}, + {file = "tornado-6.2-cp37-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3a2f5999215a3a06a4fc218026cd84c61b8b2b40ac5296a6db1f1451ef04c1e"}, + {file = "tornado-6.2-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:5f8c52d219d4995388119af7ccaa0bcec289535747620116a58d830e7c25d8a8"}, + {file = "tornado-6.2-cp37-abi3-musllinux_1_1_i686.whl", hash = "sha256:6fdfabffd8dfcb6cf887428849d30cf19a3ea34c2c248461e1f7d718ad30b66b"}, + {file = "tornado-6.2-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:1d54d13ab8414ed44de07efecb97d4ef7c39f7438cf5e976ccd356bebb1b5fca"}, + {file = "tornado-6.2-cp37-abi3-win32.whl", hash = "sha256:5c87076709343557ef8032934ce5f637dbb552efa7b21d08e89ae7619ed0eb23"}, + {file = "tornado-6.2-cp37-abi3-win_amd64.whl", hash = "sha256:e5f923aa6a47e133d1cf87d60700889d7eae68988704e20c75fb2d65677a8e4b"}, + {file = "tornado-6.2.tar.gz", hash = "sha256:9b630419bde84ec666bfd7ea0a4cb2a8a651c2d5cccdbdd1972a0c859dfc3c13"}, +] + +[[package]] +name = "tqdm" +version = "4.65.0" +description = "Fast, Extensible Progress Meter" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tqdm-4.65.0-py3-none-any.whl", hash = "sha256:c4f53a17fe37e132815abceec022631be8ffe1b9381c2e6e30aa70edc99e9671"}, + {file = "tqdm-4.65.0.tar.gz", hash = "sha256:1871fb68a86b8fb3b59ca4cdd3dcccbc7e6d613eeed31f4c332531977b89beb5"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["py-make (>=0.1.0)", "twine", "wheel"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + +[[package]] +name = "traitlets" +version = "5.9.0" +description = "Traitlets Python configuration system" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "traitlets-5.9.0-py3-none-any.whl", hash = "sha256:9e6ec080259b9a5940c797d58b613b5e31441c2257b87c2e795c5228ae80d2d8"}, + {file = "traitlets-5.9.0.tar.gz", hash = "sha256:f6cde21a9c68cf756af02035f72d5a723bf607e862e7be33ece505abf4a3bad9"}, +] + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"] + +[[package]] +name = "trimesh" +version = "3.21.0" +description = "Import, export, process, analyze and view triangular meshes." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "trimesh-3.21.0-py3-none-any.whl", hash = "sha256:459c811448facf410247bd9f284cd3026bee71804d0b0704b90352bbb069944c"}, + {file = "trimesh-3.21.0.tar.gz", hash = "sha256:2aa8c312900e24a7487744a7e9d47e794bd6e79ad629aaa48cde0d37ee63a094"}, +] + +[package.dependencies] +numpy = "*" + +[package.extras] +all = ["chardet", "colorlog", "glooey", "jsonschema", "lxml", "mapbox-earcut", "meshio", "networkx", "pillow", "psutil", "pycollada", "pyglet (<2)", "python-fcl", "requests", "rtree", "scikit-image", "scipy", "setuptools", "shapely", "svg.path", "sympy", "xatlas", "xxhash"] +easy = ["chardet", "colorlog", "jsonschema", "lxml", "mapbox-earcut", "networkx", "pillow", "pycollada", "requests", "rtree", "scipy", "setuptools", "shapely", "svg.path", "sympy", "xxhash"] +test = ["autopep8", "coveralls", "ezdxf", "pyinstrument", "pytest", "pytest-cov", "ruff"] + +[[package]] +name = "typer" +version = "0.7.0" +description = "Typer, build great CLIs. Easy to code. Based on Python type hints." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "typer-0.7.0-py3-none-any.whl", hash = "sha256:b5e704f4e48ec263de1c0b3a2387cd405a13767d2f907f44c1a08cbad96f606d"}, + {file = "typer-0.7.0.tar.gz", hash = "sha256:ff797846578a9f2a201b53442aedeb543319466870fbe1c701eab66dd7681165"}, +] + +[package.dependencies] +click = ">=7.1.1,<9.0.0" + +[package.extras] +all = ["colorama (>=0.4.3,<0.5.0)", "rich (>=10.11.0,<13.0.0)", "shellingham (>=1.3.0,<2.0.0)"] +dev = ["autoflake (>=1.3.1,<2.0.0)", "flake8 (>=3.8.3,<4.0.0)", "pre-commit (>=2.17.0,<3.0.0)"] +doc = ["cairosvg (>=2.5.2,<3.0.0)", "mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "pillow (>=9.3.0,<10.0.0)"] +test = ["black (>=22.3.0,<23.0.0)", "coverage (>=6.2,<7.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.910)", "pytest (>=4.4.0,<8.0.0)", "pytest-cov (>=2.10.0,<5.0.0)", "pytest-sugar (>=0.9.4,<0.10.0)", "pytest-xdist (>=1.32.0,<4.0.0)", "rich (>=10.11.0,<13.0.0)", "shellingham (>=1.3.0,<2.0.0)"] + +[[package]] +name = "typing-extensions" +version = "4.5.0" +description = "Backported and Experimental Type Hints for Python 3.7+" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "typing_extensions-4.5.0-py3-none-any.whl", hash = "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4"}, + {file = "typing_extensions-4.5.0.tar.gz", hash = "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb"}, +] + +[[package]] +name = "ujson" +version = "5.7.0" +description = "Ultra fast JSON encoder and decoder for Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "ujson-5.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5eba5e69e4361ac3a311cf44fa71bc619361b6e0626768a494771aacd1c2f09b"}, + {file = "ujson-5.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aae4d9e1b4c7b61780f0a006c897a4a1904f862fdab1abb3ea8f45bd11aa58f3"}, + {file = "ujson-5.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2e43ccdba1cb5c6d3448eadf6fc0dae7be6c77e357a3abc968d1b44e265866d"}, + {file = "ujson-5.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54384ce4920a6d35fa9ea8e580bc6d359e3eb961fa7e43f46c78e3ed162d56ff"}, + {file = "ujson-5.7.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24ad1aa7fc4e4caa41d3d343512ce68e41411fb92adf7f434a4d4b3749dc8f58"}, + {file = "ujson-5.7.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:afff311e9f065a8f03c3753db7011bae7beb73a66189c7ea5fcb0456b7041ea4"}, + {file = "ujson-5.7.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6e80f0d03e7e8646fc3d79ed2d875cebd4c83846e129737fdc4c2532dbd43d9e"}, + {file = "ujson-5.7.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:137831d8a0db302fb6828ee21c67ad63ac537bddc4376e1aab1c8573756ee21c"}, + {file = "ujson-5.7.0-cp310-cp310-win32.whl", hash = "sha256:7df3fd35ebc14dafeea031038a99232b32f53fa4c3ecddb8bed132a43eefb8ad"}, + {file = "ujson-5.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:af4639f684f425177d09ae409c07602c4096a6287027469157bfb6f83e01448b"}, + {file = "ujson-5.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9b0f2680ce8a70f77f5d70aaf3f013d53e6af6d7058727a35d8ceb4a71cdd4e9"}, + {file = "ujson-5.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:67a19fd8e7d8cc58a169bea99fed5666023adf707a536d8f7b0a3c51dd498abf"}, + {file = "ujson-5.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6abb8e6d8f1ae72f0ed18287245f5b6d40094e2656d1eab6d99d666361514074"}, + {file = "ujson-5.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8cd622c069368d5074bd93817b31bdb02f8d818e57c29e206f10a1f9c6337dd"}, + {file = "ujson-5.7.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:14f9082669f90e18e64792b3fd0bf19f2b15e7fe467534a35ea4b53f3bf4b755"}, + {file = "ujson-5.7.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d7ff6ebb43bc81b057724e89550b13c9a30eda0f29c2f506f8b009895438f5a6"}, + {file = "ujson-5.7.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f7f241488879d91a136b299e0c4ce091996c684a53775e63bb442d1a8e9ae22a"}, + {file = "ujson-5.7.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5593263a7fcfb934107444bcfba9dde8145b282de0ee9f61e285e59a916dda0f"}, + {file = "ujson-5.7.0-cp311-cp311-win32.whl", hash = "sha256:26c2b32b489c393106e9cb68d0a02e1a7b9d05a07429d875c46b94ee8405bdb7"}, + {file = "ujson-5.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:ed24406454bb5a31df18f0a423ae14beb27b28cdfa34f6268e7ebddf23da807e"}, + {file = "ujson-5.7.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:18679484e3bf9926342b1c43a3bd640f93a9eeeba19ef3d21993af7b0c44785d"}, + {file = "ujson-5.7.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ee295761e1c6c30400641f0a20d381633d7622633cdf83a194f3c876a0e4b7e"}, + {file = "ujson-5.7.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b738282e12a05f400b291966630a98d622da0938caa4bc93cf65adb5f4281c60"}, + {file = "ujson-5.7.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00343501dbaa5172e78ef0e37f9ebd08040110e11c12420ff7c1f9f0332d939e"}, + {file = "ujson-5.7.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c0d1f7c3908357ee100aa64c4d1cf91edf99c40ac0069422a4fd5fd23b263263"}, + {file = "ujson-5.7.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a5d2f44331cf04689eafac7a6596c71d6657967c07ac700b0ae1c921178645da"}, + {file = "ujson-5.7.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:16b2254a77b310f118717715259a196662baa6b1f63b1a642d12ab1ff998c3d7"}, + {file = "ujson-5.7.0-cp37-cp37m-win32.whl", hash = "sha256:6faf46fa100b2b89e4db47206cf8a1ffb41542cdd34dde615b2fc2288954f194"}, + {file = "ujson-5.7.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ff0004c3f5a9a6574689a553d1b7819d1a496b4f005a7451f339dc2d9f4cf98c"}, + {file = "ujson-5.7.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:75204a1dd7ec6158c8db85a2f14a68d2143503f4bafb9a00b63fe09d35762a5e"}, + {file = "ujson-5.7.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7312731c7826e6c99cdd3ac503cd9acd300598e7a80bcf41f604fee5f49f566c"}, + {file = "ujson-5.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b9dc5a90e2149643df7f23634fe202fed5ebc787a2a1be95cf23632b4d90651"}, + {file = "ujson-5.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6a6961fc48821d84b1198a09516e396d56551e910d489692126e90bf4887d29"}, + {file = "ujson-5.7.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b01a9af52a0d5c46b2c68e3f258fdef2eacaa0ce6ae3e9eb97983f5b1166edb6"}, + {file = "ujson-5.7.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b7316d3edeba8a403686cdcad4af737b8415493101e7462a70ff73dd0609eafc"}, + {file = "ujson-5.7.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4ee997799a23227e2319a3f8817ce0b058923dbd31904761b788dc8f53bd3e30"}, + {file = "ujson-5.7.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:dda9aa4c33435147262cd2ea87c6b7a1ca83ba9b3933ff7df34e69fee9fced0c"}, + {file = "ujson-5.7.0-cp38-cp38-win32.whl", hash = "sha256:bea8d30e362180aafecabbdcbe0e1f0b32c9fa9e39c38e4af037b9d3ca36f50c"}, + {file = "ujson-5.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:c96e3b872bf883090ddf32cc41957edf819c5336ab0007d0cf3854e61841726d"}, + {file = "ujson-5.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6411aea4c94a8e93c2baac096fbf697af35ba2b2ed410b8b360b3c0957a952d3"}, + {file = "ujson-5.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3d3b3499c55911f70d4e074c626acdb79a56f54262c3c83325ffb210fb03e44d"}, + {file = "ujson-5.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:341f891d45dd3814d31764626c55d7ab3fd21af61fbc99d070e9c10c1190680b"}, + {file = "ujson-5.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f242eec917bafdc3f73a1021617db85f9958df80f267db69c76d766058f7b19"}, + {file = "ujson-5.7.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3af9f9f22a67a8c9466a32115d9073c72a33ae627b11de6f592df0ee09b98b6"}, + {file = "ujson-5.7.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4a3d794afbf134df3056a813e5c8a935208cddeae975bd4bc0ef7e89c52f0ce0"}, + {file = "ujson-5.7.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:800bf998e78dae655008dd10b22ca8dc93bdcfcc82f620d754a411592da4bbf2"}, + {file = "ujson-5.7.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b5ac3d5c5825e30b438ea92845380e812a476d6c2a1872b76026f2e9d8060fc2"}, + {file = "ujson-5.7.0-cp39-cp39-win32.whl", hash = "sha256:cd90027e6d93e8982f7d0d23acf88c896d18deff1903dd96140613389b25c0dd"}, + {file = "ujson-5.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:523ee146cdb2122bbd827f4dcc2a8e66607b3f665186bce9e4f78c9710b6d8ab"}, + {file = "ujson-5.7.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e87cec407ec004cf1b04c0ed7219a68c12860123dfb8902ef880d3d87a71c172"}, + {file = "ujson-5.7.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bab10165db6a7994e67001733f7f2caf3400b3e11538409d8756bc9b1c64f7e8"}, + {file = "ujson-5.7.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b522be14a28e6ac1cf818599aeff1004a28b42df4ed4d7bc819887b9dac915fc"}, + {file = "ujson-5.7.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7592f40175c723c032cdbe9fe5165b3b5903604f774ab0849363386e99e1f253"}, + {file = "ujson-5.7.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ed22f9665327a981f288a4f758a432824dc0314e4195a0eaeb0da56a477da94d"}, + {file = "ujson-5.7.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:adf445a49d9a97a5a4c9bb1d652a1528de09dd1c48b29f79f3d66cea9f826bf6"}, + {file = "ujson-5.7.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64772a53f3c4b6122ed930ae145184ebaed38534c60f3d859d8c3f00911eb122"}, + {file = "ujson-5.7.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35209cb2c13fcb9d76d249286105b4897b75a5e7f0efb0c0f4b90f222ce48910"}, + {file = "ujson-5.7.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:90712dfc775b2c7a07d4d8e059dd58636bd6ff1776d79857776152e693bddea6"}, + {file = "ujson-5.7.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:0e4e8981c6e7e9e637e637ad8ffe948a09e5434bc5f52ecbb82b4b4cfc092bfb"}, + {file = "ujson-5.7.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:581c945b811a3d67c27566539bfcb9705ea09cb27c4be0002f7a553c8886b817"}, + {file = "ujson-5.7.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d36a807a24c7d44f71686685ae6fbc8793d784bca1adf4c89f5f780b835b6243"}, + {file = "ujson-5.7.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b4257307e3662aa65e2644a277ca68783c5d51190ed9c49efebdd3cbfd5fa44"}, + {file = "ujson-5.7.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea7423d8a2f9e160c5e011119741682414c5b8dce4ae56590a966316a07a4618"}, + {file = "ujson-5.7.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4c592eb91a5968058a561d358d0fef59099ed152cfb3e1cd14eee51a7a93879e"}, + {file = "ujson-5.7.0.tar.gz", hash = "sha256:e788e5d5dcae8f6118ac9b45d0b891a0d55f7ac480eddcb7f07263f2bcf37b23"}, +] + +[[package]] +name = "uri-template" +version = "1.2.0" +description = "RFC 6570 URI Template Processor" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "uri_template-1.2.0-py3-none-any.whl", hash = "sha256:f1699c77b73b925cf4937eae31ab282a86dc885c333f2e942513f08f691fc7db"}, + {file = "uri_template-1.2.0.tar.gz", hash = "sha256:934e4d09d108b70eb8a24410af8615294d09d279ce0e7cbcdaef1bd21f932b06"}, +] + +[package.extras] +dev = ["flake8 (<4.0.0)", "flake8-annotations", "flake8-bugbear", "flake8-commas", "flake8-comprehensions", "flake8-continuation", "flake8-datetimez", "flake8-docstrings", "flake8-import-order", "flake8-literal", "flake8-noqa", "flake8-requirements", "flake8-type-annotations", "flake8-use-fstring", "mypy", "pep8-naming"] + +[[package]] +name = "urllib3" +version = "1.26.15" +description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "urllib3-1.26.15-py2.py3-none-any.whl", hash = "sha256:aa751d169e23c7479ce47a0cb0da579e3ede798f994f5816a74e4f4500dcea42"}, + {file = "urllib3-1.26.15.tar.gz", hash = "sha256:8a388717b9476f934a21484e8c8e61875ab60644d29b9b39e11e4b9dc1c6b305"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + +[[package]] +name = "urwid" +version = "2.1.2" +description = "A full-featured console (xterm et al.) user interface library" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "urwid-2.1.2.tar.gz", hash = "sha256:588bee9c1cb208d0906a9f73c613d2bd32c3ed3702012f51efe318a3f2127eae"}, +] + +[[package]] +name = "urwid-readline" +version = "0.13" +description = "A textbox edit widget for urwid that supports readline shortcuts" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "urwid_readline-0.13.tar.gz", hash = "sha256:018020cbc864bb5ed87be17dc26b069eae2755cb29f3a9c569aac3bded1efaf4"}, +] + +[package.dependencies] +urwid = "*" + +[package.extras] +dev = ["black", "pytest"] + +[[package]] +name = "visidata" +version = "2.11" +description = "terminal interface for exploring and arranging tabular data" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "visidata-2.11-py3-none-any.whl", hash = "sha256:84fd9c31ff3bce07055bfe735d0455fca69db462db284c61b53e88e55debba77"}, + {file = "visidata-2.11.tar.gz", hash = "sha256:c09ecb65025dc9d6513bfd5e5aff9c430ffc325cc183b81abf5f2df5a96b66b3"}, +] + +[package.dependencies] +importlib-metadata = ">=3.6" +python-dateutil = "*" +windows-curses = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "watchdog" +version = "3.0.0" +description = "Filesystem events monitoring" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:336adfc6f5cc4e037d52db31194f7581ff744b67382eb6021c868322e32eef41"}, + {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a70a8dcde91be523c35b2bf96196edc5730edb347e374c7de7cd20c43ed95397"}, + {file = "watchdog-3.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:adfdeab2da79ea2f76f87eb42a3ab1966a5313e5a69a0213a3cc06ef692b0e96"}, + {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2b57a1e730af3156d13b7fdddfc23dea6487fceca29fc75c5a868beed29177ae"}, + {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7ade88d0d778b1b222adebcc0927428f883db07017618a5e684fd03b83342bd9"}, + {file = "watchdog-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7e447d172af52ad204d19982739aa2346245cc5ba6f579d16dac4bfec226d2e7"}, + {file = "watchdog-3.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9fac43a7466eb73e64a9940ac9ed6369baa39b3bf221ae23493a9ec4d0022674"}, + {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8ae9cda41fa114e28faf86cb137d751a17ffd0316d1c34ccf2235e8a84365c7f"}, + {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:25f70b4aa53bd743729c7475d7ec41093a580528b100e9a8c5b5efe8899592fc"}, + {file = "watchdog-3.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4f94069eb16657d2c6faada4624c39464f65c05606af50bb7902e036e3219be3"}, + {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7c5f84b5194c24dd573fa6472685b2a27cc5a17fe5f7b6fd40345378ca6812e3"}, + {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3aa7f6a12e831ddfe78cdd4f8996af9cf334fd6346531b16cec61c3b3c0d8da0"}, + {file = "watchdog-3.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:233b5817932685d39a7896b1090353fc8efc1ef99c9c054e46c8002561252fb8"}, + {file = "watchdog-3.0.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:13bbbb462ee42ec3c5723e1205be8ced776f05b100e4737518c67c8325cf6100"}, + {file = "watchdog-3.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8f3ceecd20d71067c7fd4c9e832d4e22584318983cabc013dbf3f70ea95de346"}, + {file = "watchdog-3.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c9d8c8ec7efb887333cf71e328e39cffbf771d8f8f95d308ea4125bf5f90ba64"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0e06ab8858a76e1219e68c7573dfeba9dd1c0219476c5a44d5333b01d7e1743a"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:d00e6be486affb5781468457b21a6cbe848c33ef43f9ea4a73b4882e5f188a44"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:c07253088265c363d1ddf4b3cdb808d59a0468ecd017770ed716991620b8f77a"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:5113334cf8cf0ac8cd45e1f8309a603291b614191c9add34d33075727a967709"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:51f90f73b4697bac9c9a78394c3acbbd331ccd3655c11be1a15ae6fe289a8c83"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:ba07e92756c97e3aca0912b5cbc4e5ad802f4557212788e72a72a47ff376950d"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:d429c2430c93b7903914e4db9a966c7f2b068dd2ebdd2fa9b9ce094c7d459f33"}, + {file = "watchdog-3.0.0-py3-none-win32.whl", hash = "sha256:3ed7c71a9dccfe838c2f0b6314ed0d9b22e77d268c67e015450a29036a81f60f"}, + {file = "watchdog-3.0.0-py3-none-win_amd64.whl", hash = "sha256:4c9956d27be0bb08fc5f30d9d0179a855436e655f046d288e2bcc11adfae893c"}, + {file = "watchdog-3.0.0-py3-none-win_ia64.whl", hash = "sha256:5d9f3a10e02d7371cd929b5d8f11e87d4bad890212ed3901f9b4d68767bee759"}, + {file = "watchdog-3.0.0.tar.gz", hash = "sha256:4d98a320595da7a7c5a18fc48cb633c2e73cda78f93cac2ef42d42bf609a33f9"}, +] + +[package.extras] +watchmedo = ["PyYAML (>=3.10)"] + +[[package]] +name = "wcwidth" +version = "0.2.6" +description = "Measures the displayed width of unicode strings in a terminal" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "wcwidth-0.2.6-py2.py3-none-any.whl", hash = "sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e"}, + {file = "wcwidth-0.2.6.tar.gz", hash = "sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0"}, +] + +[[package]] +name = "webcolors" +version = "1.12" +description = "A library for working with color names and color values formats defined by HTML and CSS." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "webcolors-1.12-py3-none-any.whl", hash = "sha256:d98743d81d498a2d3eaf165196e65481f0d2ea85281463d856b1e51b09f62dce"}, + {file = "webcolors-1.12.tar.gz", hash = "sha256:16d043d3a08fd6a1b1b7e3e9e62640d09790dce80d2bdd4792a175b35fe794a9"}, +] + +[[package]] +name = "webencodings" +version = "0.5.1" +description = "Character encoding aliases for legacy web content" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] + +[[package]] +name = "websocket-client" +version = "1.5.1" +description = "WebSocket client for Python with low level API options" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "websocket-client-1.5.1.tar.gz", hash = "sha256:3f09e6d8230892547132177f575a4e3e73cfdf06526e20cc02aa1c3b47184d40"}, + {file = "websocket_client-1.5.1-py3-none-any.whl", hash = "sha256:cdf5877568b7e83aa7cf2244ab56a3213de587bbe0ce9d8b9600fc77b455d89e"}, +] + +[package.extras] +docs = ["Sphinx (>=3.4)", "sphinx-rtd-theme (>=0.5)"] +optional = ["python-socks", "wsaccel"] +test = ["websockets"] + +[[package]] +name = "werkzeug" +version = "2.2.3" +description = "The comprehensive WSGI web application library." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Werkzeug-2.2.3-py3-none-any.whl", hash = "sha256:56433961bc1f12533306c624f3be5e744389ac61d722175d543e1751285da612"}, + {file = "Werkzeug-2.2.3.tar.gz", hash = "sha256:2e1ccc9417d4da358b9de6f174e3ac094391ea1d4fbef2d667865d819dfd0afe"}, +] + +[package.dependencies] +MarkupSafe = ">=2.1.1" + +[package.extras] +watchdog = ["watchdog"] + +[[package]] +name = "whatthepatch" +version = "1.0.4" +description = "A patch parsing and application library." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "whatthepatch-1.0.4-py3-none-any.whl", hash = "sha256:e1261068ba4df71f72ac1b0dfd2271362691c25e8843c1fcbd170166c219f3aa"}, + {file = "whatthepatch-1.0.4.tar.gz", hash = "sha256:e95c108087845b09258ddfaf82aa13cf83ba8319475117c0909754ca8b54d742"}, +] + +[[package]] +name = "wheel" +version = "0.37.1" +description = "A built-package format for Python" +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +files = [ + {file = "wheel-0.37.1-py2.py3-none-any.whl", hash = "sha256:4bdcd7d840138086126cd09254dc6195fb4fc6f01c050a1d7236f2630db1d22a"}, + {file = "wheel-0.37.1.tar.gz", hash = "sha256:e9a504e793efbca1b8e0e9cb979a249cf4a0a7b5b8c9e8b65a5e39d49529c1c4"}, +] + +[package.extras] +test = ["pytest (>=3.0.0)", "pytest-cov"] + +[[package]] +name = "widgetsnbextension" +version = "4.0.6" +description = "Jupyter interactive widgets for Jupyter Notebook" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "widgetsnbextension-4.0.6-py3-none-any.whl", hash = "sha256:7df2bffa274b0b416c1fa0789e321451858a9e276e1220b40a16cc994192e2b7"}, + {file = "widgetsnbextension-4.0.6.tar.gz", hash = "sha256:1a07d06c881a7c16ca7ab4541b476edbe2e404f5c5f0cf524ffa2406a8bd7c80"}, +] + +[[package]] +name = "windows-curses" +version = "2.3.1" +description = "Support for the standard curses module on Windows" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "windows_curses-2.3.1-cp310-cp310-win32.whl", hash = "sha256:2644f4547ae5124ce5129b66faa59ee0995b7b7205ed5e3920f6ecfef2e46275"}, + {file = "windows_curses-2.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:8b541520895649c0835771775034a2b4edf36da3c3d9381c5022b5b4f9a5014e"}, + {file = "windows_curses-2.3.1-cp311-cp311-win32.whl", hash = "sha256:25e7ff3d77aed6c747456b06fbc1528d67fc59d1ef3be9ca244774e65e6bdbb2"}, + {file = "windows_curses-2.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:395656bfe88d6f60cb18604605d423e0f2d1c3a8f550507dca5877a9d0b3a0f3"}, + {file = "windows_curses-2.3.1-cp36-cp36m-win32.whl", hash = "sha256:6ea8e1c4536fee248ee3f88e5010871df749932b7e829e2f012e5d23bd2fe31d"}, + {file = "windows_curses-2.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:59856b41676c4b3eb527eb6b1478803d4dc92413b2e63aea762407807ffcd3ac"}, + {file = "windows_curses-2.3.1-cp37-cp37m-win32.whl", hash = "sha256:9cd0ba6efde23930736eff45a0aa0af6fd82e60b4787a46157ef4956d2c52b06"}, + {file = "windows_curses-2.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:f9a7fcd03934e40238f9bbeddae51e3fdc442f28bca50afccdc521245ed39439"}, + {file = "windows_curses-2.3.1-cp38-cp38-win32.whl", hash = "sha256:5c55ebafdb402cfa927174a03d651cd1b1e76d6e6cf71818f9d3378636c00e74"}, + {file = "windows_curses-2.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:a551aaa09d6ec28f64ade8e85fd0c52880c8e9114729a79c34803104e49bed71"}, + {file = "windows_curses-2.3.1-cp39-cp39-win32.whl", hash = "sha256:aab7e28133bf81769cddf8b3c3c8ab89e76cd43effd371c6370e918b6dfccf1b"}, + {file = "windows_curses-2.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:85675de4ae7058348140daae83a8a7b81147a84ef9ab699307b3168f9490292f"}, +] + +[[package]] +name = "wirerope" +version = "0.4.7" +description = "'Turn functions and methods into fully controllable objects'" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "wirerope-0.4.7.tar.gz", hash = "sha256:f3961039218276283c5037da0fa164619def0327595f10892d562a61a8603990"}, +] + +[package.dependencies] +six = ">=1.11.0" + +[package.extras] +doc = ["sphinx"] +test = ["pytest (>=4.6.7)", "pytest-cov (>=2.6.1)"] + +[[package]] +name = "wrapt" +version = "1.15.0" +description = "Module for decorators, wrappers and monkey patching." +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +files = [ + {file = "wrapt-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a"}, + {file = "wrapt-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923"}, + {file = "wrapt-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975"}, + {file = "wrapt-1.15.0-cp310-cp310-win32.whl", hash = "sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1"}, + {file = "wrapt-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e"}, + {file = "wrapt-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7"}, + {file = "wrapt-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98"}, + {file = "wrapt-1.15.0-cp311-cp311-win32.whl", hash = "sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416"}, + {file = "wrapt-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248"}, + {file = "wrapt-1.15.0-cp35-cp35m-win32.whl", hash = "sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559"}, + {file = "wrapt-1.15.0-cp35-cp35m-win_amd64.whl", hash = "sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639"}, + {file = "wrapt-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2"}, + {file = "wrapt-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1"}, + {file = "wrapt-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420"}, + {file = "wrapt-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653"}, + {file = "wrapt-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0"}, + {file = "wrapt-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e"}, + {file = "wrapt-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145"}, + {file = "wrapt-1.15.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7"}, + {file = "wrapt-1.15.0-cp38-cp38-win32.whl", hash = "sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b"}, + {file = "wrapt-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1"}, + {file = "wrapt-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86"}, + {file = "wrapt-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9"}, + {file = "wrapt-1.15.0-cp39-cp39-win32.whl", hash = "sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff"}, + {file = "wrapt-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6"}, + {file = "wrapt-1.15.0-py3-none-any.whl", hash = "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640"}, + {file = "wrapt-1.15.0.tar.gz", hash = "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a"}, +] + +[[package]] +name = "y-py" +version = "0.5.9" +description = "Python bindings for the Y-CRDT built from yrs (Rust)" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "y_py-0.5.9-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:afa9a11aa2880dd8689894f3269b653e6d3bd1956963d5329be9a5bf021dab62"}, + {file = "y_py-0.5.9-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:e370ce076781adea161b04d2f666e8b4f89bc7e8927ef842fbb0283d3bfa73e0"}, + {file = "y_py-0.5.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b67dad339f9b6701f74ff7a6e901c7909eca4eea02cf955b28d87a42650bd1be"}, + {file = "y_py-0.5.9-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ae82a6d9cbaff8cb7505e81b5b7f9cd7756bb7e7110aef7914375fe56b012a90"}, + {file = "y_py-0.5.9-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c7ca64a2a97f708569dcabd55865915943e30267bf6d26c4d212d005951efe62"}, + {file = "y_py-0.5.9-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55098440e32339c2dc3d652fb36bb77a4927dee5fd4ab0cb1fe12fdd163fd4f5"}, + {file = "y_py-0.5.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc9052a814e8b7ec756371a191f38de68b956437e0bb429c2dd503e658f298f9"}, + {file = "y_py-0.5.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:95d13b38c9055d607565b77cbae12e2bf0c1671c5cb8f2ee2e1230d41d2d6d34"}, + {file = "y_py-0.5.9-cp310-none-win32.whl", hash = "sha256:5dbd8d177ec7b9fef4a7b6d22eb2f8d5606fd5aac31cf2eab0dc18f0b3504c7c"}, + {file = "y_py-0.5.9-cp310-none-win_amd64.whl", hash = "sha256:d373c6bb8e21d5f7ec0833b76fa1ab480086ada602ef5bbf4724a25a21a00b6a"}, + {file = "y_py-0.5.9-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:f8f238144a302f17eb26b122cad9382fcff5ec6653b8a562130b9a5e44010098"}, + {file = "y_py-0.5.9-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:25637e3d011ca6f877a24f3083ff2549d1d619406d7e8a1455c445527205046c"}, + {file = "y_py-0.5.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ffebe5e62cbfee6e24593927dedba77dc13ac4cfb9c822074ab566b1fb63d59"}, + {file = "y_py-0.5.9-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b0ed760e6aa5316227a0ba2d5d29634a4ef2d72c8bc55169ac01664e17e4b536"}, + {file = "y_py-0.5.9-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91be189fae8ba242528333e266e38d65cae3d9a09fe45867fab8578a3ddf2ea2"}, + {file = "y_py-0.5.9-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3ae6d22b7cc599220a26b06da6ead9fd582eea5fdb6273b06fa3f060d0a26a7"}, + {file = "y_py-0.5.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:065f90501cf008375d70be6ce72dd41745e09d088f0b545f5f914d2c3f04f7ae"}, + {file = "y_py-0.5.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:742c486d5b792c4ad76e09426161302edddca85efe826fa01dcee50907326cd7"}, + {file = "y_py-0.5.9-cp311-none-win32.whl", hash = "sha256:2692c808bf28f797f8d693f45dc86563ac3b1626579f67ce9546dca69644d687"}, + {file = "y_py-0.5.9-cp311-none-win_amd64.whl", hash = "sha256:c1f5f287cc7ae127ed6a2fb1546e631b316a41d087d7d2db9caa3e5f59906dcf"}, + {file = "y_py-0.5.9-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:9a59603cf42c20d02ee5add2e3d0ce48e89c480a2a02f642fb77f142c4f37958"}, + {file = "y_py-0.5.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b44473bb32217c78e18db66f497f6c8be33e339bab5f52398bb2468c904d5140"}, + {file = "y_py-0.5.9-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1906f13e8d5ebfbd9c7948f57bc6f6f53b451b19c99350f42a0f648147a8acfe"}, + {file = "y_py-0.5.9-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:202b2a3e42e0a1eaedee26f8a3bc73cd9f994c4c2b15511ea56b9838178eb380"}, + {file = "y_py-0.5.9-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13b9d2959d9a26536b6ad118fb026ff19bd79da52e4addf6f3a562e7c01d516e"}, + {file = "y_py-0.5.9-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff3ddedaa95284f4f22a92b362f658f3d92f272d8c0fa009051bd5490c4d5a04"}, + {file = "y_py-0.5.9-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:85585e669d7679126e4a04e4bc0a063a641175a74eecfe47539e8da3e5b1da6e"}, + {file = "y_py-0.5.9-cp37-none-win32.whl", hash = "sha256:caf9b1feb69379d424a1d3d7c899b8e0389a3fb3131d39c3c03dcc3d4a93dbdc"}, + {file = "y_py-0.5.9-cp37-none-win_amd64.whl", hash = "sha256:7353af0e9c1f42fbf0ab340e253eeb333d58c890fa91d3eadb1b9adaf9336732"}, + {file = "y_py-0.5.9-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:ed0fd5265905cc7e23709479bc152d69f4972dec32fa322d20cb77f749707e78"}, + {file = "y_py-0.5.9-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:db1ac7f2d1862eb4c448cf76183399d555a63dbe2452bafecb1c2f691e36d687"}, + {file = "y_py-0.5.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa685f7e43ce490dfb1e392ac48f584b75cd21f05dc526c160d15308236ce8a0"}, + {file = "y_py-0.5.9-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c42f3a6cd20153925b00c49af855a3277989d411bb8ea849095be943ee160821"}, + {file = "y_py-0.5.9-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:753aaae817d658a1e9d271663439d8e83d9d8effa45590ecdcadc600c7cf77e3"}, + {file = "y_py-0.5.9-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc8e5f38842a4b043c9592bfa9a740147ddb8fac2d7a5b7bf6d52466c090ec23"}, + {file = "y_py-0.5.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecd3cb0d13ac92e7b9235d1024dba9af0788161246f12dcf1f635d634ccb206a"}, + {file = "y_py-0.5.9-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9983e99e3a61452b39ffce98206c7e4c6d260f4e917c8fe53fb54aaf25df89a3"}, + {file = "y_py-0.5.9-cp38-none-win32.whl", hash = "sha256:63ef8e5b76cd54578a7fd5f72d8c698d9ccd7c555c7900ebfd38a24d397c3b15"}, + {file = "y_py-0.5.9-cp38-none-win_amd64.whl", hash = "sha256:fe70d0134fe2115c08866f0cac0eb5c0788093872b5026eb438a74e1ebafd659"}, + {file = "y_py-0.5.9-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:05f805b58422d5d7c8e7e8e2141d1c3cac4daaa4557ae6a9b84b141fe8d6289e"}, + {file = "y_py-0.5.9-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:a7977eeaceaeb0dfffcc5643c985c337ebc33a0b1d792ae0a9b1331cdd97366f"}, + {file = "y_py-0.5.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:800e73d2110b97a74c52db2c8ce03a78e96f0d66a7e0c87d8254170a67c2db0e"}, + {file = "y_py-0.5.9-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:add793f5f5c7c7a3eb1b09ffc771bdaae10a0bd482a370bf696b83f8dee8d1b4"}, + {file = "y_py-0.5.9-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8b67ae37af8aac6160fda66c0f73bcdf65c06da9022eb76192c3fc45cfab994"}, + {file = "y_py-0.5.9-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2532ea5aefb223fd688c93860199d348a7601d814aac9e8784d816314588ddeb"}, + {file = "y_py-0.5.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df78a0409dca11554a4b6442d7a8e61f762c3cfc78d55d98352392869a6b9ae0"}, + {file = "y_py-0.5.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d2da2a9e28dceab4832945a745cad507579f52b4d0c9e2f54ae156eb56875861"}, + {file = "y_py-0.5.9-cp39-none-win32.whl", hash = "sha256:fdafb93bfd5532b13a53c4090675bcd31724160017ecc73e492dc1211bc0377a"}, + {file = "y_py-0.5.9-cp39-none-win_amd64.whl", hash = "sha256:73200c59bb253b880825466717941ac57267f2f685b053e183183cb6fe82874d"}, + {file = "y_py-0.5.9-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:af6df5ec1d66ee2d962026635d60e84ad35fc01b2a1e36b993360c0ce60ae349"}, + {file = "y_py-0.5.9-pp38-pypy38_pp73-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:0c0e333c20b0a6ce4a5851203d45898ab93f16426c342420b931e190c5b71d3d"}, + {file = "y_py-0.5.9-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7434c77cd23592973ed63341b8d337e6aebaba5ed40d7f22e2d43dfd0c3a56e"}, + {file = "y_py-0.5.9-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e30fe2491d095c6d695a2c96257967fd3e2497f0f777030c8492d03c18d46e2a"}, + {file = "y_py-0.5.9-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a57d81260e048caacf43a2f851766687f53e8a8356df6947fb0eee7336a7e2de"}, + {file = "y_py-0.5.9-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d4dfc276f988175baaa4ab321c3321a16ce33db3356c9bc5f4dea0db3de55aa"}, + {file = "y_py-0.5.9-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb68445414940efe547291340e91604c7b8379b60822678ef29f4fc2a0e11c62"}, + {file = "y_py-0.5.9-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cd6f373dbf592ad83aaf95c16abebc8678928e49bd509ebd593259e1908345ae"}, + {file = "y_py-0.5.9-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:76b3480e7037ac9390c450e2aff9e46e2c9e61520c0d88afe228110ec728adc5"}, + {file = "y_py-0.5.9-pp39-pypy39_pp73-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:9484a3fc33f812234e58a5ee834b42bb0a628054d61b5c06c323aa56c12e557d"}, + {file = "y_py-0.5.9-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6d87d0c2e87990bc00c049742d36a5dbbb1510949459af17198728890ee748a"}, + {file = "y_py-0.5.9-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fce5feb57f6231376eb10d1fb68c60da106ffa0b520b3129471c466eff0304cc"}, + {file = "y_py-0.5.9-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:27c1e9a866146d250e9e16d99fe22a40c82f5b592ab85da97e5679fc3841c7ce"}, + {file = "y_py-0.5.9-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d722d6a27230c1f395535da5cee6a9a16497c6343afd262c846090075c083009"}, + {file = "y_py-0.5.9-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f54625b9ed4e787872c45d3044dcfd04c0da4258d9914f3d32308830b35246c"}, + {file = "y_py-0.5.9-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9513ae81fcc805671ae134c4c7421ca322acf92ce8b33817e1775ea8c0176973"}, + {file = "y_py-0.5.9.tar.gz", hash = "sha256:50cfa0532bcee27edb8c64743b49570e28bb76a00cd384ead1d84b6f052d9368"}, +] + +[[package]] +name = "yacs" +version = "0.1.8" +description = "Yet Another Configuration System" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "yacs-0.1.8-py2-none-any.whl", hash = "sha256:d43d1854c1ffc4634c5b349d1c1120f86f05c3a294c9d141134f282961ab5d94"}, + {file = "yacs-0.1.8-py3-none-any.whl", hash = "sha256:99f893e30497a4b66842821bac316386f7bd5c4f47ad35c9073ef089aa33af32"}, + {file = "yacs-0.1.8.tar.gz", hash = "sha256:efc4c732942b3103bea904ee89af98bcd27d01f0ac12d8d4d369f1e7a2914384"}, +] + +[package.dependencies] +PyYAML = "*" + +[[package]] +name = "yapf" +version = "0.32.0" +description = "A formatter for Python code." +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "yapf-0.32.0-py2.py3-none-any.whl", hash = "sha256:8fea849025584e486fd06d6ba2bed717f396080fd3cc236ba10cb97c4c51cf32"}, + {file = "yapf-0.32.0.tar.gz", hash = "sha256:a3f5085d37ef7e3e004c4ba9f9b3e40c54ff1901cd111f05145ae313a7c67d1b"}, +] + +[[package]] +name = "yarl" +version = "1.8.2" +description = "Yet another URL library" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "yarl-1.8.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:bb81f753c815f6b8e2ddd2eef3c855cf7da193b82396ac013c661aaa6cc6b0a5"}, + {file = "yarl-1.8.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:47d49ac96156f0928f002e2424299b2c91d9db73e08c4cd6742923a086f1c863"}, + {file = "yarl-1.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3fc056e35fa6fba63248d93ff6e672c096f95f7836938241ebc8260e062832fe"}, + {file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58a3c13d1c3005dbbac5c9f0d3210b60220a65a999b1833aa46bd6677c69b08e"}, + {file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10b08293cda921157f1e7c2790999d903b3fd28cd5c208cf8826b3b508026996"}, + {file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de986979bbd87272fe557e0a8fcb66fd40ae2ddfe28a8b1ce4eae22681728fef"}, + {file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c4fcfa71e2c6a3cb568cf81aadc12768b9995323186a10827beccf5fa23d4f8"}, + {file = "yarl-1.8.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae4d7ff1049f36accde9e1ef7301912a751e5bae0a9d142459646114c70ecba6"}, + {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:bf071f797aec5b96abfc735ab97da9fd8f8768b43ce2abd85356a3127909d146"}, + {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:74dece2bfc60f0f70907c34b857ee98f2c6dd0f75185db133770cd67300d505f"}, + {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:df60a94d332158b444301c7f569659c926168e4d4aad2cfbf4bce0e8fb8be826"}, + {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:63243b21c6e28ec2375f932a10ce7eda65139b5b854c0f6b82ed945ba526bff3"}, + {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cfa2bbca929aa742b5084fd4663dd4b87c191c844326fcb21c3afd2d11497f80"}, + {file = "yarl-1.8.2-cp310-cp310-win32.whl", hash = "sha256:b05df9ea7496df11b710081bd90ecc3a3db6adb4fee36f6a411e7bc91a18aa42"}, + {file = "yarl-1.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:24ad1d10c9db1953291f56b5fe76203977f1ed05f82d09ec97acb623a7976574"}, + {file = "yarl-1.8.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2a1fca9588f360036242f379bfea2b8b44cae2721859b1c56d033adfd5893634"}, + {file = "yarl-1.8.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f37db05c6051eff17bc832914fe46869f8849de5b92dc4a3466cd63095d23dfd"}, + {file = "yarl-1.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:77e913b846a6b9c5f767b14dc1e759e5aff05502fe73079f6f4176359d832581"}, + {file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0978f29222e649c351b173da2b9b4665ad1feb8d1daa9d971eb90df08702668a"}, + {file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:388a45dc77198b2460eac0aca1efd6a7c09e976ee768b0d5109173e521a19daf"}, + {file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2305517e332a862ef75be8fad3606ea10108662bc6fe08509d5ca99503ac2aee"}, + {file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42430ff511571940d51e75cf42f1e4dbdded477e71c1b7a17f4da76c1da8ea76"}, + {file = "yarl-1.8.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3150078118f62371375e1e69b13b48288e44f6691c1069340081c3fd12c94d5b"}, + {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c15163b6125db87c8f53c98baa5e785782078fbd2dbeaa04c6141935eb6dab7a"}, + {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4d04acba75c72e6eb90745447d69f84e6c9056390f7a9724605ca9c56b4afcc6"}, + {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e7fd20d6576c10306dea2d6a5765f46f0ac5d6f53436217913e952d19237efc4"}, + {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:75c16b2a900b3536dfc7014905a128a2bea8fb01f9ee26d2d7d8db0a08e7cb2c"}, + {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6d88056a04860a98341a0cf53e950e3ac9f4e51d1b6f61a53b0609df342cc8b2"}, + {file = "yarl-1.8.2-cp311-cp311-win32.whl", hash = "sha256:fb742dcdd5eec9f26b61224c23baea46c9055cf16f62475e11b9b15dfd5c117b"}, + {file = "yarl-1.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:8c46d3d89902c393a1d1e243ac847e0442d0196bbd81aecc94fcebbc2fd5857c"}, + {file = "yarl-1.8.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ceff9722e0df2e0a9e8a79c610842004fa54e5b309fe6d218e47cd52f791d7ef"}, + {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f6b4aca43b602ba0f1459de647af954769919c4714706be36af670a5f44c9c1"}, + {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1684a9bd9077e922300ecd48003ddae7a7474e0412bea38d4631443a91d61077"}, + {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ebb78745273e51b9832ef90c0898501006670d6e059f2cdb0e999494eb1450c2"}, + {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3adeef150d528ded2a8e734ebf9ae2e658f4c49bf413f5f157a470e17a4a2e89"}, + {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57a7c87927a468e5a1dc60c17caf9597161d66457a34273ab1760219953f7f4c"}, + {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:efff27bd8cbe1f9bd127e7894942ccc20c857aa8b5a0327874f30201e5ce83d0"}, + {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a783cd344113cb88c5ff7ca32f1f16532a6f2142185147822187913eb989f739"}, + {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:705227dccbe96ab02c7cb2c43e1228e2826e7ead880bb19ec94ef279e9555b5b"}, + {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:34c09b43bd538bf6c4b891ecce94b6fa4f1f10663a8d4ca589a079a5018f6ed7"}, + {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a48f4f7fea9a51098b02209d90297ac324241bf37ff6be6d2b0149ab2bd51b37"}, + {file = "yarl-1.8.2-cp37-cp37m-win32.whl", hash = "sha256:0414fd91ce0b763d4eadb4456795b307a71524dbacd015c657bb2a39db2eab89"}, + {file = "yarl-1.8.2-cp37-cp37m-win_amd64.whl", hash = "sha256:d881d152ae0007809c2c02e22aa534e702f12071e6b285e90945aa3c376463c5"}, + {file = "yarl-1.8.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5df5e3d04101c1e5c3b1d69710b0574171cc02fddc4b23d1b2813e75f35a30b1"}, + {file = "yarl-1.8.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7a66c506ec67eb3159eea5096acd05f5e788ceec7b96087d30c7d2865a243918"}, + {file = "yarl-1.8.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2b4fa2606adf392051d990c3b3877d768771adc3faf2e117b9de7eb977741229"}, + {file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e21fb44e1eff06dd6ef971d4bdc611807d6bd3691223d9c01a18cec3677939e"}, + {file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93202666046d9edadfe9f2e7bf5e0782ea0d497b6d63da322e541665d65a044e"}, + {file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fc77086ce244453e074e445104f0ecb27530d6fd3a46698e33f6c38951d5a0f1"}, + {file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64dd68a92cab699a233641f5929a40f02a4ede8c009068ca8aa1fe87b8c20ae3"}, + {file = "yarl-1.8.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1b372aad2b5f81db66ee7ec085cbad72c4da660d994e8e590c997e9b01e44901"}, + {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e6f3515aafe0209dd17fb9bdd3b4e892963370b3de781f53e1746a521fb39fc0"}, + {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:dfef7350ee369197106805e193d420b75467b6cceac646ea5ed3049fcc950a05"}, + {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:728be34f70a190566d20aa13dc1f01dc44b6aa74580e10a3fb159691bc76909d"}, + {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:ff205b58dc2929191f68162633d5e10e8044398d7a45265f90a0f1d51f85f72c"}, + {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baf211dcad448a87a0d9047dc8282d7de59473ade7d7fdf22150b1d23859f946"}, + {file = "yarl-1.8.2-cp38-cp38-win32.whl", hash = "sha256:272b4f1599f1b621bf2aabe4e5b54f39a933971f4e7c9aa311d6d7dc06965165"}, + {file = "yarl-1.8.2-cp38-cp38-win_amd64.whl", hash = "sha256:326dd1d3caf910cd26a26ccbfb84c03b608ba32499b5d6eeb09252c920bcbe4f"}, + {file = "yarl-1.8.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f8ca8ad414c85bbc50f49c0a106f951613dfa5f948ab69c10ce9b128d368baf8"}, + {file = "yarl-1.8.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:418857f837347e8aaef682679f41e36c24250097f9e2f315d39bae3a99a34cbf"}, + {file = "yarl-1.8.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ae0eec05ab49e91a78700761777f284c2df119376e391db42c38ab46fd662b77"}, + {file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:009a028127e0a1755c38b03244c0bea9d5565630db9c4cf9572496e947137a87"}, + {file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3edac5d74bb3209c418805bda77f973117836e1de7c000e9755e572c1f7850d0"}, + {file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da65c3f263729e47351261351b8679c6429151ef9649bba08ef2528ff2c423b2"}, + {file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ef8fb25e52663a1c85d608f6dd72e19bd390e2ecaf29c17fb08f730226e3a08"}, + {file = "yarl-1.8.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bcd7bb1e5c45274af9a1dd7494d3c52b2be5e6bd8d7e49c612705fd45420b12d"}, + {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:44ceac0450e648de86da8e42674f9b7077d763ea80c8ceb9d1c3e41f0f0a9951"}, + {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:97209cc91189b48e7cfe777237c04af8e7cc51eb369004e061809bcdf4e55220"}, + {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:48dd18adcf98ea9cd721a25313aef49d70d413a999d7d89df44f469edfb38a06"}, + {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e59399dda559688461762800d7fb34d9e8a6a7444fd76ec33220a926c8be1516"}, + {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d617c241c8c3ad5c4e78a08429fa49e4b04bedfc507b34b4d8dceb83b4af3588"}, + {file = "yarl-1.8.2-cp39-cp39-win32.whl", hash = "sha256:cb6d48d80a41f68de41212f3dfd1a9d9898d7841c8f7ce6696cf2fd9cb57ef83"}, + {file = "yarl-1.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:6604711362f2dbf7160df21c416f81fac0de6dbcf0b5445a2ef25478ecc4c778"}, + {file = "yarl-1.8.2.tar.gz", hash = "sha256:49d43402c6e3013ad0978602bf6bf5328535c48d192304b91b97a3c6790b1562"}, +] + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" + +[[package]] +name = "ypy-websocket" +version = "0.8.2" +description = "WebSocket connector for Ypy" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "ypy_websocket-0.8.2-py3-none-any.whl", hash = "sha256:9049d5a7d61c26c2b5a39757c9ffcbe2274bf3553adeea8de7fe1c04671d4145"}, + {file = "ypy_websocket-0.8.2.tar.gz", hash = "sha256:491b2cc4271df4dde9be83017c15f4532b597dc43148472eb20c5aeb838a5b46"}, +] + +[package.dependencies] +aiofiles = ">=22.1.0,<23" +aiosqlite = ">=0.17.0,<1" +y-py = ">=0.5.3,<0.6.0" + +[package.extras] +test = ["mypy", "pre-commit", "pytest", "pytest-asyncio", "websockets (>=10.0)"] + +[[package]] +name = "zipp" +version = "3.15.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, + {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] + +[metadata] +lock-version = "2.0" +python-versions = ">=3.10,<3.11" +content-hash = "ac011d99b8b2769be7c7b851ba1af8f48658b7676aa4241978c66761abcf71eb" diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..2776600 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,80 @@ +[tool.poetry] +name = "ifield" +version = "0.2.0" +description = "" +authors = ["Peder Bergebakken Sundt "] + +[build-system] +requires = ["poetry-core>=1.0.0", "setuptools>=60"] +build-backend = "poetry.core.masonry.api" + +[tool.poetry.dependencies] +python = ">=3.10,<3.11" +faiss-cpu = "^1.7.3" +geomloss = "0.2.4" # 0.2.5 has no bdist on pypi +h5py = "^3.7.0" +hdf5plugin = "^4.0.1" +imageio = "^2.23.0" +jinja2 = "^3.1.2" +matplotlib = "^3.6.2" +mesh-to-sdf = {git = "https://github.com/pbsds/mesh_to_sdf", rev = "no_flip_normals"} +methodtools = "^0.4.5" +more-itertools = "^9.1.0" +munch = "^2.5.0" +numpy = "^1.23.0" +pyembree = {url = "https://folk.ntnu.no/pederbs/pypy/pep503/pyembree/pyembree-0.2.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl"} +pygame = "^2.1.2" +pykeops = "^2.1.1" +pytorch3d = [ + {url = "https://dl.fbaipublicfiles.com/pytorch3d/packaging/wheels/py310_cu116_pyt1130/pytorch3d-0.7.2-cp310-cp310-linux_x86_64.whl"}, +] +pyqt5 = "^5.15.7" +pyrender = "^0.1.45" +pytorch-lightning = "^1.8.6" +pyyaml = "^6.0" +rich = "^13.3.2" +rtree = "^1.0.1" +scikit-image = "^0.19.3" +scikit-learn = "^1.2.0" +seaborn = "^0.12.1" +serve-me-once = "^0.1.2" +torch = "^1.13.0" +torchmeta = {git = "https://github.com/pbsds/pytorch-meta", rev = "upgrade"} +torchviz = "^0.0.2" +tqdm = "^4.64.1" +trimesh = "^3.17.1" +typer = "^0.7.0" + + +[tool.poetry.dev-dependencies] +python-lsp-server = {extras = ["all"], version = "^1.6.0"} +fix-my-functions = "^0.1.3" +imageio-ffmpeg = "^0.4.7" +jupyter = "^1.0.0" +jupyter-contrib-nbextensions = "^0.7.0" +jupyterlab = "^3.5.2" +jupyterthemes = "^0.20.0" +llvmlite = "^0.39.1" # only to make poetry install the python3.10 wheels instead of building them +nbconvert = "<=6.5.0" # https://github.com/jupyter/nbconvert/issues/1894 +numba = "^0.56.4" # only to make poetry install the python3.10 wheels instead of building them +papermill = "^2.4.0" +pdoc = "^12.3.0" +pdoc3 = "^0.10.0" +ptpython = "^3.0.22" +pudb = "^2022.1.3" +remote-exec = {git = "https://github.com/pbsds/remote", rev = "whitespace-push"} # https://github.com/remote-cli/remote/pull/52 +shapely = "^2.0.0" +sympy = "^1.11.1" +tensorboard = "^2.11.0" +visidata = "^2.11" + +[tool.poetry.scripts] +show-schedule = 'ifield.utils.loss:main' +show-h5-items = 'ifield.cli_utils:show_h5_items' +show-h5-img = 'ifield.cli_utils:show_h5_img' +show-h5-scan-cloud = 'ifield.cli_utils:show_h5_scan_cloud' +show-model = 'ifield.cli_utils:show_model' +download-stanford = 'ifield.data.stanford.download:cli' +download-coseg = 'ifield.data.coseg.download:cli' +preprocess-stanford = 'ifield.data.stanford.preprocess:cli' +preprocess-coseg = 'ifield.data.coseg.preprocess:cli'