From 0e20c14a54e37a15f93792541d9101c01c819a31 Mon Sep 17 00:00:00 2001 From: d33bs Date: Fri, 5 Jan 2024 09:58:57 -0700 Subject: [PATCH 01/53] add initial scaffold --- .gitignore | 3 + .pre-commit-config.yaml | 27 ++ README.md | 3 +- build/docker/Dockerfile | 22 ++ poetry.lock | 545 ++++++++++++++++++++++++++++++++++ pyproject.toml | 18 ++ src/pymaccounting/__init__.py | 0 7 files changed, 617 insertions(+), 1 deletion(-) create mode 100644 .pre-commit-config.yaml create mode 100644 build/docker/Dockerfile create mode 100644 poetry.lock create mode 100644 pyproject.toml create mode 100644 src/pymaccounting/__init__.py diff --git a/.gitignore b/.gitignore index 68bc17f..281bd61 100644 --- a/.gitignore +++ b/.gitignore @@ -158,3 +158,6 @@ cython_debug/ # and can be added to the global gitignore or merged into this file. For a more nuclear # option (not recommended) you can uncomment the following to ignore the entire idea folder. #.idea/ + +# customizations +.python-version diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..d1c4c8b --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,27 @@ +# See https://pre-commit.com for more information +# See https://pre-commit.com/hooks.html for more hooks +default_language_version: + python: python3.11 +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.5.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-added-large-files + - repo: https://github.com/codespell-project/codespell + rev: v2.2.6 + hooks: + - id: codespell + - repo: https://github.com/executablebooks/mdformat + rev: 0.7.17 + hooks: + - id: mdformat + - repo: https://github.com/hadolint/hadolint + rev: v2.12.1-beta + hooks: + - id: hadolint-docker + - repo: https://github.com/rhysd/actionlint + rev: v1.6.26 + hooks: + - id: actionlint-docker diff --git a/README.md b/README.md index 9b40998..53bf5b4 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,3 @@ # demo-python-memory-reference-accounting -Demonstrating Python memory allocator reference counting and debug + +Demonstrating Python memory allocator reference counting and debug. diff --git a/build/docker/Dockerfile b/build/docker/Dockerfile new file mode 100644 index 0000000..7f54645 --- /dev/null +++ b/build/docker/Dockerfile @@ -0,0 +1,22 @@ +# base image for running tests +FROM python:3.11 + +# set the workdir to /app +WORKDIR /app + +# copy pyproject and poetry lockfile for stepped installation +COPY pyproject.toml poetry.lock ./ + +# install poetry and poetry dynamic versioning +# hadolint ignore=DL3013 +RUN pip install --no-cache-dir poetry + +# copy the rest of the repository +COPY . . + +# install env from poetry +RUN poetry install -v --no-interaction + +# set an alias for running python through the poetry env +# hadolint ignore=DL3059 +RUN echo 'alias python="poetry run python"' >> ~/.bashrc diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..8b03dbf --- /dev/null +++ b/poetry.lock @@ -0,0 +1,545 @@ +# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. + +[[package]] +name = "anyio" +version = "4.2.0" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.8" +files = [ + {file = "anyio-4.2.0-py3-none-any.whl", hash = "sha256:745843b39e829e108e518c489b31dc757de7d2131d53fac32bd8df268227bfee"}, + {file = "anyio-4.2.0.tar.gz", hash = "sha256:e1875bb4b4e2de1669f4bc7869b6d3f54231cdced71605e6e64c9be77e3be50f"}, +] + +[package.dependencies] +exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} +idna = ">=2.8" +sniffio = ">=1.1" +typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} + +[package.extras] +doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (>=0.23)"] + +[[package]] +name = "attrs" +version = "23.2.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.7" +files = [ + {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, + {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, +] + +[package.extras] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] +tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] + +[[package]] +name = "backoff" +version = "2.2.1" +description = "Function decoration for backoff and retry" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8"}, + {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"}, +] + +[[package]] +name = "beartype" +version = "0.16.4" +description = "Unbearably fast runtime type checking in pure Python." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "beartype-0.16.4-py3-none-any.whl", hash = "sha256:64865952f9dff1e17f22684b3c7286fc79754553b47eaefeb1286224ae8c1bd9"}, + {file = "beartype-0.16.4.tar.gz", hash = "sha256:1ada89cf2d6eb30eb6e156eed2eb5493357782937910d74380918e53c2eae0bf"}, +] + +[package.extras] +all = ["typing-extensions (>=3.10.0.0)"] +dev = ["autoapi (>=0.9.0)", "coverage (>=5.5)", "mypy (>=0.800)", "numpy", "pandera", "pydata-sphinx-theme (<=0.7.2)", "pytest (>=4.0.0)", "sphinx", "sphinx (>=4.2.0,<6.0.0)", "sphinxext-opengraph (>=0.7.5)", "tox (>=3.20.1)", "typing-extensions (>=3.10.0.0)"] +doc-rtd = ["autoapi (>=0.9.0)", "pydata-sphinx-theme (<=0.7.2)", "sphinx (>=4.2.0,<6.0.0)", "sphinxext-opengraph (>=0.7.5)"] +test-tox = ["mypy (>=0.800)", "numpy", "pandera", "pytest (>=4.0.0)", "sphinx", "typing-extensions (>=3.10.0.0)"] +test-tox-coverage = ["coverage (>=5.5)"] + +[[package]] +name = "cattrs" +version = "23.2.3" +description = "Composable complex class support for attrs and dataclasses." +optional = false +python-versions = ">=3.8" +files = [ + {file = "cattrs-23.2.3-py3-none-any.whl", hash = "sha256:0341994d94971052e9ee70662542699a3162ea1e0c62f7ce1b4a57f563685108"}, + {file = "cattrs-23.2.3.tar.gz", hash = "sha256:a934090d95abaa9e911dac357e3a8699e0b4b14f8529bcc7d2b1ad9d51672b9f"}, +] + +[package.dependencies] +attrs = ">=23.1.0" +exceptiongroup = {version = ">=1.1.1", markers = "python_version < \"3.11\""} +typing-extensions = {version = ">=4.1.0,<4.6.3 || >4.6.3", markers = "python_version < \"3.11\""} + +[package.extras] +bson = ["pymongo (>=4.4.0)"] +cbor2 = ["cbor2 (>=5.4.6)"] +msgpack = ["msgpack (>=1.0.5)"] +orjson = ["orjson (>=3.9.2)"] +pyyaml = ["pyyaml (>=6.0)"] +tomlkit = ["tomlkit (>=0.11.8)"] +ujson = ["ujson (>=5.7.0)"] + +[[package]] +name = "certifi" +version = "2023.11.17" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2023.11.17-py3-none-any.whl", hash = "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474"}, + {file = "certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1"}, +] + +[[package]] +name = "dagger-io" +version = "0.9.5" +description = "A client package for running Dagger pipelines in Python." +optional = false +python-versions = ">=3.10" +files = [ + {file = "dagger_io-0.9.5-py3-none-any.whl", hash = "sha256:e7f075997af3eaef742bab9ad7c862c92c0965029679805ae12ab7a613d97fd1"}, + {file = "dagger_io-0.9.5.tar.gz", hash = "sha256:90593bb6a419f64d3c468adbbffbb907a1dd14eed9b852b65ff60a14da0b37a8"}, +] + +[package.dependencies] +anyio = ">=3.6.2" +beartype = ">=0.11.0" +cattrs = ">=22.2.0" +gql = ">=3.4.0" +graphql-core = ">=3.2.3" +httpx = ">=0.23.1" +platformdirs = ">=2.6.2" +rich = ">=10.11.0" +typing-extensions = ">=4.8.0" + +[[package]] +name = "exceptiongroup" +version = "1.2.0" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"}, + {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "gql" +version = "3.5.0" +description = "GraphQL client for Python" +optional = false +python-versions = "*" +files = [ + {file = "gql-3.5.0-py2.py3-none-any.whl", hash = "sha256:70dda5694a5b194a8441f077aa5fb70cc94e4ec08016117523f013680901ecb7"}, + {file = "gql-3.5.0.tar.gz", hash = "sha256:ccb9c5db543682b28f577069950488218ed65d4ac70bb03b6929aaadaf636de9"}, +] + +[package.dependencies] +anyio = ">=3.0,<5" +backoff = ">=1.11.1,<3.0" +graphql-core = ">=3.2,<3.3" +yarl = ">=1.6,<2.0" + +[package.extras] +aiohttp = ["aiohttp (>=3.8.0,<4)", "aiohttp (>=3.9.0b0,<4)"] +all = ["aiohttp (>=3.8.0,<4)", "aiohttp (>=3.9.0b0,<4)", "botocore (>=1.21,<2)", "httpx (>=0.23.1,<1)", "requests (>=2.26,<3)", "requests-toolbelt (>=1.0.0,<2)", "websockets (>=10,<12)"] +botocore = ["botocore (>=1.21,<2)"] +dev = ["aiofiles", "aiohttp (>=3.8.0,<4)", "aiohttp (>=3.9.0b0,<4)", "black (==22.3.0)", "botocore (>=1.21,<2)", "check-manifest (>=0.42,<1)", "flake8 (==3.8.1)", "httpx (>=0.23.1,<1)", "isort (==4.3.21)", "mock (==4.0.2)", "mypy (==0.910)", "parse (==1.15.0)", "pytest (==7.4.2)", "pytest-asyncio (==0.21.1)", "pytest-console-scripts (==1.3.1)", "pytest-cov (==3.0.0)", "requests (>=2.26,<3)", "requests-toolbelt (>=1.0.0,<2)", "sphinx (>=5.3.0,<6)", "sphinx-argparse (==0.2.5)", "sphinx-rtd-theme (>=0.4,<1)", "types-aiofiles", "types-mock", "types-requests", "vcrpy (==4.4.0)", "websockets (>=10,<12)"] +httpx = ["httpx (>=0.23.1,<1)"] +requests = ["requests (>=2.26,<3)", "requests-toolbelt (>=1.0.0,<2)"] +test = ["aiofiles", "aiohttp (>=3.8.0,<4)", "aiohttp (>=3.9.0b0,<4)", "botocore (>=1.21,<2)", "httpx (>=0.23.1,<1)", "mock (==4.0.2)", "parse (==1.15.0)", "pytest (==7.4.2)", "pytest-asyncio (==0.21.1)", "pytest-console-scripts (==1.3.1)", "pytest-cov (==3.0.0)", "requests (>=2.26,<3)", "requests-toolbelt (>=1.0.0,<2)", "vcrpy (==4.4.0)", "websockets (>=10,<12)"] +test-no-transport = ["aiofiles", "mock (==4.0.2)", "parse (==1.15.0)", "pytest (==7.4.2)", "pytest-asyncio (==0.21.1)", "pytest-console-scripts (==1.3.1)", "pytest-cov (==3.0.0)", "vcrpy (==4.4.0)"] +websockets = ["websockets (>=10,<12)"] + +[[package]] +name = "graphql-core" +version = "3.2.3" +description = "GraphQL implementation for Python, a port of GraphQL.js, the JavaScript reference implementation for GraphQL." +optional = false +python-versions = ">=3.6,<4" +files = [ + {file = "graphql-core-3.2.3.tar.gz", hash = "sha256:06d2aad0ac723e35b1cb47885d3e5c45e956a53bc1b209a9fc5369007fe46676"}, + {file = "graphql_core-3.2.3-py3-none-any.whl", hash = "sha256:5766780452bd5ec8ba133f8bf287dc92713e3868ddd83aee4faab9fc3e303dc3"}, +] + +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "httpcore" +version = "1.0.2" +description = "A minimal low-level HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpcore-1.0.2-py3-none-any.whl", hash = "sha256:096cc05bca73b8e459a1fc3dcf585148f63e534eae4339559c9b8a8d6399acc7"}, + {file = "httpcore-1.0.2.tar.gz", hash = "sha256:9fc092e4799b26174648e54b74ed5f683132a464e95643b226e00c2ed2fa6535"}, +] + +[package.dependencies] +certifi = "*" +h11 = ">=0.13,<0.15" + +[package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +trio = ["trio (>=0.22.0,<0.23.0)"] + +[[package]] +name = "httpx" +version = "0.26.0" +description = "The next generation HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpx-0.26.0-py3-none-any.whl", hash = "sha256:8915f5a3627c4d47b73e8202457cb28f1266982d1159bd5779d86a80c0eab1cd"}, + {file = "httpx-0.26.0.tar.gz", hash = "sha256:451b55c30d5185ea6b23c2c793abf9bb237d2a7dfb901ced6ff69ad37ec1dfaf"}, +] + +[package.dependencies] +anyio = "*" +certifi = "*" +httpcore = "==1.*" +idna = "*" +sniffio = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] + +[[package]] +name = "idna" +version = "3.6" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, + {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, +] + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +optional = false +python-versions = ">=3.8" +files = [ + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, +] + +[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 = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +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 = "multidict" +version = "6.0.4" +description = "multidict implementation" +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 = "platformdirs" +version = "4.1.0" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +optional = false +python-versions = ">=3.8" +files = [ + {file = "platformdirs-4.1.0-py3-none-any.whl", hash = "sha256:11c8f37bcca40db96d8144522d925583bdb7a31f7b0e37e3ed4318400a8e2380"}, + {file = "platformdirs-4.1.0.tar.gz", hash = "sha256:906d548203468492d432bcb294d4bc2fff751bf84971fbb2c10918cc206ee420"}, +] + +[package.extras] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] + +[[package]] +name = "pygments" +version = "2.17.2" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.7" +files = [ + {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, + {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, +] + +[package.extras] +plugins = ["importlib-metadata"] +windows-terminal = ["colorama (>=0.4.6)"] + +[[package]] +name = "rich" +version = "13.7.0" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "rich-13.7.0-py3-none-any.whl", hash = "sha256:6da14c108c4866ee9520bbffa71f6fe3962e193b7da68720583850cd4548e235"}, + {file = "rich-13.7.0.tar.gz", hash = "sha256:5cb5123b5cf9ee70584244246816e9114227e0b98ad9176eede6ad54bf5403fa"}, +] + +[package.dependencies] +markdown-it-py = ">=2.2.0" +pygments = ">=2.13.0,<3.0.0" + +[package.extras] +jupyter = ["ipywidgets (>=7.5.1,<9)"] + +[[package]] +name = "sniffio" +version = "1.3.0" +description = "Sniff out which async library your code is running under" +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 = "typing-extensions" +version = "4.9.0" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, + {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, +] + +[[package]] +name = "yarl" +version = "1.9.4" +description = "Yet another URL library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541"}, + {file = "yarl-1.9.4-cp310-cp310-win32.whl", hash = "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d"}, + {file = "yarl-1.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98"}, + {file = "yarl-1.9.4-cp311-cp311-win32.whl", hash = "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31"}, + {file = "yarl-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10"}, + {file = "yarl-1.9.4-cp312-cp312-win32.whl", hash = "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7"}, + {file = "yarl-1.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984"}, + {file = "yarl-1.9.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:63b20738b5aac74e239622d2fe30df4fca4942a86e31bf47a81a0e94c14df94f"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d7f7de27b8944f1fee2c26a88b4dabc2409d2fea7a9ed3df79b67277644e17"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c74018551e31269d56fab81a728f683667e7c28c04e807ba08f8c9e3bba32f14"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca06675212f94e7a610e85ca36948bb8fc023e458dd6c63ef71abfd482481aa5"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aef935237d60a51a62b86249839b51345f47564208c6ee615ed2a40878dccdd"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b134fd795e2322b7684155b7855cc99409d10b2e408056db2b93b51a52accc7"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d25039a474c4c72a5ad4b52495056f843a7ff07b632c1b92ea9043a3d9950f6e"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:957b4774373cf6f709359e5c8c4a0af9f6d7875db657adb0feaf8d6cb3c3964c"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d7eeb6d22331e2fd42fce928a81c697c9ee2d51400bd1a28803965883e13cead"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6a962e04b8f91f8c4e5917e518d17958e3bdee71fd1d8b88cdce74dd0ebbf434"}, + {file = "yarl-1.9.4-cp37-cp37m-win32.whl", hash = "sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749"}, + {file = "yarl-1.9.4-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4d7a90a92e528aadf4965d685c17dacff3df282db1121136c382dc0b6014d2"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ec61d826d80fc293ed46c9dd26995921e3a82146feacd952ef0757236fc137be"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8be9e837ea9113676e5754b43b940b50cce76d9ed7d2461df1af39a8ee674d9f"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bef596fdaa8f26e3d66af846bbe77057237cb6e8efff8cd7cc8dff9a62278bbf"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d47552b6e52c3319fede1b60b3de120fe83bde9b7bddad11a69fb0af7db32f1"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84fc30f71689d7fc9168b92788abc977dc8cefa806909565fc2951d02f6b7d57"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4aa9741085f635934f3a2583e16fcf62ba835719a8b2b28fb2917bb0537c1dfa"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:206a55215e6d05dbc6c98ce598a59e6fbd0c493e2de4ea6cc2f4934d5a18d130"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07574b007ee20e5c375a8fe4a0789fad26db905f9813be0f9fef5a68080de559"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5a2e2433eb9344a163aced6a5f6c9222c0786e5a9e9cac2c89f0b28433f56e23"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6ad6d10ed9b67a382b45f29ea028f92d25bc0bc1daf6c5b801b90b5aa70fb9ec"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6fe79f998a4052d79e1c30eeb7d6c1c1056ad33300f682465e1b4e9b5a188b78"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a825ec844298c791fd28ed14ed1bffc56a98d15b8c58a20e0e08c1f5f2bea1be"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8619d6915b3b0b34420cf9b2bb6d81ef59d984cb0fde7544e9ece32b4b3043c3"}, + {file = "yarl-1.9.4-cp38-cp38-win32.whl", hash = "sha256:686a0c2f85f83463272ddffd4deb5e591c98aac1897d65e92319f729c320eece"}, + {file = "yarl-1.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:a00862fb23195b6b8322f7d781b0dc1d82cb3bcac346d1e38689370cc1cc398b"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:604f31d97fa493083ea21bd9b92c419012531c4e17ea6da0f65cacdcf5d0bd27"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a854227cf581330ffa2c4824d96e52ee621dd571078a252c25e3a3b3d94a1b1"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ba6f52cbc7809cd8d74604cce9c14868306ae4aa0282016b641c661f981a6e91"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6327976c7c2f4ee6816eff196e25385ccc02cb81427952414a64811037bbc8b"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8397a3817d7dcdd14bb266283cd1d6fc7264a48c186b986f32e86d86d35fbac5"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0381b4ce23ff92f8170080c97678040fc5b08da85e9e292292aba67fdac6c34"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23d32a2594cb5d565d358a92e151315d1b2268bc10f4610d098f96b147370136"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddb2a5c08a4eaaba605340fdee8fc08e406c56617566d9643ad8bf6852778fc7"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:26a1dc6285e03f3cc9e839a2da83bcbf31dcb0d004c72d0730e755b33466c30e"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:18580f672e44ce1238b82f7fb87d727c4a131f3a9d33a5e0e82b793362bf18b4"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:29e0f83f37610f173eb7e7b5562dd71467993495e568e708d99e9d1944f561ec"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:1f23e4fe1e8794f74b6027d7cf19dc25f8b63af1483d91d595d4a07eca1fb26c"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db8e58b9d79200c76956cefd14d5c90af54416ff5353c5bfd7cbe58818e26ef0"}, + {file = "yarl-1.9.4-cp39-cp39-win32.whl", hash = "sha256:c7224cab95645c7ab53791022ae77a4509472613e839dab722a72abe5a684575"}, + {file = "yarl-1.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:824d6c50492add5da9374875ce72db7a0733b29c2394890aef23d533106e2b15"}, + {file = "yarl-1.9.4-py3-none-any.whl", hash = "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad"}, + {file = "yarl-1.9.4.tar.gz", hash = "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf"}, +] + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" + +[metadata] +lock-version = "2.0" +python-versions = ">=3.10,<4.0" +content-hash = "56753cb3a08d56853b1fb170490998e4e1114eab06ae9e2a0281425112ea33b2" diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..0e643d5 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,18 @@ +[tool.poetry] +name = "demo-python-memory-reference-accounting" +version = "0.0.1" +description = "Demonstrating Python memory allocator reference counting and debug." +authors = ["d33bs "] +license = "BSD-3-Clause" +readme = "README.md" +packages = [{include = "pymaccounter", from="src"}] + +[tool.poetry.dependencies] +python = ">=3.10,<4.0" +dagger-io = "^0.9.5" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" + +[tool.setuptools_scm] diff --git a/src/pymaccounting/__init__.py b/src/pymaccounting/__init__.py new file mode 100644 index 0000000..e69de29 From 1669ed0d7d3810fd3ba1beb685b7187bc9987c29 Mon Sep 17 00:00:00 2001 From: d33bs Date: Fri, 5 Jan 2024 10:01:21 -0700 Subject: [PATCH 02/53] add pre-commit checks workflow --- .github/workflows/pre-commit-checks.yaml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 .github/workflows/pre-commit-checks.yaml diff --git a/.github/workflows/pre-commit-checks.yaml b/.github/workflows/pre-commit-checks.yaml new file mode 100644 index 0000000..ab43ff1 --- /dev/null +++ b/.github/workflows/pre-commit-checks.yaml @@ -0,0 +1,19 @@ +--- +# used for running pre-commit checks +name: pre-commit checks + +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + run_pre_commit_tests: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: "3.11" + - uses: pre-commit/action@v3.0.0 From 1123ddb008d4bc87743f58f6d7b9bb23faa71278 Mon Sep 17 00:00:00 2001 From: d33bs Date: Fri, 5 Jan 2024 10:26:30 -0700 Subject: [PATCH 03/53] update linting, add pipeline and runner modules --- .pre-commit-config.yaml | 39 ++++++++++++++++++++++++++++++ poetry.lock | 2 +- pyproject.toml | 1 + src/pymaccounting/pipeline.py | 45 +++++++++++++++++++++++++++++++++++ src/pymaccounting/runner.py | 9 +++++++ 5 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 src/pymaccounting/pipeline.py create mode 100644 src/pymaccounting/runner.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index d1c4c8b..dbb56ff 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -25,3 +25,42 @@ repos: rev: v1.6.26 hooks: - id: actionlint-docker + - repo: https://github.com/adrienverge/yamllint + rev: v1.33.0 + hooks: + - id: yamllint + - repo: https://github.com/psf/black + rev: 23.12.1 + hooks: + - id: black + - repo: https://github.com/PyCQA/bandit + rev: 1.7.6 + hooks: + - id: bandit + args: ["-c", "pyproject.toml"] + additional_dependencies: ["bandit[toml]"] + - repo: https://github.com/PyCQA/isort + rev: 5.13.2 + hooks: + - id: isort + - repo: https://github.com/jendrikseipp/vulture + rev: v2.10 + hooks: + - id: vulture + - repo: https://github.com/pre-commit/mirrors-mypy + rev: v1.8.0 + hooks: + - id: mypy + - repo: https://github.com/PyCQA/pylint + rev: v3.0.3 + hooks: + - id: pylint + name: pylint + entry: pylint + language: python + types: [python] + # note: we install additional dependencies for + # pylint due to it's dynamic analysis capabilities + # and the way pre-commit references virtual environments. + additional_dependencies: + - "dagger-io" diff --git a/poetry.lock b/poetry.lock index 8b03dbf..59434ee 100644 --- a/poetry.lock +++ b/poetry.lock @@ -542,4 +542,4 @@ multidict = ">=4.0" [metadata] lock-version = "2.0" python-versions = ">=3.10,<4.0" -content-hash = "56753cb3a08d56853b1fb170490998e4e1114eab06ae9e2a0281425112ea33b2" +content-hash = "8793c9ba96a83faa6dc311a429e8488ae27e5289037a7ea56683e424837000a4" diff --git a/pyproject.toml b/pyproject.toml index 0e643d5..8521e73 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,6 +10,7 @@ packages = [{include = "pymaccounter", from="src"}] [tool.poetry.dependencies] python = ">=3.10,<4.0" dagger-io = "^0.9.5" +anyio = "^4.2.0" [build-system] requires = ["poetry-core"] diff --git a/src/pymaccounting/pipeline.py b/src/pymaccounting/pipeline.py new file mode 100644 index 0000000..3c0fd05 --- /dev/null +++ b/src/pymaccounting/pipeline.py @@ -0,0 +1,45 @@ +""" +Dagger pipelines using the Python SDK for pymaccounting +""" + +# referenced with modifications from: +# https://docs.dagger.io/sdk/python/628797/get-started + +import sys +import anyio +import dagger + + +async def test(versions): + async with dagger.Connection(dagger.Config(log_output=sys.stderr)) as client: + # get reference to the local project + src = client.host().directory(".") + + async def test_version(version: str): + python = ( + client.container() + .from_(f"python:{version}-slim-buster") + # mount cloned repository into image + .with_mounted_directory("/demo-github-actions", src) + # set current working directory for next commands + .with_workdir("/demo-github-actions") + # install test dependencies + .with_exec(["pip", "install", "poetry==1.4"]) + .with_exec(["poetry", "install"]) + # run tests + .with_exec(["poetry", "run", "python", "-m", "pytest"]) + ) + + print(f"Starting tests for Python {version}") + + # execute + await python.exit_code() + + print(f"Tests for Python {version} succeeded!") + + # when this block exits, all tasks will be awaited (i.e., executed) + async with anyio.create_task_group() as tg: + for version in versions: + tg.start_soon(test_version, version) + + print("All tasks have finished") diff --git a/src/pymaccounting/runner.py b/src/pymaccounting/runner.py new file mode 100644 index 0000000..deb7425 --- /dev/null +++ b/src/pymaccounting/runner.py @@ -0,0 +1,9 @@ +""" +Defines runner convenience functions for pymaccounting. +""" + +import anyio + + +def run_test(test_to_run: str): + anyio.run(test, test_to_run) From 0c7271a8dfde5061b920769ee66d710eb17e28bd Mon Sep 17 00:00:00 2001 From: d33bs Date: Fri, 5 Jan 2024 10:31:29 -0700 Subject: [PATCH 04/53] linting --- pyproject.toml | 9 +++++++++ src/pymaccounting/__init__.py | 5 +++++ src/pymaccounting/pipeline.py | 4 ++++ src/pymaccounting/runner.py | 7 ++++++- 4 files changed, 24 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 8521e73..7b1cf59 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,4 +16,13 @@ anyio = "^4.2.0" requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" +[tool.vulture] +min_confidence = 80 +paths = ["src"] +sort_by_size = true +verbose = true + +[tool.isort] +profile = "black" + [tool.setuptools_scm] diff --git a/src/pymaccounting/__init__.py b/src/pymaccounting/__init__.py index e69de29..c88043f 100644 --- a/src/pymaccounting/__init__.py +++ b/src/pymaccounting/__init__.py @@ -0,0 +1,5 @@ +""" +__init__.py for pymaccounting +""" + +from .runner import run_test diff --git a/src/pymaccounting/pipeline.py b/src/pymaccounting/pipeline.py index 3c0fd05..ab29253 100644 --- a/src/pymaccounting/pipeline.py +++ b/src/pymaccounting/pipeline.py @@ -6,11 +6,15 @@ # https://docs.dagger.io/sdk/python/628797/get-started import sys + import anyio import dagger async def test(versions): + """ + Dagger pipeline for running reproducible tests in python. + """ async with dagger.Connection(dagger.Config(log_output=sys.stderr)) as client: # get reference to the local project src = client.host().directory(".") diff --git a/src/pymaccounting/runner.py b/src/pymaccounting/runner.py index deb7425..69608d5 100644 --- a/src/pymaccounting/runner.py +++ b/src/pymaccounting/runner.py @@ -1,9 +1,14 @@ """ -Defines runner convenience functions for pymaccounting. +Defines runner convenience functions for pymaccounting. """ import anyio +from pymaccounting.pipeline import test + def run_test(test_to_run: str): + """ + Helper function to run dagger testing pipeline + """ anyio.run(test, test_to_run) From 66db5b72746fb3e90c037443832751629e4f11c9 Mon Sep 17 00:00:00 2001 From: d33bs Date: Fri, 5 Jan 2024 10:51:09 -0700 Subject: [PATCH 05/53] move dockerfile, add a baseline test, pipeline cfg --- .../pymaccounting/build}/docker/Dockerfile | 0 src/pymaccounting/pipeline.py | 25 ++++++------------- .../tests/baseline/test_baseline.py | 5 ++++ 3 files changed, 13 insertions(+), 17 deletions(-) rename {build => src/pymaccounting/build}/docker/Dockerfile (100%) create mode 100644 src/pymaccounting/tests/baseline/test_baseline.py diff --git a/build/docker/Dockerfile b/src/pymaccounting/build/docker/Dockerfile similarity index 100% rename from build/docker/Dockerfile rename to src/pymaccounting/build/docker/Dockerfile diff --git a/src/pymaccounting/pipeline.py b/src/pymaccounting/pipeline.py index ab29253..aced977 100644 --- a/src/pymaccounting/pipeline.py +++ b/src/pymaccounting/pipeline.py @@ -11,39 +11,30 @@ import dagger -async def test(versions): +async def test(test_to_run: str): """ Dagger pipeline for running reproducible tests in python. """ async with dagger.Connection(dagger.Config(log_output=sys.stderr)) as client: # get reference to the local project - src = client.host().directory(".") - async def test_version(version: str): + async def test_version(test_to_run: str): + # build a python container based on Dockerfile python = ( client.container() - .from_(f"python:{version}-slim-buster") - # mount cloned repository into image - .with_mounted_directory("/demo-github-actions", src) - # set current working directory for next commands - .with_workdir("/demo-github-actions") - # install test dependencies - .with_exec(["pip", "install", "poetry==1.4"]) - .with_exec(["poetry", "install"]) - # run tests - .with_exec(["poetry", "run", "python", "-m", "pytest"]) + .build(context=".", dockerfile="build/docker/Dockerfile") + .with_exec(["poetry", "run", "python", test_to_run]) ) - print(f"Starting tests for Python {version}") + print(f"Starting test for {test_to_run}") # execute await python.exit_code() - print(f"Tests for Python {version} succeeded!") + print(f"Tests for {test_to_run} succeeded!") # when this block exits, all tasks will be awaited (i.e., executed) async with anyio.create_task_group() as tg: - for version in versions: - tg.start_soon(test_version, version) + tg.start_soon(test_version, test_to_run) print("All tasks have finished") diff --git a/src/pymaccounting/tests/baseline/test_baseline.py b/src/pymaccounting/tests/baseline/test_baseline.py new file mode 100644 index 0000000..c403ade --- /dev/null +++ b/src/pymaccounting/tests/baseline/test_baseline.py @@ -0,0 +1,5 @@ +""" +A baseline test for Python memory +""" + +print("hello!") From 0026fba05e00201076c1a056e24f43b132808192 Mon Sep 17 00:00:00 2001 From: d33bs Date: Fri, 5 Jan 2024 10:52:56 -0700 Subject: [PATCH 06/53] rename / typo --- .../__init__.py | 2 +- .../pipeline.py | 2 +- src/{pymaccounting => pymaccounter}/runner.py | 4 ++-- .../tests/baseline/test_baseline.py | 0 src/pymaccounting/build/docker/Dockerfile | 22 ------------------- 5 files changed, 4 insertions(+), 26 deletions(-) rename src/{pymaccounting => pymaccounter}/__init__.py (55%) rename src/{pymaccounting => pymaccounter}/pipeline.py (95%) rename src/{pymaccounting => pymaccounter}/runner.py (62%) rename src/{pymaccounting => pymaccounter}/tests/baseline/test_baseline.py (100%) delete mode 100644 src/pymaccounting/build/docker/Dockerfile diff --git a/src/pymaccounting/__init__.py b/src/pymaccounter/__init__.py similarity index 55% rename from src/pymaccounting/__init__.py rename to src/pymaccounter/__init__.py index c88043f..c3d6c8a 100644 --- a/src/pymaccounting/__init__.py +++ b/src/pymaccounter/__init__.py @@ -1,5 +1,5 @@ """ -__init__.py for pymaccounting +__init__.py for pymaccounter """ from .runner import run_test diff --git a/src/pymaccounting/pipeline.py b/src/pymaccounter/pipeline.py similarity index 95% rename from src/pymaccounting/pipeline.py rename to src/pymaccounter/pipeline.py index aced977..c5e2b2c 100644 --- a/src/pymaccounting/pipeline.py +++ b/src/pymaccounter/pipeline.py @@ -1,5 +1,5 @@ """ -Dagger pipelines using the Python SDK for pymaccounting +Dagger pipelines using the Python SDK for pymaccounter """ # referenced with modifications from: diff --git a/src/pymaccounting/runner.py b/src/pymaccounter/runner.py similarity index 62% rename from src/pymaccounting/runner.py rename to src/pymaccounter/runner.py index 69608d5..1b5cdf2 100644 --- a/src/pymaccounting/runner.py +++ b/src/pymaccounter/runner.py @@ -1,10 +1,10 @@ """ -Defines runner convenience functions for pymaccounting. +Defines runner convenience functions for pymaccounter. """ import anyio -from pymaccounting.pipeline import test +from pymaccounter.pipeline import test def run_test(test_to_run: str): diff --git a/src/pymaccounting/tests/baseline/test_baseline.py b/src/pymaccounter/tests/baseline/test_baseline.py similarity index 100% rename from src/pymaccounting/tests/baseline/test_baseline.py rename to src/pymaccounter/tests/baseline/test_baseline.py diff --git a/src/pymaccounting/build/docker/Dockerfile b/src/pymaccounting/build/docker/Dockerfile deleted file mode 100644 index 7f54645..0000000 --- a/src/pymaccounting/build/docker/Dockerfile +++ /dev/null @@ -1,22 +0,0 @@ -# base image for running tests -FROM python:3.11 - -# set the workdir to /app -WORKDIR /app - -# copy pyproject and poetry lockfile for stepped installation -COPY pyproject.toml poetry.lock ./ - -# install poetry and poetry dynamic versioning -# hadolint ignore=DL3013 -RUN pip install --no-cache-dir poetry - -# copy the rest of the repository -COPY . . - -# install env from poetry -RUN poetry install -v --no-interaction - -# set an alias for running python through the poetry env -# hadolint ignore=DL3059 -RUN echo 'alias python="poetry run python"' >> ~/.bashrc From 49c6218c61b5a50be4bca19f7564a5c75fbfd97d Mon Sep 17 00:00:00 2001 From: d33bs Date: Fri, 5 Jan 2024 10:53:37 -0700 Subject: [PATCH 07/53] readd dockerfile --- src/pymaccounter/build/docker/Dockerfile | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/pymaccounter/build/docker/Dockerfile diff --git a/src/pymaccounter/build/docker/Dockerfile b/src/pymaccounter/build/docker/Dockerfile new file mode 100644 index 0000000..7f54645 --- /dev/null +++ b/src/pymaccounter/build/docker/Dockerfile @@ -0,0 +1,22 @@ +# base image for running tests +FROM python:3.11 + +# set the workdir to /app +WORKDIR /app + +# copy pyproject and poetry lockfile for stepped installation +COPY pyproject.toml poetry.lock ./ + +# install poetry and poetry dynamic versioning +# hadolint ignore=DL3013 +RUN pip install --no-cache-dir poetry + +# copy the rest of the repository +COPY . . + +# install env from poetry +RUN poetry install -v --no-interaction + +# set an alias for running python through the poetry env +# hadolint ignore=DL3059 +RUN echo 'alias python="poetry run python"' >> ~/.bashrc From 3bb470aa7869457a5c38e950555b7a31d244463b Mon Sep 17 00:00:00 2001 From: d33bs Date: Fri, 5 Jan 2024 11:02:33 -0700 Subject: [PATCH 08/53] Update pyproject.toml --- pyproject.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 7b1cf59..da9cad3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,6 +12,9 @@ python = ">=3.10,<4.0" dagger-io = "^0.9.5" anyio = "^4.2.0" +[tool.poetry.scripts] +run_test = 'pymaccounter.runner:run_test' + [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" From 79c6fe39af26dae7029a8b05cf852051b3f0f010 Mon Sep 17 00:00:00 2001 From: d33bs Date: Fri, 5 Jan 2024 11:32:10 -0700 Subject: [PATCH 09/53] update pipeline --- pyproject.toml | 3 --- src/pymaccounter/pipeline.py | 8 ++++++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index da9cad3..7b1cf59 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,9 +12,6 @@ python = ">=3.10,<4.0" dagger-io = "^0.9.5" anyio = "^4.2.0" -[tool.poetry.scripts] -run_test = 'pymaccounter.runner:run_test' - [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" diff --git a/src/pymaccounter/pipeline.py b/src/pymaccounter/pipeline.py index c5e2b2c..30e837b 100644 --- a/src/pymaccounter/pipeline.py +++ b/src/pymaccounter/pipeline.py @@ -20,16 +20,20 @@ async def test(test_to_run: str): async def test_version(test_to_run: str): # build a python container based on Dockerfile + print(client.host().directory(".")) python = ( client.container() - .build(context=".", dockerfile="build/docker/Dockerfile") + .build( + context=client.host().directory("."), + dockerfile="./build/docker/Dockerfile", + ) .with_exec(["poetry", "run", "python", test_to_run]) ) print(f"Starting test for {test_to_run}") # execute - await python.exit_code() + await python.sync() print(f"Tests for {test_to_run} succeeded!") From 97319d94654bf3f5866edd2cd43717f870c91869 Mon Sep 17 00:00:00 2001 From: d33bs Date: Fri, 5 Jan 2024 13:39:15 -0700 Subject: [PATCH 10/53] move dockerfile again --- {src/pymaccounter/build => build}/docker/Dockerfile | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {src/pymaccounter/build => build}/docker/Dockerfile (100%) diff --git a/src/pymaccounter/build/docker/Dockerfile b/build/docker/Dockerfile similarity index 100% rename from src/pymaccounter/build/docker/Dockerfile rename to build/docker/Dockerfile From 94e8ecc373892d0503a19627b9d6ef6df3cbaa8f Mon Sep 17 00:00:00 2001 From: d33bs Date: Fri, 5 Jan 2024 13:39:49 -0700 Subject: [PATCH 11/53] adjust pipeline for multiple input --- src/pymaccounter/pipeline.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/pymaccounter/pipeline.py b/src/pymaccounter/pipeline.py index 30e837b..94824e3 100644 --- a/src/pymaccounter/pipeline.py +++ b/src/pymaccounter/pipeline.py @@ -8,23 +8,24 @@ import sys import anyio +from typing import Union, List import dagger -async def test(test_to_run: str): +async def test(test_to_run: Union[str, List[str]]): """ Dagger pipeline for running reproducible tests in python. """ async with dagger.Connection(dagger.Config(log_output=sys.stderr)) as client: # get reference to the local project + dockerfile_dir = client.host().directory(".") async def test_version(test_to_run: str): # build a python container based on Dockerfile - print(client.host().directory(".")) python = ( client.container() .build( - context=client.host().directory("."), + context=dockerfile_dir, dockerfile="./build/docker/Dockerfile", ) .with_exec(["poetry", "run", "python", test_to_run]) @@ -41,4 +42,4 @@ async def test_version(test_to_run: str): async with anyio.create_task_group() as tg: tg.start_soon(test_version, test_to_run) - print("All tasks have finished") + print("All tests have finished") From 67a4cbb5ac8ebe501d2378d027c051cabc2199a9 Mon Sep 17 00:00:00 2001 From: d33bs Date: Fri, 5 Jan 2024 13:41:55 -0700 Subject: [PATCH 12/53] linting --- src/pymaccounter/pipeline.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pymaccounter/pipeline.py b/src/pymaccounter/pipeline.py index 94824e3..6a4734b 100644 --- a/src/pymaccounter/pipeline.py +++ b/src/pymaccounter/pipeline.py @@ -6,9 +6,9 @@ # https://docs.dagger.io/sdk/python/628797/get-started import sys +from typing import List, Union import anyio -from typing import Union, List import dagger From 48c3ca2cd9174c917559268351d82c815b6978d3 Mon Sep 17 00:00:00 2001 From: d33bs Date: Fri, 5 Jan 2024 14:09:29 -0700 Subject: [PATCH 13/53] move test; add fire; adjust for multiple input --- poetry.lock | 49 +++++++++++++++++-- pyproject.toml | 1 + src/pymaccounter/pipeline.py | 22 ++++++--- src/pymaccounter/runner.py | 11 ++++- .../tests/{baseline => }/test_baseline.py | 0 5 files changed, 69 insertions(+), 14 deletions(-) rename src/pymaccounter/tests/{baseline => }/test_baseline.py (100%) diff --git a/poetry.lock b/poetry.lock index 59434ee..70f58e4 100644 --- a/poetry.lock +++ b/poetry.lock @@ -142,6 +142,20 @@ files = [ [package.extras] test = ["pytest (>=6)"] +[[package]] +name = "fire" +version = "0.5.0" +description = "A library for automatically generating command line interfaces." +optional = false +python-versions = "*" +files = [ + {file = "fire-0.5.0.tar.gz", hash = "sha256:a6b0d49e98c8963910021f92bba66f65ab440da2982b78eb1bbf95a0a34aacc6"}, +] + +[package.dependencies] +six = "*" +termcolor = "*" + [[package]] name = "gql" version = "3.5.0" @@ -368,13 +382,13 @@ files = [ [[package]] name = "platformdirs" -version = "4.1.0" +version = "3.11.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" files = [ - {file = "platformdirs-4.1.0-py3-none-any.whl", hash = "sha256:11c8f37bcca40db96d8144522d925583bdb7a31f7b0e37e3ed4318400a8e2380"}, - {file = "platformdirs-4.1.0.tar.gz", hash = "sha256:906d548203468492d432bcb294d4bc2fff751bf84971fbb2c10918cc206ee420"}, + {file = "platformdirs-3.11.0-py3-none-any.whl", hash = "sha256:e9d171d00af68be50e9202731309c4e658fd8bc76f55c11c7dd760d023bda68e"}, + {file = "platformdirs-3.11.0.tar.gz", hash = "sha256:cf8ee52a3afdb965072dcc652433e0c7e3e40cf5ea1477cd4b3b1d2eb75495b3"}, ] [package.extras] @@ -414,6 +428,17 @@ pygments = ">=2.13.0,<3.0.0" [package.extras] jupyter = ["ipywidgets (>=7.5.1,<9)"] +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +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" @@ -425,6 +450,20 @@ files = [ {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, ] +[[package]] +name = "termcolor" +version = "2.4.0" +description = "ANSI color formatting for output in terminal" +optional = false +python-versions = ">=3.8" +files = [ + {file = "termcolor-2.4.0-py3-none-any.whl", hash = "sha256:9297c0df9c99445c2412e832e882a7884038a25617c60cea2ad69488d4040d63"}, + {file = "termcolor-2.4.0.tar.gz", hash = "sha256:aab9e56047c8ac41ed798fa36d892a37aca6b3e9159f3e0c24bc64a9b3ac7b7a"}, +] + +[package.extras] +tests = ["pytest", "pytest-cov"] + [[package]] name = "typing-extensions" version = "4.9.0" @@ -542,4 +581,4 @@ multidict = ">=4.0" [metadata] lock-version = "2.0" python-versions = ">=3.10,<4.0" -content-hash = "8793c9ba96a83faa6dc311a429e8488ae27e5289037a7ea56683e424837000a4" +content-hash = "05d9292dc72208a7d39ff19981eff46b7383b10aaaf4cffd8621e79ab428d5e2" diff --git a/pyproject.toml b/pyproject.toml index 7b1cf59..18981e6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,6 +11,7 @@ packages = [{include = "pymaccounter", from="src"}] python = ">=3.10,<4.0" dagger-io = "^0.9.5" anyio = "^4.2.0" +fire = "^0.5.0" [build-system] requires = ["poetry-core"] diff --git a/src/pymaccounter/pipeline.py b/src/pymaccounter/pipeline.py index 6a4734b..26c789a 100644 --- a/src/pymaccounter/pipeline.py +++ b/src/pymaccounter/pipeline.py @@ -12,7 +12,9 @@ import dagger -async def test(test_to_run: Union[str, List[str]]): +async def test( + tests_to_run: Union[str, List[str]], test_dir: str = "src/pymaccounter/tests" +) -> None: """ Dagger pipeline for running reproducible tests in python. """ @@ -20,26 +22,32 @@ async def test(test_to_run: Union[str, List[str]]): # get reference to the local project dockerfile_dir = client.host().directory(".") - async def test_version(test_to_run: str): - # build a python container based on Dockerfile + async def test_version(test_to_run: str, test_dir: str): + full_test_to_run = f"{test_dir}/{test_to_run}" + + # build a python container based on Dockerfile and run test python = ( client.container() .build( context=dockerfile_dir, dockerfile="./build/docker/Dockerfile", ) - .with_exec(["poetry", "run", "python", test_to_run]) + .with_exec(["poetry", "run", "python", full_test_to_run]) ) - print(f"Starting test for {test_to_run}") + print(f"Starting test for {full_test_to_run}") # execute await python.sync() - print(f"Tests for {test_to_run} succeeded!") + print(f"Tests for {full_test_to_run} succeeded!") # when this block exits, all tasks will be awaited (i.e., executed) async with anyio.create_task_group() as tg: - tg.start_soon(test_version, test_to_run) + if not isinstance(tests_to_run, list): + tests_to_run = [tests_to_run] + + for test_to_run in tests_to_run: + tg.start_soon(test_version, test_to_run, test_dir) print("All tests have finished") diff --git a/src/pymaccounter/runner.py b/src/pymaccounter/runner.py index 1b5cdf2..b958c08 100644 --- a/src/pymaccounter/runner.py +++ b/src/pymaccounter/runner.py @@ -4,11 +4,18 @@ import anyio +from typing import Union, List from pymaccounter.pipeline import test +import fire -def run_test(test_to_run: str): + +def run_test(tests_to_run: Union[str, List[str]]) -> None: """ Helper function to run dagger testing pipeline """ - anyio.run(test, test_to_run) + anyio.run(test, tests_to_run) + + +if __name__ == "__main__": + fire.Fire(run_test) diff --git a/src/pymaccounter/tests/baseline/test_baseline.py b/src/pymaccounter/tests/test_baseline.py similarity index 100% rename from src/pymaccounter/tests/baseline/test_baseline.py rename to src/pymaccounter/tests/test_baseline.py From 359f181d9c7cf5486ce06237f484a7e89112e8ab Mon Sep 17 00:00:00 2001 From: d33bs Date: Fri, 5 Jan 2024 14:18:39 -0700 Subject: [PATCH 14/53] add pandas; add debug_leak test; linting cfg --- .pre-commit-config.yaml | 1 + poetry.lock | 151 ++++++++++++++++++- pyproject.toml | 1 + src/pymaccounter/runner.py | 6 +- src/pymaccounter/tests/test_gc.debug_leak.py | 51 +++++++ 5 files changed, 206 insertions(+), 4 deletions(-) create mode 100644 src/pymaccounter/tests/test_gc.debug_leak.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index dbb56ff..f49eceb 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -64,3 +64,4 @@ repos: # and the way pre-commit references virtual environments. additional_dependencies: - "dagger-io" + - "fire" diff --git a/poetry.lock b/poetry.lock index 70f58e4..3637f81 100644 --- a/poetry.lock +++ b/poetry.lock @@ -380,6 +380,119 @@ files = [ {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, ] +[[package]] +name = "numpy" +version = "1.26.3" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numpy-1.26.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:806dd64230dbbfaca8a27faa64e2f414bf1c6622ab78cc4264f7f5f028fee3bf"}, + {file = "numpy-1.26.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02f98011ba4ab17f46f80f7f8f1c291ee7d855fcef0a5a98db80767a468c85cd"}, + {file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d45b3ec2faed4baca41c76617fcdcfa4f684ff7a151ce6fc78ad3b6e85af0a6"}, + {file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdd2b45bf079d9ad90377048e2747a0c82351989a2165821f0c96831b4a2a54b"}, + {file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:211ddd1e94817ed2d175b60b6374120244a4dd2287f4ece45d49228b4d529178"}, + {file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b1240f767f69d7c4c8a29adde2310b871153df9b26b5cb2b54a561ac85146485"}, + {file = "numpy-1.26.3-cp310-cp310-win32.whl", hash = "sha256:21a9484e75ad018974a2fdaa216524d64ed4212e418e0a551a2d83403b0531d3"}, + {file = "numpy-1.26.3-cp310-cp310-win_amd64.whl", hash = "sha256:9e1591f6ae98bcfac2a4bbf9221c0b92ab49762228f38287f6eeb5f3f55905ce"}, + {file = "numpy-1.26.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b831295e5472954104ecb46cd98c08b98b49c69fdb7040483aff799a755a7374"}, + {file = "numpy-1.26.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9e87562b91f68dd8b1c39149d0323b42e0082db7ddb8e934ab4c292094d575d6"}, + {file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c66d6fec467e8c0f975818c1796d25c53521124b7cfb760114be0abad53a0a2"}, + {file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f25e2811a9c932e43943a2615e65fc487a0b6b49218899e62e426e7f0a57eeda"}, + {file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:af36e0aa45e25c9f57bf684b1175e59ea05d9a7d3e8e87b7ae1a1da246f2767e"}, + {file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:51c7f1b344f302067b02e0f5b5d2daa9ed4a721cf49f070280ac202738ea7f00"}, + {file = "numpy-1.26.3-cp311-cp311-win32.whl", hash = "sha256:7ca4f24341df071877849eb2034948459ce3a07915c2734f1abb4018d9c49d7b"}, + {file = "numpy-1.26.3-cp311-cp311-win_amd64.whl", hash = "sha256:39763aee6dfdd4878032361b30b2b12593fb445ddb66bbac802e2113eb8a6ac4"}, + {file = "numpy-1.26.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a7081fd19a6d573e1a05e600c82a1c421011db7935ed0d5c483e9dd96b99cf13"}, + {file = "numpy-1.26.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12c70ac274b32bc00c7f61b515126c9205323703abb99cd41836e8125ea0043e"}, + {file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f784e13e598e9594750b2ef6729bcd5a47f6cfe4a12cca13def35e06d8163e3"}, + {file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f24750ef94d56ce6e33e4019a8a4d68cfdb1ef661a52cdaee628a56d2437419"}, + {file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:77810ef29e0fb1d289d225cabb9ee6cf4d11978a00bb99f7f8ec2132a84e0166"}, + {file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8ed07a90f5450d99dad60d3799f9c03c6566709bd53b497eb9ccad9a55867f36"}, + {file = "numpy-1.26.3-cp312-cp312-win32.whl", hash = "sha256:f73497e8c38295aaa4741bdfa4fda1a5aedda5473074369eca10626835445511"}, + {file = "numpy-1.26.3-cp312-cp312-win_amd64.whl", hash = "sha256:da4b0c6c699a0ad73c810736303f7fbae483bcb012e38d7eb06a5e3b432c981b"}, + {file = "numpy-1.26.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1666f634cb3c80ccbd77ec97bc17337718f56d6658acf5d3b906ca03e90ce87f"}, + {file = "numpy-1.26.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:18c3319a7d39b2c6a9e3bb75aab2304ab79a811ac0168a671a62e6346c29b03f"}, + {file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b7e807d6888da0db6e7e75838444d62495e2b588b99e90dd80c3459594e857b"}, + {file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4d362e17bcb0011738c2d83e0a65ea8ce627057b2fdda37678f4374a382a137"}, + {file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b8c275f0ae90069496068c714387b4a0eba5d531aace269559ff2b43655edd58"}, + {file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cc0743f0302b94f397a4a65a660d4cd24267439eb16493fb3caad2e4389bccbb"}, + {file = "numpy-1.26.3-cp39-cp39-win32.whl", hash = "sha256:9bc6d1a7f8cedd519c4b7b1156d98e051b726bf160715b769106661d567b3f03"}, + {file = "numpy-1.26.3-cp39-cp39-win_amd64.whl", hash = "sha256:867e3644e208c8922a3be26fc6bbf112a035f50f0a86497f98f228c50c607bb2"}, + {file = "numpy-1.26.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3c67423b3703f8fbd90f5adaa37f85b5794d3366948efe9a5190a5f3a83fc34e"}, + {file = "numpy-1.26.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46f47ee566d98849323f01b349d58f2557f02167ee301e5e28809a8c0e27a2d0"}, + {file = "numpy-1.26.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a8474703bffc65ca15853d5fd4d06b18138ae90c17c8d12169968e998e448bb5"}, + {file = "numpy-1.26.3.tar.gz", hash = "sha256:697df43e2b6310ecc9d95f05d5ef20eacc09c7c4ecc9da3f235d39e71b7da1e4"}, +] + +[[package]] +name = "pandas" +version = "2.1.4" +description = "Powerful data structures for data analysis, time series, and statistics" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pandas-2.1.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bdec823dc6ec53f7a6339a0e34c68b144a7a1fd28d80c260534c39c62c5bf8c9"}, + {file = "pandas-2.1.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:294d96cfaf28d688f30c918a765ea2ae2e0e71d3536754f4b6de0ea4a496d034"}, + {file = "pandas-2.1.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b728fb8deba8905b319f96447a27033969f3ea1fea09d07d296c9030ab2ed1d"}, + {file = "pandas-2.1.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00028e6737c594feac3c2df15636d73ace46b8314d236100b57ed7e4b9ebe8d9"}, + {file = "pandas-2.1.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:426dc0f1b187523c4db06f96fb5c8d1a845e259c99bda74f7de97bd8a3bb3139"}, + {file = "pandas-2.1.4-cp310-cp310-win_amd64.whl", hash = "sha256:f237e6ca6421265643608813ce9793610ad09b40154a3344a088159590469e46"}, + {file = "pandas-2.1.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b7d852d16c270e4331f6f59b3e9aa23f935f5c4b0ed2d0bc77637a8890a5d092"}, + {file = "pandas-2.1.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bd7d5f2f54f78164b3d7a40f33bf79a74cdee72c31affec86bfcabe7e0789821"}, + {file = "pandas-2.1.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0aa6e92e639da0d6e2017d9ccff563222f4eb31e4b2c3cf32a2a392fc3103c0d"}, + {file = "pandas-2.1.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d797591b6846b9db79e65dc2d0d48e61f7db8d10b2a9480b4e3faaddc421a171"}, + {file = "pandas-2.1.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d2d3e7b00f703aea3945995ee63375c61b2e6aa5aa7871c5d622870e5e137623"}, + {file = "pandas-2.1.4-cp311-cp311-win_amd64.whl", hash = "sha256:dc9bf7ade01143cddc0074aa6995edd05323974e6e40d9dbde081021ded8510e"}, + {file = "pandas-2.1.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:482d5076e1791777e1571f2e2d789e940dedd927325cc3cb6d0800c6304082f6"}, + {file = "pandas-2.1.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8a706cfe7955c4ca59af8c7a0517370eafbd98593155b48f10f9811da440248b"}, + {file = "pandas-2.1.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0513a132a15977b4a5b89aabd304647919bc2169eac4c8536afb29c07c23540"}, + {file = "pandas-2.1.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9f17f2b6fc076b2a0078862547595d66244db0f41bf79fc5f64a5c4d635bead"}, + {file = "pandas-2.1.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:45d63d2a9b1b37fa6c84a68ba2422dc9ed018bdaa668c7f47566a01188ceeec1"}, + {file = "pandas-2.1.4-cp312-cp312-win_amd64.whl", hash = "sha256:f69b0c9bb174a2342818d3e2778584e18c740d56857fc5cdb944ec8bbe4082cf"}, + {file = "pandas-2.1.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3f06bda01a143020bad20f7a85dd5f4a1600112145f126bc9e3e42077c24ef34"}, + {file = "pandas-2.1.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab5796839eb1fd62a39eec2916d3e979ec3130509930fea17fe6f81e18108f6a"}, + {file = "pandas-2.1.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edbaf9e8d3a63a9276d707b4d25930a262341bca9874fcb22eff5e3da5394732"}, + {file = "pandas-2.1.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ebfd771110b50055712b3b711b51bee5d50135429364d0498e1213a7adc2be8"}, + {file = "pandas-2.1.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8ea107e0be2aba1da619cc6ba3f999b2bfc9669a83554b1904ce3dd9507f0860"}, + {file = "pandas-2.1.4-cp39-cp39-win_amd64.whl", hash = "sha256:d65148b14788b3758daf57bf42725caa536575da2b64df9964c563b015230984"}, + {file = "pandas-2.1.4.tar.gz", hash = "sha256:fcb68203c833cc735321512e13861358079a96c174a61f5116a1de89c58c0ef7"}, +] + +[package.dependencies] +numpy = [ + {version = ">=1.22.4,<2", markers = "python_version < \"3.11\""}, + {version = ">=1.23.2,<2", markers = "python_version == \"3.11\""}, + {version = ">=1.26.0,<2", markers = "python_version >= \"3.12\""}, +] +python-dateutil = ">=2.8.2" +pytz = ">=2020.1" +tzdata = ">=2022.1" + +[package.extras] +all = ["PyQt5 (>=5.15.6)", "SQLAlchemy (>=1.4.36)", "beautifulsoup4 (>=4.11.1)", "bottleneck (>=1.3.4)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=0.8.1)", "fsspec (>=2022.05.0)", "gcsfs (>=2022.05.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.8.0)", "matplotlib (>=3.6.1)", "numba (>=0.55.2)", "numexpr (>=2.8.0)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.10)", "pandas-gbq (>=0.17.5)", "psycopg2 (>=2.9.3)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.5)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "pyxlsb (>=1.0.9)", "qtpy (>=2.2.0)", "s3fs (>=2022.05.0)", "scipy (>=1.8.1)", "tables (>=3.7.0)", "tabulate (>=0.8.10)", "xarray (>=2022.03.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.3)", "zstandard (>=0.17.0)"] +aws = ["s3fs (>=2022.05.0)"] +clipboard = ["PyQt5 (>=5.15.6)", "qtpy (>=2.2.0)"] +compression = ["zstandard (>=0.17.0)"] +computation = ["scipy (>=1.8.1)", "xarray (>=2022.03.0)"] +consortium-standard = ["dataframe-api-compat (>=0.1.7)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.0.10)", "pyxlsb (>=1.0.9)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.3)"] +feather = ["pyarrow (>=7.0.0)"] +fss = ["fsspec (>=2022.05.0)"] +gcp = ["gcsfs (>=2022.05.0)", "pandas-gbq (>=0.17.5)"] +hdf5 = ["tables (>=3.7.0)"] +html = ["beautifulsoup4 (>=4.11.1)", "html5lib (>=1.1)", "lxml (>=4.8.0)"] +mysql = ["SQLAlchemy (>=1.4.36)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.8.10)"] +parquet = ["pyarrow (>=7.0.0)"] +performance = ["bottleneck (>=1.3.4)", "numba (>=0.55.2)", "numexpr (>=2.8.0)"] +plot = ["matplotlib (>=3.6.1)"] +postgresql = ["SQLAlchemy (>=1.4.36)", "psycopg2 (>=2.9.3)"] +spss = ["pyreadstat (>=1.1.5)"] +sql-other = ["SQLAlchemy (>=1.4.36)"] +test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.8.0)"] + [[package]] name = "platformdirs" version = "3.11.0" @@ -410,6 +523,31 @@ files = [ plugins = ["importlib-metadata"] windows-terminal = ["colorama (>=0.4.6)"] +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +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 = "pytz" +version = "2023.3.post1" +description = "World timezone definitions, modern and historical" +optional = false +python-versions = "*" +files = [ + {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"}, + {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, +] + [[package]] name = "rich" version = "13.7.0" @@ -475,6 +613,17 @@ files = [ {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, ] +[[package]] +name = "tzdata" +version = "2023.4" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +files = [ + {file = "tzdata-2023.4-py2.py3-none-any.whl", hash = "sha256:aa3ace4329eeacda5b7beb7ea08ece826c28d761cda36e747cfbf97996d39bf3"}, + {file = "tzdata-2023.4.tar.gz", hash = "sha256:dd54c94f294765522c77399649b4fefd95522479a664a0cec87f41bebc6148c9"}, +] + [[package]] name = "yarl" version = "1.9.4" @@ -581,4 +730,4 @@ multidict = ">=4.0" [metadata] lock-version = "2.0" python-versions = ">=3.10,<4.0" -content-hash = "05d9292dc72208a7d39ff19981eff46b7383b10aaaf4cffd8621e79ab428d5e2" +content-hash = "84526b4e3a2b423883fabd0d404429d88a84016a8eead612f717eb80b0a9d054" diff --git a/pyproject.toml b/pyproject.toml index 18981e6..47ce154 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,6 +12,7 @@ python = ">=3.10,<4.0" dagger-io = "^0.9.5" anyio = "^4.2.0" fire = "^0.5.0" +pandas = "^2.1.4" [build-system] requires = ["poetry-core"] diff --git a/src/pymaccounter/runner.py b/src/pymaccounter/runner.py index b958c08..4ac02e3 100644 --- a/src/pymaccounter/runner.py +++ b/src/pymaccounter/runner.py @@ -2,13 +2,13 @@ Defines runner convenience functions for pymaccounter. """ +from typing import List, Union + import anyio +import fire -from typing import Union, List from pymaccounter.pipeline import test -import fire - def run_test(tests_to_run: Union[str, List[str]]) -> None: """ diff --git a/src/pymaccounter/tests/test_gc.debug_leak.py b/src/pymaccounter/tests/test_gc.debug_leak.py new file mode 100644 index 0000000..fa4bae6 --- /dev/null +++ b/src/pymaccounter/tests/test_gc.debug_leak.py @@ -0,0 +1,51 @@ +""" +Module for testing pure Python garbage collection. +""" +import gc +import sys + +import pandas as pd + +# set gc to debug leak mode +# see here for more info: +# https://docs.python.org/3/library/gc.html#gc.DEBUG_LEAK +gc.set_debug(gc.DEBUG_LEAK) + + +# modified example from: +# https://parsl.readthedocs.io/en/stable/1-parsl-introduction.html#Python-Apps +def multiply(a, b): + return a * b + + +print(multiply(5, 9)) + +# collect garbage +# see here for more info: +# https://docs.python.org/3/library/gc.html#gc.collect +collected = gc.collect() + +# list of elements which could not be collected in garbage +# see here for more info: +# https://docs.python.org/3/library/gc.html#gc.garbage +if gc.garbage: + print(f"Memory leak detected: {len(gc.garbage)} objects") + df = pd.DataFrame( + [ + { + "id": id(obj), + "type": type(obj), + "refcount": sys.getrefcount(obj), + "repr": repr(obj), + "size": sys.getsizeof(obj), + } + for obj in gc.garbage + ] + ) + + print(df.head()) + # df.to_csv("experiment_control_gc.csv") + +# else print that there was nothing to analyze +else: + print("No uncollected garbage to analyze.") From 13cec46cc7d73cd95857a3ec3e332fcb3353b2b0 Mon Sep 17 00:00:00 2001 From: d33bs Date: Fri, 5 Jan 2024 14:21:55 -0700 Subject: [PATCH 15/53] remove pandas; rename basic tests --- poetry.lock | 151 +----------------- pyproject.toml | 1 - src/pymaccounter/tests/test_gc.debug_leak.py | 51 ------ .../tests/test_multiply_gc.collect.py | 24 +++ .../tests/test_multiply_gc.debug_leak copy.py | 30 ++++ 5 files changed, 55 insertions(+), 202 deletions(-) delete mode 100644 src/pymaccounter/tests/test_gc.debug_leak.py create mode 100644 src/pymaccounter/tests/test_multiply_gc.collect.py create mode 100644 src/pymaccounter/tests/test_multiply_gc.debug_leak copy.py diff --git a/poetry.lock b/poetry.lock index 3637f81..70f58e4 100644 --- a/poetry.lock +++ b/poetry.lock @@ -380,119 +380,6 @@ files = [ {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, ] -[[package]] -name = "numpy" -version = "1.26.3" -description = "Fundamental package for array computing in Python" -optional = false -python-versions = ">=3.9" -files = [ - {file = "numpy-1.26.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:806dd64230dbbfaca8a27faa64e2f414bf1c6622ab78cc4264f7f5f028fee3bf"}, - {file = "numpy-1.26.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02f98011ba4ab17f46f80f7f8f1c291ee7d855fcef0a5a98db80767a468c85cd"}, - {file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d45b3ec2faed4baca41c76617fcdcfa4f684ff7a151ce6fc78ad3b6e85af0a6"}, - {file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdd2b45bf079d9ad90377048e2747a0c82351989a2165821f0c96831b4a2a54b"}, - {file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:211ddd1e94817ed2d175b60b6374120244a4dd2287f4ece45d49228b4d529178"}, - {file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b1240f767f69d7c4c8a29adde2310b871153df9b26b5cb2b54a561ac85146485"}, - {file = "numpy-1.26.3-cp310-cp310-win32.whl", hash = "sha256:21a9484e75ad018974a2fdaa216524d64ed4212e418e0a551a2d83403b0531d3"}, - {file = "numpy-1.26.3-cp310-cp310-win_amd64.whl", hash = "sha256:9e1591f6ae98bcfac2a4bbf9221c0b92ab49762228f38287f6eeb5f3f55905ce"}, - {file = "numpy-1.26.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b831295e5472954104ecb46cd98c08b98b49c69fdb7040483aff799a755a7374"}, - {file = "numpy-1.26.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9e87562b91f68dd8b1c39149d0323b42e0082db7ddb8e934ab4c292094d575d6"}, - {file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c66d6fec467e8c0f975818c1796d25c53521124b7cfb760114be0abad53a0a2"}, - {file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f25e2811a9c932e43943a2615e65fc487a0b6b49218899e62e426e7f0a57eeda"}, - {file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:af36e0aa45e25c9f57bf684b1175e59ea05d9a7d3e8e87b7ae1a1da246f2767e"}, - {file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:51c7f1b344f302067b02e0f5b5d2daa9ed4a721cf49f070280ac202738ea7f00"}, - {file = "numpy-1.26.3-cp311-cp311-win32.whl", hash = "sha256:7ca4f24341df071877849eb2034948459ce3a07915c2734f1abb4018d9c49d7b"}, - {file = "numpy-1.26.3-cp311-cp311-win_amd64.whl", hash = "sha256:39763aee6dfdd4878032361b30b2b12593fb445ddb66bbac802e2113eb8a6ac4"}, - {file = "numpy-1.26.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a7081fd19a6d573e1a05e600c82a1c421011db7935ed0d5c483e9dd96b99cf13"}, - {file = "numpy-1.26.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12c70ac274b32bc00c7f61b515126c9205323703abb99cd41836e8125ea0043e"}, - {file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f784e13e598e9594750b2ef6729bcd5a47f6cfe4a12cca13def35e06d8163e3"}, - {file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f24750ef94d56ce6e33e4019a8a4d68cfdb1ef661a52cdaee628a56d2437419"}, - {file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:77810ef29e0fb1d289d225cabb9ee6cf4d11978a00bb99f7f8ec2132a84e0166"}, - {file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8ed07a90f5450d99dad60d3799f9c03c6566709bd53b497eb9ccad9a55867f36"}, - {file = "numpy-1.26.3-cp312-cp312-win32.whl", hash = "sha256:f73497e8c38295aaa4741bdfa4fda1a5aedda5473074369eca10626835445511"}, - {file = "numpy-1.26.3-cp312-cp312-win_amd64.whl", hash = "sha256:da4b0c6c699a0ad73c810736303f7fbae483bcb012e38d7eb06a5e3b432c981b"}, - {file = "numpy-1.26.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1666f634cb3c80ccbd77ec97bc17337718f56d6658acf5d3b906ca03e90ce87f"}, - {file = "numpy-1.26.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:18c3319a7d39b2c6a9e3bb75aab2304ab79a811ac0168a671a62e6346c29b03f"}, - {file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b7e807d6888da0db6e7e75838444d62495e2b588b99e90dd80c3459594e857b"}, - {file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4d362e17bcb0011738c2d83e0a65ea8ce627057b2fdda37678f4374a382a137"}, - {file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b8c275f0ae90069496068c714387b4a0eba5d531aace269559ff2b43655edd58"}, - {file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cc0743f0302b94f397a4a65a660d4cd24267439eb16493fb3caad2e4389bccbb"}, - {file = "numpy-1.26.3-cp39-cp39-win32.whl", hash = "sha256:9bc6d1a7f8cedd519c4b7b1156d98e051b726bf160715b769106661d567b3f03"}, - {file = "numpy-1.26.3-cp39-cp39-win_amd64.whl", hash = "sha256:867e3644e208c8922a3be26fc6bbf112a035f50f0a86497f98f228c50c607bb2"}, - {file = "numpy-1.26.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3c67423b3703f8fbd90f5adaa37f85b5794d3366948efe9a5190a5f3a83fc34e"}, - {file = "numpy-1.26.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46f47ee566d98849323f01b349d58f2557f02167ee301e5e28809a8c0e27a2d0"}, - {file = "numpy-1.26.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a8474703bffc65ca15853d5fd4d06b18138ae90c17c8d12169968e998e448bb5"}, - {file = "numpy-1.26.3.tar.gz", hash = "sha256:697df43e2b6310ecc9d95f05d5ef20eacc09c7c4ecc9da3f235d39e71b7da1e4"}, -] - -[[package]] -name = "pandas" -version = "2.1.4" -description = "Powerful data structures for data analysis, time series, and statistics" -optional = false -python-versions = ">=3.9" -files = [ - {file = "pandas-2.1.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bdec823dc6ec53f7a6339a0e34c68b144a7a1fd28d80c260534c39c62c5bf8c9"}, - {file = "pandas-2.1.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:294d96cfaf28d688f30c918a765ea2ae2e0e71d3536754f4b6de0ea4a496d034"}, - {file = "pandas-2.1.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b728fb8deba8905b319f96447a27033969f3ea1fea09d07d296c9030ab2ed1d"}, - {file = "pandas-2.1.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00028e6737c594feac3c2df15636d73ace46b8314d236100b57ed7e4b9ebe8d9"}, - {file = "pandas-2.1.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:426dc0f1b187523c4db06f96fb5c8d1a845e259c99bda74f7de97bd8a3bb3139"}, - {file = "pandas-2.1.4-cp310-cp310-win_amd64.whl", hash = "sha256:f237e6ca6421265643608813ce9793610ad09b40154a3344a088159590469e46"}, - {file = "pandas-2.1.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b7d852d16c270e4331f6f59b3e9aa23f935f5c4b0ed2d0bc77637a8890a5d092"}, - {file = "pandas-2.1.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bd7d5f2f54f78164b3d7a40f33bf79a74cdee72c31affec86bfcabe7e0789821"}, - {file = "pandas-2.1.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0aa6e92e639da0d6e2017d9ccff563222f4eb31e4b2c3cf32a2a392fc3103c0d"}, - {file = "pandas-2.1.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d797591b6846b9db79e65dc2d0d48e61f7db8d10b2a9480b4e3faaddc421a171"}, - {file = "pandas-2.1.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d2d3e7b00f703aea3945995ee63375c61b2e6aa5aa7871c5d622870e5e137623"}, - {file = "pandas-2.1.4-cp311-cp311-win_amd64.whl", hash = "sha256:dc9bf7ade01143cddc0074aa6995edd05323974e6e40d9dbde081021ded8510e"}, - {file = "pandas-2.1.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:482d5076e1791777e1571f2e2d789e940dedd927325cc3cb6d0800c6304082f6"}, - {file = "pandas-2.1.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8a706cfe7955c4ca59af8c7a0517370eafbd98593155b48f10f9811da440248b"}, - {file = "pandas-2.1.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0513a132a15977b4a5b89aabd304647919bc2169eac4c8536afb29c07c23540"}, - {file = "pandas-2.1.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9f17f2b6fc076b2a0078862547595d66244db0f41bf79fc5f64a5c4d635bead"}, - {file = "pandas-2.1.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:45d63d2a9b1b37fa6c84a68ba2422dc9ed018bdaa668c7f47566a01188ceeec1"}, - {file = "pandas-2.1.4-cp312-cp312-win_amd64.whl", hash = "sha256:f69b0c9bb174a2342818d3e2778584e18c740d56857fc5cdb944ec8bbe4082cf"}, - {file = "pandas-2.1.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3f06bda01a143020bad20f7a85dd5f4a1600112145f126bc9e3e42077c24ef34"}, - {file = "pandas-2.1.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab5796839eb1fd62a39eec2916d3e979ec3130509930fea17fe6f81e18108f6a"}, - {file = "pandas-2.1.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edbaf9e8d3a63a9276d707b4d25930a262341bca9874fcb22eff5e3da5394732"}, - {file = "pandas-2.1.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ebfd771110b50055712b3b711b51bee5d50135429364d0498e1213a7adc2be8"}, - {file = "pandas-2.1.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8ea107e0be2aba1da619cc6ba3f999b2bfc9669a83554b1904ce3dd9507f0860"}, - {file = "pandas-2.1.4-cp39-cp39-win_amd64.whl", hash = "sha256:d65148b14788b3758daf57bf42725caa536575da2b64df9964c563b015230984"}, - {file = "pandas-2.1.4.tar.gz", hash = "sha256:fcb68203c833cc735321512e13861358079a96c174a61f5116a1de89c58c0ef7"}, -] - -[package.dependencies] -numpy = [ - {version = ">=1.22.4,<2", markers = "python_version < \"3.11\""}, - {version = ">=1.23.2,<2", markers = "python_version == \"3.11\""}, - {version = ">=1.26.0,<2", markers = "python_version >= \"3.12\""}, -] -python-dateutil = ">=2.8.2" -pytz = ">=2020.1" -tzdata = ">=2022.1" - -[package.extras] -all = ["PyQt5 (>=5.15.6)", "SQLAlchemy (>=1.4.36)", "beautifulsoup4 (>=4.11.1)", "bottleneck (>=1.3.4)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=0.8.1)", "fsspec (>=2022.05.0)", "gcsfs (>=2022.05.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.8.0)", "matplotlib (>=3.6.1)", "numba (>=0.55.2)", "numexpr (>=2.8.0)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.10)", "pandas-gbq (>=0.17.5)", "psycopg2 (>=2.9.3)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.5)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "pyxlsb (>=1.0.9)", "qtpy (>=2.2.0)", "s3fs (>=2022.05.0)", "scipy (>=1.8.1)", "tables (>=3.7.0)", "tabulate (>=0.8.10)", "xarray (>=2022.03.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.3)", "zstandard (>=0.17.0)"] -aws = ["s3fs (>=2022.05.0)"] -clipboard = ["PyQt5 (>=5.15.6)", "qtpy (>=2.2.0)"] -compression = ["zstandard (>=0.17.0)"] -computation = ["scipy (>=1.8.1)", "xarray (>=2022.03.0)"] -consortium-standard = ["dataframe-api-compat (>=0.1.7)"] -excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.0.10)", "pyxlsb (>=1.0.9)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.3)"] -feather = ["pyarrow (>=7.0.0)"] -fss = ["fsspec (>=2022.05.0)"] -gcp = ["gcsfs (>=2022.05.0)", "pandas-gbq (>=0.17.5)"] -hdf5 = ["tables (>=3.7.0)"] -html = ["beautifulsoup4 (>=4.11.1)", "html5lib (>=1.1)", "lxml (>=4.8.0)"] -mysql = ["SQLAlchemy (>=1.4.36)", "pymysql (>=1.0.2)"] -output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.8.10)"] -parquet = ["pyarrow (>=7.0.0)"] -performance = ["bottleneck (>=1.3.4)", "numba (>=0.55.2)", "numexpr (>=2.8.0)"] -plot = ["matplotlib (>=3.6.1)"] -postgresql = ["SQLAlchemy (>=1.4.36)", "psycopg2 (>=2.9.3)"] -spss = ["pyreadstat (>=1.1.5)"] -sql-other = ["SQLAlchemy (>=1.4.36)"] -test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] -xml = ["lxml (>=4.8.0)"] - [[package]] name = "platformdirs" version = "3.11.0" @@ -523,31 +410,6 @@ files = [ plugins = ["importlib-metadata"] windows-terminal = ["colorama (>=0.4.6)"] -[[package]] -name = "python-dateutil" -version = "2.8.2" -description = "Extensions to the standard Python datetime module" -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 = "pytz" -version = "2023.3.post1" -description = "World timezone definitions, modern and historical" -optional = false -python-versions = "*" -files = [ - {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"}, - {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, -] - [[package]] name = "rich" version = "13.7.0" @@ -613,17 +475,6 @@ files = [ {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, ] -[[package]] -name = "tzdata" -version = "2023.4" -description = "Provider of IANA time zone data" -optional = false -python-versions = ">=2" -files = [ - {file = "tzdata-2023.4-py2.py3-none-any.whl", hash = "sha256:aa3ace4329eeacda5b7beb7ea08ece826c28d761cda36e747cfbf97996d39bf3"}, - {file = "tzdata-2023.4.tar.gz", hash = "sha256:dd54c94f294765522c77399649b4fefd95522479a664a0cec87f41bebc6148c9"}, -] - [[package]] name = "yarl" version = "1.9.4" @@ -730,4 +581,4 @@ multidict = ">=4.0" [metadata] lock-version = "2.0" python-versions = ">=3.10,<4.0" -content-hash = "84526b4e3a2b423883fabd0d404429d88a84016a8eead612f717eb80b0a9d054" +content-hash = "05d9292dc72208a7d39ff19981eff46b7383b10aaaf4cffd8621e79ab428d5e2" diff --git a/pyproject.toml b/pyproject.toml index 47ce154..18981e6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,7 +12,6 @@ python = ">=3.10,<4.0" dagger-io = "^0.9.5" anyio = "^4.2.0" fire = "^0.5.0" -pandas = "^2.1.4" [build-system] requires = ["poetry-core"] diff --git a/src/pymaccounter/tests/test_gc.debug_leak.py b/src/pymaccounter/tests/test_gc.debug_leak.py deleted file mode 100644 index fa4bae6..0000000 --- a/src/pymaccounter/tests/test_gc.debug_leak.py +++ /dev/null @@ -1,51 +0,0 @@ -""" -Module for testing pure Python garbage collection. -""" -import gc -import sys - -import pandas as pd - -# set gc to debug leak mode -# see here for more info: -# https://docs.python.org/3/library/gc.html#gc.DEBUG_LEAK -gc.set_debug(gc.DEBUG_LEAK) - - -# modified example from: -# https://parsl.readthedocs.io/en/stable/1-parsl-introduction.html#Python-Apps -def multiply(a, b): - return a * b - - -print(multiply(5, 9)) - -# collect garbage -# see here for more info: -# https://docs.python.org/3/library/gc.html#gc.collect -collected = gc.collect() - -# list of elements which could not be collected in garbage -# see here for more info: -# https://docs.python.org/3/library/gc.html#gc.garbage -if gc.garbage: - print(f"Memory leak detected: {len(gc.garbage)} objects") - df = pd.DataFrame( - [ - { - "id": id(obj), - "type": type(obj), - "refcount": sys.getrefcount(obj), - "repr": repr(obj), - "size": sys.getsizeof(obj), - } - for obj in gc.garbage - ] - ) - - print(df.head()) - # df.to_csv("experiment_control_gc.csv") - -# else print that there was nothing to analyze -else: - print("No uncollected garbage to analyze.") diff --git a/src/pymaccounter/tests/test_multiply_gc.collect.py b/src/pymaccounter/tests/test_multiply_gc.collect.py new file mode 100644 index 0000000..9614159 --- /dev/null +++ b/src/pymaccounter/tests/test_multiply_gc.collect.py @@ -0,0 +1,24 @@ +""" +Module for testing pure Python garbage collection. +""" +import gc + + +# modified example from: +# https://parsl.readthedocs.io/en/stable/1-parsl-introduction.html#Python-Apps +def multiply(a, b): + return a * b + + +print(multiply(5, 9)) + +# collect garbage +# see here for more info: +# https://docs.python.org/3/library/gc.html#gc.collect +collected = gc.collect() + +# print the unreachable objects +print(collected) + +# print the len of gc garbage to reference unreachable objects +print(len(gc.garbage)) diff --git a/src/pymaccounter/tests/test_multiply_gc.debug_leak copy.py b/src/pymaccounter/tests/test_multiply_gc.debug_leak copy.py new file mode 100644 index 0000000..839da63 --- /dev/null +++ b/src/pymaccounter/tests/test_multiply_gc.debug_leak copy.py @@ -0,0 +1,30 @@ +""" +Module for testing pure Python garbage collection. +""" +import gc + + +# set gc to debug leak mode +# see here for more info: +# https://docs.python.org/3/library/gc.html#gc.DEBUG_LEAK +gc.set_debug(gc.DEBUG_LEAK) + + +# modified example from: +# https://parsl.readthedocs.io/en/stable/1-parsl-introduction.html#Python-Apps +def multiply(a, b): + return a * b + + +print(multiply(5, 9)) + +# collect garbage +# see here for more info: +# https://docs.python.org/3/library/gc.html#gc.collect +collected = gc.collect() + +# print the unreachable objects +print(collected) + +# print the len of gc garbage to reference unreachable objects +print(len(gc.garbage)) From e421a1b67c125bfcbe53c00a493a958c84798cd4 Mon Sep 17 00:00:00 2001 From: d33bs Date: Fri, 5 Jan 2024 14:23:45 -0700 Subject: [PATCH 16/53] add callbacks to gc test --- .../tests/test_multiply_gc.callbacks.py | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/pymaccounter/tests/test_multiply_gc.callbacks.py diff --git a/src/pymaccounter/tests/test_multiply_gc.callbacks.py b/src/pymaccounter/tests/test_multiply_gc.callbacks.py new file mode 100644 index 0000000..953dee8 --- /dev/null +++ b/src/pymaccounter/tests/test_multiply_gc.callbacks.py @@ -0,0 +1,38 @@ +""" +Module for testing pure Python garbage collection. +""" +import gc + + +# leverage gc.callbacks to show collection start and stop along with info +# see: https://docs.python.org/3/library/gc.html#gc.callbacks +def info_callback(phase, info): + if phase == "start": + print("Garbage collection started. Info: ", info, sep="\n", end="\n\n") + + elif phase == "stop": + print("Garbage collection stopped. Info: ", info, sep="\n", end="\n\n") + + +# append the callback for use by gc +gc.callbacks.append(info_callback) + + +# modified example from: +# https://parsl.readthedocs.io/en/stable/1-parsl-introduction.html#Python-Apps +def multiply(a, b): + return a * b + + +print(multiply(5, 9)) + +# collect garbage +# see here for more info: +# https://docs.python.org/3/library/gc.html#gc.collect +collected = gc.collect() + +# print the unreachable objects +print(collected) + +# print the len of gc garbage to reference unreachable objects +print(len(gc.garbage)) From 6f1f94fd2226822d72d92c7a3fc411dd491df7d4 Mon Sep 17 00:00:00 2001 From: d33bs Date: Fri, 5 Jan 2024 14:24:44 -0700 Subject: [PATCH 17/53] update docs --- src/pymaccounter/tests/test_multiply_gc.callbacks.py | 2 +- src/pymaccounter/tests/test_multiply_gc.collect.py | 2 +- src/pymaccounter/tests/test_multiply_gc.debug_leak copy.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/pymaccounter/tests/test_multiply_gc.callbacks.py b/src/pymaccounter/tests/test_multiply_gc.callbacks.py index 953dee8..79fd9b4 100644 --- a/src/pymaccounter/tests/test_multiply_gc.callbacks.py +++ b/src/pymaccounter/tests/test_multiply_gc.callbacks.py @@ -1,5 +1,5 @@ """ -Module for testing pure Python garbage collection. +Module for testing Python garbage collection with customized callbacks. """ import gc diff --git a/src/pymaccounter/tests/test_multiply_gc.collect.py b/src/pymaccounter/tests/test_multiply_gc.collect.py index 9614159..00584fa 100644 --- a/src/pymaccounter/tests/test_multiply_gc.collect.py +++ b/src/pymaccounter/tests/test_multiply_gc.collect.py @@ -1,5 +1,5 @@ """ -Module for testing pure Python garbage collection. +Module for testing Python garbage collection. """ import gc diff --git a/src/pymaccounter/tests/test_multiply_gc.debug_leak copy.py b/src/pymaccounter/tests/test_multiply_gc.debug_leak copy.py index 839da63..9707c52 100644 --- a/src/pymaccounter/tests/test_multiply_gc.debug_leak copy.py +++ b/src/pymaccounter/tests/test_multiply_gc.debug_leak copy.py @@ -1,5 +1,5 @@ """ -Module for testing pure Python garbage collection. +Module for testing Python garbage collection with DEBUG_LEAK """ import gc From 74eaab6b873afad10cd0ffdb038239df80957e75 Mon Sep 17 00:00:00 2001 From: d33bs Date: Fri, 5 Jan 2024 14:28:42 -0700 Subject: [PATCH 18/53] updates for linting --- .../tests/test_multiply_gc.callbacks.py | 13 +++++++++---- src/pymaccounter/tests/test_multiply_gc.collect.py | 7 +++++-- ..._leak copy.py => test_multiply_gc.debug_leak.py} | 6 ++++-- 3 files changed, 18 insertions(+), 8 deletions(-) rename src/pymaccounter/tests/{test_multiply_gc.debug_leak copy.py => test_multiply_gc.debug_leak.py} (84%) diff --git a/src/pymaccounter/tests/test_multiply_gc.callbacks.py b/src/pymaccounter/tests/test_multiply_gc.callbacks.py index 79fd9b4..f8962ec 100644 --- a/src/pymaccounter/tests/test_multiply_gc.callbacks.py +++ b/src/pymaccounter/tests/test_multiply_gc.callbacks.py @@ -3,10 +3,14 @@ """ import gc +# pylint: disable=R0801 + -# leverage gc.callbacks to show collection start and stop along with info -# see: https://docs.python.org/3/library/gc.html#gc.callbacks def info_callback(phase, info): + """ + Leverage gc.callbacks to show collection start and stop along with info + see: https://docs.python.org/3/library/gc.html#gc.callbacks + """ if phase == "start": print("Garbage collection started. Info: ", info, sep="\n", end="\n\n") @@ -18,9 +22,10 @@ def info_callback(phase, info): gc.callbacks.append(info_callback) -# modified example from: -# https://parsl.readthedocs.io/en/stable/1-parsl-introduction.html#Python-Apps def multiply(a, b): + """ + Basic python function + """ return a * b diff --git a/src/pymaccounter/tests/test_multiply_gc.collect.py b/src/pymaccounter/tests/test_multiply_gc.collect.py index 00584fa..e7fa486 100644 --- a/src/pymaccounter/tests/test_multiply_gc.collect.py +++ b/src/pymaccounter/tests/test_multiply_gc.collect.py @@ -3,10 +3,13 @@ """ import gc +# pylint: disable=R0801 + -# modified example from: -# https://parsl.readthedocs.io/en/stable/1-parsl-introduction.html#Python-Apps def multiply(a, b): + """ + Basic python function + """ return a * b diff --git a/src/pymaccounter/tests/test_multiply_gc.debug_leak copy.py b/src/pymaccounter/tests/test_multiply_gc.debug_leak.py similarity index 84% rename from src/pymaccounter/tests/test_multiply_gc.debug_leak copy.py rename to src/pymaccounter/tests/test_multiply_gc.debug_leak.py index 9707c52..9bd40a3 100644 --- a/src/pymaccounter/tests/test_multiply_gc.debug_leak copy.py +++ b/src/pymaccounter/tests/test_multiply_gc.debug_leak.py @@ -3,6 +3,7 @@ """ import gc +# pylint: disable=R0801 # set gc to debug leak mode # see here for more info: @@ -10,9 +11,10 @@ gc.set_debug(gc.DEBUG_LEAK) -# modified example from: -# https://parsl.readthedocs.io/en/stable/1-parsl-introduction.html#Python-Apps def multiply(a, b): + """ + Basic python function + """ return a * b From 33aeb5fdbf2bf64accedc21b1d8f55b7d3510178 Mon Sep 17 00:00:00 2001 From: d33bs Date: Sat, 6 Jan 2024 13:02:08 -0700 Subject: [PATCH 19/53] update to show the stdout from container --- src/pymaccounter/pipeline.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pymaccounter/pipeline.py b/src/pymaccounter/pipeline.py index 26c789a..4cd6878 100644 --- a/src/pymaccounter/pipeline.py +++ b/src/pymaccounter/pipeline.py @@ -37,8 +37,8 @@ async def test_version(test_to_run: str, test_dir: str): print(f"Starting test for {full_test_to_run}") - # execute - await python.sync() + # execute and show the results of the last executed command + print(await python.stdout()) print(f"Tests for {full_test_to_run} succeeded!") From d96c8446bd2eb7678a92407f1c2aa718d1c8b5b5 Mon Sep 17 00:00:00 2001 From: d33bs Date: Sat, 6 Jan 2024 16:45:09 -0700 Subject: [PATCH 20/53] change dockerfile path --- {build/docker => src/pymaccounter}/Dockerfile | 0 src/pymaccounter/pipeline.py | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename {build/docker => src/pymaccounter}/Dockerfile (100%) diff --git a/build/docker/Dockerfile b/src/pymaccounter/Dockerfile similarity index 100% rename from build/docker/Dockerfile rename to src/pymaccounter/Dockerfile diff --git a/src/pymaccounter/pipeline.py b/src/pymaccounter/pipeline.py index 4cd6878..ad27875 100644 --- a/src/pymaccounter/pipeline.py +++ b/src/pymaccounter/pipeline.py @@ -30,7 +30,7 @@ async def test_version(test_to_run: str, test_dir: str): client.container() .build( context=dockerfile_dir, - dockerfile="./build/docker/Dockerfile", + dockerfile="./src/pymaccounter/Dockerfile", ) .with_exec(["poetry", "run", "python", full_test_to_run]) ) From 6252a985fa8e2293c8c6882ec00f92de6fa1c9c9 Mon Sep 17 00:00:00 2001 From: d33bs Date: Sat, 6 Jan 2024 17:00:47 -0700 Subject: [PATCH 21/53] move to solely list-based execution --- poetry.lock | 2 +- pyproject.toml | 2 ++ src/pymaccounter/pipeline.py | 5 +---- src/pymaccounter/runner.py | 3 ++- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/poetry.lock b/poetry.lock index 70f58e4..224a52f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -581,4 +581,4 @@ multidict = ">=4.0" [metadata] lock-version = "2.0" python-versions = ">=3.10,<4.0" -content-hash = "05d9292dc72208a7d39ff19981eff46b7383b10aaaf4cffd8621e79ab428d5e2" +content-hash = "da21d8a152e18f8397428dc88ef78f5488d460fcc50dd2bd45c799b3afbc1e7c" diff --git a/pyproject.toml b/pyproject.toml index 18981e6..04be1f8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,6 +9,8 @@ packages = [{include = "pymaccounter", from="src"}] [tool.poetry.dependencies] python = ">=3.10,<4.0" + +[tool.poetry.group.runner.dependencies] dagger-io = "^0.9.5" anyio = "^4.2.0" fire = "^0.5.0" diff --git a/src/pymaccounter/pipeline.py b/src/pymaccounter/pipeline.py index ad27875..7ff425b 100644 --- a/src/pymaccounter/pipeline.py +++ b/src/pymaccounter/pipeline.py @@ -13,7 +13,7 @@ async def test( - tests_to_run: Union[str, List[str]], test_dir: str = "src/pymaccounter/tests" + tests_to_run: List[str], test_dir: str = "src/pymaccounter/tests" ) -> None: """ Dagger pipeline for running reproducible tests in python. @@ -44,9 +44,6 @@ async def test_version(test_to_run: str, test_dir: str): # when this block exits, all tasks will be awaited (i.e., executed) async with anyio.create_task_group() as tg: - if not isinstance(tests_to_run, list): - tests_to_run = [tests_to_run] - for test_to_run in tests_to_run: tg.start_soon(test_version, test_to_run, test_dir) diff --git a/src/pymaccounter/runner.py b/src/pymaccounter/runner.py index 4ac02e3..dcc9438 100644 --- a/src/pymaccounter/runner.py +++ b/src/pymaccounter/runner.py @@ -10,10 +10,11 @@ from pymaccounter.pipeline import test -def run_test(tests_to_run: Union[str, List[str]]) -> None: +def run_test(tests_to_run: List[str]) -> None: """ Helper function to run dagger testing pipeline """ + print(tests_to_run) anyio.run(test, tests_to_run) From d13775a9baf10b29ff90db7f606baec6c5f0ef51 Mon Sep 17 00:00:00 2001 From: d33bs Date: Sat, 6 Jan 2024 17:03:25 -0700 Subject: [PATCH 22/53] avoid the use of runner env group with tests --- src/pymaccounter/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pymaccounter/Dockerfile b/src/pymaccounter/Dockerfile index 7f54645..3821e73 100644 --- a/src/pymaccounter/Dockerfile +++ b/src/pymaccounter/Dockerfile @@ -15,7 +15,7 @@ RUN pip install --no-cache-dir poetry COPY . . # install env from poetry -RUN poetry install -v --no-interaction +RUN poetry install --without runner -v --no-interaction # set an alias for running python through the poetry env # hadolint ignore=DL3059 From b39cd386cf0fc31820e44552d2d515f97aba5a97 Mon Sep 17 00:00:00 2001 From: d33bs Date: Sat, 6 Jan 2024 17:09:08 -0700 Subject: [PATCH 23/53] add poethepoet workflow for tests --- pyproject.toml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 04be1f8..2699831 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,6 +15,17 @@ dagger-io = "^0.9.5" anyio = "^4.2.0" fire = "^0.5.0" +# define poethepoet convenience access +# to test runner workflow definition +[tool.poe.tasks.run_all_tests] +cmd = """ +python src/pymaccounter/runner.py \ +'["test_baseline.py", \ +"test_multiply_gc.collect.py", \ +"test_multiply_gc.debug_leak.py", \ +"test_multiply_gc.callbacks.py"]' +""" + [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" From eb0373057e7ce955dabdd3ff388f3fedf769c1f2 Mon Sep 17 00:00:00 2001 From: d33bs Date: Sat, 6 Jan 2024 17:10:38 -0700 Subject: [PATCH 24/53] remove no longer used union --- src/pymaccounter/pipeline.py | 2 +- src/pymaccounter/runner.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pymaccounter/pipeline.py b/src/pymaccounter/pipeline.py index 7ff425b..1f9fdcb 100644 --- a/src/pymaccounter/pipeline.py +++ b/src/pymaccounter/pipeline.py @@ -6,7 +6,7 @@ # https://docs.dagger.io/sdk/python/628797/get-started import sys -from typing import List, Union +from typing import List import anyio import dagger diff --git a/src/pymaccounter/runner.py b/src/pymaccounter/runner.py index dcc9438..eafa552 100644 --- a/src/pymaccounter/runner.py +++ b/src/pymaccounter/runner.py @@ -2,7 +2,7 @@ Defines runner convenience functions for pymaccounter. """ -from typing import List, Union +from typing import List import anyio import fire From 58438f0769427e3a3a02f5a0056df4ee14bd79df Mon Sep 17 00:00:00 2001 From: d33bs Date: Mon, 8 Jan 2024 06:37:14 -0700 Subject: [PATCH 25/53] remove print, adjust language --- src/pymaccounter/pipeline.py | 2 +- src/pymaccounter/runner.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pymaccounter/pipeline.py b/src/pymaccounter/pipeline.py index 1f9fdcb..7592bdf 100644 --- a/src/pymaccounter/pipeline.py +++ b/src/pymaccounter/pipeline.py @@ -40,7 +40,7 @@ async def test_version(test_to_run: str, test_dir: str): # execute and show the results of the last executed command print(await python.stdout()) - print(f"Tests for {full_test_to_run} succeeded!") + print(f"Tests for {full_test_to_run} complete!") # when this block exits, all tasks will be awaited (i.e., executed) async with anyio.create_task_group() as tg: diff --git a/src/pymaccounter/runner.py b/src/pymaccounter/runner.py index eafa552..c59584b 100644 --- a/src/pymaccounter/runner.py +++ b/src/pymaccounter/runner.py @@ -14,7 +14,7 @@ def run_test(tests_to_run: List[str]) -> None: """ Helper function to run dagger testing pipeline """ - print(tests_to_run) + anyio.run(test, tests_to_run) From bc89a9e2ddc764bb072f016b2392f4cf13e46a90 Mon Sep 17 00:00:00 2001 From: d33bs Date: Mon, 8 Jan 2024 12:08:06 -0700 Subject: [PATCH 26/53] simplify the prints for async ops --- src/pymaccounter/pipeline.py | 7 ++----- src/pymaccounter/tests/test_baseline.py | 2 +- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/pymaccounter/pipeline.py b/src/pymaccounter/pipeline.py index 7592bdf..e628b27 100644 --- a/src/pymaccounter/pipeline.py +++ b/src/pymaccounter/pipeline.py @@ -35,12 +35,9 @@ async def test_version(test_to_run: str, test_dir: str): .with_exec(["poetry", "run", "python", full_test_to_run]) ) - print(f"Starting test for {full_test_to_run}") - # execute and show the results of the last executed command - print(await python.stdout()) - - print(f"Tests for {full_test_to_run} complete!") + results = await python.stdout() + print(f"Test results for {full_test_to_run}:\n{results}") # when this block exits, all tasks will be awaited (i.e., executed) async with anyio.create_task_group() as tg: diff --git a/src/pymaccounter/tests/test_baseline.py b/src/pymaccounter/tests/test_baseline.py index c403ade..1e8d424 100644 --- a/src/pymaccounter/tests/test_baseline.py +++ b/src/pymaccounter/tests/test_baseline.py @@ -2,4 +2,4 @@ A baseline test for Python memory """ -print("hello!") +print("Hello! This is a quick test of a print statement!") From 8cd67fc1c2893321f4bfb855b418c00aedadb967 Mon Sep 17 00:00:00 2001 From: d33bs Date: Mon, 8 Jan 2024 12:19:38 -0700 Subject: [PATCH 27/53] add github actions workflow for running tests --- .github/workflows/run-memory-tests.yaml | 27 +++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 .github/workflows/run-memory-tests.yaml diff --git a/.github/workflows/run-memory-tests.yaml b/.github/workflows/run-memory-tests.yaml new file mode 100644 index 0000000..6e97203 --- /dev/null +++ b/.github/workflows/run-memory-tests.yaml @@ -0,0 +1,27 @@ +--- +# used for running memory checks through GitHub Actions for open observability +name: run memory tests + +on: + push: + branches: [build-demonstrations] + pull_request: + branches: [main] + +jobs: + run_memory_tests: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: "3.11" + - name: Setup poetry and poethepoet + run: | + python -m pip install poetry poethepoet + - name: Install poetry runner env + run: | + poetry install --with runner -v --no-interaction + - name: Run memory tests through Dagger pipeline + run: | + poetry poe run_all_tests From df1585e82182d92135ad35c1b7bf28b330e5ee5e Mon Sep 17 00:00:00 2001 From: d33bs Date: Mon, 8 Jan 2024 14:14:14 -0700 Subject: [PATCH 28/53] move to main for running tests --- .github/workflows/run-memory-tests.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/run-memory-tests.yaml b/.github/workflows/run-memory-tests.yaml index 6e97203..8d4f0f8 100644 --- a/.github/workflows/run-memory-tests.yaml +++ b/.github/workflows/run-memory-tests.yaml @@ -4,7 +4,7 @@ name: run memory tests on: push: - branches: [build-demonstrations] + branches: [main] pull_request: branches: [main] From 1559c6ebd86ac209f5fa2c55e16d0aa4ced8e6fd Mon Sep 17 00:00:00 2001 From: d33bs Date: Mon, 8 Jan 2024 14:45:34 -0700 Subject: [PATCH 29/53] add guidance and overview in readme --- README.md | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 53bf5b4..6b90275 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,59 @@ -# demo-python-memory-reference-accounting +# Demonstrating Python Memory Allocator Reference Counting (and Related) Demonstrating Python memory allocator reference counting and debug. +The goal of this repository is to help demonstrate Python memory allocation using source controlled code. +Work for this project was originally inspired by [cytomining/CytoTable#75](https://github.com/cytomining/CytoTable/issues/75) which explores related topics. + +## Project outline + +```mermaid +--- +title: Project Overview +--- +flowchart LR + +pyproject["pyproject.toml"] +poeworkflow["poethepoet\nworkflows"] +dockerfile["Dockerfile"] +subgraph test_container["test container"] + subgraph tests + test_env["Python environment\n(for tests)"] + test_modules["Test module(s)"] + end +end +subgraph runner + runner_env["Python environment\n(for runner)"] + pipeline["Container pipeline\n(through Dagger)"] +end + + +pyproject --> |defines| test_env +pyproject --> |defines| runner_env + +test_env --> |runs| test_modules +test_modules -.-> |display\nresults through| pipeline +runner_env --> |runs| pipeline + +dockerfile -.-> |defines\ncontainer for| pipeline + +pipeline --> |executes| test_container + +pyproject --> poeworkflow +poeworkflow -.-> |declarative\nworkflows for| runner +``` + +See above for a quick overview of project components and their relationship. +[Poetry](https://python-poetry.org/docs/) is used to define Python environment dependencies within dependency groups in a `pyproject.toml` file. +Declarative [Poe the Poet tasks](https://poethepoet.natn.io/index.html) may also be found in the same `pyproject.toml` file to help define reproducible workflows. +Containerization is used through [Dagger's Python SDK](https://docs.dagger.io/sdk/python/) to help isolate potential OS-specific distinctions for memory allocation work in Python. +Testing workflows are designed to run "locally" within a developer's environment (for example, leveraging [pyenv](https://github.com/pyenv/pyenv), [poetry](https://python-poetry.org/docs/), and [Docker Desktop](https://www.docker.com/products/docker-desktop/)) or within [GitHub Actions images](https://github.com/actions/runner-images) (`dagger-io` installs the necessary dependencies). + +## Development + +The following are suggested steps to get started with development for this project. + +1. Install Python from [pyenv](https://github.com/pyenv/pyenv?tab=readme-ov-file#installation) +1. [Install Poetry](https://python-poetry.org/docs/#installation) +1. [Install Poe the Poet](https://poethepoet.natn.io/installation.html) +1. [Install Docker Desktop](https://www.docker.com/products/docker-desktop/) +1. Run Poe the Poet workflow(s): e.g. `poetry poe run_all_tests` From bd4365107dc06c2269844e00e8d0a103a93eb3fb Mon Sep 17 00:00:00 2001 From: d33bs Date: Mon, 8 Jan 2024 14:51:26 -0700 Subject: [PATCH 30/53] add python fire mentions --- README.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 6b90275..ebcc511 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,7 @@ subgraph test_container["test container"] end subgraph runner runner_env["Python environment\n(for runner)"] + runner_cli["Runner CLI\n(Python Fire)"] pipeline["Container pipeline\n(through Dagger)"] end @@ -32,7 +33,8 @@ pyproject --> |defines| runner_env test_env --> |runs| test_modules test_modules -.-> |display\nresults through| pipeline -runner_env --> |runs| pipeline +runner_env --> |enables| runner_cli +runner_cli --> |runs| pipeline dockerfile -.-> |defines\ncontainer for| pipeline @@ -43,9 +45,10 @@ poeworkflow -.-> |declarative\nworkflows for| runner ``` See above for a quick overview of project components and their relationship. -[Poetry](https://python-poetry.org/docs/) is used to define Python environment dependencies within dependency groups in a `pyproject.toml` file. +[Poetry](https://python-poetry.org/docs/) is used to define Python environment dependencies within [dependency groups](https://python-poetry.org/docs/master/managing-dependencies/#dependency-groups) in a `pyproject.toml` file. Declarative [Poe the Poet tasks](https://poethepoet.natn.io/index.html) may also be found in the same `pyproject.toml` file to help define reproducible workflows. -Containerization is used through [Dagger's Python SDK](https://docs.dagger.io/sdk/python/) to help isolate potential OS-specific distinctions for memory allocation work in Python. +A "runner" command-line interface (CLI) is provided through [Python Fire](https://github.com/google/python-fire) to help enable the use of the container-based pipelines. +Container-based pipelines are provided through [Dagger's Python SDK](https://docs.dagger.io/sdk/python/) to help isolate potential OS-specific distinctions for memory allocation work in Python. Testing workflows are designed to run "locally" within a developer's environment (for example, leveraging [pyenv](https://github.com/pyenv/pyenv), [poetry](https://python-poetry.org/docs/), and [Docker Desktop](https://www.docker.com/products/docker-desktop/)) or within [GitHub Actions images](https://github.com/actions/runner-images) (`dagger-io` installs the necessary dependencies). ## Development From 3fb9f375542f5770f13a78218716f78dc1fb9902 Mon Sep 17 00:00:00 2001 From: d33bs Date: Mon, 8 Jan 2024 14:56:02 -0700 Subject: [PATCH 31/53] set the platform of the container --- src/pymaccounter/pipeline.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/pymaccounter/pipeline.py b/src/pymaccounter/pipeline.py index e628b27..64d8aee 100644 --- a/src/pymaccounter/pipeline.py +++ b/src/pymaccounter/pipeline.py @@ -27,7 +27,10 @@ async def test_version(test_to_run: str, test_dir: str): # build a python container based on Dockerfile and run test python = ( - client.container() + client.container( + # explicitly set the container to be a certain platform type + platform=dagger.Platform("linux/amd64") + ) .build( context=dockerfile_dir, dockerfile="./src/pymaccounter/Dockerfile", From 43eef009ea240eaba79aa4ec528228475150e2e7 Mon Sep 17 00:00:00 2001 From: d33bs Date: Mon, 8 Jan 2024 15:12:39 -0700 Subject: [PATCH 32/53] update naming and docs --- src/pymaccounter/__init__.py | 2 +- src/pymaccounter/pipeline.py | 13 ++++++++----- src/pymaccounter/runner.py | 9 +++++---- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/pymaccounter/__init__.py b/src/pymaccounter/__init__.py index c3d6c8a..fd3f30d 100644 --- a/src/pymaccounter/__init__.py +++ b/src/pymaccounter/__init__.py @@ -2,4 +2,4 @@ __init__.py for pymaccounter """ -from .runner import run_test +from .runner import pipeline_run_tests diff --git a/src/pymaccounter/pipeline.py b/src/pymaccounter/pipeline.py index 64d8aee..6234b35 100644 --- a/src/pymaccounter/pipeline.py +++ b/src/pymaccounter/pipeline.py @@ -12,7 +12,7 @@ import dagger -async def test( +async def pipeline_run_tests( tests_to_run: List[str], test_dir: str = "src/pymaccounter/tests" ) -> None: """ @@ -22,7 +22,8 @@ async def test( # get reference to the local project dockerfile_dir = client.host().directory(".") - async def test_version(test_to_run: str, test_dir: str): + async def run_test(test_to_run: str, test_dir: str): + """ """ full_test_to_run = f"{test_dir}/{test_to_run}" # build a python container based on Dockerfile and run test @@ -30,11 +31,12 @@ async def test_version(test_to_run: str, test_dir: str): client.container( # explicitly set the container to be a certain platform type platform=dagger.Platform("linux/amd64") - ) - .build( + ).build( context=dockerfile_dir, + # uses a dockerfile to create the container dockerfile="./src/pymaccounter/Dockerfile", ) + # run the python test through a poetry environment .with_exec(["poetry", "run", "python", full_test_to_run]) ) @@ -44,7 +46,8 @@ async def test_version(test_to_run: str, test_dir: str): # when this block exits, all tasks will be awaited (i.e., executed) async with anyio.create_task_group() as tg: + # run each test provided individually for test_to_run in tests_to_run: - tg.start_soon(test_version, test_to_run, test_dir) + tg.start_soon(run_test, test_to_run, test_dir) print("All tests have finished") diff --git a/src/pymaccounter/runner.py b/src/pymaccounter/runner.py index c59584b..276b707 100644 --- a/src/pymaccounter/runner.py +++ b/src/pymaccounter/runner.py @@ -7,16 +7,17 @@ import anyio import fire -from pymaccounter.pipeline import test +from pymaccounter.pipeline import pipeline_run_tests -def run_test(tests_to_run: List[str]) -> None: +def run_tests(tests_to_run: List[str]) -> None: """ Helper function to run dagger testing pipeline """ - anyio.run(test, tests_to_run) + anyio.run(pipeline_run_tests, tests_to_run) if __name__ == "__main__": - fire.Fire(run_test) + # creats a CLI through Python Fire for run_test + fire.Fire(run_tests) From e0236cc9c981cdd7991465f8e0f04352361fe191 Mon Sep 17 00:00:00 2001 From: d33bs Date: Mon, 8 Jan 2024 15:13:07 -0700 Subject: [PATCH 33/53] typo --- src/pymaccounter/runner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pymaccounter/runner.py b/src/pymaccounter/runner.py index 276b707..c04faa9 100644 --- a/src/pymaccounter/runner.py +++ b/src/pymaccounter/runner.py @@ -19,5 +19,5 @@ def run_tests(tests_to_run: List[str]) -> None: if __name__ == "__main__": - # creats a CLI through Python Fire for run_test + # creates a CLI through Python Fire for run_test fire.Fire(run_tests) From 540694bd4dfd5901221dc687798d119589cd2f79 Mon Sep 17 00:00:00 2001 From: d33bs Date: Wed, 10 Jan 2024 06:31:37 -0700 Subject: [PATCH 34/53] add poethepoet as a runner dependency --- .github/workflows/run-memory-tests.yaml | 4 +-- README.md | 5 ++- poetry.lock | 42 ++++++++++++++++++++++++- pyproject.toml | 1 + 4 files changed, 46 insertions(+), 6 deletions(-) diff --git a/.github/workflows/run-memory-tests.yaml b/.github/workflows/run-memory-tests.yaml index 8d4f0f8..deea4cf 100644 --- a/.github/workflows/run-memory-tests.yaml +++ b/.github/workflows/run-memory-tests.yaml @@ -18,10 +18,10 @@ jobs: python-version: "3.11" - name: Setup poetry and poethepoet run: | - python -m pip install poetry poethepoet + python -m pip install poetry - name: Install poetry runner env run: | poetry install --with runner -v --no-interaction - name: Run memory tests through Dagger pipeline run: | - poetry poe run_all_tests + poetry run poe run_all_tests diff --git a/README.md b/README.md index ebcc511..4af8fd6 100644 --- a/README.md +++ b/README.md @@ -55,8 +55,7 @@ Testing workflows are designed to run "locally" within a developer's environment The following are suggested steps to get started with development for this project. -1. Install Python from [pyenv](https://github.com/pyenv/pyenv?tab=readme-ov-file#installation) +1. (Suggested) Install Python from [pyenv](https://github.com/pyenv/pyenv?tab=readme-ov-file#installation) (or another way). 1. [Install Poetry](https://python-poetry.org/docs/#installation) -1. [Install Poe the Poet](https://poethepoet.natn.io/installation.html) 1. [Install Docker Desktop](https://www.docker.com/products/docker-desktop/) -1. Run Poe the Poet workflow(s): e.g. `poetry poe run_all_tests` +1. Run Poe the Poet workflow(s): e.g. `poetry run poe run_all_tests` diff --git a/poetry.lock b/poetry.lock index 224a52f..1963583 100644 --- a/poetry.lock +++ b/poetry.lock @@ -380,6 +380,17 @@ files = [ {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, ] +[[package]] +name = "pastel" +version = "0.2.1" +description = "Bring colors to your terminal." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pastel-0.2.1-py2.py3-none-any.whl", hash = "sha256:4349225fcdf6c2bb34d483e523475de5bb04a5c10ef711263452cb37d7dd4364"}, + {file = "pastel-0.2.1.tar.gz", hash = "sha256:e6581ac04e973cac858828c6202c1e1e81fee1dc7de7683f3e1ffe0bfd8a573d"}, +] + [[package]] name = "platformdirs" version = "3.11.0" @@ -395,6 +406,24 @@ files = [ docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] +[[package]] +name = "poethepoet" +version = "0.24.4" +description = "A task runner that works well with poetry." +optional = false +python-versions = ">=3.8" +files = [ + {file = "poethepoet-0.24.4-py3-none-any.whl", hash = "sha256:fb4ea35d7f40fe2081ea917d2e4102e2310fda2cde78974050ca83896e229075"}, + {file = "poethepoet-0.24.4.tar.gz", hash = "sha256:ff4220843a87c888cbcb5312c8905214701d0af60ac7271795baa8369b428fef"}, +] + +[package.dependencies] +pastel = ">=0.2.1,<0.3.0" +tomli = ">=1.2.2" + +[package.extras] +poetry-plugin = ["poetry (>=1.0,<2.0)"] + [[package]] name = "pygments" version = "2.17.2" @@ -464,6 +493,17 @@ files = [ [package.extras] tests = ["pytest", "pytest-cov"] +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +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 = "typing-extensions" version = "4.9.0" @@ -581,4 +621,4 @@ multidict = ">=4.0" [metadata] lock-version = "2.0" python-versions = ">=3.10,<4.0" -content-hash = "da21d8a152e18f8397428dc88ef78f5488d460fcc50dd2bd45c799b3afbc1e7c" +content-hash = "ac6670e7e7f530d09e893c2af507e515df90377f875bbc632c8f7961b50dc1bd" diff --git a/pyproject.toml b/pyproject.toml index 2699831..72a9643 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,6 +14,7 @@ python = ">=3.10,<4.0" dagger-io = "^0.9.5" anyio = "^4.2.0" fire = "^0.5.0" +poethepoet = "^0.24.4" # define poethepoet convenience access # to test runner workflow definition From 84feff094e026ae4cc2d6f7ed636186d3d225d60 Mon Sep 17 00:00:00 2001 From: d33bs Date: Wed, 10 Jan 2024 09:06:23 -0700 Subject: [PATCH 35/53] bandit skip tests for assert linting --- pyproject.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 72a9643..7491c97 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -40,4 +40,7 @@ verbose = true [tool.isort] profile = "black" +[tool.bandit.assert_used] +skips = ['*_test.py', '*test_*.py'] + [tool.setuptools_scm] From 7f9bfeeca7e8b679903468bc5b6ebef8305da17d Mon Sep 17 00:00:00 2001 From: d33bs Date: Wed, 10 Jan 2024 09:06:39 -0700 Subject: [PATCH 36/53] update tests with asserts for garbage --- src/pymaccounter/tests/test_multiply_gc.callbacks.py | 11 +++++++---- src/pymaccounter/tests/test_multiply_gc.collect.py | 11 +++++++---- src/pymaccounter/tests/test_multiply_gc.debug_leak.py | 11 +++++++---- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/pymaccounter/tests/test_multiply_gc.callbacks.py b/src/pymaccounter/tests/test_multiply_gc.callbacks.py index f8962ec..8a50121 100644 --- a/src/pymaccounter/tests/test_multiply_gc.callbacks.py +++ b/src/pymaccounter/tests/test_multiply_gc.callbacks.py @@ -29,15 +29,18 @@ def multiply(a, b): return a * b -print(multiply(5, 9)) +print(f"Function output: {multiply(5, 9)}") # collect garbage # see here for more info: # https://docs.python.org/3/library/gc.html#gc.collect -collected = gc.collect() +COLLECTED = gc.collect() # print the unreachable objects -print(collected) +print(COLLECTED) +assert COLLECTED == 0 # print the len of gc garbage to reference unreachable objects -print(len(gc.garbage)) +GC_LEN = len(gc.garbage) +print(GC_LEN) +assert GC_LEN == 0 diff --git a/src/pymaccounter/tests/test_multiply_gc.collect.py b/src/pymaccounter/tests/test_multiply_gc.collect.py index e7fa486..dd8670e 100644 --- a/src/pymaccounter/tests/test_multiply_gc.collect.py +++ b/src/pymaccounter/tests/test_multiply_gc.collect.py @@ -13,15 +13,18 @@ def multiply(a, b): return a * b -print(multiply(5, 9)) +print(f"Function output: {multiply(5, 9)}") # collect garbage # see here for more info: # https://docs.python.org/3/library/gc.html#gc.collect -collected = gc.collect() +COLLECTED = gc.collect() # print the unreachable objects -print(collected) +print(COLLECTED) +assert COLLECTED == 0 # print the len of gc garbage to reference unreachable objects -print(len(gc.garbage)) +GC_LEN = len(gc.garbage) +print(GC_LEN) +assert GC_LEN == 0 diff --git a/src/pymaccounter/tests/test_multiply_gc.debug_leak.py b/src/pymaccounter/tests/test_multiply_gc.debug_leak.py index 9bd40a3..716fd92 100644 --- a/src/pymaccounter/tests/test_multiply_gc.debug_leak.py +++ b/src/pymaccounter/tests/test_multiply_gc.debug_leak.py @@ -18,15 +18,18 @@ def multiply(a, b): return a * b -print(multiply(5, 9)) +print(f"Function output: {multiply(5, 9)}") # collect garbage # see here for more info: # https://docs.python.org/3/library/gc.html#gc.collect -collected = gc.collect() +COLLECTED = gc.collect() # print the unreachable objects -print(collected) +print(COLLECTED) +assert COLLECTED == 0 # print the len of gc garbage to reference unreachable objects -print(len(gc.garbage)) +GC_LEN = len(gc.garbage) +print(GC_LEN) +assert GC_LEN == 0 From df22eb9421d5c2d11b98dfb02534e005732c222a Mon Sep 17 00:00:00 2001 From: d33bs Date: Wed, 10 Jan 2024 09:22:43 -0700 Subject: [PATCH 37/53] add debug config; add lines for visual clarity --- src/pymaccounter/pipeline.py | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/pymaccounter/pipeline.py b/src/pymaccounter/pipeline.py index 6234b35..64c1812 100644 --- a/src/pymaccounter/pipeline.py +++ b/src/pymaccounter/pipeline.py @@ -5,6 +5,7 @@ # referenced with modifications from: # https://docs.dagger.io/sdk/python/628797/get-started +import shutil import sys from typing import List @@ -13,19 +14,30 @@ async def pipeline_run_tests( - tests_to_run: List[str], test_dir: str = "src/pymaccounter/tests" + tests_to_run: List[str], + test_dir: str = "src/pymaccounter/tests", + debug: bool = False, ) -> None: """ Dagger pipeline for running reproducible tests in python. """ - async with dagger.Connection(dagger.Config(log_output=sys.stderr)) as client: + + # create dagger conf based on debug arg + dagger_conf = dagger.Config(log_output=sys.stderr) if debug else dagger.Config() + + async with dagger.Connection(dagger_conf) as client: # get reference to the local project dockerfile_dir = client.host().directory(".") async def run_test(test_to_run: str, test_dir: str): - """ """ + """ + Run a test in a container via dagger + """ full_test_to_run = f"{test_dir}/{test_to_run}" + # gather the terminal width for result display purposes + terminal_width, _ = shutil.get_terminal_size() + # build a python container based on Dockerfile and run test python = ( client.container( @@ -42,6 +54,9 @@ async def run_test(test_to_run: str, test_dir: str): # execute and show the results of the last executed command results = await python.stdout() + + # surround the output with terminal-width lines for reading clarity + print("_" * terminal_width) print(f"Test results for {full_test_to_run}:\n{results}") # when this block exits, all tasks will be awaited (i.e., executed) From 63a35feecb35a8348f63c8eed605ef1006a919e0 Mon Sep 17 00:00:00 2001 From: d33bs Date: Wed, 10 Jan 2024 11:04:57 -0700 Subject: [PATCH 38/53] expand readme with some definitions + new sections --- README.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/README.md b/README.md index 4af8fd6..084087a 100644 --- a/README.md +++ b/README.md @@ -51,6 +51,28 @@ A "runner" command-line interface (CLI) is provided through [Python Fire](https: Container-based pipelines are provided through [Dagger's Python SDK](https://docs.dagger.io/sdk/python/) to help isolate potential OS-specific distinctions for memory allocation work in Python. Testing workflows are designed to run "locally" within a developer's environment (for example, leveraging [pyenv](https://github.com/pyenv/pyenv), [poetry](https://python-poetry.org/docs/), and [Docker Desktop](https://www.docker.com/products/docker-desktop/)) or within [GitHub Actions images](https://github.com/actions/runner-images) (`dagger-io` installs the necessary dependencies). +## Definitions + +### Memory Allocator + +Computer memory management often occurs through the use of a "memory allocator" which controls how computer memory resources are used. +This usually occurs through __"allocation"__, computer memory resource reservation (taking memory), and __"deallocation"__, computer memory resource freeing (giving back memory for other uses). + +### Garbage Collection + +"Garbage collection (GC)" is used to describe a type of automated memory management within software development. +"The _garbage collector_ attempts to reclaim memory which was allocated by the program, but is no longer referenced; such memory is called _garbage_." ([Wikipedia: Garbage collection (computer science)]()). +A garbage collector often works in tandem with a memory allocator to help control computer memory resource usage in software development. + +### Python's Garbage Collection Interface (`gc`) + +The `gc` module provides an interface to Python garbage collection. + +## Test Cases + +This project focuses on leveraging Python memory observability tools to illustrate what happens as code is executed. +See below for more information on specifics regarding each test case and the technologies used for these. + ## Development The following are suggested steps to get started with development for this project. @@ -59,3 +81,4 @@ The following are suggested steps to get started with development for this proje 1. [Install Poetry](https://python-poetry.org/docs/#installation) 1. [Install Docker Desktop](https://www.docker.com/products/docker-desktop/) 1. Run Poe the Poet workflow(s): e.g. `poetry run poe run_all_tests` + _(Poe the Poet is installed as a Poetry env dependency for the `runner` group)_ From 13c962cff543d0de42fbeb1609b833e7897a56a0 Mon Sep 17 00:00:00 2001 From: d33bs Date: Sat, 13 Jan 2024 15:19:35 -0700 Subject: [PATCH 39/53] add memory allocation definitions --- README.md | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 084087a..d6aacc4 100644 --- a/README.md +++ b/README.md @@ -53,14 +53,36 @@ Testing workflows are designed to run "locally" within a developer's environment ## Definitions +### Computer Memory + +Computer memory, also sometimes known as "RAM" or "random-access memory", is a type of resource used by computer software on a computer. +"Computer memory stores information, such as data and programs for immediate use in the computer. ... Main memory operates at a high speed compared to \[non-memory\] storage which is slower but less expensive and \[oftentimes\] higher in capacity. " ([Wikipedia: Computer memory](https://en.wikipedia.org/wiki/Computer_memory)). +Computer memory is generally organized as ___heaps___ which help describe chunks of the total memory available on a computer. +These heaps may be ___private___ (only available to a specific software process) or ___shared___ (available to one or many software processes). + ### Memory Allocator -Computer memory management often occurs through the use of a "memory allocator" which controls how computer memory resources are used. -This usually occurs through __"allocation"__, computer memory resource reservation (taking memory), and __"deallocation"__, computer memory resource freeing (giving back memory for other uses). +Memory management is a concept which helps enable the shared use of computer memory to avoid challenges such as memory overuse (where all memory is in use and never shared to other software). +Computer memory management often occurs through the use of a ___memory allocator___ which controls how computer memory resources are used. +Computer software can be written to interact with memory allocators to use computer memory. +Memory allocators may be used manually (with specific directions provided on when and how to use memory resources) or automatically (with an algorithmic approach of some kind). +The memory allocator usually performs the following actions with memory: + +- __"Allocation"__: computer memory resource reservation (taking memory). This is sometimes also known as "`malloc`", or "memory allocate". +- __"Deallocation"__: computer memory resource freeing (giving back memory for other uses). This is sometimes also known as "`free`", or "freeing memory from allocation". + +### Python's Memory Manager + +Python is an interpreted "high-level" programming language ([Python: What is Python?](https://www.python.org/doc/essays/blurb/)). +Interpreted languages are those which include an "interpreter" which helps execute code written in a particular way ([Wikipedia: Interpreter (computing)]()). +High-level languages such as Python often remove the requirement for software developers to manually perform memory management ([Wikipedia: High-level programming language](https://en.wikipedia.org/wiki/High-level_programming_language)). +Python code is executed by the Python [interpreter](). +Memory is managed for Python software processes automatically (when unspecified) or manually (when specified) through the Python interpreter. +The ___Python memory manager___ manages memory through a private heap for Python software processes through the Python interpreter and CPython ([Python: Memory Management](https://docs.python.org/3/c-api/memory.html)). ### Garbage Collection -"Garbage collection (GC)" is used to describe a type of automated memory management within software development. +"Garbage collection (GC)" is used to describe a type of automated memory management. "The _garbage collector_ attempts to reclaim memory which was allocated by the program, but is no longer referenced; such memory is called _garbage_." ([Wikipedia: Garbage collection (computer science)]()). A garbage collector often works in tandem with a memory allocator to help control computer memory resource usage in software development. From 9e9a1b9be24b6adb012d1e02efd6650e96a6a364 Mon Sep 17 00:00:00 2001 From: d33bs Date: Sat, 13 Jan 2024 15:21:51 -0700 Subject: [PATCH 40/53] assumption about python memory --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index d6aacc4..107c490 100644 --- a/README.md +++ b/README.md @@ -79,6 +79,7 @@ High-level languages such as Python often remove the requirement for software de Python code is executed by the Python [interpreter](). Memory is managed for Python software processes automatically (when unspecified) or manually (when specified) through the Python interpreter. The ___Python memory manager___ manages memory through a private heap for Python software processes through the Python interpreter and CPython ([Python: Memory Management](https://docs.python.org/3/c-api/memory.html)). +From a high-level perspective, we assume variables and other operations written in Python will automatically allocate memory through the Python interpreter when executed. ### Garbage Collection From 9d4f6898ed6e97ce3fe1bece5ff46bff3f173913 Mon Sep 17 00:00:00 2001 From: d33bs Date: Sat, 13 Jan 2024 16:05:34 -0700 Subject: [PATCH 41/53] add more detail to python garbage collection --- README.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 107c490..8d7986e 100644 --- a/README.md +++ b/README.md @@ -71,7 +71,7 @@ The memory allocator usually performs the following actions with memory: - __"Allocation"__: computer memory resource reservation (taking memory). This is sometimes also known as "`malloc`", or "memory allocate". - __"Deallocation"__: computer memory resource freeing (giving back memory for other uses). This is sometimes also known as "`free`", or "freeing memory from allocation". -### Python's Memory Manager +#### Python's Memory Manager Python is an interpreted "high-level" programming language ([Python: What is Python?](https://www.python.org/doc/essays/blurb/)). Interpreted languages are those which include an "interpreter" which helps execute code written in a particular way ([Wikipedia: Interpreter (computing)]()). @@ -87,9 +87,12 @@ From a high-level perspective, we assume variables and other operations written "The _garbage collector_ attempts to reclaim memory which was allocated by the program, but is no longer referenced; such memory is called _garbage_." ([Wikipedia: Garbage collection (computer science)]()). A garbage collector often works in tandem with a memory allocator to help control computer memory resource usage in software development. -### Python's Garbage Collection Interface (`gc`) +#### Python's Garbage Collection -The `gc` module provides an interface to Python garbage collection. +Python by default uses an optional garbage collector to automatically deallocate garbage memory through the Python interpreter in CPython. +"The main garbage collection algorithm used by CPython is reference counting. The basic idea is that CPython counts how many different places there are that have a reference to an object. Such a place could be another object, or a global (or static) C variable, or a local variable in some C function. When an object’s reference count becomes zero, the object is deallocated." ([Python Developer's Guide: Garbage collector design](https://devguide.python.org/internals/garbage-collector/)) +The [`gc` module](https://docs.python.org/3/library/gc.html) provides an interface to the Python garbage collector. +In addition, the [`sys` module](https://docs.python.org/3/library/sys.html) provides many functions which provide information about references and other details about Python objects as they are executed through the interpreter. ## Test Cases From ddcef59ec5cdd8d0788763d5ae4e846b9f1bf158 Mon Sep 17 00:00:00 2001 From: d33bs Date: Sun, 14 Jan 2024 15:07:42 -0700 Subject: [PATCH 42/53] reorganizing and adding test module documentation --- README.md | 40 +++++++++++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 8d7986e..8f666aa 100644 --- a/README.md +++ b/README.md @@ -60,6 +60,14 @@ Computer memory, also sometimes known as "RAM" or "random-access memory", is a t Computer memory is generally organized as ___heaps___ which help describe chunks of the total memory available on a computer. These heaps may be ___private___ (only available to a specific software process) or ___shared___ (available to one or many software processes). +#### Python and Computer Memory + +Python is an interpreted "high-level" programming language ([Python: What is Python?](https://www.python.org/doc/essays/blurb/)). +Interpreted languages are those which include an "interpreter" which helps execute code written in a particular way ([Wikipedia: Interpreter (computing)]()). +High-level languages such as Python often remove the requirement for software developers to manually perform memory management ([Wikipedia: High-level programming language](https://en.wikipedia.org/wiki/High-level_programming_language)). +Python code is executed by a commonly pre-packaged and downloaded binary call the Python [interpreter](). +The Python interpreter reads Python code and performs memory management as the code is executed. + ### Memory Allocator Memory management is a concept which helps enable the shared use of computer memory to avoid challenges such as memory overuse (where all memory is in use and never shared to other software). @@ -73,10 +81,6 @@ The memory allocator usually performs the following actions with memory: #### Python's Memory Manager -Python is an interpreted "high-level" programming language ([Python: What is Python?](https://www.python.org/doc/essays/blurb/)). -Interpreted languages are those which include an "interpreter" which helps execute code written in a particular way ([Wikipedia: Interpreter (computing)]()). -High-level languages such as Python often remove the requirement for software developers to manually perform memory management ([Wikipedia: High-level programming language](https://en.wikipedia.org/wiki/High-level_programming_language)). -Python code is executed by the Python [interpreter](). Memory is managed for Python software processes automatically (when unspecified) or manually (when specified) through the Python interpreter. The ___Python memory manager___ manages memory through a private heap for Python software processes through the Python interpreter and CPython ([Python: Memory Management](https://docs.python.org/3/c-api/memory.html)). From a high-level perspective, we assume variables and other operations written in Python will automatically allocate memory through the Python interpreter when executed. @@ -94,11 +98,6 @@ Python by default uses an optional garbage collector to automatically deallocate The [`gc` module](https://docs.python.org/3/library/gc.html) provides an interface to the Python garbage collector. In addition, the [`sys` module](https://docs.python.org/3/library/sys.html) provides many functions which provide information about references and other details about Python objects as they are executed through the interpreter. -## Test Cases - -This project focuses on leveraging Python memory observability tools to illustrate what happens as code is executed. -See below for more information on specifics regarding each test case and the technologies used for these. - ## Development The following are suggested steps to get started with development for this project. @@ -108,3 +107,26 @@ The following are suggested steps to get started with development for this proje 1. [Install Docker Desktop](https://www.docker.com/products/docker-desktop/) 1. Run Poe the Poet workflow(s): e.g. `poetry run poe run_all_tests` _(Poe the Poet is installed as a Poetry env dependency for the `runner` group)_ + +## Test Modules + +This project focuses on leveraging Python memory observability tools to illustrate what happens as code is executed. +See the `src/pymaccounter/tests` folder for a full list of test modules. +Each test module includes a description of what it tests and expects in a [docstring](https://docs.python.org/3/glossary.html#term-docstring) near the top of the file. + +### Running Test Modules + +Test modules may be executed individually or in groups. +Test modules are provided in a list to be run by containerized pipelines. +Each test provided in this way is run in an isolated container instance. + +In addition to test module specification, a test module base directory and debug mode may also be specified. +The test module base directory is where the container pipeline will look for test modules listed by name in the list. +Debug mode may be used to view container pipeline debug log messages. + +See the following examples for more details on the suggested way to run tests through this project. + +- Individual test: `poetry run python src/pymaccounter/runner.py '["test_baseline.py"]'` +- Multiple tests: `poetry run python src/pymaccounter/runner.py '["test_baseline.py", "test_multiply_gc.collect.py"]'` +- Individual test with debug mode: `poetry run python src/pymaccounter/runner.py '["test_baseline.py"]' --debug True` +- Individual test with non-default base test directory specification: `poetry run python src/pymaccounter/runner.py '["test_baseline.py"]' --test_dir 'src/another_test_dir'` From 49e6f034a64b4c8d2367badc17a54e08397cd4ca Mon Sep 17 00:00:00 2001 From: d33bs Date: Sun, 14 Jan 2024 15:08:03 -0700 Subject: [PATCH 43/53] add extra cli arg capabilities --- src/pymaccounter/pipeline.py | 4 +--- src/pymaccounter/runner.py | 10 +++++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/pymaccounter/pipeline.py b/src/pymaccounter/pipeline.py index 64c1812..d637072 100644 --- a/src/pymaccounter/pipeline.py +++ b/src/pymaccounter/pipeline.py @@ -14,9 +14,7 @@ async def pipeline_run_tests( - tests_to_run: List[str], - test_dir: str = "src/pymaccounter/tests", - debug: bool = False, + tests_to_run: List[str], test_dir: str, debug: bool ) -> None: """ Dagger pipeline for running reproducible tests in python. diff --git a/src/pymaccounter/runner.py b/src/pymaccounter/runner.py index c04faa9..e4d75b9 100644 --- a/src/pymaccounter/runner.py +++ b/src/pymaccounter/runner.py @@ -1,5 +1,5 @@ """ -Defines runner convenience functions for pymaccounter. +Defines runner convenience functions and interface for pymaccounter. """ from typing import List @@ -10,12 +10,16 @@ from pymaccounter.pipeline import pipeline_run_tests -def run_tests(tests_to_run: List[str]) -> None: +def run_tests( + tests_to_run: List[str], + test_dir: str = "src/pymaccounter/tests", + debug: bool = False, +) -> None: """ Helper function to run dagger testing pipeline """ - anyio.run(pipeline_run_tests, tests_to_run) + anyio.run(pipeline_run_tests, tests_to_run, test_dir, debug) if __name__ == "__main__": From f9f57b7023248b77de34d336444b1756fbfae786 Mon Sep 17 00:00:00 2001 From: d33bs Date: Mon, 15 Jan 2024 14:05:02 -0700 Subject: [PATCH 44/53] reorganize for better flow; specify allocators --- README.md | 47 ++++++++++++++++++++++++++++++----------------- 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 8f666aa..673a164 100644 --- a/README.md +++ b/README.md @@ -60,38 +60,51 @@ Computer memory, also sometimes known as "RAM" or "random-access memory", is a t Computer memory is generally organized as ___heaps___ which help describe chunks of the total memory available on a computer. These heaps may be ___private___ (only available to a specific software process) or ___shared___ (available to one or many software processes). -#### Python and Computer Memory - -Python is an interpreted "high-level" programming language ([Python: What is Python?](https://www.python.org/doc/essays/blurb/)). -Interpreted languages are those which include an "interpreter" which helps execute code written in a particular way ([Wikipedia: Interpreter (computing)]()). -High-level languages such as Python often remove the requirement for software developers to manually perform memory management ([Wikipedia: High-level programming language](https://en.wikipedia.org/wiki/High-level_programming_language)). -Python code is executed by a commonly pre-packaged and downloaded binary call the Python [interpreter](). -The Python interpreter reads Python code and performs memory management as the code is executed. - ### Memory Allocator Memory management is a concept which helps enable the shared use of computer memory to avoid challenges such as memory overuse (where all memory is in use and never shared to other software). Computer memory management often occurs through the use of a ___memory allocator___ which controls how computer memory resources are used. Computer software can be written to interact with memory allocators to use computer memory. Memory allocators may be used manually (with specific directions provided on when and how to use memory resources) or automatically (with an algorithmic approach of some kind). -The memory allocator usually performs the following actions with memory: +The memory allocator usually performs the following actions with memory (in addition to others): -- __"Allocation"__: computer memory resource reservation (taking memory). This is sometimes also known as "`malloc`", or "memory allocate". +- __"Allocation"__: computer memory resource reservation (taking memory). This is sometimes also known as "`alloc`", or "allocate memory". - __"Deallocation"__: computer memory resource freeing (giving back memory for other uses). This is sometimes also known as "`free`", or "freeing memory from allocation". -#### Python's Memory Manager - -Memory is managed for Python software processes automatically (when unspecified) or manually (when specified) through the Python interpreter. -The ___Python memory manager___ manages memory through a private heap for Python software processes through the Python interpreter and CPython ([Python: Memory Management](https://docs.python.org/3/c-api/memory.html)). -From a high-level perspective, we assume variables and other operations written in Python will automatically allocate memory through the Python interpreter when executed. - ### Garbage Collection "Garbage collection (GC)" is used to describe a type of automated memory management. "The _garbage collector_ attempts to reclaim memory which was allocated by the program, but is no longer referenced; such memory is called _garbage_." ([Wikipedia: Garbage collection (computer science)]()). A garbage collector often works in tandem with a memory allocator to help control computer memory resource usage in software development. -#### Python's Garbage Collection +### Python and Computer Memory + +Python is an interpreted "high-level" programming language ([Python: What is Python?](https://www.python.org/doc/essays/blurb/)). +Interpreted languages are those which include an "interpreter" which helps execute code written in a particular way ([Wikipedia: Interpreter (computing)]()). +High-level languages such as Python often remove the requirement for software developers to manually perform memory management ([Wikipedia: High-level programming language](https://en.wikipedia.org/wiki/High-level_programming_language)). +Python code is executed by a commonly pre-packaged and downloaded binary call the Python [interpreter](). +The Python interpreter reads Python code and performs memory management as the code is executed. + +#### Python's Memory Manager + +Memory is managed for Python software processes automatically (when unspecified) or manually (when specified) through the Python interpreter. +The ___Python memory manager___ is an abstraction which manages memory for Python software processes through the Python interpreter and CPython ([Python: Memory Management](https://docs.python.org/3/c-api/memory.html)). +From a high-level perspective, we assume variables and other operations written in Python will automatically allocate and deallocate memory through the Python interpreter when executed. +Python's memory manager performs this work through various __memory allocators__ and a __garbage collector__ (or as configured with customizations). + +##### Python's Memory Allocator(s) + +The Python memory manager allocates memory for use through memory allocators. +Python may use one or many memory allocators depending on specifications in Python code and how the Python interpreter is configured (for example, see [Python: Memory Management - Default Memory Allocators](https://docs.python.org/3/c-api/memory.html#default-memory-allocators)). +One way to understand Python memory allocators is through the following distinctions. + +- "Python Memory Allocator" (`pymalloc`): + The Python interpreter is packaged with a specialized memory allocator called `pymalloc`. + "Python has a pymalloc allocator optimized for small objects (smaller or equal to 512 bytes) with a short lifetime." ([Python: Memory Management - The pymalloc allocator](https://docs.python.org/3/c-api/memory.html#the-pymalloc-allocator)) + `pymalloc` may be disabled through the use of a special environment variable called [`PYTHONMALLOC`](https://docs.python.org/3/using/cmdline.html#envvar-PYTHONMALLOC) (for example, to use only [`malloc`](https://en.wikipedia.org/wiki/C_dynamic_memory_allocation) as seen below). +- C dynamic memory allocator (`malloc`) + +##### Python's Garbage Collection Python by default uses an optional garbage collector to automatically deallocate garbage memory through the Python interpreter in CPython. "The main garbage collection algorithm used by CPython is reference counting. The basic idea is that CPython counts how many different places there are that have a reference to an object. Such a place could be another object, or a global (or static) C variable, or a local variable in some C function. When an object’s reference count becomes zero, the object is deallocated." ([Python Developer's Guide: Garbage collector design](https://devguide.python.org/internals/garbage-collector/)) From 96a90f4651c7c11ab74a1d66c118e2119876388e Mon Sep 17 00:00:00 2001 From: d33bs Date: Wed, 17 Jan 2024 06:36:13 -0700 Subject: [PATCH 45/53] further details on allocators --- README.md | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 673a164..55d1626 100644 --- a/README.md +++ b/README.md @@ -55,10 +55,12 @@ Testing workflows are designed to run "locally" within a developer's environment ### Computer Memory -Computer memory, also sometimes known as "RAM" or "random-access memory", is a type of resource used by computer software on a computer. +Computer memory, also sometimes known as "RAM" or "random-access memory", or "dynamic memory" is a type of resource used by computer software on a computer. "Computer memory stores information, such as data and programs for immediate use in the computer. ... Main memory operates at a high speed compared to \[non-memory\] storage which is slower but less expensive and \[oftentimes\] higher in capacity. " ([Wikipedia: Computer memory](https://en.wikipedia.org/wiki/Computer_memory)). + Computer memory is generally organized as ___heaps___ which help describe chunks of the total memory available on a computer. These heaps may be ___private___ (only available to a specific software process) or ___shared___ (available to one or many software processes). +Heaps can be further segmented into ___pools___ which are areas of the heap which can be used for specific purposes (for example, when multiple memory allocators are used). ### Memory Allocator @@ -98,18 +100,38 @@ The Python memory manager allocates memory for use through memory allocators. Python may use one or many memory allocators depending on specifications in Python code and how the Python interpreter is configured (for example, see [Python: Memory Management - Default Memory Allocators](https://docs.python.org/3/c-api/memory.html#default-memory-allocators)). One way to understand Python memory allocators is through the following distinctions. -- "Python Memory Allocator" (`pymalloc`): +- __"Python Memory Allocator" (`pymalloc`)__ The Python interpreter is packaged with a specialized memory allocator called `pymalloc`. "Python has a pymalloc allocator optimized for small objects (smaller or equal to 512 bytes) with a short lifetime." ([Python: Memory Management - The pymalloc allocator](https://docs.python.org/3/c-api/memory.html#the-pymalloc-allocator)) - `pymalloc` may be disabled through the use of a special environment variable called [`PYTHONMALLOC`](https://docs.python.org/3/using/cmdline.html#envvar-PYTHONMALLOC) (for example, to use only [`malloc`](https://en.wikipedia.org/wiki/C_dynamic_memory_allocation) as seen below). -- C dynamic memory allocator (`malloc`) +- __C dynamic memory allocator (`malloc`)__ + When `pymalloc` is disabled or a memory requirements exceed `pymalloc`'s constraints, the Python interpreter will use a function from the [C standard library](https://en.wikipedia.org/wiki/C_standard_library) called [`malloc`](<%5B%60malloc%60%5D(https://en.wikipedia.org/wiki/C_dynamic_memory_allocation)>). + When `malloc` is used by the Python interpreter, it uses the system's existing implementation of `malloc`. + +`pymalloc` may be disabled through the use of a special environment variable called [`PYTHONMALLOC`](https://docs.python.org/3/using/cmdline.html#envvar-PYTHONMALLOC) (for example, to use only [`malloc`](https://en.wikipedia.org/wiki/C_dynamic_memory_allocation) as seen below). +This same environment variable may be used with `debug` settings in order to help troubleshoot in-depth questions. + +__Notable Additions__ + +Python provides the capability of customizing memory allocation through the use of packages. +See below for some notable examples of additional memory allocation possibilities. + +- __NumPy Memory Allocation__ + [NumPy](https://numpy.org/) [uses custom C-API's](https://numpy.org/doc/stable/reference/c-api/data_memory.html) which are backed by C dynamic memory allocation functions (`alloc`, `free`, `realloc`) to help address memory management. + These interfaces can be controlled directly through NumPy to help manage memory effectively when using the package. +- __PyArrow Memory Allocators__ + [PyArrow](https://arrow.apache.org/) provides the capability to use `malloc`, [`jemalloc`](https://github.com/jemalloc/jemalloc), or [`mimalloc`](https://github.com/microsoft/mimalloc) through the [PyArrow Memory Pools group of functions](https://arrow.apache.org/docs/python/api/memory.html#memory-pools). + A default memory allocator is selected for use when PyArrow based on the operating system and the availability of the memory allocator on the system. + The selection of a memory allocator for use with PyArrow can be influenced by how it performs on a particular system. ##### Python's Garbage Collection Python by default uses an optional garbage collector to automatically deallocate garbage memory through the Python interpreter in CPython. "The main garbage collection algorithm used by CPython is reference counting. The basic idea is that CPython counts how many different places there are that have a reference to an object. Such a place could be another object, or a global (or static) C variable, or a local variable in some C function. When an object’s reference count becomes zero, the object is deallocated." ([Python Developer's Guide: Garbage collector design](https://devguide.python.org/internals/garbage-collector/)) +Python's garbage collector is generally focused on collecting garbage created by `pymalloc` and `malloc`. + The [`gc` module](https://docs.python.org/3/library/gc.html) provides an interface to the Python garbage collector. In addition, the [`sys` module](https://docs.python.org/3/library/sys.html) provides many functions which provide information about references and other details about Python objects as they are executed through the interpreter. +These functions and other packages can help software developers observe memory behaviors within Python procedures. ## Development From 8b73e4cf4520a5525d08f84527b5403ca86b1c57 Mon Sep 17 00:00:00 2001 From: d33bs Date: Wed, 17 Jan 2024 15:01:03 -0700 Subject: [PATCH 46/53] add diagrams --- README.md | 207 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 202 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 55d1626..7d55cef 100644 --- a/README.md +++ b/README.md @@ -55,18 +55,73 @@ Testing workflows are designed to run "locally" within a developer's environment ### Computer Memory +```mermaid +flowchart LR + +subgraph computer ["Computer (resources)"] + memory["Memory"] + storage["Data Storage"] + cpu["CPU(s)"] +end + +style computer fill:#fff,stroke:#333 +style storage fill:#fff,stroke:#333 +style cpu fill:#fff,stroke:#333 +style memory fill:#86EFAC,stroke:#333 +``` + +_Computer memory is a type of computer resource available for use by software on a computer_ + Computer memory, also sometimes known as "RAM" or "random-access memory", or "dynamic memory" is a type of resource used by computer software on a computer. "Computer memory stores information, such as data and programs for immediate use in the computer. ... Main memory operates at a high speed compared to \[non-memory\] storage which is slower but less expensive and \[oftentimes\] higher in capacity. " ([Wikipedia: Computer memory](https://en.wikipedia.org/wiki/Computer_memory)). -Computer memory is generally organized as ___heaps___ which help describe chunks of the total memory available on a computer. +```mermaid +flowchart LR + +subgraph computer ["Computer (resources)"] + +subgraph memory["Memory"] + subgraph heap1 ["heap 1"] + direction TB + poola["pool a"] + poolb["pool b"] + end + subgraph heap2 ["heap 2"] + poola2["pool c"] + end +end + +end + +style computer fill:#fff,stroke:#333 +style memory fill:#86EFAC,stroke:#333 +``` + +_Memory heaps help organize available memory on a computer for specific procedures. Heaps may have one or many memory pools._ + +Computer memory is generally organized as ___heaps___ which help describe chunks of the total memory available on a computer for specific processes. These heaps may be ___private___ (only available to a specific software process) or ___shared___ (available to one or many software processes). Heaps can be further segmented into ___pools___ which are areas of the heap which can be used for specific purposes (for example, when multiple memory allocators are used). ### Memory Allocator +```mermaid +sequenceDiagram + +software ->> allocator:"I need some memory, please!" +allocator ->> memory:Allocate portion of memory for use +memory ->> allocator:Allocated memory for use +allocator ->> software:"Here's some memory to use!" + +software ->> allocator:"I'm finished with that memory!" +allocator ->> memory:Free the memory for other purposes. +``` + +_Memory allocators help software reserve and free computer memory resources._ + Memory management is a concept which helps enable the shared use of computer memory to avoid challenges such as memory overuse (where all memory is in use and never shared to other software). -Computer memory management often occurs through the use of a ___memory allocator___ which controls how computer memory resources are used. -Computer software can be written to interact with memory allocators to use computer memory. +Computer memory management often occurs through the use of a ___memory allocator___ which controls how computer memory resources are used for software. +Computer software is written to interact with memory allocators to use computer memory. Memory allocators may be used manually (with specific directions provided on when and how to use memory resources) or automatically (with an algorithmic approach of some kind). The memory allocator usually performs the following actions with memory (in addition to others): @@ -75,12 +130,52 @@ The memory allocator usually performs the following actions with memory (in addi ### Garbage Collection +```mermaid +sequenceDiagram + +participant software +participant memory allocator +participant garbage collector +participant memory + +software ->> memory allocator:"I need some memory, please!" +memory allocator ->> memory:Allocate portion of memory for use +memory ->> memory allocator:Allocated memory for use +memory allocator ->> software:"Here's some memory to use!" + +software -->> garbage collector :(software finishes with memory usage, sometimes implicitly) +garbage collector ->> memory:Free the memory for other purposes. +``` + +_Garbage collectors help free computer memory which is no longer referenced by software._ + "Garbage collection (GC)" is used to describe a type of automated memory management. "The _garbage collector_ attempts to reclaim memory which was allocated by the program, but is no longer referenced; such memory is called _garbage_." ([Wikipedia: Garbage collection (computer science)]()). A garbage collector often works in tandem with a memory allocator to help control computer memory resource usage in software development. ### Python and Computer Memory +```mermaid +flowchart LR + +subgraph computer ["Computer"] + direction LR + memory["Memory"] + code["Python code"] + interpreter["Python interpreter"] +end + +code --> |interpreted and\nexecuted by| interpreter +interpreter <--> |allocates memory\nfor processed code| memory + +style computer fill:#fff,stroke:#333 +style memory fill:#86EFAC,stroke:#333 +style code fill:#67E8F9,stroke:#333; +style interpreter fill:#FDBA74,stroke:#333; +``` + +_The Python interpreter helps execute Python code and allocate memory for Python procedures._ + Python is an interpreted "high-level" programming language ([Python: What is Python?](https://www.python.org/doc/essays/blurb/)). Interpreted languages are those which include an "interpreter" which helps execute code written in a particular way ([Wikipedia: Interpreter (computing)]()). High-level languages such as Python often remove the requirement for software developers to manually perform memory management ([Wikipedia: High-level programming language](https://en.wikipedia.org/wiki/High-level_programming_language)). @@ -89,12 +184,69 @@ The Python interpreter reads Python code and performs memory management as the c #### Python's Memory Manager +```mermaid +flowchart LR + +subgraph computer ["Computer"] + direction LR + memory["Memory"] + code["Python code"] + subgraph interpreter["Python interpreter"] + manager["Python memory manager"] + end +end + +code --> |interpreted and\nexecuted by| interpreter +manager --> |allocates memory\nfor processed code| memory + +style computer fill:#fff,stroke:#333 +style memory fill:#86EFAC,stroke:#333 +style code fill:#67E8F9,stroke:#333; +style manager fill:#FDBA74,stroke:#333; +``` + +_The Python memory manager helps manage memory for Python code executed by the Python interpreter._ + Memory is managed for Python software processes automatically (when unspecified) or manually (when specified) through the Python interpreter. The ___Python memory manager___ is an abstraction which manages memory for Python software processes through the Python interpreter and CPython ([Python: Memory Management](https://docs.python.org/3/c-api/memory.html)). From a high-level perspective, we assume variables and other operations written in Python will automatically allocate and deallocate memory through the Python interpreter when executed. Python's memory manager performs this work through various __memory allocators__ and a __garbage collector__ (or as configured with customizations). -##### Python's Memory Allocator(s) +##### Python's Memory Allocators + +```mermaid +flowchart LR + +subgraph computer ["Computer"] + direction LR + memory["Memory"] + code["Python code"] + malloc["malloc\n(system function)"] + subgraph interpreter ["Python interpreter"] + subgraph spacer [" "] + subgraph mgr ["Python memory manager"] + pymalloc["pymalloc"] + end + end + end +end + +code --> |interpreted and\nexecuted by| interpreter +pymalloc --> |"allocates memory for\nsmall and temporary needs"| memory +mgr --> |"allocates memory for\nlarger or long-lived needs"| malloc +malloc --> memory + + +style computer fill:#fff,stroke:#333 +style memory fill:#86EFAC,stroke:#333 +style code fill:#67E8F9,stroke:#333; +style mgr fill:#FDBA74,stroke:#333; +style pymalloc fill:#FBBF24,stroke:#333; +style malloc fill:#FBBF24,stroke:#333; +style spacer stroke:none; +``` + +_The Python memory manager by default will use `pymalloc` internally or malloc from the system to allocate computer memory resources._ The Python memory manager allocates memory for use through memory allocators. Python may use one or many memory allocators depending on specifications in Python code and how the Python interpreter is configured (for example, see [Python: Memory Management - Default Memory Allocators](https://docs.python.org/3/c-api/memory.html#default-memory-allocators)). @@ -110,7 +262,52 @@ One way to understand Python memory allocators is through the following distinct `pymalloc` may be disabled through the use of a special environment variable called [`PYTHONMALLOC`](https://docs.python.org/3/using/cmdline.html#envvar-PYTHONMALLOC) (for example, to use only [`malloc`](https://en.wikipedia.org/wiki/C_dynamic_memory_allocation) as seen below). This same environment variable may be used with `debug` settings in order to help troubleshoot in-depth questions. -__Notable Additions__ +__Additional Python Memory Allocators__ + +```mermaid +flowchart LR + +subgraph computer ["Computer"] + direction LR + memory["Memory"] + code["Python code"] + malloc["malloc\n(system function)"] + subgraph interpreter ["Python interpreter"] + subgraph spacer [" "] + subgraph mgr ["Python memory manager"] + pymalloc["pymalloc"] + end + end + package_managed["Python package\nmanaged allocators\n(ex. NumPy, PyArrow, etc.)"] + end + mimalloc["mimalloc"] + jemalloc["jemalloc"] +end + +code --> |interpreted and\nexecuted by| interpreter +pymalloc <--> |"allocates memory for\nsmall and temporary needs"| memory +mgr --> |"allocates memory for\nlarger or long-lived needs"| malloc +malloc --> memory +code -.-> |may stipulate\nthe use of| package_managed +package_managed -.-> malloc +package_managed -.-> mimalloc +package_managed -.-> jemalloc +mimalloc -.-> memory +jemalloc -.-> memory + +style computer fill:#fff,stroke:#333 +style memory fill:#86EFAC,stroke:#333 +style code fill:#67E8F9,stroke:#333; +style mgr fill:#FDBA74,stroke:#333; +style pymalloc fill:#FBBF24,stroke:#333; +style malloc fill:#FBBF24,stroke:#333; +style package_managed fill:#FBBF24,stroke:#333; +style mimalloc fill:#FEF08A,stroke:#333; +style jemalloc fill:#FEF08A,stroke:#333; +style spacer stroke:none; +``` + +_Python code and package dependencies may stipulate the use of additional memory allocators, such as `mimalloc` and `jemalloc` outside of the Python memory manager._ Python provides the capability of customizing memory allocation through the use of packages. See below for some notable examples of additional memory allocation possibilities. From b1c20da42604652c789962748691e62d33e6ea4d Mon Sep 17 00:00:00 2001 From: d33bs Date: Thu, 18 Jan 2024 16:03:50 -0700 Subject: [PATCH 47/53] additional diagrams, specificity --- README.md | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 66 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7d55cef..78e3682 100644 --- a/README.md +++ b/README.md @@ -73,7 +73,9 @@ style memory fill:#86EFAC,stroke:#333 _Computer memory is a type of computer resource available for use by software on a computer_ Computer memory, also sometimes known as "RAM" or "random-access memory", or "dynamic memory" is a type of resource used by computer software on a computer. -"Computer memory stores information, such as data and programs for immediate use in the computer. ... Main memory operates at a high speed compared to \[non-memory\] storage which is slower but less expensive and \[oftentimes\] higher in capacity. " ([Wikipedia: Computer memory](https://en.wikipedia.org/wiki/Computer_memory)). +"Computer memory stores information, such as data and programs for immediate use in the computer. ... Main memory operates at a high speed compared to non-memory storage which is slower but less expensive and oftentimes higher in capacity. " ([Wikipedia: Computer memory](https://en.wikipedia.org/wiki/Computer_memory)). + +Blocks... ```mermaid flowchart LR @@ -99,7 +101,8 @@ style memory fill:#86EFAC,stroke:#333 _Memory heaps help organize available memory on a computer for specific procedures. Heaps may have one or many memory pools._ -Computer memory is generally organized as ___heaps___ which help describe chunks of the total memory available on a computer for specific processes. +Computer memory may be organized in hierarchical layers to help share resources among many software procedures. +One top-level organization model for computer memory is through the use of ___heaps___ which help describe chunks of the total memory available on a computer for specific processes. These heaps may be ___private___ (only available to a specific software process) or ___shared___ (available to one or many software processes). Heaps can be further segmented into ___pools___ which are areas of the heap which can be used for specific purposes (for example, when multiple memory allocators are used). @@ -259,6 +262,33 @@ One way to understand Python memory allocators is through the following distinct When `pymalloc` is disabled or a memory requirements exceed `pymalloc`'s constraints, the Python interpreter will use a function from the [C standard library](https://en.wikipedia.org/wiki/C_standard_library) called [`malloc`](<%5B%60malloc%60%5D(https://en.wikipedia.org/wiki/C_dynamic_memory_allocation)>). When `malloc` is used by the Python interpreter, it uses the system's existing implementation of `malloc`. +```mermaid +flowchart LR + +subgraph computer ["Computer (resources)"] + +subgraph memory["Memory"] + subgraph heap1 ["heap(s)"] + direction TB + subgraph arena ["pymalloc\narena(s)"] + subgraph spacer [" "] + pools["pool(s)"] + end + end + end +end + +end + +style computer fill:#fff,stroke:#333 +style memory fill:#86EFAC,stroke:#333 +style arena fill:#C7D2FE,stroke:#333 +style spacer fill:transparent,stroke:transparent; +``` + +_`pymalloc` makes use of arenas to further organize pools within a computer memory heap._ + +It's important to note that `pymalloc` adds additional abstractions to how memory is organized through the use of "arenas". `pymalloc` may be disabled through the use of a special environment variable called [`PYTHONMALLOC`](https://docs.python.org/3/using/cmdline.html#envvar-PYTHONMALLOC) (for example, to use only [`malloc`](https://en.wikipedia.org/wiki/C_dynamic_memory_allocation) as seen below). This same environment variable may be used with `debug` settings in order to help troubleshoot in-depth questions. @@ -322,6 +352,40 @@ See below for some notable examples of additional memory allocation possibilitie ##### Python's Garbage Collection +```mermaid +flowchart LR + +subgraph computer ["Computer"] + direction LR + memory["Memory"] + code["Python code"] + malloc["malloc\n(system function)"] + subgraph interpreter ["Python interpreter"] + subgraph spacer [" "] + subgraph mgr ["Python memory manager"] + pymalloc["pymalloc"] + gc["Garbage\nCollector"] + end + end + end +end + +code --> |interpreted and\nexecuted by| interpreter +pymalloc --> |"allocates memory for\nsmall and temporary needs"| memory +mgr --> |"allocates memory for\nlarger or long-lived needs"| malloc +malloc --> memory +gc --> |frees memory with\nno object references| memory + +style computer fill:#fff,stroke:#333 +style memory fill:#86EFAC,stroke:#333 +style code fill:#67E8F9,stroke:#333; +style mgr fill:#FDBA74,stroke:#333; +style pymalloc fill:#FBBF24,stroke:#333; +style malloc fill:#FBBF24,stroke:#333; +style gc fill:#FCA5A5,stroke:#333; +style spacer stroke:none; +``` + Python by default uses an optional garbage collector to automatically deallocate garbage memory through the Python interpreter in CPython. "The main garbage collection algorithm used by CPython is reference counting. The basic idea is that CPython counts how many different places there are that have a reference to an object. Such a place could be another object, or a global (or static) C variable, or a local variable in some C function. When an object’s reference count becomes zero, the object is deallocated." ([Python Developer's Guide: Garbage collector design](https://devguide.python.org/internals/garbage-collector/)) Python's garbage collector is generally focused on collecting garbage created by `pymalloc` and `malloc`. From 76ce4d1eae5dc296600cb8f02ba7d449c243e3ce Mon Sep 17 00:00:00 2001 From: d33bs Date: Fri, 19 Jan 2024 06:24:54 -0700 Subject: [PATCH 48/53] add blocks content --- README.md | 47 ++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 42 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 78e3682..ce33a87 100644 --- a/README.md +++ b/README.md @@ -75,7 +75,35 @@ _Computer memory is a type of computer resource available for use by software on Computer memory, also sometimes known as "RAM" or "random-access memory", or "dynamic memory" is a type of resource used by computer software on a computer. "Computer memory stores information, such as data and programs for immediate use in the computer. ... Main memory operates at a high speed compared to non-memory storage which is slower but less expensive and oftentimes higher in capacity. " ([Wikipedia: Computer memory](https://en.wikipedia.org/wiki/Computer_memory)). -Blocks... + + + + + + +
Memory Blocks
+ +A.) All memory blocks available. + + + +
BlockBlockBlock
+ +
+ +B.) Some memory blocks in use. + + + +
BlockBlockBlock
+ +
+ +_Fixed-size memory blocks may be free or used at various times._ + +One way to organize computer memory is through the use of ["fixed-size blocks"](https://en.wikipedia.org/wiki/Memory_management#FIXED-SIZE), also called "blocks". +Fixed-size memory blocks are chunks of memory of a certain byte size (usually all the same size). +Memory blocks may be in use or free at different times. ```mermaid flowchart LR @@ -85,11 +113,17 @@ subgraph computer ["Computer (resources)"] subgraph memory["Memory"] subgraph heap1 ["heap 1"] direction TB - poola["pool a"] - poolb["pool b"] + subgraph poola["pool a"] + blocks1["blocks"] + end + subgraph poolb["pool b"] + blocks2["blocks"] + end end subgraph heap2 ["heap 2"] - poola2["pool c"] + subgraph poolc["pool c"] + blocks3["blocks"] + end end end @@ -97,6 +131,9 @@ end style computer fill:#fff,stroke:#333 style memory fill:#86EFAC,stroke:#333 +style poola fill:#BFDBFE,stroke:#333; +style poolb fill:#BFDBFE,stroke:#333; +style poolc fill:#BFDBFE,stroke:#333; ``` _Memory heaps help organize available memory on a computer for specific procedures. Heaps may have one or many memory pools._ @@ -104,7 +141,7 @@ _Memory heaps help organize available memory on a computer for specific procedur Computer memory may be organized in hierarchical layers to help share resources among many software procedures. One top-level organization model for computer memory is through the use of ___heaps___ which help describe chunks of the total memory available on a computer for specific processes. These heaps may be ___private___ (only available to a specific software process) or ___shared___ (available to one or many software processes). -Heaps can be further segmented into ___pools___ which are areas of the heap which can be used for specific purposes (for example, when multiple memory allocators are used). +Heaps are sometimes further segmented into ___pools___ which are areas of the heap which can be used for specific purposes (for example, when multiple memory allocators are used). ### Memory Allocator From 33487e6f0ef6b2121357cd2da21668e15eeacd99 Mon Sep 17 00:00:00 2001 From: d33bs Date: Fri, 19 Jan 2024 06:29:28 -0700 Subject: [PATCH 49/53] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index ce33a87..292802f 100644 --- a/README.md +++ b/README.md @@ -423,6 +423,8 @@ style gc fill:#FCA5A5,stroke:#333; style spacer stroke:none; ``` +_The Python garbage collector works as part of the Python memory manager to free memory which is no longer needed (based on reference count)._ + Python by default uses an optional garbage collector to automatically deallocate garbage memory through the Python interpreter in CPython. "The main garbage collection algorithm used by CPython is reference counting. The basic idea is that CPython counts how many different places there are that have a reference to an object. Such a place could be another object, or a global (or static) C variable, or a local variable in some C function. When an object’s reference count becomes zero, the object is deallocated." ([Python Developer's Guide: Garbage collector design](https://devguide.python.org/internals/garbage-collector/)) Python's garbage collector is generally focused on collecting garbage created by `pymalloc` and `malloc`. From 0b5c92ebcd7a7ad1feb2dece02574166f9889559 Mon Sep 17 00:00:00 2001 From: d33bs Date: Fri, 19 Jan 2024 16:08:10 -0700 Subject: [PATCH 50/53] modifications; adding reference counting guide --- README.md | 151 +++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 120 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index 292802f..7189c75 100644 --- a/README.md +++ b/README.md @@ -138,10 +138,10 @@ style poolc fill:#BFDBFE,stroke:#333; _Memory heaps help organize available memory on a computer for specific procedures. Heaps may have one or many memory pools._ -Computer memory may be organized in hierarchical layers to help share resources among many software procedures. +Computer memory blocks may be organized in hierarchical layers to manage memory efficiently or towards a specific purpose. One top-level organization model for computer memory is through the use of ___heaps___ which help describe chunks of the total memory available on a computer for specific processes. These heaps may be ___private___ (only available to a specific software process) or ___shared___ (available to one or many software processes). -Heaps are sometimes further segmented into ___pools___ which are areas of the heap which can be used for specific purposes (for example, when multiple memory allocators are used). +Heaps are sometimes further segmented into ___pools___ which are areas of the heap which can be used for specific purposes. ### Memory Allocator @@ -214,13 +214,16 @@ style code fill:#67E8F9,stroke:#333; style interpreter fill:#FDBA74,stroke:#333; ``` -_The Python interpreter helps execute Python code and allocate memory for Python procedures._ +_A Python interpreter executes Python code and manages memory for Python procedures._ Python is an interpreted "high-level" programming language ([Python: What is Python?](https://www.python.org/doc/essays/blurb/)). Interpreted languages are those which include an "interpreter" which helps execute code written in a particular way ([Wikipedia: Interpreter (computing)]()). High-level languages such as Python often remove the requirement for software developers to manually perform memory management ([Wikipedia: High-level programming language](https://en.wikipedia.org/wiki/High-level_programming_language)). + Python code is executed by a commonly pre-packaged and downloaded binary call the Python [interpreter](). The Python interpreter reads Python code and performs memory management as the code is executed. +The [CPython Python interpreter](https://github.com/python/cpython) is the most commonly used interpreter for Python, and what's use as a reference for other content here. +There are also other interpreters such as [PyPy](https://www.pypy.org/features.html), [Jython](https://github.com/jython/jython), and [IronPython](https://ironpython.net/) which all handle memory differently than the CPython interpreter. #### Python's Memory Manager @@ -229,7 +232,9 @@ flowchart LR subgraph computer ["Computer"] direction LR - memory["Memory"] + subgraph memory["Memory"] + pyheap["Python heap"] + end code["Python code"] subgraph interpreter["Python interpreter"] manager["Python memory manager"] @@ -237,7 +242,7 @@ subgraph computer ["Computer"] end code --> |interpreted and\nexecuted by| interpreter -manager --> |allocates memory\nfor processed code| memory +manager --> |allocates memory\nfor processed code| pyheap style computer fill:#fff,stroke:#333 style memory fill:#86EFAC,stroke:#333 @@ -248,9 +253,10 @@ style manager fill:#FDBA74,stroke:#333; _The Python memory manager helps manage memory for Python code executed by the Python interpreter._ Memory is managed for Python software processes automatically (when unspecified) or manually (when specified) through the Python interpreter. -The ___Python memory manager___ is an abstraction which manages memory for Python software processes through the Python interpreter and CPython ([Python: Memory Management](https://docs.python.org/3/c-api/memory.html)). +The ___Python memory manager___ is an abstraction which manages memory for Python software processes through the Python interpreter ([Python: Memory Management](https://docs.python.org/3/c-api/memory.html)). From a high-level perspective, we assume variables and other operations written in Python will automatically allocate and deallocate memory through the Python interpreter when executed. -Python's memory manager performs this work through various __memory allocators__ and a __garbage collector__ (or as configured with customizations). +The Python memory manager . +Python's memory manager performs work through various __memory allocators__ and a __garbage collector__ (or as configured with customizations) within a __private Python memory heap__. ##### Python's Memory Allocators @@ -259,9 +265,11 @@ flowchart LR subgraph computer ["Computer"] direction LR - memory["Memory"] + subgraph memory["Memory"] + pyheap["Python heap"] + end code["Python code"] - malloc["malloc\n(system function)"] + malloc["C memory functions"] subgraph interpreter ["Python interpreter"] subgraph spacer [" "] subgraph mgr ["Python memory manager"] @@ -272,9 +280,9 @@ subgraph computer ["Computer"] end code --> |interpreted and\nexecuted by| interpreter -pymalloc --> |"allocates memory for\nsmall and temporary needs"| memory +pymalloc --> |"allocates memory for\nsmall and temporary needs"| malloc mgr --> |"allocates memory for\nlarger or long-lived needs"| malloc -malloc --> memory +malloc --> pyheap style computer fill:#fff,stroke:#333 @@ -294,9 +302,10 @@ One way to understand Python memory allocators is through the following distinct - __"Python Memory Allocator" (`pymalloc`)__ The Python interpreter is packaged with a specialized memory allocator called `pymalloc`. - "Python has a pymalloc allocator optimized for small objects (smaller or equal to 512 bytes) with a short lifetime." ([Python: Memory Management - The pymalloc allocator](https://docs.python.org/3/c-api/memory.html#the-pymalloc-allocator)) + "Python has a pymalloc allocator optimized for small objects (smaller or equal to 512 bytes) with a short lifetime." ([Python: Memory Management - The pymalloc allocator](https://docs.python.org/3/c-api/memory.html#the-pymalloc-allocator)). + Ultimately, `pymalloc` uses `C malloc` to implement memory work. - __C dynamic memory allocator (`malloc`)__ - When `pymalloc` is disabled or a memory requirements exceed `pymalloc`'s constraints, the Python interpreter will use a function from the [C standard library](https://en.wikipedia.org/wiki/C_standard_library) called [`malloc`](<%5B%60malloc%60%5D(https://en.wikipedia.org/wiki/C_dynamic_memory_allocation)>). + When `pymalloc` is disabled or a memory requirements exceed `pymalloc`'s constraints, the Python interpreter will directly use a function from the [C standard library](https://en.wikipedia.org/wiki/C_standard_library) called [`malloc`](<%5B%60malloc%60%5D(https://en.wikipedia.org/wiki/C_dynamic_memory_allocation)>). When `malloc` is used by the Python interpreter, it uses the system's existing implementation of `malloc`. ```mermaid @@ -305,11 +314,13 @@ flowchart LR subgraph computer ["Computer (resources)"] subgraph memory["Memory"] - subgraph heap1 ["heap(s)"] + subgraph heap1 ["heap"] direction TB subgraph arena ["pymalloc\narena(s)"] subgraph spacer [" "] - pools["pool(s)"] + subgraph pools["pool(s)"] + blocks["blocks"] + end end end end @@ -319,13 +330,15 @@ end style computer fill:#fff,stroke:#333 style memory fill:#86EFAC,stroke:#333 -style arena fill:#C7D2FE,stroke:#333 +style arena fill:#D8B4FE,stroke:#333 +style pools fill:#C7D2FE,stroke:#333 style spacer fill:transparent,stroke:transparent; ``` _`pymalloc` makes use of arenas to further organize pools within a computer memory heap._ It's important to note that `pymalloc` adds additional abstractions to how memory is organized through the use of "arenas". +These arenas are specific to `pymalloc` purposes. `pymalloc` may be disabled through the use of a special environment variable called [`PYTHONMALLOC`](https://docs.python.org/3/using/cmdline.html#envvar-PYTHONMALLOC) (for example, to use only [`malloc`](https://en.wikipedia.org/wiki/C_dynamic_memory_allocation) as seen below). This same environment variable may be used with `debug` settings in order to help troubleshoot in-depth questions. @@ -336,9 +349,11 @@ flowchart LR subgraph computer ["Computer"] direction LR - memory["Memory"] + subgraph memory["Memory"] + pyheap["Python heap"] + end code["Python code"] - malloc["malloc\n(system function)"] + malloc["C memory functions"] subgraph interpreter ["Python interpreter"] subgraph spacer [" "] subgraph mgr ["Python memory manager"] @@ -347,20 +362,20 @@ subgraph computer ["Computer"] end package_managed["Python package\nmanaged allocators\n(ex. NumPy, PyArrow, etc.)"] end - mimalloc["mimalloc"] - jemalloc["jemalloc"] + mimalloc["mimalloc memory functions"] + jemalloc["jemalloc memory functions"] end code --> |interpreted and\nexecuted by| interpreter -pymalloc <--> |"allocates memory for\nsmall and temporary needs"| memory +pymalloc --> |"allocates memory for\nsmall and temporary needs"| malloc mgr --> |"allocates memory for\nlarger or long-lived needs"| malloc -malloc --> memory +malloc --> pyheap code -.-> |may stipulate\nthe use of| package_managed package_managed -.-> malloc package_managed -.-> mimalloc package_managed -.-> jemalloc -mimalloc -.-> memory -jemalloc -.-> memory +mimalloc -.-> pyheap +jemalloc -.-> pyheap style computer fill:#fff,stroke:#333 style memory fill:#86EFAC,stroke:#333 @@ -387,6 +402,53 @@ See below for some notable examples of additional memory allocation possibilitie A default memory allocator is selected for use when PyArrow based on the operating system and the availability of the memory allocator on the system. The selection of a memory allocator for use with PyArrow can be influenced by how it performs on a particular system. +##### Python Reference Counting + + + + + + + + + + + + + + + + +
Processed line of codeReference count
+ +```python +a_string = "cornucopia" +``` + + +a_string: 1 +
+ +```python +a_list = [a_string] +``` + + +a_string: 2 +
+ +```python +sys = [a_string] +``` + + +a_string: 2 +
+ +As computer memory is allocated to Python processes the Python memory manager keeps track of these through the use of a [reference counter](https://en.wikipedia.org/wiki/Reference_counting). +In Python, we could label this as an "\[Object\] reference counter" because all data in Python is represented by objects ([Python: Data model](https://docs.python.org/3/reference/datamodel.html#objects-values-and-types)). +"... CPython counts how many different places there are that have a reference to an object. Such a place could be another object, or a global (or static) C variable, or a local variable in some C function." ([Python Developer's Guide: Garbage collector design](https://devguide.python.org/internals/garbage-collector/)). + ##### Python's Garbage Collection ```mermaid @@ -394,9 +456,11 @@ flowchart LR subgraph computer ["Computer"] direction LR - memory["Memory"] + subgraph memory["Memory"] + pyheap["Python heap"] + end code["Python code"] - malloc["malloc\n(system function)"] + malloc["C memory functions"] subgraph interpreter ["Python interpreter"] subgraph spacer [" "] subgraph mgr ["Python memory manager"] @@ -408,10 +472,10 @@ subgraph computer ["Computer"] end code --> |interpreted and\nexecuted by| interpreter -pymalloc --> |"allocates memory for\nsmall and temporary needs"| memory +pymalloc --> |"allocates memory for\nsmall and temporary needs"| malloc mgr --> |"allocates memory for\nlarger or long-lived needs"| malloc -malloc --> memory -gc --> |frees memory with\nno object references| memory +malloc --> pyheap +gc --> |"frees memory with\nno object references\n(including C, mimalloc,\n jemalloc and other \nfunction allocated memory)"| pyheap style computer fill:#fff,stroke:#333 style memory fill:#86EFAC,stroke:#333 @@ -426,13 +490,38 @@ style spacer stroke:none; _The Python garbage collector works as part of the Python memory manager to free memory which is no longer needed (based on reference count)._ Python by default uses an optional garbage collector to automatically deallocate garbage memory through the Python interpreter in CPython. -"The main garbage collection algorithm used by CPython is reference counting. The basic idea is that CPython counts how many different places there are that have a reference to an object. Such a place could be another object, or a global (or static) C variable, or a local variable in some C function. When an object’s reference count becomes zero, the object is deallocated." ([Python Developer's Guide: Garbage collector design](https://devguide.python.org/internals/garbage-collector/)) -Python's garbage collector is generally focused on collecting garbage created by `pymalloc` and `malloc`. +"When an object’s reference count becomes zero, the object is deallocated." ([Python Developer's Guide: Garbage collector design](https://devguide.python.org/internals/garbage-collector/)) +Python's garbage collector focuses on collecting garbage created by `pymalloc`, C memory functions, as well as other memory allocators like `mimalloc` and `jemalloc`. + +##### Python Tools for Observing Memory Behavior + +###### Python Built-in Tools + +```python +import gc +import sys + +# set gc in debug mode for detecting memory leaks +gc.set_debug(gc.DEBUG_LEAK) + +# create an int object +an_object = 1 + +# show the number of uncollectable references via COLLECTED +COLLECTED = gc.collect() + +# show the reference count for an object +sys.getrefcount(an_object) +``` The [`gc` module](https://docs.python.org/3/library/gc.html) provides an interface to the Python garbage collector. In addition, the [`sys` module](https://docs.python.org/3/library/sys.html) provides many functions which provide information about references and other details about Python objects as they are executed through the interpreter. These functions and other packages can help software developers observe memory behaviors within Python procedures. +###### Python Package: Memray + +Mem + ## Development The following are suggested steps to get started with development for this project. From b44e16114ff8cbe3628b6150154de944210e1fa5 Mon Sep 17 00:00:00 2001 From: d33bs Date: Sat, 20 Jan 2024 17:20:59 -0700 Subject: [PATCH 51/53] add analogy; memray; begin scalene content --- README.md | 56 ++++++++++++++++++++++++++++++++++++------ memray-flamegraph.png | Bin 0 -> 38131 bytes 2 files changed, 48 insertions(+), 8 deletions(-) create mode 100644 memray-flamegraph.png diff --git a/README.md b/README.md index 7189c75..1bc865c 100644 --- a/README.md +++ b/README.md @@ -97,9 +97,32 @@ Computer memory, also sometimes known as "RAM" or "random-access memory", or "dy + +Practical analogy + + + + +C.) You have limited buckets to hold things. + + +
🪣🪣🪣
-_Fixed-size memory blocks may be free or used at various times._ + + + +D.) Two buckets are used, the other remains empty. + + + +
🪣🪣🪣
+ + + + + +_Fixed-size memory blocks may be free or used at various times. They can be thought of like reusable buckets to hold things._ One way to organize computer memory is through the use of ["fixed-size blocks"](https://en.wikipedia.org/wiki/Memory_management#FIXED-SIZE), also called "blocks". Fixed-size memory blocks are chunks of memory of a certain byte size (usually all the same size). @@ -422,31 +445,35 @@ a_string: 1 ```python -a_list = [a_string] +reference_a_string = a_string ``` -a_string: 2 +a_string: 2
+(Because `a_string` is now referenced twice.) ```python -sys = [a_string] +del reference_a_string ``` -a_string: 2 +a_string: 1
+(Because the additional reference has been deleted.) +_Python reference counting at a simple level works through the use of object reference increments and decrements._ + As computer memory is allocated to Python processes the Python memory manager keeps track of these through the use of a [reference counter](https://en.wikipedia.org/wiki/Reference_counting). -In Python, we could label this as an "\[Object\] reference counter" because all data in Python is represented by objects ([Python: Data model](https://docs.python.org/3/reference/datamodel.html#objects-values-and-types)). +In Python, we could label this as an "Object reference counter" because all data in Python is represented by objects ([Python: Data model](https://docs.python.org/3/reference/datamodel.html#objects-values-and-types)). "... CPython counts how many different places there are that have a reference to an object. Such a place could be another object, or a global (or static) C variable, or a local variable in some C function." ([Python Developer's Guide: Garbage collector design](https://devguide.python.org/internals/garbage-collector/)). ##### Python's Garbage Collection @@ -509,18 +536,31 @@ an_object = 1 # show the number of uncollectable references via COLLECTED COLLECTED = gc.collect() +print(f"Uncollectable garbage references: {COLLECTED}") # show the reference count for an object -sys.getrefcount(an_object) +print(f"Reference count of `an_object`: {sys.getrefcount(an_object)}") ``` The [`gc` module](https://docs.python.org/3/library/gc.html) provides an interface to the Python garbage collector. In addition, the [`sys` module](https://docs.python.org/3/library/sys.html) provides many functions which provide information about references and other details about Python objects as they are executed through the interpreter. These functions and other packages can help software developers observe memory behaviors within Python procedures. +###### Python Package: Scalene + +[Scalene](https://github.com/plasma-umass/scalene) is a Python package for analyzing memory, CPU, and GPU resource consumption. +It provides a web interface to help visualize and understand how resources are consumed. +Scalene provides suggestions on which portions of your code to troubleshoot. + ###### Python Package: Memray -Mem +![](memray-flamegraph.png) + +_Memray provides the ability to create and view flamegraphs which show how memory was consumed as a procedure executed._ + +[Memray](https://github.com/bloomberg/memray) is a Python package to track memory allocation within Python and compiled extension modules. +Memray provides a high-level way to investigate memory performance and adds visualizations such as [flamegraphs](https://www.brendangregg.com/flamegraphs.html)(which contextualization of [stack traces](https://en.wikipedia.org/wiki/Stack_trace) and memory allocations in one spot). +Memray seeks to provide a way to overcome challenges with tracking and understanding Python and other memory allocators (such as C, C++, or Rust libraries used in tandem with a Python process). ## Development diff --git a/memray-flamegraph.png b/memray-flamegraph.png new file mode 100644 index 0000000000000000000000000000000000000000..3039b9ed6b68e4fcb7c1e4ee85d0b53adaeea5ed GIT binary patch literal 38131 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 vUe)4e@hvR`y3_#%N>gTe~DWM4fF5N_7 literal 0 HcmV?d00001 From 7689ba6c3193b9ccbad47887c5ebb2cb80fd5402 Mon Sep 17 00:00:00 2001 From: d33bs Date: Sun, 21 Jan 2024 14:41:06 -0700 Subject: [PATCH 52/53] add scalene content --- README.md | 9 +++++++-- scalene-web-interface.png | Bin 0 -> 223573 bytes 2 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 scalene-web-interface.png diff --git a/README.md b/README.md index 1bc865c..2dc7001 100644 --- a/README.md +++ b/README.md @@ -548,9 +548,14 @@ These functions and other packages can help software developers observe memory b ###### Python Package: Scalene +![](scalene-web-interface.png) + +_Scalene provides a web interface to analyze memory, CPU, and GPU resource consumption in one spot alongside suggested areas of concern._ + [Scalene](https://github.com/plasma-umass/scalene) is a Python package for analyzing memory, CPU, and GPU resource consumption. -It provides a web interface to help visualize and understand how resources are consumed. -Scalene provides suggestions on which portions of your code to troubleshoot. +It provides [a web interface](https://github.com/plasma-umass/scalene?tab=readme-ov-file#web-based-gui) to help visualize and understand how resources are consumed. +Scalene provides suggestions on which portions of your code to troubleshoot through the web interface. +Scalene can also be configured to work with [OpenAI](https://en.wikipedia.org/wiki/OpenAI) [LLM's](https://en.wikipedia.org/wiki/Large_language_model) by way of a an [OpenAI API provided by the user](https://github.com/plasma-umass/scalene?tab=readme-ov-file#ai-powered-optimization-suggestions). ###### Python Package: Memray diff --git a/scalene-web-interface.png b/scalene-web-interface.png new file mode 100644 index 0000000000000000000000000000000000000000..ad9c13d5d779dabc1f874dbc80c459c17aea05c1 GIT binary patch literal 223573 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�?FNE1y-Ip>)J2JG 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

NASu!ZsLW?Hr8z4axG>|B)h=h7>4^A`1bZ@O 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 IQo0`ae^xGLpa1{>

NASu!ZsLW?Hr8z4axG>|B)h=h7>4^A`1bZ@O zxd!>FFQR#C#(C_cO~7p5RI7&4kodG)w{gyMy-K$gvRdiP5=gdh#O-F`u&G)A#L6zx zcX1mP^l^Dc=BoTq3Ym=F7uGsC9S@6R6DRAYw5YjHny%lE4~w;ER4EkJ+k@=DEm zagj%qrd&?@>50mws{(!J!9pivp+NHL)DS z#KnCZ)l0+jp5JTu75C=k1}=w^_n`JNMd%kL=b!llvsdG4Q7nREN3$kO$8}{|EDTHC-WPrR9HQxz z%rYX6sRTD0r(OLfU+F+$IWfC8RJwl1cwd82UOzXV;3p_oX|^kd<~@&6g~n+VffDb3 zfn{u;0}KRMiN#$P}^1{XWZ`Xc*g z3VD^m(wbif(-C0`&VlV7BAIAS`ZmtXdmO_jTomfAluqeYVN`t0%FG`j6@i-}Tb-8ES?S4_cJ}nM_C)UU1D9~FVC{oL z7xfTuJcht3YBa@XCjUZuY|8oTQFzZr%ar6x!eV#D_x}}M``SYp%@e8r! zNf>)Dk8cK#x?jRmeThe`d`5AjW6!u4n37Vbs~K8h&wuABqo1-LrHp2ml1%=7T_=wf zeFQYgI8@#`YRa_t{``nq7Ua4hV5&WJ`V1hY8Sok5>8g(O zMgZ#BA5i~u`h%1oCMbGAa?@y~&>^-8e5|Z;ME;7!t)h&U#sI>q#cEgibv4_*l19!6 z5HiV^@Jf?)9s}j&4&c9)ZWvS|ia?_t|Jo!fq23=fGSgZ0IHjbz6^Z+^j`NE@Y14iu zO4|2_3J5YjdpaHK97Ggyj8wWwo`Jy>s2mBj%gx^2&@;=lwzZucAFlQemwm78mTbp4 ztPeoI7JRDha~ZY~S`#H8*mr=Lsvu5KRhfSUnfkp^JRmU_w|b+7PU(cZm_*frhk)j} zcZqs5?w*5rwrEH-l&;GGCaWR^Zy43@O10c|*7pi61G`|mK643En#JSAJ5EYWqe8N; zmYzP8^71aMZ?|nN5s#ht7+$G+<#=x4^Y#<9Mc_1pji&)q;HuA0PngQoE@H3IY@)zd z;hQ+}B3VWs_%>EA3C;?4|3o&2hRV<3*NA9b!D%V~P)!5t67Tr|;Ueutrrh;MHdv0oPEET=c%h( zd%7fl<;E!iS#z!N8b+25e_8feOuN@0c+AiIoAKgQzunUpjg_$?K4`Q1)^^x;-=2I% zgQ6keb?(pgenEPdl-br~_3i2czr0g-4vr2^w{+MuM6}qOZWECgVHQk*gB#Tz5|f%v znd>}Ij9&Hf>#@#AMdy5#LZJ|Rx}^62YS(#wupCKfca(trD4Ew)g?F*|!0D);;{?No zNw(fFPN1bM4Tyls+V7-?wK+9<+|(sl3l<=B=Ux?{EFB88BdW8iM+_Yj*Q%pIMU={% zj|}s52}_5_naQXFiGt=muB7*b5YWpmSOinaY~plSy4RWvErb{qp1voA&&2`J@AZL{ zQsZID%AcVqh83l+EvBGmV+Hcjx^%(_PpiCZDkkde^VQ9z-R@ieKv6VQ-4~*3X_E_* z5JV|#Z@4TL0~${IO$*qT+V?&Lz=qc0k%c0#6*b?b;iIn2W>UHb?EMULo8zw;ejH;rKl#;z>9d~h;n$gkw08q;1>t96 zspKYi(k^J)Z-XPzujz-6!m9(4)$flaE@!y`4>MWfp7kRGb!h<|C%k~Ia@}3(h>uq= zT}Kb!cE$S0kJ2`i>D$gOup**`{0ZX&)dDJ*>S&=)c9e=H8#O~yPPA1=TehbB`RG$b z%wmN0of{NKOky!jYrN-H?4owG*q;*-9%Kp#zEi?<`9ol!H+LzvX}TJ4fOzKd zltn)0rPfxet?6a4MYQrr_p=e~;EN5NJ2@s3hf3&^r_!#?H_JD5bSquZGpzfO^&T4< z^s@3slZ*HAla`@$ddc33dPm&xkqe1QzS3f%%hb!4MmsRxtqlk5bX%oYygR$tQsviE zZlXE&77fBOzp}@V-3$@X?xm2YirGIis1{9Z&ns~1So!e10u{+0!+wQS)XAYZ3}cP2 zj(c-1!@+nAeF)?(UbvL9yeCloBMt8w98REy>aPwSrQI7em<4JD5uIW99PJj~HIhT# zGnus(CA3RJn?T2om`eP!QZ$(92Gls0;DM1M4A8=NV+Cil1G_03@4;gp9&`{>Y@P0{ zHkI?0XxWe8GvbeANw)#2)$i#J$^baVPjl<%Uai~B^KF;z&3TG1gS#rYWZvJtsUo{j zl+yhjy;Tsre2jKR2@dL0p4uYjq8$8L9NDUiKHGScEL@!B7f!Z4u7TzsIr497`ma{( zPNxcwOlx^tQu>kL52U<=CUsBbIV)a^d~;guG)Zo#5U)O`s9A9x?tPz~sZVj#j2kwu zOsp27Js#R#*H}J^SK`J5&{Ing-E%!D!4ShMOS=2h+vi(q`Dv&3-9uLc$RpS8g{ zxp}7kIbNgFG;`T zI~+Lgj&(q>x~T05^F~`s85y-KxlZ=RfPm4-4chyI=C!OaA+yo(-CIJtJHkTzpuokj zR2oOjsDu8cTh4U2a1_=vO{f(Ef5|i&2&Q}<4gr_yqf^6RKr#lG!Em83)?!nzGV znWO1b2YyGK{MaqE2&(A3pRPNv>sM#)&YJIXlS*y9XCfmAUkIe}xsxYV<7|%R2i)6? zY`?5WK;yr=w)2;*kxhAn7tU|#3i^c=Vi*ACAUW*5u2lj0rp5H6)(cfi%AnP4@j+e& zZSOl}@!s=|?6l*H3d`ANOTUD?-8c>o4uAnMweGH4 z&L^RUu25RDw|`7rBUEViFlA)>MK&TDhhDMnc{tsk&wHZgpsY~^gtsO#3tE1?95TAU z2T6zvEmZ~+lb)BOy@Nm3p_BVFy{4!XZuxy&`kka46SQEGS9mabkC^JRz`NP1B$3vB zE?!BB#Zmu8b>|!#eLQ?*k1*S?^8kE@c*2^;j2z%@rkBq`cS!7Oe}qxiNOy-z=Z zV{_F-?lApiCM+l9(^N4fj8TsWTIFhhiV94WK%%`=&_3q{e zdz{q}j&{2gn#tq{DhMK1CFgF!j-iDyXe>qo6n-WOeAtLBKImEtGPD4ajEd`A75Usl z!<&|hvNC~Sc1{HB54=!j3J|gB-N0-x0(bsY2t-BTKjRB0i6Dl&@%-0K{RAe8h)_h;y{gNlll`<_LTkFM5x)^;rFWS4WID zWqj6c4_KdA`ILmHhc{+m$YWRyKxeodmNRlk?Lu$C!}s^Rin7M@Y6ZSJFLuWRj_DeH z+pE)~v!e#tJUx8>=%(G}dpC_!mitsJldXEXHP~djy*cx|oB;;mc=R#m8QCOZ#N5q~ zme;ejC&+iiMU}dGXS2Ac@U~{DB4PyuA60HFK&~5Jt~OQ(HxdlzotB#(oM;g2&&e`X z=KYyH6#mU@rfsY{Ip-R@Kp}E*rRXi69uX_i1%t-8b{%VA@~4pp)ro+u`}0^YpMTi% z?*6|MLkbT5=H1s0pbg3gJER~V@Zrps5NcibzLaN)6nXO>{)lCYz*Qx}YQIh_x`O=_B>LiK$FWX$H8+@}jXQVC%3!zC#-&bL@aH@w8y zY{4zn+XC%mDZUfZcjQev76|N4kGw8IrkfI;Q%Cfoa7v}?@X$@maox~*Bw6^OkAGhD zQKK8vE~s^~_6KP?BqYd&>G9RPE&?Llk^3uXHTZgh-deF}GbOAS0Z1#n$&HIfHZ>Gj z!apCq?m+wjJiWJ52L?g~TK>@J0D*_6yi?SnZ`rV(3*TBo$C1>#=?O5)4g0+VUsYId zPrN8syijkd%&$S*Kj}|g|JmI$Mdxm|TpGI$7WX_HVq3`3G}152KkF1~+f=dwn0TYa zRLOJdz8rx?K!w0UM^x|55k~4jfS@T+^Ei|N z{;>FrwU*(n3c{dIQ{h)C_mV~Oikx9pS&b0Jd3IDO_Rr%Xd>hS*K}iTB8`!Ww38nT7 zoC0@Q1$5heGBl_y7GM28lAAT=U!cGOsjTg88X^D+umK2RI|Y-MHaaR!c57I75xL0Ez0ZiIdT-E+6TZLw@_U!V#FN? zcX%5b2+BM*%}S$_lem%(Y_>yRR}B|*>J~(JP3(Pshrck86(bR99Qx_9n1a0hHfXWJ zRR;sdnh7$11ACk{^_XK%Q=V2e^CJ<@@TFc7Zc5GmTVk$yHI_ko00d0N8pl;HdA(Y& zdSsgR$$YnGeF&^BPNFYu1BNS_EAiVQ-f*D^@}#<0N^Y|=V`t?&rC}z{?zNNlpem*h z_m04MqsTj2fYs0!x{>C2D;P~fm;DV)j%4qhvbNZ}ia;mq6DsPB!uEue$Cw7k`lHSO z7ED5WNzxRU-I`WgHQ%s{g+Be@h$8I&czE{hx77hEFlQ;He-3%b#B(-dhxI|k#pgRZ zdZ`M93d751?NM!DoBw-S^a}+9H}eM-)lMAR&E^jdQH59 zqRIqs>OT0?sehE>nOu8SuUDlK|K&^IIPK`~5P(SzN|g@SG7(FbCFg}8E}v2HrwMeZ zw;;I-PBm}UI_@%D9N z<*qGbIK+=wcXOvC7c%J&UsPP{)gHWj z@RBO50oCUO+42P*BQ3+c>)=Q4cnBh1=By{Px%PwkyC$(FmBvV?3;vl)Bf_X)HgP$h zxCH{^*_Db}BsB>Lv&@h4M{b6iJZ^k@FNmATX(3)2A6ECp25VJ}nk@Isuj@M9g!gv3 zVud_P;?h%H?18<|O$cIP_fI@|!dTFDteRDT495vs0@;46dTd2`xdm1e4paGkPG`m!h#v=jI0Ddn*%d$h|Y&UzmVJE>KI zyuB6PncRy8IIWXR#|nks7#e8$Qdu=!WX<`(8~zNpRbkpSW{9?{f!_{EuU&xwL?ysa zW+xw?RQ&1x0$mgU6F+5nzm?;iX@asAO9p+=%jFc_lLDXtCLC`-Q{yer@(ZEKeAmSZ?un#dRC>U1LO0GdPpG>#r`2uZ zh4J2oR&wM+Ml-!o~YMN2?624?PPj{^Wzk?B+3(% zwm`o86ZxQXd65Vl?`!lNgQ`>;?23lWKu)U;EyXR3x|cRe_jCcbKFt_PUx{84-zhcr zJAe&ie`MtNkFc;S{ujJFvzI%N@+t!W^emyU2gtH}ZGEeXrF(x!HF@1hw0bt;#w^q` zG)pDnRjV9~vvt&?!n=W-f|eP8Jn_abLZFB?BKgaw*>Y*xXXsx{!=f+(mIg+J1G(xS z2H9|YAp^<@Wa>y4QtSZ%x}>9{J}A&wCJleEyCLofNzz3B_FS$8wEm_v@M#GEg(_8U zaxrDWVQ&g6F~o>;TBX#zmG673>WM=!>eABNHD4+Q4?(acd}xFUH7p?Z??)!sC?`AI z7ZQO6j*Z|9d5&)h9Z@8VXTGw0Z?T_}a@n@`h55{wap4y>wgq4&o#e0fvVs2b3PdjFdlNVu zWuJlsIK8b376a}}4{U-d95wjqb2Fol+~heN5^FD)O!nj=-(xbKO1~%-%ZJWl|C<4&urJ(x9tm1|M@4< zw4>t;Hke6@4v1c@{x?UgX7<6AkGT48HM8Fay9OWMSRCxlY47(YVqa?3za|Ye93>qe zDZ+^yPra6=#Gj>CDL}bM?g?uFZNrAt)&4=U)+Mx;z$&MxIJWd}@pQ<<6x0Pa0B=?c znjO{n7#cM^0;dcV`NT;;0<82eEwA6yC3Q||7&lU`s=L6lxdyUz)&Qb)awPi=kIkn8;`pY&v(?Afw|R`Q+5QJH|CFUYNZZ7qsd%64m|)yp5fgp^j7Y8;O8 z4uu_qopp8yKPn}YpU}w-S`46VDJICcGQloChwtN zbo^LqV>W&jHMUsuqn)^UrwC|=%klsQHaP^sZQBPnYyzT?e1KQh68^Ua|gULNTuoM%ia;31j6VFinVhCI~jD!fe4JG?rsStspg)#VC77pVFtGs zj2!cy1Cw9nhkj$9P%u_R8mU@f%n_GMn}P)_AkWi{?&$s$lG#x$R39~G?qmn`BG~Mh zr|HJoLl?gxNTCxP5{Fb~19!pP)m8~#WFRA_Ix@u%)J0X_>$kVV(&{Bk%*FGK8VtqK z$<5|-o_!+@@CnN^P*}~v8h}9piuje=&JObYM{Y3zDS#8U# z4>D;l4)$wr+W*3ds`VD2pm;$FNDb*p7jZ2Fm_R!mFH$I7dvkq5vd?5&sofTX!2!S_ zdyYPGP~cN#RgcMzO949{?4NJ1NrH#0E~?(<$k#D}!8gljIZwC$@l5TSN~B2qC}^1& z_ogRFI4R{OY(C~v@;QqWJnDY>-x8F_KROiC(7wgb>@L^&a5lrUtC&IvPmj~hkg7@R zx`0whQmMR9EnZS8ojmqg*7X4n4$ks%mIW`B3nHz!h{y?;;BV;Cn`qt6RaA@t8cTFb zIoCfLOT)iRa5$&9m-s3RWCCVqwRBb;H?o_>2D|kq01J}uz&O%dDdEzNYKw`8_KZvG zE%3^jsVjLTuG+Ajv%pW3ONL;jshPQ(XEeHz-?Tk|25wm6L=TE+V`%F(mxrqiJ zj6!=+mGNwZ-pIBlRQEtpYxwRXx&E?<+spYHclor6K-~6~lT{*Gie3DQeW%{i_$J$& zTOar4s%7~~CG^UPNeH5eQaiR(^|xe~INZizKeOBS+)06!^-Cz*_fEFthe zS^!*jVzcHPb&gI49R&BTLG{8!tU3>xE;kt(KbvdvgYwk0UYAKg=JMVHD~}-%3}-e^ z^!2KNI>$tCtP#}IEP$5^6;fJ06+y{F1n>1*BY?Q&Ze>?8shTv) zkc^l~%IKO25fpx=8iRpPs_QPueo{#eL0FzLzL-)jQ2fH6DkHV2>dXvk==`GZ4Nt%{ zfGp)Zd^Yg&=dmqG5fQprZ**)paLiM&SEJaa66vF~lw9#ZrBuT93OA^6I-qRd^u=#K z6a_wj75a6>TugF-^{!Gjh0$d;H`e9Y#&W~AZUYQ^EoAiBZIwd}V6knf|NaxTJ=lJ~ zXw9;2HMPf}Gj?7g}6V+K)d8bgeMw!82C4B`ovX^r&l#;j7r?F?xJdrhNEj zZXOCYbez4%XsOh0`Xj|XB8YCxPtrtrbZfX=W51)d$yJ|+5gu9t!d7a;qz46WJ8+z~FMAOtSR$LVm1v81~oiI7914)2s9yMB#aSJ`% zHXlzTDg26rSGTyhMyJA2ab3``JKszODE^Ll%p!2(iY5^+A$pO%{}}0B$Nw0;$Gk5J zQj|fCV~y<3hxiSyeO6(jH6D!nF0hz4uQuxKt-?J1vZF_DxO=p-;57gveG3Z2lOP|* zu5mCYlqup!h>2+d@Sl0~UPHS`mtZMmmKn~*CvlhqZL{2Q$F-uf{Ad@!9KS}2NI|(( z%kc5&oQC>_gVY1NG;rP?nUpO}T&~t(^Jr-%b>bOn4e8(eX?P`5(DH2_c_KxB@G2lv zel-=~pt!q(6j1+%p0lh*A@?8(&u*DapzkyHGp)@x()0S($El%XuTs;;rX&V8oOe?D zG&}Hosv!(>y?hX;ZAQF}Tdx3JQ~Wk8SzQKu~~DwmZmf zGCmgf0teWxnvK+Xe=#zAXWI-%dCFx=4YWc@-oAlutJy~&iRiG}Z~j)Y2-*LZn!RH6G{nP~l?}muh&D+>8KUUD8A>K#(qe#E3QQ%( z7<z+*2F}XI+vicQ)K85bb)AM)i|= z$32s>$RJpn1=CT|UD#vv&kUU9#B5ybz+o(MX=slA-F8t{mb~MrFKA z0Se`>qMbL&WWs=N1Ya?9R}cxNM5=hKTi6Y20yD)ZtdW2H0Cj}SKX$@^xc_K*Am}t{ zN}T1>OPp?a80X?`gGD3)1t=&>V8Iu$ouSH#Sh(?Jr8&Ib{bm)N444?A7fZR)38wap z#eheL^C1zzmfs8AHGBDbfNoR7%_lfr^XljR@srm{@F-o%qoF7eHtz~{}kD&JC!}Igba5R06`fV6uax0a{Q&&)NJ_Hs3AV5AQAvzX(cWS=dm&g>E53m zmpwn*#bR92t&Ka`kqgGcbNm6jI#Y?c>bpTq z!j}lTegGR-!9lX>Ve^v};8Bvs@Y|Knfe7vaaFZ&E4+X^@BwupdG^j=8h^2Bv|_GUHGzv) zN+3KHOX{)iYRlZ4p0{@ZD5hQcES-(x;~zO7bBJte+a8GRbhT4mnV|#_b2oUpjRLK} zNIMWD!>l|iLZiXdj#q;`nU-rB`Q&Fndbc`n71eAt*4YFVDl$YtbZmm?-2c-t7dX&v z#tJj;MH;<7zgGrD!N90wR2eBVVJKkKZdNxiSq8XHxipJX{SOtV>7$YP@SzAJmA)LQ z2$x@urMexzKf2uhH1TTvkFsXp{T~_9-uT>Z{B!3NFI^fP81wtX#Y^x*Asl9_RWc14 zW71OTfH;VnYLce=u=CJ^$(`Xe&-DBHyt|!3O4Imew~_h=rTtL$2`9pphG(kCcFDqg zI5|FE0isE!%SVRQS9!EOcm#2DbYsE=qmC+bg&NgLs<5e}+)4%&VaCD`V}l}>MiNI7 ztDB+rwf*)(#ZS5y8ShH#a^4r=(#KT1S2bHn)U{u%|IV`fyQ5J(c2c>C<;3EOP{c`( z3Djv3dv8fLn|-7F^5ABa8iyhhG|b+iEeh|zP&e|)^8Z|{hyN~?SC@aa{=@sGMeYbR z+<&G7T`NdUeqpwdUK~sr4K8<2`k*jxWaH(ICmL*K2w1~<;&O7X;e34seOlfSMAwgS zF-UFnj~%IcJO3463i2g1%A7v`oYUVWdxtUyhw!z!Ra4yciEA-Z1e z>r#_kBSk3tyJ~h?wJt-bwmIvHO*{C5PCgyzOM^9jrcR~xi{rk6RROZf|rvB zI3qKvx&!1tSjbwB#3_OOsJuk2;kbYJs%A$)Lm+~_o`&pp*btn;g@e27m4`yTKq&bO>G!zW#7&#FnY z7VG{KAL`yqQ(5yQqM6}veK0&H2L{M8d8!&jzdElfYXWJ$F(qX8$iw{EV0rd;3^)`zqd3Ls&lOR3pOEy!rCQ~<~J@L2O4F<6iP#)6F$7$ICh zkj(8UV}C$S+X~dtg8-&9*OHx>FuI@-Ziw~JuVgIsA$BgO=|jEwCU^M%#ok+nRh9OA zpn@P9lbJ+Kzl!N zgV5!imm{LoRuk?b8|WdtJIJ3wh9F8ubwF62yC^TdkxQ`%<9LhJ&8~qGM2~yTJ1}XP z^VW;ZL%?;zW0OT{m9hx$y}zn_Ar&XLoK=MN(kbQi`}%Ab*~g?$Gvmoj1LV#7iI}A{ zmZJAy!SD8Tc_;OHC^PWVt!M`5--vms{?792Ao)2|ozG~UO1wh?paUrtkI<9aG_gP@ zwfYmrN7pTeH{;au)XG&)r7)SV*MV9}lx~1&D9m(X(+zCBtt#?hZ#!9)#EcfR0bs0^ zOP6Aw&iB=vEi5g;%9SRf#GKO5tR45L{G6cO{cTEY0{t!Jv`A*vHiq5=HW5KV59X;? ziO{egU#o>nLIW|OZ@{K`M8(C$Md=~)2h+&PHDPD~d>t#S4|td}KmXDdFhbX96f9GTG?X-z&bxGW;Xtf zoktPg`m=N4Pb~D#J?w6G1?~HLfH)tIsrBVbu7JB9<~|Ryg7ky9=Eabs9vu#VTU~hR z1#?K?8MW0;vir?yl)}XJ$ZB87C2$hqYSm6$c$)1?m2G!Fs#3>t>$HliYG;lhX%t;r zd`e@fBN{KmuCQQ+&_0q)Xx_eb==;h)1;soz6GW!@+P;0uPAB#90)n2IUE?eu3#ad& zRi1XU-JPD$!Hiw8f?hUZIpz(fI zbn1bxB3N}e6BO{vEYMUpj>zM32|qHhiYBp9m3!wDKW|V>R|mU3bTW}ta(hi$=b|93 zvy74*8pQ8W9VIIQ)Ew*IX z4CAO>;g@3t>UYgY{v;$q?%Xln<40oC$xUFw?hQ(}^`iovdTu;+)7+ddAe7?4>-=$S z-an7cI}FLfhUG4n3xZg_P+py3wLju^9f&q46n5#VgpI5(Bn0|K;-xUpnMK+!X9i03 zIId?uli41GW0A&20ZAsyt05u+^_z5VOJqjfXt#M*7_5TV>=A8M_?%Ul#pZmZBn7-( z6&I5Qp>$LLNZGbYozt|)VCt_bNL_an(!UBXpi2pYTK(i$9k_(dFHwr_2ha{rxgFL7`ml9 z5%6(}ZV*tkJUj;Nybqrvw4_gwSG{(1aJnL2?QzoLsdxkiTY2Os`^PF@;csB2YMVL; z@qz3{sFgnb@A2=CA}Sai44UA8fD9@jA-F~Nf;rlFZ0MmbTu;A+;D6$LmJF*27OJLU z{7;n@L1?6(1Zg;8OqFhZ=*2lx(Cg=PJ~hQUYg^ThXc~KdJ8v?bWs6v7D*-FI#wtLW zRP=x#cREuN9RY)2zKxb5d>95zzj$#!<=W~j^!hAfnpzg60(dO70SX!l7M35j?o;)k zl6Du6fuRVg08^_0(8zUGR{xdZ%?6PD5w5W;1?2YM#HccVGU)SC5LTCAJmceW0J)Td zs^(P+gW&u~%+k5t(r4R{<(PLCS@~{av~aMnd5?EktQq$}K<&_h?hHKOtXRFZJo=$R zU3-+reFhH^w>>J|@7ASN#%298j{l5%zx^d3pI7n}K3b&_fW%U3Lr#ctVfs^Fx>DTk zoPPVj*RcM5@S%3iIf*X++K1Uu9=$(Y?aDp~hL!H@oUZQ?2M9ltBB_z0uRXEW)LZZn z&ehDt>+%s@y^|LM$&k6!{QQQiTA3aZQu3sQz2C}nr8c@5|A|5{rvh4R(j>U{MMU3v z%ReerBJo4PqGG&2ukOqe(b3`S`=1J#O<&+Sl~YTMp16sn|Tkld!#VqVOFD4OHiBGBtt9hE3l?G9^X|x1l;9}G4i0dOo(SIaM^w~7HO2LVINK7j!D z@2?Tmp&(Jgq>zse$5u_T`6m%mOEz$ORZYIPv#5R5EapRGjy@_PRI z$)-`j!kagtYdQGq&;MT@d*FjRr5O=BM)B9Sr@vOLQzZvr+5AFC`~MI$`!5G+E&&o4 z4lO0wz(2#=uaD#}OIIrd?5IT*WCZ_4s_)NKqz z{TBg&1geq(?3*nfP|s~8$Yde#h{A<%pJ;?(qtKe4qf%i!Iuxpxx`8}W$^?*%^}0Xm zo&OqSeotti>>qBSUP{( zfCOdHfjVQ3s>k)8Rm(45_}3=|i2w&zm`Ke~HsW9G9M%coOmNjhZ>Ri!ebXVDC(u#r z9cyiMG%L+|0@TEWW658^{jcZzKQG`0+m0=UBfYSvu#ToxU)(=@F%UMT_(mXf*lV*N zntR{j!dSC$JK%4x)w=ub4E4O~T$~6PWswY1|CC*Hl*2?8?TKv1O77F2k<>k}=qM-P zwEEjsl(-YoRFXK9dH@!NQ5Kin-~Ri@f&^)rDS0@?5%KPiE7b6KpQc#i=2i}hsmoX5 z|2e$72lIz_naKrZ*C!~T@T6=w!SMH_=s(v@Fd486wlEeeT>WaPDo9H@r}jfllc~5Y zhaCL{O@GLoUp-h$g15=0m=}YIjEqFV#}5MYX^sTt-6Sbc@wm9U+U&t_9-302prd<- zhilRL*a0k+urPF8eSNvB%#pA^ShBv#s|0^mg?~vKKmafE6Vy}+cRL0t zIHH~JBxWy%<>x7VPQt%{lwFMTX&hd@!0AWv1%z_PbEaKIf4CXeNga@9kHl4;Smy-iwi9seG)c_y=IOCd0>(%(7Q7eXgm+MQrJCyh#xA|NH9~OgF z{1yAKwpwb5`>op#AVcu!CH2#%7^tYIxhjQtUfwhvw%?xnLci;DSIVKAZ zo!k$YVuRB0?O)t|Cg2d~jPK@4yW+?IGmi%&D$TS$g?IUqm#>})z?My%c9K(=?RQ?+ z7sw>74HWGP@|n?N4G6 zt8F0?6m6!7EHmdukT&@2%af1ebpCQnduQ$~5k?;sN8xESP);7ad)7-e+0r^pu3XLB z`oVyuVyox?IHb;J#pw*?a2WRyC|hP4FZ%^Ne24*HXa2wmC^MaUF%1-~fBzsN;y-{M$&VSW`Uh=s~zehdfaqbHg& zY9gmEv`{Oc$j(J%eoBO=w4J<4-KWLxVbyp#u%%2rh;z;3mXVW$$s9TrE4a{Z8Gie{=g90PJzX2eoyu?ZK64}p6nS7 z^ia_8$P-AQllSR3)GT0ZdtutYL}hREg! zKmgEz7AUptBhT;I!u|^P5bv7ecbFLxX+bA{RB|zlrWYbtD0C_X;XoXoN3cm^8^9kV z0ZNF1wyXNS?q11GWz6B$((v-YH*KdFt`nuy{p$|Nvd!z1-fNVV)Lo+;rO!SyLF1h@ za%&%_m{=`myJ>g4Tcr#Z2KjAvW(_Won$L_ES&$?>oZJTgw`ygR@jdK~*}sq>T`5c>SH^)tVxg zWqO2?iQ`AquJ5&p-CVS52x$APo*a$!nq%hu?-K?}G^lWgY|^<~0$Kf+OL3EWGx#iL zurJ7-G9k~e1XBT2Ov3y4TnEQj11YO7h*Bn=g{JVQ#ujffi7}YkdRNn97(>5!gc4we z@b#_tT4Ey%082hT&q2&60jMRHH)91KbXKfuj5i)!xNg^$ZS~tRbUOg7P^Er(-IQ~% zx_H*nR`-{3V*7x)d#G)R_{l8YBRexH3?CyE>%2PP$1u=cU-411F_@U|`b!|EAmi?# z?jLT?aC@b>K8;;$D)!y=A=eLf1wV)^E z^_G45r_jP*;{1Q&KLdOsPpOE)t&=(#8oQMAFmt4pQ!T;8+oCp{LG(zeD|d|QZa>TW z@D395!?68bd--$9S&W>;DaY0GX}706(F;-K;`dsrk*VBMbITDXU5Gi6Ar_GEuY~|3w=wSsOfn z$i;$Cp0G9DD_#3KUS!0_I^?aC|KRm<6n=X`ts_w6J@CvcvtB(jNm*~>#3Upw)q*ca z;xoV|p1v8!D2?T5*z%Azi#qA~%D>~MO}`_qlVi`3bERq#^8q`IB~J6vE+sY}^MKa3 z;Ks>ic^YglZ;!8oDQge#&y<9|gHhEAFu{I@LZjt+GOAE!*y+XT62S!$tY_JDj%5Ei zW&f`Su+K<#jvM_r7oG(MtLcf#;*c!B6H*#oQ*$MbNp^AIQY!j57P`NQx&-kXXaf*e#XzM`ZT1QL=klwM!Pge2mrA22efg6$|o3Fb}Rme~>Tn*C>3+R`FF~ zIX<-SiLF1nzU}-}D3G^;>M9T^m4zQaC2aK=+M&)1*LMuC}40^Is& zewQ>Oud=L7ZeM(uyp**WpN2umqmu1zyR3{~spaL8NI z(;8!i8{Z4x&?Y2*ti_q#__={+3pdC*Nau$dR_Lw7ju$(k_ED$^#slr~ar?&Ya29Bz zJvDyi^hEF2CLP8|~znSUabWG7hWW&sUmCcNCs91oOHnzB9Kj_h9x` zLdj7KRafQeiIez5G8kcnv{k1rA<08?6=oje-EQCYVPpvnKgsZO&S&XMlK}M)I#1!v ziD8!29rjOJ`89E!h}cG9v^TcRtYXUnXCoC<<{zj6OS!}!euOLOP2{u^21m)*{CW+G zUPD4(KfO@2nVt;!6mT1|3CKY+A1%0}NGUIJq)=1UWW0zTgx<*W^K&iyXkvX2fJ5#E zDu~L-yPrQl^(@Z@*kuz@n(xh^v;R0EB0_d*ZI3-GJG%>6;0Fna^YV4`5HX1Pv7S({ z^|SLmK>fzVFdCczj%5rjY@NRu-T~e^az{33MJr5KfMNS zRYqWzpa6uQ-%NhadulQwAr)=uYPM8K?x-&c%y8nnlY4rconoazv zHqKqYaKmAn;GLfLMbC2hV!g`pie;E}`I?S6qTb!iRxL#-Eqc1fAu^(YR+^x>M-MvbgdR1RDM^FkltC)ladN`#WALAnFA1_(ivg0=Xbb% zogb|hf=JzPo-JT_1KTLV#Or*#N0!_T=1}EQgZtp4rGP(R78vH3r+nm^e5-zE_p4sZ zPREU|a;G$u@U$~j%!sB-o$9XOg7(e-Yhw84V-hv^c@bRxM=krzB}Uz`vT`c`Zvw7r zV=i(u!2c@hNd;ljJqEMPnCA@DZ9n4IY}Zh995=r|mehVKq|d@GVe0>ug3K}1F!@?U z*3?00Xc0~_a8p%M)B$pTF%Ryk=M3CP-MX@@HW#S@x1Db2z% zl%;v3nWehr+*<>Z7nz1123{I&3#ZDfm(#C8i3J#dRkx=|DM<0?{DWG%pw;48jNbEJ zEJt;1Z0=e@aBoLdb*t&fZZPf_XjLl!02v*zYcyNr3pA&%Rr1oe zknX{oGNbNKXAJgz3-+^);sfp_04Gts5~~@_NhxlmQ?##=x<3;jS$66D1WF^XCdR0V zk#UuC@%@{*E;;1-7y~|)^{2?~6}NO26^&C*Y`$uqJ>N+#>^17iOyVUU=0=V}cShza zXcsQmWQZ*?DEBeGF;NWlhWU;#edM45JOIk8D;^n%g%KrXXo1+X48YzUr8>o&_PdFq zqN3~1;uN*QydNN1SI><4;hR?p&AN_XTtS^S+qeK#MX8as0;HV&92XR7!F!p$_klK5 z(((GBh*j-j8G4KC5H__g{#(jmbkKR&wPQa(#*?MbgwSm$)9FKymJcB~E8(DDjrok!E+|`37N9^%KO7 zl;==z)9OSnN^zOlxj`_-b`lvC8yki<4iXD(F@>Ovz?I{xpP-$J?ddOHeP(wSnwt!)`T44R|r6@$L!t_Jy58c4JS5h377y@;EKRW-R$bkvYKBxE}7qtG7wI5 zLW;z%QK+A&mx<0-b;)#;I-Qt!+Vq;^pa$01?ql-SDC*uF4i%h!JO z4eV!HlDg%83s5&QUD^`T54W0EO@!Rq*}Oq`KoS(}3LWKvE# z!?sSDPE4Nb!G-nLsf>}j#>q_DhXVpANLr37F)TpcBTOS;t)7+CyAcKfq%yHQyH%|j z6>1Nw(WxCYsM5dAUqI4A%b-!H=N&D9(XzT6Wjn7MhYKpUAjDGwVUnSCnf>GaNm(4svYp0DZv})sqw!}HH^tZU=aIKLPtSio3wM%@G0tOJ|AvDUPU{W>C zj|}?rh^$HoA2!YnQd^(S$kX5?wziN{R-9;~DHn=Mu%5qpkKxiP0d;S8PCDmfLw z{BqBD$qdH##E(<&y-eagD4`@NvrOxa2eer*3j7744{;3ldF^pJBZ~eFMzumDe31JxuRMO@RMLcm%n)hN>g)El_~u z!mO!38PjAjlo*4&*2Ycjw@f9K=5l*JU-g0AEMc}lIAIHda54Be*z1cJwqTVR1Qmsa zFb|H&30oM-Y+ds+n?Mf(Fbgke3B?5b^itF{7A)n^m)_T-I}eD zYEZk$JYy;mV-|GGyg#_XCeHyw@GggHDDIB5{{6|Un0(2Rm?(6Bc6b>X7ngb<42mAq z6JVE~k$4PP!Ak9AHwW!(p_lVMqV5_Qih@4YgU_(@PCZy*;K$zH$ydg;6FK)x62N&v z!w6K}hBJsx@tsX)v=Of(L(D!eTsi@Tuak7HXUR^4vc%V(5nIW@)*N(}tOnQ^kEU)s zeZ*^sglwE zWPG24ieZUd6~yF)a4_9`t@i~K@Et&&r!aqncN6GK#8nf$c(xxbE`f5e0`APvmj>)+xXLBA1XB@zA$C$G#))D>|jins6XnqSv5Z@C#!-%8=s9yhu0GPnpC|#mL2c zNCmx6<(tn1KSbnNa|Wd;cJx4^dWQ3?&97)Wd97qwGSDb$CQi`C&#{>6AVRW!y;M*U z%odf*WQ>M^8Fi@CFH>%NH)(0!P{{=IY0l8|1=p>k-)1A0~EA79eRAJeQIh`e-f9j5f!= z=?a=DUePd7HXBFyFtwG*vo^YUt(g7MS_nn^va87cEH<=NaGD9EACJE>xL z_c&t@TR|j!dyVr3nG}k^o=M991e8*d@9#eMJ26PGdac7x&KnZ5o5t%r%>l_p9YS%D zDv6OOz%QPp57V@K5qSc2q>?IMtiv}^WtA~`R#dwiIj-X@)5~+Uv|Tf@^1~`5gF#f( zVJU>e_6uzYrr29eL}A%up3poqkZ*QL7Q_|O5FK+%qke!MkCt8Wu-Tj_&!N$={E94V zM2|qPT9l~R9CpGv+v5ykx%>uR`6bcPUi7zdd*(O}ms0tLnxki52$FE9M6l`~Gk;xN z`D$|A!@`%`D1tXPpj_~VME*1xk+p|q!??e*hv=+3Eu?m&1}Wo`CapE4*oEvU#d)qk zcW_0?&56XMuaAKZ|-Z)~6EqbY~Dm>`a zFJY*JpOI&lmWMCkH2a2aFa`TOn;ny{=oy)@wm#^NtTt*8#l1*an&i_1qHYg34Vg7I zb(iL>mWaik_~GA@D0Ijl>FL3L+Z2f`8|vVzH?K_WmWYg3@up}fa`un-OTaGl0&MGZkCX zDYLUwEW4RIldI;+oc!`b?|=%uMypMe(`-dL1GZ|BR^ItKbU>s&X8XoTBKI90Cju_+ z&l2yiO-zzph+yiS!UiTS8)>s;0RF0M>b)Fz0xeL)E0VVCP&u#m;0iIk#^Ilw5bvAp z#$H(o9{xySG?8y@K8&{Xw3VXf4I8}NC({6=p-1$>*$0FpDAYb*ac+ZOSbi%@WEFml zL+0DjH7=!Q_|U-3KhrFM`pw%o2@^HPK$CYl6v`X9jVV}0w!D=nWb;9Sq~xq3L=O31 zthzI46)>NVMn$OhzmqIv0<%keWkLM;0kHrlGYHph7hQ4g;Ivax<#1g9)amZb7K(bi za*^%lyi~9%m*zPJxDUs>;2Psp7NE)Qy*w^%>;<_)G(3b0u#ne};*hkAr|< zGF!3#4ShNp1u2;~JLg7tY+KCAGk|6kNp-Wl>-pDV4V*9Gr2w5nlK0;1nIY6K(tUJ# zn0+1e0Q%R2@A82#g;^gAf~6ogI+og1yAJXukLA3F6mHs<-}*53qIU6_-DZd&6q(OB zJ|YY9=vlpgmQzlF1kqebJVn01xw={YSZSb^ndvYi-5ACrv)vtX?BE6+x9d4ub@mlH zt`EL3VC*}U+NC>pB=93Fvd^q&TuOBWhI?xe(ZUF z-*Od@D=Z}_y>dAvDivBK;KH%Hkv+Y%nS8hK@?L6XwU+Y3p`<-{0nt+Lj-^-D{*Kgq z+~j#bMsT4PSFSS~v$1-zH{(PkIg!3J@T;*mTHrlu`$AWD;I!Uha=?T1E((^E2*XIjkK zCei-6?bW_zf>5Nj3#Nl<$84k!Oq3y_P!#)6HSJmM-XQRwV=FDQU4rI!3m$A=y=Qgh zj)op{wgKs?%zT9nxo6DzXG;q(m3sRAF5~gqp&@phuk@NsI-VV z;Q|Qwa4C1g-V(GxAoee-xg=ja5Do)fVFMLhG5alhnp#098g{TVb8C<2y@#j-2&c>B zObvB^zX6Sz^=H+WoB6#<@pMN_OCf@!!w&wAX;SZM;^}fiVl`$oJ3}w>mzTDZnKYRl zn)4OvoE&W~Mx8i5Mqt+P^Qk2uuG2i9I~R6yW}zb!1pWPG(C5deDP&p6$S01{b}v%A zVz1Bhw{>QBHoWe_o$C%W$WAy3{eE3K*{*BGLWk6Z%UO~Xh+0&&h=9vt81PI5Y&&Or+8+8Tu4EJ(7~@ zm)UI;Dbe3mGJ>feDnGJnQIpiHe=!ufDP_9F94Y^);$wytIy?*`lr9*TF}gi-(@NgS z#dDvMT8c%mhbN7OMeryyXh&N4KBAYqlR8h~r`VD3d`jnAO(Hh4$LI$eP=s_Zehn&A z=IOzX7KG}%1znKlh40A>=XgUrm6wIku$-Un__UR^BqLmHXiS;*f|K`g#MHxZS;cyJ zo|C4sf4{+?Q|Yl~TI6sArWh4y6G4us)Tvm@(e^6?t&Yfq+)5#leKMj^<8KKf;N8v_ z;Oz8O+$M}SIsGw6PPU9gw%f4+M1VJR27)>`Rptzu6+KqQ-9w-aOh^#1;ityT%X_6> z0g8Qf;JR7e4v6o2<4>7qAs7RYw>5s|{nNB-+QX9Bc7&wu6~_%t?G7jcW%}N4 z`^LD}J=MhGy-k}89YOYX>z|y{HB-QZ+b5o$lL#}gyV+VLlWI1roOuiewY93K+COOI z1)U;+sa+@FVA__$KW2UxJy^sICXMl-+Dbx$)PFlKYj@ac~5Y+(mKd%ozKj_-p{B>V0){w{N2GtSPbGs9w<_jA%LjsL!f>2LA1bC zGO`9KIzU02((alyvdkqbk$y^QQR7jRPh^8@-APs96A5TviMycX+{jD)oWm_oBMC)Q zE4gmPzS0#^BPc5pD#CrXGFb;n5L- z$9OE8NDYLG!pa{n*X#o5fWjMiYx;E~sC>aRpo?Gjsu!=4O({>|tL-CxKu|vf@{yko z$2#swFncK7ul_K~1$S^y47Rqc4go`+u?>4Zz|HcNWrMJ#=WF8KCye6`KvATJnw(rL zIQ(F#y_P2$uqJfFRYdT~#I@ZnR!jzIIz+H;A;u94Q zRzYl7@pX!N(d~HurOt>!ruVw6){B}b*fs{dfr%AUHwCp+4ZwyUsQNB1w1%2@O6 z;reD>(KLr6igH|-w5b`*DI$5vttwyH8Y53EISO&)jdv}3e)dM$W8`GC_d6qm@P8)Vb^*o4Xu1F_!fC{)CA6lZ@cPmf_m_tdKeJoG7IJbe zm9vu>#%?g}=b3S9jgx!si#4%9EC2f1_{eB?Ag=dN1WPu0*<@vTKYQj-)_ARN3r{=Y zdCCXmgsb%r98+^+%E8u%d<+z?o>|&Ac2af(R9M;_*3`1OX%+jzH@lD#3ZG`9cu$X8YxGKZ=x$Szf?zuybV5eS*i>c*8d{O$1^Fx(~DWi;oZ) zKJ#f#|G}!6T6=8H4sBfF5OOr=M}3sRho>V2p(&tc_Iy70osp#z>83ZkJ+yD#=QqGs z!@3z3d%ab{oE#|dU2uY=0*ZXw`DD|m;=voJCR}#VDy=>qdfsc6Bb#K6!Wxf%^O5V_ zc0BM(o7M`caX#IC1G*g`Ob^(#E(D$-EPoW&RYPAXH(16bi;!JqGl>n4HFg-7YFvd@Qp!a3 zx5wD^4C8rLVJ;j?G!vi6rkYc>_+=5M*-vc(L%XGD^ske;cFvlJQ8Cwz#gGj4};0$dkK3!2dx&Wwp4oYn*_Hh_oO1q8sNtKB-bWWns*pDV&aA99>*9Qeh@@-g~ z_h1E>tBxphNrU7!SWH%;qtEWHBJBpM@vHLgLW~Zy@*dvBz$fn2B$6{XB)F$gx3OWu zg%hc`dKJ%Rg8v98?RJ2S!J-KCNXmg`eK**bm;D8sogUSqG@<9@+qv_lOtIYn%i!+$ z<_V-z&~k+gy{anvZ3N-4g!l!Q=EcqRnQnP5h!DBQzoQC1T^bk|tgL<{OnI~F=^B5a zl4@x?#qXH!ZNMFUKGeyweilcWt#-=ilWmx7+<{MT9yJUXmKV$RTjF}EQXVshY%V9Jn)1Y*o?Hc0_=SeY}z zs+=1(hr9Cyp$0YlkO)8JD>gm^Vq5u|sL|@@jku81V|Q`e^?_y#-l^_ttvF1n4 zDB`}%pg!`aBPi}O1yv!E?AuIH0NqR|Pv;t&5TCkh>?@SNlJU1btymA)OsYE}eQUVYMJ-s8=|r=n1T*&<#Oyx>|(uECjWF5+&r`!t8-FVk=i6 zke<;Fs|ijfV-p7BN}1C8ry{Z!`}>KD#Pwmt(7phWkiWlO?VH+e1@HrAs}ud5QjJ4?hAPJHpzVlxP?CVmA1h`-dWrXT|5F;ucm0K?sQR#IBpR^_Sg z*a8Pk9=}vvADUqm4`gVS7Ysu`1!xy6n>K=e*7l$}iVWQNn`-NoM8d8W?po^2B>UM2 zsQVA9o}?IflL8U2V>tE3?{*_81XrBugUP0XJUz+G|#{E-~{^NTdg`0 zf?chW*?1Y5p+A0D*=5+_(w2r*;Tih=1 z8>1#-0mZ`Kh3$6YiLv@4aeeO>vKP3=V^(cQN%Zfvg4LbT=s8)KQE8XR& z-%A5#FvR(XHK;f%S73IOH-{{G-(e#w4hBir_yLt3$RLu;BI`cGV@{GI3MN9Wxqxn! z4FU4?`#FJt`zR44961A^|4xk}|2ki@vIy{$)fu^yRv*iI3}f_N(kN!fUl|-9)Hxnm zLlBtKFVce;Sh{Dd+6jRkb1~;J_BrXw0|mF&BHs_Dhu}dAHJ-~R8_zLh3u&Q8JCJ=I z!!K7@_pJoH*E@|~-SKmDIo<^nuKQ1b(4Qe+v{aDwS4`D-FZgLXOSD+(7cEcLz+6;J z#lYtadw?fH!?}Kad`=!Cw6BcrEvfD_cQdc~73#QD?Lz1au29n%ItyLPV)blkZxidI zu%%ujHUnPlxm|}8f{8L!dNQ=ukU3r|NlZd=iEAdOvLAd~;x=>n*#abNwO^jbF)vlJ zbB!c?*$3_$9bhomOYh(}Ydb8XAg|9#-yrOREJ|m2@~F+u>xv+v_hmq|zD$HcvWL+( zRZr;Tuk@O)&Y*Vh^D>e)9gYo{^NIlN>WU`9a-khybZy%0R6v^Z-s0U)OrRif(`$)+h@&2-I67~}`hlUM?`3j-p zoYB|UkLFAx5s!j(7AH`9_k+4bS8vnU>Z1Ueq>qR;;H(aD3W>hf!fmsBq? zsWE~W$&Dh*#TVN}sXD@w(RXTdS2}Gh;t*@G5~jj8)3go}tZ7$r2?Si5wA^0|LjfR( zsiY)N-WVphkw68h7-~_@{OyrgZsptYz8YHHwS~HwM)yYU2V|I9pn_4TeP@=ZQ(uE7 z1%!jexuyy?2*W?YA(`4gpgPEuoFD}TXFqDTiWE;4IrM?fG>h5fQ_MqWp#Jkp`4si~ zyGKN&C8SWj{M#eB&=XzPlNbcM!lYp!1?FwLHHP>xF`?LOD5iM>Hm4Evycw#O(KZG% z{G&lC$Tct^#(8b~(bAlI#&@=#+jq(R@^~X#0(J@|;^lmk=c3dTFBTO~=-6iLzD5Ay z&s|5l1O7}rF!fK>2N~NZi&E1{K+umz4J$#EeR7NqgJY>6EO8$$gFQeNRC*%y>((Zi z)Tt<^<#>so=8ZXk#Z?|ccqLJWpH;}BlLrJwb^ug#Jc(3A^rn>wjYS8FIkI_6TUW5{ zO&1`v>-iEKph&1yE)jXmx0-;6n`%DdI4^i=gP5nF^^CK$;w$&<)@^ooXT5)6{_^$) z#>C;U?rKd^^LZw#5EnagrQdOkE3e^b*>|4 zt_nV$ov$m3;&?BxCgWF5dM^91JEm)OhJqB*U%^&e_8=;x8Szatngp4iTc;Hy@%2w5 zrGa~bKaRZ1>u%@ni5I%W4k+ICTf>AAg4NSVO%3y1(s5Yu-PG|{gN=|Q!4s?T1*C{g zeHOsozEi=k-ZuTlAn%b2CCqJhURcJDesT#AJ|D@9>XG`N%WV&&i6AXfZ+jaflfkJW zF0w(aP~f4FTmm}6i6nyRNl?6-IvuJWfSf+!y=@nHB2TgrijIT+Io~w!3=w&8Oz5Vm z75I=40oxPk$iEk)I>h+(*54%6lq3j6+!0}qODw8~gByf=*7t~*4&dPDO%*$ec&c3k z4NYC2>33yIOnzcT8{3wZ%pF#2d9+3w0wWyZp`7|sz&!xz+gwdcg9be@Z-q$m^}2P= z3$$Y-Z1zn?)e2%tWSK2_YG_{of0hhyX);L;POgmY-*N$##M1tuRCdj{p8@zHuHQ}@ zj=-K{+S1$G=9xvg>_S~70!9g9OUN`Cq)BhKSXY2@b%5NfJp_M^r3QMl_xZ;X0a1H^ zq0MZib}Fzp-c9FzDR8xJudQmHVYmYgTc1)+lXw|0B%dLMX#8=MoAU?i21Gw_`q7K~ zI<6C*>pqEb}ol>gcnF)+bpD{5pV+_jqj6_4BD=@2W_oWq~VW-$ruy4_g zF+^ctf7oNVt&s$KEpR~(#^>K=m!%8?8GECX&C%0Q=u&JS(==d^SM~)2+0ZV4m-c^hg44 z5;hbK4#qDVX$Y!zId3y}T*{wXo$@A$4pR_diSx&ZY?sXmDIs^j>fvLWmf3_}=L zXY)4%#In!i2vMk0RK4$CgI=;yTI%f$506D%y$+;{$YCA|lb_gejE|Xf56EOMuuMX? z$b{jsNzM0^P2GuiK853)D|j$C1;iAT)!Yjz#hwYO*}ctm-g0x|XEYnKYkJ`~C!{KC z0)b|dIss#EY|eHY*5L5366$8auT)`?zkb_vGf)spKMo*8oMPBvUeNE?Zg1NYkRPI! z-b>{B0-(Z0qOk2@#MqW%PGQq60|pc)}HH`u)ENjpfA!4+bn7^*8LZcg0! zYp*ZH1El5)xzMRoLziliIsn9&tTwK|Uft--*dppNhn;=3wi%O;5M8!Al>lFKl1^KL z$O=1R=6Ktcb*6hs+>z$TCzw1zKKDH#FdDFW0o>k$hgD!F=d8826!k53KXw9(efP<40Ot!aeNPaoWg=rB83c*R(m{HvLRba($mb z=W{_sbq+^=OmK)_D|vmD4+jA){FhoZM1Z6tf;W8isw24-->7@Gk)r2ZcZCHp%c(ls zv0&7_wiOBrjy5sCAzOdhOb<6P4H6MXL(ujbee%9P7r_p&6yaw>M0)CjqYKPyFLyjR z5f^=?6VHIS7-qm@+Ya+(74b`W_xNJ7G9vuGG9X5u{~5irv(w9RQzFnKFGp5y1a1&! zv&C`o2NU`ansMFC6veZ^s6f&Maq#4i5R_#4e{dg>NQ0KD`6Y=C_)veR%b{+@zcZ|K& zs>fDIOT>xSYW|<8s<8H5I(H@%UWW9xdXi{qeldxW67W76?AMw0c3|g>x4LmFzlA|? z%kP(bRux8y_xb(U{*%UoZ}|0>+Crnb4;$-I249QtHQdB*aeEm_c?y>tV@yf@syG0& z4EfhE3a7;ptPfLIS|-ILILWA#YEuU$Tkikl)55TW&N0**4j_Sp{vGkv7J|<`7+L^o z#R}m5OsaJQi>*Zh1QiGKIeX!t15VS#>nbhgbOMzR7nll$G@*qkHxu|8h#&lhA~_#%rTa#Le0)MJ)mYLgTednzrBe(+)5>sF^N_WPDN6y78Ol>NMND+{+{Rr+0RC@ zJCM9;)};t~#Ru65E7=9yD?2AI&^w6+7!{tGZ!xo|f*NpORFnXRLzY0I4@)n2cK~`b zHFmUoVXO*3gD?)D#@D3P7Ya(E>?C$PpW?XxIPjl*|CAA>kAi}NlSccg>V&?24 z1d`kohwOiFGG0+qK95x*pY6p=q;Y|c-Qw>LIXKF70K-i(FYA>q8qeo}Xq1N|(|~Ot zPm(-1maoc~r&V31^C%FEVn_#jc_n|{RwscfhQ}e6Q9LUS52!*zQ!l6)ueE{u?X{i* zfUPI|`qWvc?{a^kwaj9U{{qM!W&z_|1t7j#r_}C>2n|%D(BBS2b6|=JY4%<9Q!|?oc&n9iJwI?aQvr5^~>jr0oH4tjb-;&jJCfuUjF)m zd3rDws-ygN_>Zsn>#P5GtOKMCn%^2ud;Y7_u6cLbp9in}viknTb@~krRCmYL8}F#P z|F2Ga<=ttI#p(VR(hK+C9b`!QfkV4LlB28qzdMU48sPgNg*U4c|3)Ap4aEI4fcZ`R z7w7(0-y|48E)OCGnY}D;TKY4OHwW)k+z(Cv>4du6ak2NdtEm2RLIv;LZ9(_AJ!LHK zR(YjE)j!EkkoW-QB^2SLUPa3PtY6P`3BiXL@AhW3G33J5lwcsBJiziSpQritJ#oi( zn7zX#+WQs!bpfTKz`yovsW6+OAScg2(QFZk^00vh=~W+xCH-H1>tAk3@cBMCVEqag zv^v)Oc@pJEAmD=lYJifJRS^vx{c8&OSQrr>EznChs9#PsC$uQ?Uuq9~uAz}2pDI6+ z%*{*u%Nq(jse5-%(Q)mH|0PF3L4g6lzOGpMt;z~gJ5dvpPtgq88ep@=Iy{M`Q4|9b z4?n)$`G9o=>SAn-t^s|-IRFEPQb9tx8)*s8 zz4r6I&xbR{8RL9#yT^9RU`^({=RdCNcZtB3kKUsZaHq(062mWUN{(cmG#;QuONzWv=G^KCa_7j&DUq6rzR&z3P&M&XFsBU~xHm&i_@MXcr zd#Sv-zd4f0Id9g){y#2Wm$ndrk2nT8 zvqoeU@{PR;`y-XHo+i{~@9tk}i>rf##?^i(jtNb@2!nJK;oe2%>zS@h1|M@Nxo0!Z z?}G~Ng-hna3zy)Dp9N}I@9B}$qfaL%<<-A3ja6gSU-w_x=yFP#lxI}2AMBble8=mN zYgzx}2R#d!)>O6D#8&x&XSQMc{9Hy?awJ47cd1sBFyG%{g~L4Orgf0hH7rj-cE8Tys% zlkK(?R-H(w7tQZdXl~M;UR+#q+F}sq&}=5J=;JN32kRN34?~+it!J)ImMFaxtx-4# zbuDR&7QMLx*zZ&jmuMn^{CR_YR&X9?4J8rj{>LvkWF+Nk|2^AQtm&68EN+$k}l_G3j7`h({G=i%#Sk--X&3m5p`CoGt$`w~|= z?73htBe?0dWSy=y|i$I1)%_n!MiB*9D3v-AZG=C919G zHMedrgT-#sUV}0%^<@Q)Tt0k^8twVX-zY6=5!W9y0ASBf)m3?>pPx@i4tAx#=gqnA z#PM~A$O>;^s$oZK@3>3AchW*E(xBNpy8rguYfXjTJ7IpQnYGWrGnS9W=+K71XZ@d( zI4tyG_hmxp!MhX}aA6o{4R&UWNWh3Bl92b+`$H5kUFa3%2s z`xm%SR%pFnLXnl*OLGwCL@xZDks=EHnk)-|Etd}2L-sd1WEl5KhrXz*-R&lQP(EFp ztm)JAbHZ5~JdI2iPm@uBLB$*7dyTrdt+)8s&GwWP3vbhG94T0^ktG=n>@9)5kg&0>Z8Cf;Cfp&|dU^BnQ&82Bc7ob$IOBMI^BbY_JoBbb(8cjxP3)}CY3*0K<=!{(^p5ZAACP41R^v=+Rh zW+(?yeA}HRN!;RI{&n%^>&5+lEOmh~g#p!!zILqIdHVLbnVHgsBw{eRsySyGg zW(;FeX4qf1i(B}E=r@#NDEp^0wBvE9`h2KW@lYb-JW>fk!;XxK`c5zCl)h}~)(Eog zS~lM~KL249q4GVZG~#Lei8`=sPR@nlTdJc6Uud*2%fGy_s?%ZFPad$ z35y4#Lv0G)>YBSr-nTJS6U5OLe3JmPK+5JoeESI$&t~Y9i z7v%-uClZwqrOLnpjm%x(AliGRYL*Kf($Ic`c0;Z1a)-*%|4Ib~8lF}!)=LL0%o|qT zGy5R)ObrNmHUQk3;7hC54ih#uHV0K7*rWVx1j`n++0QR%hrwM4L*9jk#y7bk_t(Ry z32WfDEjs0{)-k02=NQFwEV4>K8)hf7EgL9Avkaw<4Xw%c0zO5qdP? z_%9E@ZZ~DF!8xFfdZdj3esye}CHyikKEsNKn2hWp2+4Wl^s{_c7~=RNx{D+CC(K0c>3)qupKNXPz> zV+iX8ZzH+oGYr$!JaBOjubbz}X-|8|cNn_nsN*3~Gg9Nw(;2?Mu^mLb zL8>1ZzdgyB0|Ny^gsX__oi)aa%(1dK?q`C?GUX?@zd&f$2XHllr6q#r_kLDv8Faw# zfStOpBIu89GoUZoy?YHDbm~C49pA3Mb=uj9Lwd`;e$sNH_X8 zZUihiMI}$@!!S9wRFY>iFL|a8->>aX5&>{-;m~O`5L6Tv+OmvNoKvO2c#^W~-rH~VTIbuKM3L$o@m;r9lps_YEqw*em^{l*6_ji?w;6A zB*7s}zMC2gLQ{(bV*uN4If?K7r@?g~KrlLm79m35m`)KSuu+*1V_6Z{?Zjw!Wf229 z4n>khliMq`3~=^o0a7@3Sy@@Q3Z=NuVfxNgNj5?+=pIfi>@Y6Fv$=Qnd4xMnF@e0y zmelU6Cm43gB?aI8-S9tT)yhc$qtwl32#f_1_#-Wu=Qs*yGVAEB?Ck6w0H)DFkun9O z;XWtaH;UFmZ48S%zkH%* z`+B@xa7e=|x_&()=EXjaC`A@qI@{m{#&*VSg$B^U02Z0=@}=HZs*8yj-L#{CMTg=z z(9)zmxZoiEt3{5G6QaI)Mk*l66#>DZhDme(<dTVIzyF8f~n#wr>trst@euEnd^(wrGQkqI0DKw z$s4}D-tNwD3ljZ2etXZ92{`|%EdW7aOfe#iU0QA68ejjsxGitu1!g7)k{2SX-2i(y z4HLJaD{A8#Hk}6nV~i9%c}wJ_kSIz4JCz!Xjz2eNCS9^tKu`EN=;l?LA`tPQUt%%o zF~})0h`WDR+TuS266~^+dp4yoIquqKQ3j~*Y4Fob{LLFht-n2!KBA^{x6Yt1zn5C4 zjAR4VEB*vx%MptORMC*nroY(!2UYSV!eEY%-X)dbPen%ow@!1}Y1L${hu+R)c?`?L zhbL*V7mnIzr>mFgvA|Nmsl_4VV2k11d>?dS0*p6M zJ98@C(B*gi(#44&hs|&+`tp@I>mrYPRV#l8E@_}^nq;^fs6XMAMO_UBH5TS$IEAP( zob`UEcC$?{-y`dp4;E!W&8Zv?GplK)>!BI!IY;jVp%%Q#2S5yMqA1%VdvZ_khyvBD z>Y3nA0<)QBat00AdOT;U6!4ZA5?%@{nq&iMqsqW2Zr}KO7O(fmKcMprzk`ngQE58h z6sm)iZvE_>16y++00R6XU(*LYb*||!bRSmdz)~>#Rcjr=;DPs1g(U2Tdd3&%5HS)x z1nOPE76a*90A)nNk4h6gFbHSaeq29AeX5v`VjXSJY<*y4KR6)i3wAUOLw`B@#HAwX zc+UtA_0sQ_BM8yQpbFZ^(sd3YeU&6DmI-3`%3Y_oIesC6ryVtiDVcUa!fU0W9C2|> z*cHBa4k$||KiMiLo2<-5^Wt27$&(Dw|ADt4F6i__XCG1o);oKE7ZfA)Bl4!*`h}RGw zU@DRgicCgY8IiFeERB7F#HkWG{A2fwtU~P!%KX)7%{XtH0~R7Ni{-@B*Gr;{NafH2 zq2Bf_z{8u^3fQFvWJr4);53OJmY?o5-ohEKD#DO(HlTLWGbqWOyh@RB`oVU6z4hLc zW-~9~FcphFP)AhR!==8mJ75Yx)VTFNYJ95nmNNYX!KlX}K!X}D1{_KLRPk}7TfSAq ziF98Z*zh-(TSxg6@%Z$u3}cP!pAw+Sms2Poj}CY+x``}_mP=n{_|QSf%&@BQ5En=^ z0wCK67%6@`hnM!bgb8(=aq|8na+@XxF_&btYW*eEHF$h=?u+elSNE#g_c8hDK7 z?t{M^IMH?J0<_S>SydxQw%cnfC_I;M^2LH?DkkKBO47f+%|@;AWVfOQNpJE@k2t-{ zvd?=u_M3+KpDCZqFJ5oF;=Yr9Aj0f+ckxyNudyY9k&89t7&wE+vf6M>>JTW%-i0iO zVSP*ITE^cJ)GafnToc8R#mRBI3aWLhyR-%Hm-KD4H(=p6sMa64hfZV+KbXbu6}^>e z;itjf;X%g1B0pQQ)ZfyDfTNC04~DT&zUJo7AcJtGO27ih33|Dj77EE%P@))6mpqTn zz6iPq2PR*Gr#pACY5Mc>A-H9sZ164(0GWE$AxdaXidfTF5DvV8H)uY1^}xJ8@8d2) z{7`3X>K56_yf}}o=pchFITT2Ptekv{m}zL$2=jQ??r0&F#3h2nl{o5<2kiZX+yIQ_DxOEA{{k&`Eb zfh(i$3?5Y{o|P`Bjy^U~w&^X(C380(ymUueIzVp@=YG)?$rEI;I_moN*M;Q6&*6MF zVy8L9^zRvzg@I{9*GK)izG`aXlc6W2%XcGB8eorBVkd1}-a^+*NY?y|>s#pUC75b` zjw}RQDMuBx0n(%!DpSFXbtFZxQCS5JdjDx_9D8CW&a0_EePPQr7bdy>0`{Z&M5N1j zpT)NK2YaC}V+qY>3l$U6)5dbKINH_c&^VD9NkmFV}hLqB&wFrg{7W#W(IE}X;yRx1Tp1zIVU-hq4EhC3kH!= z!KdGa4fHX6Hfq1qLoi~oV5q%sybtCKkYWrWQw$v2fyC4@y^`|tSOn@|wIDy55O5W! zpJP-%xT&iF7_#A&Dh}TJZoZb_JO2h`BFjVG7I1o;+m-0W?z=UwMAOW}ey@GZcGK0m zq@m8O><&UnmE-;O@U0mW2+DGw)z`+r0S2drg}~GA<#_<1SGx5igOStYMQk7>6_U3$ z$_a)Vty(#KNFU_H5h}XQRYwC=Bzd#j`FW)4=rH477?a=jUL){C`~eT=<1po5WIJfLmIfJc92QfsDgFX)<+g+zjk(^t*<-=L^8Y3bYU zY4M5=(#T)DQ+XSI@Q{)J@mYCWE;z*z1WlNY0cnkmEu(8 z*Xw*+C%%~GS1%3|h|tYR4}JZv_cpQyfk$^@-7If4S7j(JrJ!WQt#8%=hl68=T4<=#~g7R?Z?A z&h-q8gKyRRzLX)pk@Dn(l@WTn1}xqpQvJYtCBovedxV!P6>z*ri%8^wp@<6~YZ z9g^r)=6Bm8-ob+zGY=XEkNw?bp#ojtLE@bx)-reX`R)BSBLBtla?kJ(F6vjH^)86F z))&h;f0ZrhoN>GK@9uq{lUd!tT!S7v<8d$oJ_Y7W0wdkCC8Er7D1RY{VbF+R%N?(o zgs1HNBE*yhmBnCs8qtgdjV5Sd-p*}u&f(1A#ncIzEy1abKv@>`PdSpP!j}9L_Wl?C zR!wq*t8ZsPu5YKG^VJchS@ty1tq4!zEB^tp$6&fMq%4d2W8=`@)tid69{9?Kugb zvCiR+s`OYT5u*(}H` z>Wk>@slt~aQbf~(8p6#2yF$0o52C-yDnll3(0574WTB|_vc3^)Y;zK1Yz#?yUBP!h z+^+6;3@bBN3-)AxkQ9q`pAse3GY${R6G|38_+BQx$fHAfsJFl~%|?WViKkN*mf{9M zIEr|m3!N> z-X}m-sI+&N;KKwxNQuU?dyujG_ltMDeU+AS(T#{s$(8xQ%SIuykh_~pqaA&?RCCRV zOJ4wuLN%C>>E^taN%`-2+~XB$Qb9hCDn2h$#Y6)kDhPJBb>kzhtv98#>06ust;J4y zFnJEI2%q@SGqp>)1Hyi+BLQ;VXI+_l6{cHL@q+-y+THG0!|nX9b{+q{3}?krORq~d z*sl1tQvTyH`tL!01}- zD^x%M_y16itQAaS6W=EKN2irscr&e3dtzZ>WTH5(11BRloYxUFPboMXH1zZ}MrG_u zRh>Xp<^(_o-JY}rVv(IOJ2dM~Jy#LQm7^|y)`#pI;P&%DCU5D%U~g{4g}y?jrHkdr7Cl}D^(j$GpBXjH zJY3G9E;@ctEKw>Z?E!&6MUQM!$`Wtef2QS4!MKAwi?B3t)?O@0op z;Se^bzoptGYa!zaQaBIR9ItGMP0N#ilTYSc6X&>2^<&sO?R@+6-XqhMv! z>6~@l{z(`%O>Rx`p_>p~hM#=_x^j#dD0M6%R0XvfFBS863B}!gmT3_=|AJ}CQSU~k z&A1_nOKPY^GkrvagI(gdq+#K1%uH{)TcVv8sPHjnD5}*X*J98p{@r2qkrt9?8sz62 z-hvhydi$z?#~Rj`UnwNQ%_vd(?)?7Cd5p7?v}e`EnM5Spg?;oQxr3gBcvUai!WfWu z31{yl$n-4CX7&i6UD5@sTdBMZwndqD`&s*T5EAgvJ2lMBw~PvtlrD9kh}T{hsP3+u?O;uAbXKq6}O<68`3e{*!0RV zpW^sl0pg&Dt+M;yO0!4`>)r|wDYuHF`Nv;6++yyP^84D!p+DE`u$4rW$Y#^2C0>!h zMkhix_l2W2dI=K96Mup8MjJ&eFh0Gl_PLNjiz#kg?SFr)buMGr3PyyF@@ zvFNSyt+?B5L>lA56;^6EqgHp?L(U%KAQfH1PG?x;b&383VQEXRU=?*(XAKbVw4ys5MPg)p-(#C(o$7*hxWW&IvnAr zfhrU3zn&T-y#Cxa$I8iR#__|2vn1)_dJ5c_l?d|VXcCNeqK_2J;?};bK;oDCZYBhD z&8&dyjW8GCJ}I!cr2W%X#4Qq!rkRf-3!#~ut7Kj}SdHo#h?P^AN1+aK`$f1FJ#hwP z#jmW{XwKlVy;6U-nXy>kJafFZ4KX?~%7#M$(8a^}Z5@TR8yRdn9O&9(pM?fcBk;fD z%AqD6#sCep)tQvsALoc;lvEbD(fZP_;jY(BpEdV?j0TH7`;E5vHC$xQd?lv0^#Rg*H zkk=l9ag6Enon{Q9R*96JOW!?17p==0_PZNSD8mrpObwyZaF<-6|5YeeIas=H#f$f( zr=bx4GL)Re${dVKeDgvd)9f@0ol7QwCxe*cP@8r~u8Q~mYVQsbRKyG^aJwB{xg>CH zaBwI2zbt^ByYP$rF?bgs25F5&)U!1oRefACIIc!}nj&PD4S!{d@f3zvfLD!bhFkkz zKjb&KhZT7Xomo#`>6_@Cqv&tm7=`zv}IsVjuL2Q}+inkGkK< z@jH8vU5hka_c|o`#s=og3-O>HM(#Ja?MPht=tVvOYhXXg98nun&Pf4SN zJ90sRn$Gkj697 z#%Dz)p>{6oc|!_Tsz(!=6{^0vFZwDn?Y0T|lL(WdWf;Ffzf;*IQVC~l(EJglpkLy! zd~BV{m3U42y3w()xXPTVL}29WtXPwZMoZ&Buwu5UY#yx=!>-vmg*#>mrc{RQbG{sD z!@ighD52E_6bHWR5JTJ;0PM*{6H5g?D>7HteOoW~%C8;b$EN@FWW6TJBb(^nQgacX z!@!}q`v=CL70F}pMW@YJ3shw)n$x-C#S&$*wFp6_ASW!=oH`2BU8jB?8lN!0==8k> zI?tUcy@JCAd3-b2y*ahq+dkCjJ>pTe3hOf#4~@Qkpous#&%+@dCyXJaZ=_QKK2iPn z`#NP(xJYIihLNKbc*Gg(WGOt&^qL=8QE1LpnFk2D^ zc}8rG-uisSs}4ux?B17KzVtbn71;Lb#38&WZ=R%}<23u6WJ8`}Han(LAKE9r8#s>( ziFGK*9hyGF12uc(6JT%tdQ#a}M?_$E7Z81h2^TZPC$ggpxpns>qshGDl0SFEL8u6c)&^Jn!0CZvN6yphz+r z8RS48Z26R&Nrua~u95mwg&q=ykw-c0lm6c>RP@1%Ld#>*uswosGW#+0boWP`J%43{ z%)6bR;LD?x}_!7?>~KRt(19(^FY&Qe*H|~W@GvD;KMtO3=!0*gr6O% z#1-a;uez)jVw07xeyP^MRDN@(nm$s!>O6lP`~&VKpJ;VO)>oLQPvAaKN^e^}DMnF7 zt6z@E>?F6j^CYfZPuAw06qhy8|Dvx%$xO9Je^N4hdPr?d&^_Bu9J=-iBv#uAQhbk3 zF0Ag&Ya?OHd~+)tVb)WM`w9fHkIVxq{8Gm4`|hyg5#_ZPBTFXCh#*Oue|!Qg%)PMj zs|kRTET$h9T{u9H(-6<6Y?)^Z_M#~DG1E5*iG)9W|1-6)$(kw_I6sr=%#(#|yd)OW zjwPzh+ZuNQ$~GyDmOdU*iAHsMfc@ouZ|3uzhxTNtod(>MvO5Rz#x zP+l_~`GtXlq{ISG@MDWPM#LXDr0)bbqVJdgk#@F_rV`?t+EDZX%wERpxwn#yx+8Jhp8@V(?gy)5hSs`N$VrvP?@Rq&8w|hCXzB;9{ajR$+;SWYb<*EM? z?$ygmJnf^%+D#~+{d$Mr_tirI;_mI*T27Df6Trj>8Ae7&1 zsMvcPi<}aZyV?g~$x`(@T$GBohA?o3q zgH0up3__#?AXPIIa0cudUO^ z0qzEgnraJ4FWO6-sA(kn6$Vgg#w!~mZ!0{%D61!qyT71tL=bMkHI|FGq~5JW01Ez3 zgS?lVF`pS5B50PZ0$CDye*uP|7lAb;jDz7*1RuVzU7|z(N-Cd+&_;S>O_27gdS2@P z3(_^(|1-UA>o@bKAwfAx`_7!U->3vJ405gWxv;;>JuEsR{#G&jclICLTD7PAw=UDu z>r9yQg37yxw1BZzO2+c;-+nGu4yoeYz>?;EFSnztM|vrf8o7e(Q#>|~Oy*4OGrUrt zU3(GU@D;qwvA)WZ(oCIi*rfd$x8tJachmQg0!3TDbF-Kdz*7c8wPOsTb8UEwUwtoau9TAEwDIYrQ*gQlLcq`aNE zg@MqSd0s`fe_-Y?VbS3BTWn7XXNzUH0>2MEzo~M^1^j6h0T8{u0N6A*cTV7+A-e{S zZ-7Hb`*%~R#1?G}LL;E%j+(OoO~vQ+L675 zv*EG*Aws%szv?I&w;L;p1Tg5BMd(9eXD~6h9TLU-&;r0y84uI|RPez3!)I_vMzei) zJ21Q<0@!jk+@fJe&+vfBTm-qpm3zHHi+|)Ao3s1~9tvImCNM^tjy%wj`5PO)TDd4Yda)oWLUBv8>8N}3cJRX?W6{Hk2^hNxJexG+ro-iB zb8@#P#`qM1xaO~ZW2dpGUlaS_$M<%i zz6e!3vO383q{EWz{7%;mf41$uMRZ8FR@=vb6G}4l-LLBO$EY~p6BTCE zU$NLvBsiJUmNpqRd0a3O@{>{LxJ{$9M6@5RP_)~TYIK>wi-b@VNc#vEa=?Dk>j=JX zD@MbZ9#%vU9RQJ2Z==PXX9gfU$rXKpfZAP8m}E6$G(YVhKnoDT=FXpDOuhiEDhe{7*pJbcufo27qr zlj;l49B<#U0p`5acNN-?GCez9NeV#eM&AF>qEbV-(RAKn@KK}yg&by%mnqd%<*ajc zixTgn_D;K;d6J-6LRMkpwV;{Dtudz*;4hC|CU}lX8d(G!G-Rg8L+zFPcm;Z{QIvTL zTQXlQxDT4hJ>aV3Ym&`}9bMwG8f`V$WDMpE>hL|=&e(Ounjk+cKq~m+WDYwnE%qok zy_2D;IWo8ujhICC^(&pEhq+oMMKZE!%jxK^k+Lq;X)8`QH86!@{E#jDfkQb=&gHvm zm|RNsCM?cYiVAE!EJ?0`szy`&KrI_8FL7Inj&pSXH;$OCbn&~CNmb>uNv5uroC(L` zC#420@)<{KQenvfLZ~J;I~cl##QSB2T_bF>_1miIF3S&fjBjQYbq(8{Rbp#f;GgqJPdUO8*GC`uuuheOV8tt?FCNc`^{Rd{ZIFiEO z3k&Qoz;eo_D!lK(QBbRqgg>Tj2!#Tn*m`?I?+N{d<6_{9cRKjFi~NI$q6mSFnzI?m z;>cM!dh9v6TqGrR*ayQ#S;gl`@Q%gm8d)c0%fIzs@T&P7Q00R|`i*zb;zneKkb<|H zsvKo+B@>?&Pv(q4;<7$VQqo&W#4>knA{%^dd`(XhHjQkd@4H_rrwa0-qN4oy_QCnt zX_x{VbApC@HM=NihobS2PkHxuQe>b&vK$V&{@v9a7<<}oWV~lj?CwC7C-ybrgkaRl zrenH-O%OiO#P)fnTsx$M+y8MNNakSz;;PS^6GfCn7FMtet7dZ7k20tSjs&LGQkLyZ zZ0#Tg2y$;>m?eXHla;E#kRJxe=+nxt)QYgBP8F`z{+tC$5VIJIO`6pnQnst>;IIN2 zy5KA83JTbRmWDS*l;>ObCqddcnUOC^PIC$OIX@a2O{fv$pv3?xn!?4e2O%#F*>kp4UW#sL25 zcaW%G&osq1)3_#O+lNg_btZwkLlYE8#4a3{DvnxAx)M3|N3hoQ9tSP9I=V{e>5LN z-Q4SW;I<77_z@0Wypgq6D8wcmr=Hkvi9Nocz@kM$VDzv%4tW)ml_DY0o;^=uX_vdh z82jsYD4tBYTl^R&D3AF&bE%pzF!JFd_+R?u3pF~4@d zf*n)WQ_)mfhvip@ODYxUUdVaF$Ho#*wvsg?%_9ymAQ2Twc2&}mQ3^+y%=5mW_RPT z)sa0V`78_){j?j7Gq>DL2|Owmc;Zpx!?OZ(jP>VY={%F|IauMxuoq#nPeKE14Kw0- z$)c>GNuV5`4_MAcl??B|Tjlfo8a5oQ9S7d$K2)bZ@dAItOoa3#qRuUVymWXQ$SOK2 z*maCQKaV5(X#TR2I}C!r>cQzJ5@W)jmbC&hSh|3HKF&GA*}74!Oe+DwgY}EkyWYe` zv~SIHIY)~YR~^vLx8CKV zxbg`G&L=@?3>;avck-WcNg1>#1g&R$t2a$1n)Xmy9DI54D&~&~RH(JCtTtbK+<*~k z@f%nol+mLwTkwl5)AIOhP3X(g%>8(nJClt%XxDP(O(u>$UnC?%$P1JvPitO=$b5DZ zj#J4`(Q8T~y=XS%|3_TG@>ymjNq8{@)V!wj6)PfL(iUSAjVT8eWH zVqV@4i}s{uqAg*h5dxDb!+L|w`m!A;POu0}t8J5=-N@##G?#7|j<@kOL}%TX)MKw&~g4U_^?qc(pVS1S5YRnH|Kpv-LG~{BbK*>jYC6<&Ioshr0b%QbLb9x=KLdQ@Z-``%y zDsvojN#WW&FmC&sl%;zjDb_L5=~O)*c6b-=`k?q=`jwV7_F@Rk73D}UcDNY-s4{ky zsLEI4$dW`)Kurs{%{J1srON7WN!flVsGnrAETe(B_Bkq39Ruonq&I~`#g4=W^jQ7T z#^Rf6WT_0Ze>7i(^%j@;_$z5q6!l}v-tA;P>pH0WP6{` zvq);{4Z+v4T$m~~0|BZQ=%X~9$;!}1%(SX(zYqJrsJxV>f8U{(&C4ok=@^=zN70&Q zsA~PbV0@_U6$bI&w%ULBJAf|-fMixqR$yz>y{c=QFuXE}2NKvWCT%KCW7!Nzgj5VK z_GX4QdF<332h&*Err=~!!u}cDnz@YABBJs0u#j5t!>?9xn8 z@~OQm^hGk={6|K7ChkC>TG@0G-K(ry2mEUs6MODV#^sgtt~G@Cx9@qU!Ef0o&~cD5 zhlQZa->>c_lpK7fGzLGk+-JY+B*M!=0e53)?O&usly;8xy3g8nv96X|H^LSdg6sMf zODo?2zfTr)S96P1z>;dH?JV#&v}3{+Gt~)`fX3l`PMJ6zW9##)*V%17s#sfx{@H~NF+teV& z_#Dis1^Ajr*M7qgUU*y(=@;UMLlf3T&5+vyiC&)Qw0Q%hXEzS(T_iq zlvCo3VSQpoZ;AaHdgJ1KKMZZzav2jJdK zd8L_GPd2Lau%^Zzn(QF0apClfk9}|D;&w`UoKK0(VwY$a#3avBVAyWia3Ti=wXRU%yO&al`I1IyRF zXg*3oH#1d5>6Iby{$=^DS1Kz&j$0j2Q#1&&0WE1J<;@?kPGI1)aG3cUNOM1^p!++Y zE-{u^MAU`qFAF#8->!b0#xpkI0%J( z7{J(A@15M2R{>_k8^q53L!IuIc#+Qs0vMt{$RvACjo%OvNJehNtjOO1F`2D+QSBiR zu|44Gmf`V@bzFY#LDg>uj1A464IN04?#RYlOE;djsN-mP3IZ#U8bR%@k#q-06rt2r zx5uFaFMK$REHc1%ld=CVc+Zpy$7pCyguVx*=-!Eopdvb~M4rtW$JomnIDPHT*Z&JJ zU_xc0$T9>$FC!DsFjPDON4%4jM>xEfo}+>AX2~ zKF^!!W5~~)kT;1j5Khj*gG5;dUw>(hk^O~UvIOLKu7*8%gXhUB!f?XKTzD_`^s(40 z$XiMgL3jMD=td>+pXopA)8@x6abw@WR#0pNU40+PiG&8!P3ib7bisc!#HTopuAnZ* zDxI-Ol)xatH*w8c#3pZLv$J^t*E@vltPeTfd zK^f~efuAm%vrYpXUjB-uo=mM(J@{Qb<973vk?YdO<-`JrkcG3~EfW7SVR4ocRfcSc zR~GJ1AH5nXo9W>;d;!)9kpmh`xTJ|Tb9F1|IGaLeuW!I@b8z>KGSG^@Z{pp&2+!y9 z5_VnVJ+vWLGlu!DznYB)!JmKZdKG)HVFi??K0Swpu3;k{*0D+<0)JV@m>^swbFim- zJ}nk1;*OleY$!ZnTW8y{owk&ud%9>`sSvb}08%h5zlF!VU$AyStf2w?qZI}E*?QC| zJprjJypUmCJcoC#wi;MSGW2F>E>N_z6YVRd=ZrvU(4k4FS9Cfs=oy($_<(yBpxXVc zMi-~Wv^7>#qHW2wm|aCMXdmdWp%8hn`Y)2dT+b_-AH#hm_G)um4;E=Q$Lh2 znB3CdU)Bg2R3gW5p*i4qVr>ptzE6myXufw(jto^(u8?_#cNFT$l_QE_u0lN|DPWdo z@O#tCW9{BG-W^_T4nTHf1hz_QWy3JS;4aI2Tl{K#Nm6_qL;&fc5iALvz|3q(Y@w?< zll`Jk;0#RB@F*K0H}!fGHt>#Kcn8BA=2fPA@Aekz|F(5wE^Y8$Vy;COU*I@19L zyjY(WDS6G3$f@&#vw5I8rndK-a&x_8d)Y0<@%{d=r-?o zNNfIT?N;6-|8Q)Sj}Q6vNRf6deZLV)UCGYyU0T`wZl6imV)qraA|Rpl4Fr)?lIK6X z`vn7woD;km+|FZP{C;I?9A$jrb7-ri19$V}PNo(fT}=!~Iy|qM%D)uONx!nHqW$8Z zEviU2WA2mt(^DMO-#G$sIdS}sc<+}^TSA=T;43+viHU?E`TP&e;9&;Aw34zfV@}B{ zVUoQgu&1aUW-I8^6J#mmqqH?1tIdGa=cwXebDJy4bH}L%npoI5)`U2RXTMy#`=23J z)2D`KlD4;3Cx4o{?!NbKgS3rU3@ zI%fF&XWSOsXQ}L-gZu}JA-Ul%A7gb-ftESC*xNKTW&i%>sOf?)Ccs_Y z8HaSCQC{T)bpD3F&`+?cKfvXwy33L*M&O66X@H6>vM?Hl14|@>Y0E0Sz$s1qe!*FY zpEc^zf!b%??f8rY+`i%?%Ve$tJYZIR^q^T;Rw8B_6E?2s^f7H-RH7Tqaim4>uhyzA z1TjJ#>HvmkmcW_@cLq~IESCn-q%yLSF}n9(b^c*~RNWZjPE`2TAwmViRoL&(b4s9} zw%~#>%XV*`TZ9InE#l^2hFMg~a%lHKZ zY5g4mXC?=Bl zeet_W%;GC#;rw%oMvHd+1FgdwMG&wE>KwlQh6b0}Ne{JbEt(EZZN_mB8=Y%`m(@Fz zn6kCqf?x96#6I`MrM_U4xj$=c_wgsXjuuvp%zPtLy>;(Cd|{~nPv+04{z`pM3-D9f zcz+dAA^jA3MTv^cw?G7mfFIE!X!L*y@ z*cXjoH_9r~$e7szEH($Vm%gJt?gaAlOgLzBP{3!_fZ=a+Nl(*94B}w% zV?1}s9MQuCMQ-8R?l=^%pQx9l3-5tKMX~`rh;gr?7*}zJapljj6j;Zjw=i@1dCi(O z;l?nu?Ni7W_Ao@?C=14!^%Pc#J`mz-v13n)uJbXCIES%UcD|4AVBnd3RDqa|A-wxe z4_Ej6)fVX`+39cXmxFNC?F~y3!>lywRCIWr2!1LbgGDI5VJh=7=Q+Qb`le`-kChqq z+--2z_zcY)#a5vawH!^NJswl~wmtbMdrsZlu|m-+*EhlSUKqL40hLrZL@7^jz*rMnI?mIwykGl;9G^X7j{e-g4~^P|72 zi#*Wi3&4m@EY<1@z#NWX<8GE};9ac3^W6lSccth(6$Wf55bYB`Ax_8?0$LQ6?2lT1 z?mruxQ9!hNc}r|&Urqmvu#25CG$SddMm%S*5ffEOJO=`-^B z^tC58wTbca&U$C*Hl1PpNPOeI4xTr2-!TnEe8q4{k5lzRt}rPg?_cei zLRySx!KE>QS2|&7 zzeoffZQuzXHNsTH5NNoDPoA)Zy8Nm?qOfq6mS$h*3Lnjo3;Hob1EXN z5z}dLBp8J@tC{ovu=f^RRc(F$Hz^@4AV`;V2-3CbZlytxmImo=MWsWO76IvQBn9b| z+;mBI*MDw3=Q^JIxvz1*foBYKEEr?2vG$yE&H2mEH+^LD5U>BiD5e_ie8D%5*Vtza zce{g~@hOfgsbVB*oSr{RA>Uev3yY;t*5cDxXcvFLtL&T5WpnT7)m)YB$0G438hjI# zT=xY#E+UXo8h1WpM8i*!hdQIJ!6_zcI5!JOHVvu?^$PI!WK?I^CQIN4PluYM`_`Q@ z_bXr&2VW9+eiT0%&Q>C^&MPKM)&eoA<&ZL!G?5vnC==pPXVhrKOkBo!ftK^4$k*iK zIA-&16h+9%`F$U_%RP;0p7pW0x6j{xM|5e%zte)d5hg^5E*^|e_JMTG!ff1#L#yF&5STIQ1I);RS!dVe8w7=XMe|HEvcT z&oNm(P9N0<9NUf4j#+aZj-QG&D$TK%zP(tw>S#pvW1txm3x=QNn^Qv>{jrr%c<7|; z*d%#F#5NBCG^M;W7pgU`CHFdvI|_>RP7DXkwkf}f7_PnUAMn6fD;@NxB*mAuU}$ zlC%V>Qat?Nuz8JNubO`KdrsDG0@dJf;hGt%x!(Y!s>fU+U)HQGi0IFl8wN4(rm_+p zpsaE3gt=E4USfwzS&Qu-zrK zg}j7zy~O-fnm4Ic5%C&>ny#A^Ti2^XuvescFk`CPi8x3vc;u(Zn@cIKneeSe)?%+N{2c8U zDUMw4_qozlCJboJFaG)hoC=#*h7Ot^BZQsn`6In>lB=iW@~Rgkgpxx&Em04zKXKAi z9B@oO=vkoVHxk6?r{TkGz%Xm2I1s;99dHO0$gs0J)hP+M_u!mAg@1wc{)IcvK=bPb zGY3U#zqlWdMSD!E_vDV`D^ z*$eZV_mL-8&DYTFx}o#B%7EF>HMkSE{74RRfSJo51F{$n`dF555l#}&dMrrB2KSjuLL{CV*T)!Lut*CZsTs6Kebq_Jtm^Tb2 z8v&-^gC!YxERr|n{7Lf>m7cj6pkcwX+|T_x3|<5SXSUQBL~Xt+IlpRuM1g6w-5zQ2 z6(CKB)U&j|p?#4^t7&!j((&*F+tA& zG>=GsHXkp%J`!SNp0p&Orm2rGHD9YI%q?(FX%u0u9{f=J!vUMXae>pT(b;^dAs(Jo0yXphykAFd5suDE!o@Ne{+awUgwYxVO4fx z){5pw;IfZ}_NJ&$T~fp(%?Zs!)0$o{4Ele<>?hD0&L3+TF9$+&t%Nic4L5L@ ztEIjeGWF}^t99FX!)y*rEpj2=j^y*cni^{eXU$(;aRx-DtykqDq(yz&OIe&$JO5FFxuG`$$9FR&=yGm)0yx$pVk6%F)mkDS9X5+JP37 zd~~JaajGkl1d!Qe9A8Rofs5wmqmb76B_J&{Ks+7K=kOgJ1LDYwo0S_pF z{m%`T5=IM;4fa`g|AmcUnqOfY@n7k5)mW@sOI_7Bh%d?->M($VI^qF!#$&<4O2#OQnW%=mXn3BRHL7l|DYdceCNmrzC{%`pP%jy&~q5Bu*}?PFXvf&FRie;iWI9 zcQNSrwd3iJf;i#IhLR{c;hI^=QT{rD`XjtF*oiEG?aF()n_?7?zZkrVB229I1(eMAqnkiC zVEHf?`;qK-r0(+pnktHKwQfM1wd?Bqu+SEj%zLMHZOVAOFn;|cZR4qS)eU`DuPr4p za^XnfNr62kuB<5v0x~-HOZB}H+Ig{N{;&M0D?k*b^k(lPPE(jAElvd7?A=GCD6^M) z$`e4DWwOLr;?)El^ah$BgoJl~P3^((P*V<<-x%nHjH$AN#`5ya)p>sZg)F=oV4WTj zK0lXj4gx7ePydA%c)9RkiHyR%Bl3> zR8-h0EhuxR5DHvY7%DQ7mvKHnO0ZHkDq~xr7Yi{m74LSJaE;}^OMrl7)QU164;@>lCA zORWPRA>HS%V|{;I(uW_+D!h~s5~7~g`fC3)(|6pNw&{4`wMGV00uq(a5XpnJ$Kqnu zFMi15CHDQCl;i55#aGnN|4av-Y1yGlQ-d+r1VF86u zjIIPiR@XvoMuz*qJA<7Scsvi@B$pwvoeiur>hYF8uY9p0H+PK{UvM>rr#hgedw>hc zUt#WqiuGOUDc3FM2Wa=-v#7oIO=pAUexe-Yo^0i5m1ONIDDA5mUol^io6&XoY?U&T zWiT@~T`lQ;<~?!RCb8j^qg4hz zUkvJBEO|+*-e>OWs3ca`Re$7id7`7PEo&h!#i<`#01G$j=tZn3OCdDb8bpWx$WzTZ zfYjPd)Jo~%SH%d_x-i+Sg)dVL@>Q#Dn6A;O1iXu>6TZd!rt<wa`2P2=9OVyd)z~9uDE|}XoNEa7ohR(}VAUO?HdiI)IbSm)w(v20sap?_g@!j;K}E?RL%e7&8jwnnaDMq71BL|d19%=r~l={c(O{c z0XDBM)BNYrqW+FI*HMA6<=Y}{7XRmW{XecLhhXd5lC|~VKTrIBUqH}dI|MRG z{L?>nh?le_pl#%30ncVK5|S>^4n+EFiu>P=1zE})*bXRaLjEsq_ybg!l#aTgp&_Qs zB9$zq00M}Gd%YCo;QnVf_#cm##Q+=M3S%ACf5umq7Xg5sVj+~2$jHbsiHU1^$Dj*< z0rZEOeqA<7(HKg`hAAWr532)gZ*@;J@t=FupZBNb2RDytfY#-Y zu(|d?EIa#ie#O8ak@(y7RHMVi11*cFSOpxGe)R)*|G*a%Oi2L1JT!~{Hn+pcuv5wx zq2%J9TShT~0Y|N(1(h{ex}@_DX>+^zcjMXH(Kx`)EY5r2Bl_&JvZ3-y*eZGsI`zfT zkjBbjP<(2Bx7a0mtt0NA8~uAh{*ZzhR55fUSwfU$9?qe0@#8Tw4_3bH`$>hg^~EJ8 zZ{*=cO8m8ke<;kKW{Lu#P@2V{vHYi$wMmuK$^*gR-qEm3+4t87A(SZWRAQzUv2IM& z-t ze)jbdcvJ(H{QZWMp*_#{23d z$Gc{RFR6u1x_zreb2lj$B{k{;rE)1b``NI{oty$4pJVj_4TsK3=RCQF+^zjKUNI4qCZyu13NhK zRHQtJ|F}KDyrUK{PpjbS3%$fhb z49WdE+h#;l>l?5Y*@lI%er3Ij?mdNNA{w~e{Um8d#pF1dZ!MmQJ<@`&`)saf| zt636$UowNbCYwvBV%%HZ8>yq$3IR!se{H%?=-~zU@?&`-r4VlL=8reo2OjsnLkM|n z^HMYE*O)dx1CMmp6I&Y%DS+)VF@To!UF;3w6(Ixkzre1 zap>mzWLpREHKS@S{7)g;-!t$6wntS?#a7C}d?%#oh~G1?r;*NKwUNTPeq6859s|-S zr8M+Ekzj#6OX?e?e9)E5c;I~S*}AR2%x`3NxIo#YtFK_?*}{7mZDr~n!!*Y;`TJ1% zfD{GE1FU#~Mz;GIL`;SKZ&>xJzJsup?f5y2K-bV9T|u1+=F&Fe37wfJ-4M{hki)5vzLmu$jvA}8}LGOHR_Dc5$ zSe&)5bS?V#ZmkZ>JTMMN6-W=m9LH5MMCY!>_gpj@gW`J_+Z?O!nVD@y zz^cqZ_`p=0n+JhM{@(pPhP-~82Jz#uW;FhXFDePdPucEs{W8@LlY&-nZRSylxc)^)SML84?y9V#O~v^3wy&}VDigh zxf3V(em{0*l>UbSUO zD!$&jzWOHtDO;JJ(sCbJcy&c=JN4bW-YQ#O<9^(M-a8F&i;( z!~mI(X7+&A)V0TMjgrt%*FiKFVj$@ydG+yvO10TS5#!WBwFfavYsqeyqx!2KvZ*q- zk(FG!_u+uL(57;i-7~g;GQ7#U&yn~iq_Ktzbt7df%$foQNa#O>Bgo&CoNQ0`tmmW| z;!5LNEAy}52WV)LBsT-$^`SS(4>2Ju>;O#)&$baFh^ z70?GN!H=hyN)bd=pVS(II9t}EfP=!G&+e;8T`$zA`E4({JBmf4b-f}J13T(-9>pIO zde))hi=53P@-Ih86of`(TYMT%dgQjF538*DAxPFH_?Ap?jG1wqo+#jneLVmT_2}6* z(q)%31KvI8+BSP_31Z0i)ZR244J$Y;zNVkD!Y#T21*+KVbPWJx3j?#i+@9h-rYUZx z3PhM!_O=QxFl?Gwgl4MUuRS%=0AgGx1&`q2P4|Y?Q92~E}sWdI3ZUgus|S4W)TwvQ9{FqSaioRI!&4-qV1Fd5jHn>d z_}QELD7z@0B-D^(P>@XOtAO|=1E|h%Bc+D@)?kt)11C$CvR>K4E+z1$7+r!g`sMU* z@J|UC6hC<8D0*HOq2HG&j<{Z4w>Hc#nbpte0pT^dZ)xXwsQ53;#$vp=Z>)s5$!%}5 zH$FK9&3rag4iH5)Vf*Wi0j|}-3}TF0iMUg}0p(`}!+00HI=LRhHHAgyVMAVLk!`O@^e5A@uEn#P8_gE)ObBYfQpWJWl zc~Z3yXn6uh!ZNgtqNK)_@j}DS`$b9LUK)KPo6>`d>cqaJZ_G_)!DyR2th`!bz2g-S zsw@uf8aV0dMu#|qKx<`R4cGj+F*PeB~jikFUKJH;&h8XHv~gG0^)kX2oQ?SrwCANzx+{VnC-7BJmmK z9s)N3)y~)iGlDT zpgy{RmDz*CYReP=W(hI6a0-FQKl&2CgX z(Xhkb0AITpy~DFH-G3wR747c7JPI=d|l`PQ<)#w|MG#)(qho(@i20k~(Pm13^EP6oDV)oCupRVF?+s zN(KEOmx>M8hHzZE8vWa$RF8uln^PqPn!_-YXTtRNu?cyKgl;DxxHa-M5$d$zgD3YD zX5^gt3BHz2kIKMG%LsLDZYl~fFa=d2rjd8ZuGsONfmoreAj0SAaVE!BVWx@$Hzuc6 zhOS;w)$sfJteXlba^*V~;}bQbR^vEm+Qz^NFHzH`1s+s$CxssifTow7Lfz(kJ_9J@ ziPK{)y($~rw?0LfCSObxk1MLcz=@piTO|pY1ctb3&-IwfMmpQ{j^9)_;V0TvrVil{ zxhD}a01?@)^u~cGnhSmEk5z^7da0trvmwBL4xv-^SA}m-EaF;gq-FQv>6dqZ($upu z?=vu4d2cNy5CWDA97)?z!^KAa!CIQ%)E2hj7Kha|57B;`VOP=%SVXkaXjSa5L4$?= zzCh~=^f-SFn(kkNMk|g`eF(L-414{FB0*SpODQ0bq~eAC{dbTI2+v;6}Di2#tGMgLsq2Y8f zM1DX5-?Cl63Ugy7wfGiJAitMj3^u#F+m@2AP5}ly*cA62#2CPW1NXNpYgclrjl&~1 zfKo>4)z#rZ;1WnJlOyD;gBBASB8^&sZD34BNnoKxc+A#1TjeMVWfKv-TAySq@Yx|=a4nc8coHfMHO zfR&N4)cunkpC(XR&H_iWCiVrWk01AeYGyX7vL&k!al)+usCfz!ltUkKxY}3fVs|Mp z{`9k=QHZDI=Adz+WqEF{>?}AB^U2ht_hiliev%z9 zbx%~scV_DK)_A*(r70b@2+Ll1`hx0bO@saVd6)`F0;}FsgPQ$YEAsvl?0y>C8hfKx zq1t`x%gk(S36`O5d!M$U-G=dpT}c$447UJ4J0^T@O`u2&8bsCJ?DHTLV59E#EYhl; zttVoyymn)+#B!W!sa7afZVT+xxHVxwz>rfd?zeLqA*PtxOyOep_HL}0wPjzQUeWIA z!V2}jbv`V{y^G)7(^IfSIS17}4@AW%vG?`WBfPq()wO$w;wmbEeh@g23sO=nhUcHX zn~sFP#OkTs+2!h<4ZW6kwMl%ZH*PfcAz3+~{#2Q!;c z+rjXpblStGj>*%jKKf1elIpIaX)86)d{1ZGz!;1Zr>dR3`L-T$8vd&@Cv-pcX_K!{ zi&r<$y|CB1+cS0*=<{7<{u!71s&v~#ZIfX~<0*hsm!_I&hn*Ic_X{vDuD$7} zPhbqTa=-QG-{i8N6*>pbK!F<#=m>zeJ_C@At;?M8MZZ4e%b8bvMxJ<}`|>7tMcexYla=>|^m?L$)C=jG z9jNGrh4_~jvPkHCqcTlc$5V3kO`*<~AI4?NxXMjL8BSr+tpQD_Hq#Z_^5(O2wJUe& z>~HVU=HFPNZJnuCu{7w(Z!(0r*DujB$JQ(=!72M}H;XI;-&^*(y-a&c%q0zz!?_%E zC<3+YkufPLwrF^%?u%$%B%~vN-4(O~Dc8E;Mx>vHnNNUH89P~SA;=rXQqR9i1LUj4 z9s$}lkg%}d61qJu_Upprg&MJMCIR=U3vh?oL5)D9Apz&N%R8RPtx0+Yngjs|8yc#r z^E#v8{nn21GrQBt?^!cmsHeqaKg$AxPQu_ORP|zU{x4z1KLF*0+31y-zOHG^Um$e{ zy_rbc`#?b^Z0pl~hyDd9@VF?p&jE)aM8Vuv!u}fYhCH$lKPfsq2iDsUkvj+Nb6Ik+ z%Tw0H1V;yM50dd<{%PY>aaB3jmGvF!2vGVrB@mf1T_Oamau4u^B4b53oPc_P?z8iq0*M?VJFYAR58Zu}RRl!&>L^!hz&I3M z<{9qtVDhJBn$9PrRVt(TD(angde>UZt15DupZR^3I5cR(7CKt3l}Fu+udp39U=wEJ z!w9amuQ><(@i_P1dYz~;*Ux-Bjd>HMl0ZL4l8=NsvMm8~tw>aEA&p$7J$|#blJmXe znyU4xXbd7TiUep_Cv9b?W(P+-$E)ZgEi(fZq3O9LEoLDRSOH3(LT71arYW93@;GU; zj^i*k2ob(;A)}(lywD0cUJXZ?cE7bCnhjv$8r>e#vybPU zb^lbBm0&~#f?F^ydM2^^Bn)*?88m)kIVLd(-}0IVnn)S=raHxAHEFCwjISTmsxty{ zph_e(zsu>ld+ShI$vz3Bc8JFL!iS`>bFkdfG+&cK2dTdvY zFTXd5aAXc|#1g-^jJtC!N1y#0K=S(teGW^3y`8TiL4zeQLnu{QY11JK)vrR3`Zb1Z zEyKPVpnL}bBy9?T49Xlxi(H{+Vj~i|4zZ59%sZNoX({Y8B-@NLckAVye+Y*Es&w$h zWtcq4x4AvL)5T~=?SY7uxV5^LCuZv=Ke<|O+EaEMGkub#&RkuJ)Gd!(l!KFqMi_UG zPGcq?VTB39NwdgwbXAyXtP0R}=YPsPLCR?a>4}6kjOU0sRCoaqaOu?%`wNKR>fU%Op3odxL3Cl8vEp@6!f{8BQ;VG1zBpYJ<6dqa*Egn0LgP%Hu% zEge_CBvOeq%eeDOM2a1G7xbzXol3ooq>11YXAf1pW{Mr@dgqO6h14k5$kLusfOr1G zb#;H9w2gb~VHC$m2EEAeh9&VTPp`^*juxi^zVUk2)2&I3)!w9~D!F+FnM-S2_{=O) z-?N1xtF}U+^{iM^&?%vbH`@2o!P9`94~4C%A(Lh*vTDTac+*?l7pF7Lv4i*kuvFH! z+LR^wbAVlj(`eK-mR^H|i%`btyv1qDs#~0iYZI%x!7DK{weXGYMA@(JiBx)t)^y83 zN1_{ld0Z??Wa6{&zIgW4ud2q=lVLN=GgD+Xg^{35Ff&+7qzQml`UpCYn&j^=;sz&9 z>OZZht8;lU-6cMqSxeVZ!uzlV!?S_{6nx<(z65)p<|uqM*_C&KC`>YCA>@7?*+bJA zARdMs;U|f<$B9Z&T(gK?+($6h$s8yS>KauU`Gy?XgQ++r%mO8tjR|g@(eYv3b3hr( zbiyJn5t5NNpah;}jcxXI@2ODrhA)swNPVs?N#0tYaBlZAA+ zXv>dGy)zpKCHwq3`~&1ykhlpo&PI=Fy2)3yOv{I@*5^X55bHj3iixZ?k^DY^faAT?juW%gKKPOHdfAd12z7y;$ z{nJxQP>L9U9J(#t%7+ELW?C2>K-+rQatQX6Mvijj*f%^ec-te;1E!0MizA}_M%2NV zvJT-u#w#N%{l?uF0FOd~_d8o)K#6WLH>h!^zgzIWJK|G>FRr@3FZ>zjL(9_r%HUrjc9`J8xa6Ty1=1EzxMYQwG0;e{v$N(K#i z`vb8Ix3y2eleYiK^4VC-c~U0+ORnjgUbQy0pH9>*XXPUIBz zZohe=zNh4AcXkJ@dw~pmHJvq>6iaL6q@At8awNfe?jjQDDDcGXcOAZ3ODq#NOxF;5 z?mu(+@s#Rggvf>E`dm}fd{P)yk*X*cx+aYoNbm0U zOzjn!Nv92N^4dCJl3$Yqq!4r_t5NQdorukU zkKRNi6R^44`>~o!Rex)m>OJmXDGgfE0PChYVTYAo#{gz?DE`SVQ~c`sx8gg#Gj$Ia zHkuKlAxt=`6e0*4h|eI`kfTb0?k<~^e8Z}w;>CQCor`Xv$;$X)D-sX>_5|*FQOp7>s@LdVc%&a4MH(MyNh9_N~mPv zQ$E7S)G1Nbvb}Ifx_9){RoI6jj4h~xM!M;KX+X^9PGtE+vir%;+!fQ^XNLk7DI&4( zeME&yd{&JE`q(irY&>n6nmf8A5T={Fgm4(9jmZNK)$mj)6sayz&jo?D7-F|Ep=$qL z)Uj+1Y5Z7KPMYu3tSiV9gpxizhO4SJrr^eqgz#TV3>%5@qint02yzP9-uP79NOt~y zm;Z&(tUn%Zu#Hxm`jhVx#j3)SOiKBrs8m*QT;jVsn@=ziaa6HnE(f~ipsUGRL-0(j zZ#KT!k4vE8Gbu$P&D$p+_H?V+UO(g*H!;NY!&MbVLX@Ad+5MFKnX2;~xJlc#6Ed$g z5CmO=4f9`IZTMe6>~l1*4x@yQ0(E!@;w6e*Q}W0!i#AJ#2RIkJU7cDuyYrGEuEcSu zoyu#bru3ZV&#eR->+xPsbc*Z5O~~4p<#cD@#z?;w-?H_T#;nDSF$b=#XYA%` zc?kb`K@$+%JKZG0+&Ze9UoILK%#nY*==r#5s(;{64l@V0m2@0=M@CsgqIhCmyr15s zNt1Uq@0K5%C}%~Krw~>D#)0>;xWFa{Fbi#TY;#5~K|szX{;Nt4>}XmRnob@%(8?d!-2u;j#k z>8CjHcmvWSmg9c{?W1W!4HESPF>6Y^) z2?>T5>O+&1(eMMUu4-JPWr#GQOSepb^vwIXA$tT~pR~>=Xlj`QwB5pSsI5hjT~DN* zqvu*acD0l5wan2#K=x`(-CwGGZJ%RKd?eJ5NH;qYR+ep4Tx}A5N||Hez5fkNGy~WC z3EA-n>!Q+;M}dKva(`zl^KguiLh=TezS7Q91eoqyJ9l@Urh_9oH^^SrcwRLvCH*r12f1BMPz)HjL#FbF8$v{R`^*YK7oBJ&y@RMTa z#L=Bzf2yf zxHiiZt#r*nPfK6r;yn1VA^Q33^0qtToY~C6!=P*1r)qRvXjs1U_Bp+gwCZ4OIz7!S zB9MG%l%D_OlCJpBA18>Sr;RPmUfZ-a) z3S32|P|d?5M>@~6O)5?(pQIPV5v>rAZ!Mh3e3zacX@(W63UC?q7SvTV8)ATWQ8y(u%wsJDB<@6m)rV}F9&`jy#rxwLJ<)_{?8I(t*joF}2Z}Kih zXL~)9XAIyUwX(I|f97p0rQRGa+n=L7h2=pr)d>h$0XjW6eJ!@`h&GauhQgA8c=x-M zcxOzvKi#%f2G8b9wT9@9TQy{>2p`8WpuDXl*5_!Ke`>n}tsMp!X+e?|Xz3bF(tiH- zl|ULt``w)+fdgdE_)jSO)Ea!-KutADLz(}Zu5GHyH193r<~WPn!^ju4Rv(LEVzq>K zZ%e_*6V$E0#m+KJd02KZfb2BhL;v$fOkt?^1Gm-A7_EE=Veyqbx#yw2wI0ZLd}l&Fi8H-WyOKD_zp*`BRbb@xb*315OIU5G*zTrRl z+^ejdNeJcb@A4iW>J%YqP_^k$QDbBt@L`VAe?_x$-VBMf}qxMko4MLtn=rM?PRfjx*L-yv>xUtNsuMnpFMY|W_^Q?PWY>M zB)9xK>691+*9UJG-NUet{b3_{xbN%tEzUh>u!qGk*9H~Azk+@{b%?R}kM!)8St%02 zo{MiSgA2KKcGs@MH9h(1aA zQ+V~{IX}qtfAx#4E5v?s`5C3jeQcOfwFbmaw@a@2BiEV41B`M}h>}MyOum9#%lFA> z8n?!~?<4Figh2;Gx+2jF$X&{)oQe zaf)hyfoYCs4Rsz1`!7YxMILNJ#0#TNYUV~B|Bw#A4_maV13kCt6rww@9{dQ4EPB`eEc4J z?wbyq)dg`M(*&U+N6|jFY+*-y1G4>yXe502k(NsPOZ|&SWti)rS)$ zUlY5d$i?=9lO8@@qf+OTxRJ1YwV(xhscF0V`y*lh}0QaV1pSFkm7%0cWT{}bolYUvWIYI77G z*zqc{Uc1p_sN7QlE>S}$3p%~(-e&FkLsf@V`iFNlj$Rv!Dz=c#+U_;{2z5I$?}LWW zgVG22Uqv_|Z{m*)a*TVw=w%cjHG&f?3!0#U2vH=NREfA9vwC$oXqFX|y^rzNr|FJp z^d6sYQ~-Lq(XpAaPnWdLvobjWrT~O@NYqs6&)0hb$CaZ}HlRZZ@v-b)5m4^cB13y+ zh3ditGm41#;ih)9i7}hGyJpoz^dGwL%*loQGtZ4aa3HG;2FBSxWBMkl7*{su8*}gu z9*sdwOu812cCZZAl^Pps!v2x##ZT087}3S+ zshV2!^2*9&&;EP4#{sQCe%|oX2!5bi|1bu(I5^!2G_HH-dq~kT8__-`bM* zKYs^QKH!6qIkvCL3H5KhK9am_ejL_V0lC>El80_Thxb>!1b=j9du zU|7PT&`M$yb6M@_psd!sB;v3BkxnWnJil+*V1L24%+-Fuf1n#&jkHe7C`D1v|v=qk_dc)332 z2o7Eb(k_#(_qwaTWEKF!z1MIEd!+yi#8hIQ&T?CiJ$Z#-YWw8&8z|wd98l$79?d__ zU{VB&T~#7*vQVdwYrX@|nM?empy;WZYR_OqK9>Mw)?pQ)YkQO1ZP5sI5Vh2jRfWYZN zEW4q5QO>_tJJNLUZ7f6yPy771$?STdI1E37GobZ?&c3U=cvrLZB3@#uL=s?jOYM-c z#Dj}&K?82VY^sB7)r%k98{1X_mhYG*%Fh_GJJJaFoQLx98ruh_ksJLlk2fuH6vl}$ zwo9C^^%m?5!`;Go zz6DLjYpdwEv27L)pW^5%X|fRlGyM%)bo>bZRiYLda~KyE3yDvq(gV~0Vi*7XQrI@I zaouYL7Q6GaUX%BC_>P#$@3PfEMu~Rg>6~XGF2x(>#9$OruT1hfc-0CJ;DSrOr=z38 z!_11oLBl|qiQJ#4jnQ~Mls{($i$&+d!L1L90BOEb&&m(|C|uaTz`4!DyJ01)fTi9V zx|G7NEAg>T3Qg=4OdfYOJZ>?8o;sl!4Tc{NT@dK?x)Yi(;kBFhrUw+FwGX@crl=65 zwl<7G#p6DDgS~mWx*!p`Jo}^Er_{N|ONdp;$8eh`n1uO|4BOZpr*+5rREcazhDML? zLG>r{YK3Pr2q9ddic#cbktLD4$sSiJZ_H*7R0@6s)u++5T|Qe^j2Z5EMd)v_&ov;l zq^t7kGv#xCxNZf=PhilWRs%>{UBaibc%qv-YAO}R6CVH-7I_KzRf!Ae451zWddaBaQ=F3SgDM zs!5O*5RO`&2dx>KG=1ZWB=&1?5mLa?-+SnvLFVgwioh%;EuAn-LW$J0akhgimf>v? z&2oEnXR^*bBEJ6ud;jbfj|pJN;2U!Rdj_|qla@E=5L39d{^j~&mCl}+T|eokh=?a= zsKE5{c(KdLos2Ub(t=|_YRpm5g>W2VpmBy##`;<`4(-R*7Krr8iW{t47s z1y&N0Lgs1sA;V!CGa?Cu3BH36&4xC~Bz2L!sHabupe{8)_9Eh&(0FzF{ICwV$@bP~cdC6T30qv3cg-0DJ-0qey#4voH?fNm=)X*2zX38@(^LtZ z?(t*;GLjMjhn)>Oy(W-c2aqO355}@HM-QS@_Lt4bTdjt)JJ_GkJI(GY=5wV^YMs$ef9?D@~l7U<$VTA za)i6ieObwsM)Tr2W;K+D_x5f0(oax z-IXpb&Ys#&kWHv|{N!c_0=e5}z3&%;bt_-!Tv9tBWO8_e6Dn}_IS1eABH6~MfNIQb zwafPN$+LCLVbe51_539wMuUs@_yafM@+8M`0@p<`0>^Hc+)>L{wI ztVWji+T7k@?-ZOZcg1d(CO;ApPX3w=ve0bp`?cQZPGZL64_8Ux>EPHE#v8=9I}lNQPqJlIjo1&S8ObK!v#RtojI zy{6JRGsu>_$6$$z#`NxjX3L%S4vLbPnAk+t%F4{nJd5CUyd?16!HUcyp8eV`hYOhFRkR3_e>hxs=%xGrl==3p1r^80YdKoxg`{H=sKpF1E8qa8THP*eZvTyJW=B0r62 zA0L=4yj-p0)*brUUhkYX5Mm6=2@I&<=K_P4z>~FgA&`8QBREy~Y<{pb$-Z`lFklIp z>KiDvY{kiWATHe|78+UPVE4gfN{{%U2?yb`)U@d~eYMP(zI*)(|rKv%X zU1y8H5uA()mu+t=xM_9rb6emElbDW7xAi?nL=jUp`Gu|}eJA0okx+wEN zYyn6eMg<_EOzFTH@i{?0*K4wvSXcD^%7PF19A4cykC^$}*QM{u2K$|y3aBMU?dlK??B4>l-_^>;i%%Q&ZoXRoT@ zqQh3L(D7IO_?1N5_lvY0rY=c6PL#?nXX}gfyd+4?8C26DVriNV!<(|K?su$$ObB;T zYV0i!H+6R2o&>uc?Jsq1wn=hxhgH@AL)Q#i<5+ar<^$tHPM%uP4kLsVl7Q`WN!ewF zeK>yR4k=xbN=+}9hY&LQJX*$U*Jw~IIH$D#SQH5z9CFuq3`Vai0g<=ABh)^IRkxxf zv5#1Co8!}4)pVm_usDAA?X<&8EuwVC`*^Ql{ELkscR$distiE*5F&F*~;xF-YLev4`hCwI8c7xlRamaD}fd7m7 z8Lg8NLpb%|@UYP1P}I9ba#sz*B`8&IYW|5kU6etFCa|HFHQuXv!4+&^+;)qP{31G(eu7+dtJ z#2^tMjU9BG`Jp)~6w_*9imk7y%zNJ(NAAC=sNqQoq$wz7g;#4#lH4UeW?NXC;73G|YG>~|j6<)r%nSpW*zsKh~D(^a;CKPmP(lRx2*_}BAb zpc!NB2Ob0Ul~OwIA*+7ArMFSDot{3AM}F@+1Ox;j7574uTQ37g_Q(N-HAnlDzp)SW z9sD-*#Y5g-X#1)#f(6myp)BSQ`bsuiwVCnp;h|2%Pi5T+b3=uGr>9jIkI1{x+Jtd4 zS$MtnT2PROCKLfW`ENVCZ%blz34{hlYhfO%2>ApxlYvklc0k~>0i`A+^!^N)N z*K2}E?>#MX3vwW0BMWhV^>jS{pQ+>Dwl-V@KUV{^AcV_wG&nld;#tj4w23a}XVn-k zx_~+O(}4`FJ*|1stv`P8okAfZ_quDsDw%RO}B(7z{8@Di<6d&zOvyfknD~E#roE%w;^~Fd(%Rb z{F|PPq!np#h0o~qzP@MGnUPVLX;gW#NXU8j^U7@uKmf+|lSUE`*zq~x;!ReN*ws+A zqXpO!wfSyO8ML(;rEpOP5ud~1Di3Nv9~aMd;wZn|novt%!<_Bm=tUH{;;|fThBkJr zsCTY3tZlK-#mP2vxy3*g&okFa zvp|Ql?DMA&my-bY7YJ^@TTPX73fo^HJzw_Ke4=j zLFSn7c+O|n((MhSFlfSNR&Cys+jd7Lh9M813BimSsH*A*?{x|94ze#7PI}NfT;j3_0*Q+X97tb|>TIao zZ^c!6u#{U-6;39|W1QrGGBHtHyUyg16v|~(BGbU+R93IV&wQujHg1_dISD)`FS3Es zJY|O;OoMZ2b6L!g6zjGsTmmI10h*%F^z??xS|6(xkAn3*a@Y^n>gA=Ajt?I`yv6q$ zUxL5FMSE_0h#916^x-?8Sl2eJcWePM)vJ{NcWI*zj+a~h4tz=&N`=<)FJ~u>$y;lb zj=+0m=zm-gNKZB0R=tn;$mS=mEBKT?V0RZfb) zE2Gg0Z=2`hA{XZaBN@byUp*4f6N$FDs~bhmS2J&Oe~U47C!7~v)YFXEz%;*dk7Jf8 zQKvgdRKp`=BE@00BmY@WbRtCy#gxmW5)1g~w%8VZ``Liun^u@Ar8pv~6%H`zFVw%$ z-{r)(xp7-bF^!kFuSz6r57piCQc2VNl#i~Cw-fG>TT_CsDgCV^^w+DA)^DcL$xQ|r zS8r_QCqQHWn;Z<&H&ugc>RI(sS?68~w!AZE%UwxCux33EgOs~)X&4OpPwya%5b{19 zM(92nk8(-<9UW6F?mZF@pGouy5Bi4~{=si_{Y>(6dJ*KeKw`5cM_uG55dd(k+ zHN9=tMp9}o308G})0B}-XBkb(S?CSQaxo;jXah8)r3A#BArHiw7{+hPT_4-IJU1ct zcI7pRvBFnFr=+|u`<9C$<7683OAwVho|x2^VDEHkT$DWmT&dIEU^P@8#k5Bd}+A3Q}`z6UFsJ2 z>;xKwvQ=4$F|xcBC?~kpl&C{MYsyEv(BM&V3(uA0JYKE%*q9=C8r_9c2iogb0DYf{ zgDnmF5?NhhuV_+#nMKX8dQHw{2GdF5X42}zZ`hDX8X_0>htk~!D6 z?K`dptK(c9)7rD|pN4;Q%05frov`8@aLpKJw{y{+wW|6q7TqCX-lEu=87GtyQ`pNs)yU`xM zdHK*+^5ip>wi#DNHs5}ZE9_kcb8$5lD|uDMNyd0v!g@u^1KsK_zxW}1F)>1wd2hAG zO#TTkf=pqr^Q`a>>Q13MUOOJgDLbC@it92kbb)+|U#=->Qga(}i+J$$a2)R$NVM2^ zv`G{1vWMdf#VuW*sXYy%%aw^!JhV|B5^|#hA}=!n+fmMESx!0Re2lSH)6F=W^t{_- zHntq|qJkD9Sn$^APiM9lLyHT|TdXpq#sn_)6wWNQ4pSlxh66M143kqC8Rhra;vdV+ zx9QXAq&;5S;ieV7IZv_f%OMY1A!{7D86P$Dc(-AHgF=Pwv9}fUL!$1zbv-&}C`;DN z8&7y+QS?pUsTcy{lEaI)3*^LLKI)IvC|BdeJY6@3jxOYzTdJ zt+ov{i|_gPMh@(5jodfh7+@UES1%4`{c(mZIu5Ug9WzbG5{}niI1B_*!0e2*#BV`x z-`+wArFkowA!`T7nBQSgz|8K3ie@DE6QG?!P|2cko2rOPEU)|I<^$wRr?$yM^?N?r z>KVmr_^iIdeJi?w_huy|1TmWu)C?IRuFbhWzC2mcJW(eqhE3X)!Wxqak7%~aKI`Vb zLD-&Ws2K7s8GqNo*E&4rM4Wdq7dke6L3obmXjF~m4O^cIYiQ2&KIQP}kft#A^52A7BEe$So#)CuE6=?Laa3X-C_Q@%vW2 zF{zXjhE33+Py38SP$+KQMi-?}fuKY8QKX)te@wUq33&Y-9h%6`XD|9Z-EK%=B>XV06GzaoaM@}5)f>7-N*8r|QiUW;{iL&u(g?Kn);?1h zHJ=TCwGU+VX>1aRxK4B?`+Bp2p=HSpNu-_*G4q4X&zZSsR!hs*)vWsG5sRCa3udeK z*<{uIydAIS5F!X=%gj8T5|hIG#K-Y4{5-*~)iu!K-4|(Rfq^!}i+cAOC55X`Y2ycH z9ROtiD8kCgW07m9oHV6}4}Hi=?9>M<`=uPo*lPEHS_E?X4I3%OXr1fMZj`qqPWH#$ z7{YJGtc`3j5^QKC7%FEvY5>}>8ROoXlgi8-!T>%qD<<3x9q+0B-YnElV(!I9h8X~!9 zH{by~k)#`_r)sTDHJ6fYe|M7Ks$?082b$f~?!-YeIe%?t;F)h0D zv^ZbZ)jEOSnt=H2VD?dSW=KGY&-jmJ_S7#5jBUxHVtAM|C{ZS1>7`qAL1TshzQ>d~ zijJ9g?^~=RcH_YCTI@9M+OCStXy-C(;-l=#j)q2r(p}SSkK)D~MUU&F*EtKR3(8-; zsuW!vJX&aL^V=kOr<`Ks7#5SxJ3+zltgZu59Ly6cp58atAR$;R%HMyK8rFdI**wfE zUgn?=fkJxDhLP;qbfiS#y8tlTWTAzhF+ixkXSY~K&LL)gs86Vv_wq*&4o+rI zwJj5wg4clLwM*~U&xOTo3+6Q_m=664T!|%Xyu?y{_E#lTzsx0liW}oEFKMgQpjf7$ zGhFfFuG7Ur-1QO4fK3(^#?LQZrUr~VUE&Su>O}PDL$$>s#HzA*r-xl+SH;7EnmZ7w zY_&szdd(DEB40lPWcQs%m)TX5u+T5mk9n@?l0#Gw^45mw&loQKI^Kr z9^HRjAoO%=CzQKmZ_G5U^5x^BT{LeDVyI3vv10fA5SD584OV#8T_ye}Z+2&U*GTCZ z_NkSix;K23GI}pS%Mqr`p}A9XYW%NXzwF!t^stkvzvY{!C5sZ<=k17wR0ZC9g#UD; zAA_uHNRxVZNM^(P!yD<9+_bnKGMQ>u(RpM0dy%m^^dcn|y72>&CsEt>{ERI!g-aiQ zL$@g0@7L}u=?$tG;c;lnx^RqKX|;JMQH#@J+ht#z_e$WfGT^w{RI(}5rwzVdk6&aV z6>u_psQQb@yiyAEn<3O$hZN>frr@F2%bNgApVwAi<(k-d`VSYt%O<~46*cnW20bd; zBkFayQ;*=@=K|AWlZ>5xtFyH!8pF(UMz6X$*N@&oZLNF7t{>0!l(y109*TH-zEK+M zxEG1Kb0!H+PPCPS36*jKpV*o!xR!;G-->SQDQwH<^>TeNm~J`79pxXdfVEa&oDtF7 z(Z_g56E##-F8Mh@(hD8x=};)~w~?j*MjG8L8RGjCS2Vr%9-*%|XAl_T9WWUYu(;7r z1!H*k#GDfL%$J|jrV=NuQQ&vFebEsxsy9SQ+F)9A?oQ)&?S^ZLKK)>_RlUxdvPznnAJSxuL ziAQHF#@T-HY#&HI7?=pOYtCFD_;g7*)jp1p5~@%#Hj${dF0_ zyLH3XLm&8$+r4J0l%1K24vLAig0}Bil3|R@NTava5R-9enGJCZRP^$vVzK%k;^w+Q z60ya6EYGs-hVI5Dxen|XaF;`@HW~CETjfV!UMaF zMvo1?nC-DG8wBEp_hzlz|Bi3-<+pxm0_SaxpVFHr7pvQYE|r*2C_?8T-lAJ2eEAt@ zZ~9TXkQdroI0?ugjsYc9kYO43eMve;2x`Fcv!g*cCv8FaRe|OxJ-no{mVcnI6ERbX zU4M|af#A7iAB%h&3;(y-954na44=<*lsy2)KseRqB6`agQYDswvIx^azXBszn4YOq zO=1wxQ9ziW#{2^^$=6augqQbYDwGnr+T+*_rm1w5+%n9`Xc&Glsoe4vUz&JJ3^pIQ zkRXkp@O3cE?=?gI`X5z>}D06Y?7lru1`F8*X&Qn4@0Vc5GM`RCkKlVE8L(B!Trfend zoctoOy~nXxyHO0Vq=Hh>gM-H(PSPp~ZKrLOUSU@Sre3CN!^3-8kZy4>F3gFtt3(J8 zopNPBAOYwMwgkR@X#PXr&?g-_SrI@xJRb)=pzQCTe;99)U&5%M^c9b1)3+MTRYic7 zs30F+^~aC7alx)mqWz=R!MSI^qsWn zg*XLaic`%fMc!{PNS5sajoZ! znU?Y~+Lp8ZxZ4oqLl8iG^v)AeI4BfRw|tKQW$%i}jk${OnejANx4;I=1|Y~_s?UB? zeKf2)AnmH01m*V8H1k7RJ{ee+o&Y= z-~%N^Q(=StlHPW2hQ!l^4+?-1$UA09+rNeqmfIw~@`3V?%c>2w1{ zf~jrkUCI3Aqbz(lkPre;W+B66piz#!M+qZFzGyWl2yFo-jBb*j!1)_9>YfJOt)oz3 zSAg*}7f0>do2YZO6-070_}pB(#fypmB^O}ZVYs(RlTqiWI8gFKZ}r%!bIa%!f_ZC* zQH#Mxe_}E4F(e@00-Fi`0|mN#4iHF%h7dh>Zv55Zq9l;4ttBpyPN9I6qhwE&)uCoU z3ZobwPx~wr9q(=UU?tptc%!tzc^S49Is-VGt%nP>he5ex1F((M)$*|2{quxBUix41 z%MTO%3<=P8Im;a49h^8P2`}vqCmC<$B-xS?SvQsl;?Y{^9&(-={QD21puPnL-)VG(_=$a)aIuhyUB#{`>F!pFd%E4^Be!n`q+yVZHzQ245i=4_%}CL{C(8SyFaGWM|4|eSeqi^g z((N(-*P;!;1EPJ%uJ*UT_dlN#7z)@uDbWS!|5~(|)WFm}d65UzwJJUjyX@vjH ztr%nix2AG@Uyt`+H`B}%W!n3~TDQ_dU9gUcEvE>NZ?<`BAm4K^f_}UT`wTR6b1_-{ zXRZ3*d>!DV(Jg-+&dtN4(;7iWP*>X$Ml=ED0<;rh&k4nDc#ocWyc*c94~sa9-9ogy zK!^6{mfrr45`+~1?KWu9={WT-otB=0X9o$$&ZYyUXagh76M%f004+0xfZJs_QwC?B zl_02cAy@Nd_SPLy%!+IEk1l{F>pIR45o*tPcT$$|sKX+?;{h?45kv?HeJQ z!M`t+9F_i2aAYsM^W;>o4rClmE6;X1pkVjJ^0@XZ6GW@j810F=#*v3B{AB zVvZz3AU`!%bZ*0-vGx3r+(;q5@DkffKzi7j+{eluX)ESSVq_U|~zI6uNO4-T@2pTIbKgj!-eF zRpiNQ8rMqqT;^0YfiYSX>*m}_ORH@!J{u{q+O+Yg`2KQRcv0iTe*$v-gB??AUl!)MCuQWU7KReWW{bx05U^O=vUw&(T$`#Eh-p+CP zPB}4gv14V7wQ^LN8ChI)&}~@}82HoxbqrW2p7q6L@}EJGHM&k>@h^Tm$>#B@L@+jbZ|T=%pnC2 z8f+{dc$txbdCFLyzrDmYQ-{d$Q`<>aSd^s#azl)9AB*kG_-a&bDJuXVE+LDO$IcgG8?xdh&7J+gL6{=|u3S8*k24^$R<0r(v ze*Pb3pBni3F_#GkCzoo^d_{B#Bn1r!I~Ce`7`MkmGFTJWA_`eRMfUH%B%&y#3y+v{U*EHz9Pon}lly&uIcN~0E) zp)n3)_j1T#!*Od!5-B%Jq}*`BonY%i8>h=Lwv^@yMVdt^2Dt#XBkXjKioS57sL^`L zHrcxVIJ+|N{YJno6eiJ^N6oxj1N7|Nx|QR#+unIYsPHZzCFj4Tk+s& zO}qEB?TMgo02YzX$#$?f%b#Pp$xA9@nfN_ly#QjMpE5KuQpFSms2;W9aCkwSoMAie zELrTmRzz}V{}+X#jEp7$m(5Z4_~=1iUkkm!9luy+O`RZYNkOZ6lFwzdAjV_ykq;6z z0)nLr{P3Ov_T+YIqhGW=1f@e9EQM2J1uByccAf=CC)QY}P*iMaXR>!}c!&Qt_9H~e z(dMXe;`MERpv9tSeAN$Llr3=3@LEm|)JEJO9>F_lLij9SU_D?d6*`$5NOfC& zGyzDqtoIk&LvBWe0Kv}1^+_Z7umn|b7+Woa(^KOjtuNSgOYa%{sXyb(rh=idNnGY? zT8Ds2#>U`kU6Wb$euvcp%A%Ghp!nDXlfp}p^L$Y-0hB2NkXqOjIhYh^mLQOj(d*qH zkP^6D`t?4~Xu5hwc2qxl#V^793StKrOWf-9{DMuu5pzGRb}o=)6U*RK+!AUT z67oQO;$0)wAMD$+{b1+y!FD7wAn36x=XmvtqS+!vFq7&F1uPfc1v5Z&A1S(?kEE1Q z>_Bv$a?#k3C0Zb{1a?S(6SkZTyPfAjdsS4$l9#}^!S>CYxyNyrB84i|T$*2nIvloQS)`tY;7 zo;pB90-q=Zkl5ijGU_`+a8A5lUWqE3DYYjwPu&4n89rg6A9AQm8ygFFHq3^fdCd1G zS&ucV{Gj3yuoEQtdc&g~=7B7mBa4vH((?sitBTzl%XJ1nk)45LU=%xJzgT()#wBNg&VG3yW;oo&7 zH=Z~oG1V;=LZmy&-9zd>BHy93Z?6?{E++-<=~`QAu$D_9O*#mO| zpDf7^q3iQ&e0>8M(Q^z>0a(L4e~>59=j-RIr1k}Z!w@ZmJwS&tp)|yXU0v1Ycd9a0U6HJ_)NTLl8ZV+byU%qo0D4c+RC2 zB)Wk=duFLW{qe4^A~IhXBbFZ3O_?T(mav^yeHCFVeD>f2Pch4}2_39Z)X+b51FiX; zlC|Pacp*n{)?1_rmks^CE@eB>PtX1}@HSuqn=P`s9t`svpE)96oR<+fkG?u> z6~R6b0Cf^2>L);i#DHv^qjeNXmjMX%0Q*~2Gnf#%dan&~2w*k4)cr1vRYcFrUlw z=e#*}nifwwPip5`$`{lv?UYHMRo3}x6i^Q?&N0YwSKu;RfosN!9Ze3%w4OaJ(b1p%F5e8Y zW?~#QfKY*^wXD)nJiT}PCo}xT2cuiz>!2|_t=|yLAFcp0?St}D8Yq-0pT)@uApLf8 zlnz`m!Z+z=>5YJ|Cn{#jx}bK+ zuNOR?pj4ulraIi%IX+yI0e63Gg*+(?zTZ0nc1Fv53~cUCz4+RllxkTJ|IPZ~+N;VL z`!l`Mj$q-tBbsyK~k+BE5R!HEy zW0D(tOg?-X^#d-*J&1l3eT0Hpa^)2|<-GsJoObKYb{|OO?Mxi%l4G6_F~fS>&-Isp zf|ny;Bz0fS7zP#OC$`t-b>QGvOd&Ftab>CB`g7e!BSE@9&wPqPlbR`_qLF?h*WXIT z*i&n~$yeru$Kds4v-Pm~)Nc`ar?uXe;kEG|>67VE7k$?x7rP-n2nq$v8YPZBfiRfh zdPIQh8M&k~-}HLjma&3qvNbvT%-DIPP~Z9n34Xy-NWf1R-3L5KfaDVm8Uhqd!lvo< z06N;cNTRY$kg%2;@&QM#ya+MQRH@%4ujb5@rPz;5s>@QtUi&sjrTiLK7UBDK9{%|C zNy>q)$DGPZP)j@&40abu5isSkQ=g}>HeFw*^yvv@WtaS)vXC``q%u$x3mjTq3PUs$ zop7K-3o^1P(2bGi=n)Rm9GyuDw7I{M!WL*aThx^um*ucprr7;i2j7f%6l3iS_tctl zFDMVcW7zDn@xDrFc$`AUh7_3!f${maU`>}U_2?Oe>(7+^vZvS9Um&s?^26Hvu~uHR z(nhW`pmPVShpY3E941uw`t+5@VV{hWVds+Bi03HC#``iF*IbheIORI8_EIWXhl*5K z3^93Z6je3fb3fiR$A5l)3=mc0^DSXN^ued8&fAk?B39dP0Eoe=H(hLwL;nYe-}?K{ zNNN#kR)EafFom1EOd4J=ZIs>T(Ooh1MS-a5QQe?k2a+qU9 zyo>~69Ha+_Xft@16c4H{~LhX*b=!pi&RPz7P1-vFt&;BzIUvFXb?^QXe+TPshmdy?#qY2 z3&>&mp!qU>ejrmOGD<)DUJUM?;1Q&re2!=20{V1w5Lo(*UzEwc4x_u$L_}UigF;-} z7#e75Xaguw!sUzxO|OLW?v0X0VXG=Y(l8hSyn{iZtmAK>LkbCVLjbP5iTK9LrR1GJ zfJo&}=6%tF*dO-F^OOlECKT>`#Qt3{-Heb4jxBezV}Uj$0Vw0qckGYW^y^%Xy4xCb z#e%!{Yj6O%HFF4%H7r{Ny z+o4Gt2Q*6Jlo99hUL?6CgGYSJ<2D=FmhiOC$7&a=iGw%!?9t}64;mx!dq6>i#(8WV zr~Ig7{umS;0@pHkxP%lqO}iDB2=!HI-Wok3nsfny&MK8~U5}}f$B*op{q%4FBTZe? z-{*Oq3To-;iboB@g1^RiCaegKIc$sG_X_Avm%f7;PP z65DU(<)q4Yw$4PAb0)!?R5nVORrWq)K8rUYV7S~cxG5{|5uUgPPEG6U1MvThH)tnV zak^|tP44N=O2$k5!J1~|_(fGPU&w@7CgL91xWhT{zZ=WQFK5xRFNUfB^T>=%-4-JG zK)Ex4A!i?zNDo(F@9Np-jcYHcP~0Jc6ydN7RKbFFx$t^!=4K#?O|TNRY3@4??)}JLecR;Zx%>&m4tgj}&XubsB*2_i` z2Z{^Z)D1?>e;Hi+cF>KrW3Cy$s`i<4DXr`9lGJ6?(C~x7&G|^iLow^i-<&;J$`|7! z4G$1Y-`oxqKU0L5C!4%tL#sKj5!|l+L93#>-FS0-93*l{sRWIQn=KEwEUx+Gy&seI zuK8W{f=${!{KB}L=KMuS&}987U}O$5Vq7XP{S{d_H$r_b%+M+*PsKJxaC6akvq6-i zGg6+7h!Ukq0?lFm*$osEg3nhJ-cq7@f^ZJ8nZNyMnsNOHopSOgm$X*(=SKH1tdfy# zYW79n7$7AlKUT7tFp&R9YZzS4+092?WPNE%9{IwDTJ>yAYKnS=n_Dad6xA^nj&kCobMxE zA3ZIwUA1!7AC4$WCFOG9<448}Y5>oM$z{RP%{8uv-Lbl=#=q8h+QJ?vGT53zG(~SO zE-W6n>Q;j=@H!f@lg#dKxBpCjlw$6bA$?mg%yG~nE0c5t898oMHC|bNsvzwq=l5zj zNZF~*U(}N(Q`<%vQpIl6qmxM|eR%#=$X=o2QS=WyRkM1ppl|?Z`q0s52ej_%u61Oa zE+4TVTeP&5CCX{q&E-n<57y(#I8ia>vlwN8JgGB#K`6hZ>Vwa8x8EjzKKrySC`7Fq zh6!D?n=wuEQo|lKbGIgUowUy|quBm*Z0>X#LZA9DV!r$1ubCU96NKz`_tC5_R^7*E zH^JYRR0$U71a;Pz@OQUN9jXPQ!;&i#sPfEyf_TedTUmj12_0V7-o!Z2X7QEj=Z8W# zKME#sI18oL;9#~4sl8<3C+TKXsSmqKg-GNg)b{36V=?+ec|kyE>f>s01^5iwbsvIJ zReT-*RR>>@*8H&UkqJRPg4ev`>pKza-(jd{#^IZN`z@6)gpX!9nA7XkX2pQAeUQ-! zqhHWxn+n1K*U0nVz{2sAFv*}|;`=fX2NEbT#qgzu%4c5mVYF7TQ6`2VG7c_JQV^LM zAZeC`P*_hAC5m3CL&8@>pL?7}M>gyRu#W=3L4kx82@>6MpNCjIP?QwtT>IyvXuiWp zohy*chzhAe0zT;e(YeK@*{tM|1Pp~kZmbifE9X2spT-USA4`DrCtSBdavl3N`g2NO zldzeuv~VA5GT}GB1#D|7oyRF2vg(aY4YOS36unuI);%((c&0UNY$<#n1&i4)s<*)Z zhp(+=7tFsE^|th2dq%fYkFmxu8o>$YNM7&BwT&mG1Eh~nN*2A-I+fMTGJHbqa%?{@%5bu>)UmE;KL&qrnw5`1orAZvVukoni41y}Oa03EEwRw~! zM$=UBv>ES-fNnoaQW||3b0n6ZxK~B5*|(VSJxmW2VE|*8P9-bH4s9 zTQ8$eRykO{gyqMzZg5q)p~*!SyicIwMH1}u{Bm_g(|W@_Ex&P3X)7zw=`cL&#Fuoc zR>lNC8IKu1`)%8rt~Vat3ohUcaZ4^$ZXKGDLRDRFytKWWvT;%#fC-hisLN`=aKhtn z!0Moc^>U^Q{|spjMD@!7`8IfE(>Mi)@T^Pwa-X8iqt8-=XEqC?S73uo)$p7mBW{}% zQp;2Rt>vROruQQS|AYoQjrWEf33gF2$uX(GpH(6f|}k!J=Z_4@GDY$ypB1BqjPS-|c~PnI7H)XIb-U zi>{fiWJw3lXMoI*bzDl7IGOrM5;dbbjDs2E&7Br zDtcu%mmyhc*|aS{2bF7fs(}(-j4jIh=Xaar`hHK9$j-<*!7GqAXNu;>zvZ0O4 z(FmWvu>_E<+Eu;7x3PGz6&3t5ZCK3c(bP)AT6I4^oQ5nU(lZRx4L~(hDujns3XT+a zaOY+BBd+O%pSM5ZTktJV|DK7!?1yIQTptoA*{6o9Q9mJ z64)Jd8u43b=2Q>cQ6N%yvuDhhB=lmS`T;;@(E`Y9eQiCnnQBk=}4}!|Cxpe5fyv*i0VUvfB=Uow&d(iWR*`&sz#Ubfz*+-$h+5MR8 z<&?(>J7eT(JCG%RG?yCh`u8}P6!m_J`C*pyeL(`5@Xt=l=HU_nd)J#SeXa z^;0~vOQ(Rsc%2+GZSOSg_o8A{k1-mJ`z{otZ_}xyl0F6jxcBRsi|LbQXACRSuvMX5 zBt9S7^bUji=5&Dc5+wY&>IXarIEyZRYkwWUpqV-WX2o+Zd7XL1%Mu+*qwyj4JI2f< zkHh4onje)^SyT(g*UPoIkJ73rNHUBfgjfL6)bC=6M09`!fd$l!I{ac4DM8r<&clgO@+K`L zsWb#+v1VasaeHk3$UBa#A}>|-;{955ZvEPl_ZY!OMqDKEq(tyLRjI*(xW zInqR2wwPLJ>-%g}gH9u_UgajYfT6PIzRiHKLrIy^6qDZvq$G$oS)5nm%RUbL4FA=z z-@*Lj>>J^=79N_h1Bw|FN`lDezBGR!-RJL&z_e>v_xwT-9S-y1mG;lh(r|MkA}h0e6sb>9 zjLBzUnG*W*n< zm(cl(XwlrfJVr&LD;WqH2AOf<3rPs>3=P9LvV2kp4G=pC*gg|yS!)>CaeW?HZHCfk zTCax({S2Y8Hmzm9GG~Kg$PRFy((Ne$c&u98;LUo%h!d*yR9}HC2L22FfsYhy@_rL5 zac7uNF0$Bdm3rNIMI-Y1g9S-@`?boFe@@}G{T1r*`T>q;ff{D z;}$G-9%z?+e4G<(|Gzwn$?#-!Oi38SDW!!3y<*x;V*PHP0^&+w!FsCLGAY~bI|Z)H z%WFZL(RrL3vd8PS#}7BSt#+!7^SnBV8ccUYJOWr#P7;gs8Ys~1XW9kso@njdZ+z*+ zE5IeInXbtn%gJmV{e7L*cC?>}tx|pGYDA+4C))}=v61alZIi%|w*D(zGD@w$0f9lZ ziKgfGEj5bDxWnRgTjw@(R+QK)Y6D{tn=J~~EuAG}W!b7t4FiSdDX)W6GM>p3GOV^v z8gfuq;Rvjz_kJxnTPjyNgPD1ie>q7(OFX#FFDQP>zsyagN=IMmz3G}cr_X0cB(E32 z9Dvtj+yaKU&%I0L9$TL1rh{oUc)BIVh+`wn&}|yGiS5^xZ{O@i`dEPhJqWCkxO z@`p$fKB^Uij-LpQTk%Hc$4c=Jb)appM#Smna*t+y#LEm;cUI~lXF zwh{z&iUg!YJ(<)3L|Xi)q8Q%Qb1F$>GEx{ffDS}m3@qdBCNi6!mzie#iBH8J(2s{I zo6MKtx*nxDh#s#Gb#6uI$7SvSbj8?t9AI{3QKt{dEK`bpz9}dVFOtn&Q9Lngjo9()f8zg_wk7DsN70#~=jXGv<>RTvm2+G2382vMRtigayhi6;}}1qnV!m?NBi6 z^RMb_`3vLP6WY~BpzowQWk&>v|D%tbbv!^tXN6R0$8X2tF?e3?wayKaL{xtEsTjH# z(w8V=!}|;FvlVd*yWeFbOAkgu1){`2;;?*#CDNoP5&4P>1bI@CLHA$s{gvt#Ul-LW zkBslaxi)x7a{Lg2js6o~tK1@?{%SPRYVLOqytNLsk7syh>tMGq?@n6L@6>DhB<`ZI zF?^xyE$nd1v0X18Q!)Y58xFSZ$>GTy^0SHa)vDpe*di9CtF+23I^|}(suI%+&5AW1@vxqExgsVm0t7s(U@j7=R5ps9>R4MIa z0nJT1HmpAyE(aBL-pV4$M8^vdpktBcISfjt4D<;+*tk?3MfN=k{#MRpvOAWhSqyVdwU1m}B&FzbojkiGzz1e+&^h6e~>F_DUnBgS)0)Qz;mvM@9Ni5K)@B zqpgU(AmG#WG@V7xh%ilwFSlT!hTcjBm#?oAK z&jlm^M77fp4Ge~IPpZTY+ykyDfAVOW7}2IQqvoZUo~JgFjot7WH&9Q>rg|%R z@ZqhT5vr72aJj=_Jy6NI#&Ol>#^ajcl+hE^Qa zIX3o`T+csnqs%mp6#^}ONXFck#yM4R{ZYb3q;nnFs&PIMOe{{p4k|GR&5~5;9|J%o zM!WO_BMK%RvJ#Wv7)l`Ki;jsZBAI;4*G2qgyA0=MQBZf8I`e}ZeN`Uc=GKxK>m3nC zZKitZAFkURqZ+IiKQ%lBcq=q8m=1y;f>00ARn;Y&tNjn&qO5`rMLn%%n-o`;LF?&;a#y)L+pZ&TY@ca95 zAC67Mbyc^;37?Sb_Ss@>Jl&ocE^;;Z%LfY1f}m@I6)i~G=obdzN9oLxrEe^nlBgoj zzP`iD9{@EB!eJSa(HmeNl}MHv0P252-*qaM_$tAA9d)QtYbA2WZU|jXWb@np5o?m@ zT+K=dUN%o+#$4;W(4f+a?ja-@!fgdHPnUQrd7>s()X3DB)^u*p3%Ujp4iyclGj z%rY|@f_2<0_1Q4Sp-?ZG8V2!}k0rSh37_9Gocm7~D5nGd^%X{)(CO$Q8&%c#YzzCo zg!%Osz&AO0OZEQr_zSyNyA2pIkvtQ6&9B2Ql|H-Al)v@ioUV;J%>e_-MHuzDh7bNR z4bXAbD#cj`gUl_@pw@Fj$QX#}yQG6&feFPRrr+PEbwyuPK*sdou>Hy0M(qe?JN;Gj zM??ukJ%Hf0DZU)WYAhdPcc*Sz{CKe`v#SUR7-Ehe4XYxD(qMi2?aMgTo5EIcj@{*W zz;-!n?s3s~BS*HwIscO6$@byzShFQ+%$by~j6D7(Zl(#>_w9QEw$tCfS?1%J1^g~Z za{aYMGxu4$Wc*U5yUIHWyHuGZ^>yb=^>Ccf_IYHs90rus0YiJS zEtWuiJ}$SNGK0L~ia$ToTz>5M$1svyA$#}RQ=+>D%Ifu&DU6fVj=1uLcC)@{wGymx zEdoBCK^tG8{?SMy~NYgNR43}3ZDN^6kD5L&?ND(j4F+MrP>CRb%tn5b~EF$Ji$lhyeF!A zZ-NRy=(3;mJ*RtG8I;}L4qk|do7+Sw|3YKuF8?R>s$98AI@7Nr7PX{aw&0*%mR{pK zx762VCQl;HRfyzTw!+wQl#(9oYh=ao-Olt7k?ASO-U3NviZ0cwlg67Vkm^l)ub#|h z{vicS1)bXiY?Y&cFe90xD4Q@!RszzJYo1ScR1%?^J8rB^g?7{6B_@UGKv=&*yR50 zO}1UkQBtCeWB8tA>scI3pL(oY)E<+Wd+|JLoA%1*udt-^ZT{_JVB%;{BlJuK51&V1 zclmq5Kvahe^TABR%(Pe8S&%CkiCde#@7p;r{ZD6JW3tz5K-Z>*mPIu}DSVyysc~>u zs*qr^h&z~^JI4{AA_C$%IQIppDaCU7`7N`%bUzB$u~wM#f)kBnGIxsTTa`aQ+uL)s(i)v>bOY$J0mbq4V3;hjFdPIJGoZ|{ zT{6|g6_5F!A@*ZvMqjwIbFl%>q``VMJ1jV2_E6>`N7<|;R_fsOL{^AQ?DP56E$mW# zY{AT|XP@bbs9;es=0H;@nCyY9B`>Xfurfiqi@jg`AVyjd!?<5^SNEBQGVlX~l%HqL zhdFPDlZ#9vt9(J4QCkg{oA^IWk4;4`w5w~7Fd9%|oy_R<&F;M}Q=?{RTRVyLxupKB zu=7x<@k8frV!Gq&=xXK6$dt35Mi76j=Un1V2B1R+8x_GcCzIF_wXLOXf{=KwdeJ;! zqC@lG6_@f@P%!?mI=d z?{R!_@0V#)w$Ol7OH=%SHvW>83>|Aw-#3rub|Pzl{Vu6$h^Do(_w%=cpw^!ZY06Qo zDL%Wr_}a@T`T@#NEwD7?(o}i5aE`S(v?AiVTX%q^?R}Kvs-43&CUtuWpJ8h$wfB?(+?wH+2+Z&}u3rkzicV7F~F=B`QuCtxD z$LTqs*SWS=qs8P?F+BY4t`pW(gONw7EB{}6XC4pb`u_1~Wa(s!lzlh$I*37bV`oI! z6A?nzNwPH}yU3PZhB1^aTlS@7%f4g@k)4_{mh8WKs`EXs@9UiNJ?F3AU&miwGh;l@ z{XEZoU-xx=KJQEK@%&EU$t0H{m@DWH+zP+Y2NvbsFt9amz$1FpVbG7-T#xi*K9!d% zgRKCm@1ip-{ewe7dr52%AXo}-zqk}FEu&1{`l-h#i#-p`JSg(s$5T4g-jhU!hIa8e zA^_~4j@IJKoIUmI@10m|x?DeRBRUjzG%p%3b_hxU4`VhX+xg=hI@7N-`-%y)!RYDT z6wpu8c|h9&TqtOT)Mm><5e+*0_6^;U6YP)KPiFRwU=XbY(m;{9#r1A5*TmB^5X&+O zH_gX7?*O-Yu9QH!ihnL#lD|T?fA^|s7CT3zsI`I2PONVBrZCcs(tER;RtW5usT=P9 zy4+9&2qSv3UxV^{-FZv%r^e=g-Q>GxRJ-hHsEe^HH%CInEy)2b@j`0f`jCNM1%UQS zUs2g$;zqI?e{F0ow=`I`*CYz)q|$+9tDgWj@4oN;CZM92ADT>vaG+W=PP?2`dFfcq zc_RtjXXb#UiCJ#3p$(@KP>3iLk`W~6XH`oKppeIWU|RIX%#opdfoyqRE8LT?T7zlP zH~r@(8+TgmGc{I@m=-FOzFl)_Vsmli<;boTi3d5|RgrWT(aAAcBQFa-QYOEb@CPHU z*WRxk9X8)2IqIq@uB|vVxsyHWSy*j=59#vGW4rRvKW*^QJBmTkIJ9Oz{rUwM@_nd9 zFx{5&r$rC{!kpyosfbGVPVW()MQ5ksHV>znkG;mPMo&NAd-AIA>5UuNXXmow(U&pH z$EQFQr4FB@Y^i(Mk7@1&kd;ZMMVKyUM}IJ1JmYR2D_@s_Ry%f#>p(+A(J-6qaW5b_ z_K|;BC-h7vK=Yg*b~#Z(l1hxhN-Hb)z6{tIZdSO8zxTy=m-d<(W>M?#@s(yYYmSE7 zW{%efdFZSl5F@IRsJh|KDWT_uY+xcT{M{L#dQ9aCPh+~xr>8| z{$v3x2uuGaBGQ}zZhl1HH1nY$@4btg4g7O{Peaf6H|D7GQ!L|BA<&v@^44L|tKRFa z3?Lvgx|V`b1Qp^S!Qdw?)e(7Os_0R07Lzyiy9ldz`2cY+02lCms#S94T)3?n3z7}a ztNxvKlsop~3HI{op3|$_!U@q?S^iEy&Zn*O?5S5d~Jw=JRbFK@i zymbpfxl@kibMszJ9+u33low0@dS04`=A)Os;gflCrq<_^vuo|8j|HTN0e#RuelUn( zoX-mNIS;Ffp7}N{px>Mwln#*QdJ*f{-nVLhiD9Pf#4!6}MW)`kiKCpbk}87FSJ|{}iFZnd)3=GPTKTMKFsXEIuhZvm?Yo4OSKXQH3mC8^{H1f^2|olu(0x z6RNu)V3RbleUE-T3JmQ3(>2wxR>4 zkJs;oXfG@d_f>~P?GL0UKd$UNBrqVkUK&1O=A$rUm4GdO&$87@>>9`qE&O^=;tPuZ z53SaC>|BAVCw21`D$t^<8Pu&M9}?t<|y+Vk?I!qJ~VtvTPju!}xl5g8qwHqs!~_6&F5 zfKlhv3`U~=P8z)+BIdY3ta=)YdppO>&}nygmttXmi~Rl!)#OaMtzi~>qWj~Qv1=d@ z{YDYSDiP&bNANm>od6X}X|Qw&dZ%KPGK~hsP|*5W6W0!AF-vZ>K8bhcaRmhsl1H-Z z>f>Z4ECdw$04LY}{-S&p&VRdh#@k&=1NuQm-2CAV86DjT^M3I;=J<}MUO-YiCy{b3 zAahC1RiDnY0khwSwF!tX-s+k&96airPVO9rIz%lcb%gQGppGIP8`JD-8qH1IXb@m| z#A?gSJFl{!y`oz%YC7oY;RRZj9fNYL%VoBC?L{2WvCLqyRnzXyhULq3BxIbVEY#CH%v;V+hP(iXlJnt8A|XYBqPLS(()WE24)r;D=}CA~ zcZd`14aqODtytQE_N~9SGNXN$cqYma=5G)pqctY%kKg6ET~D`Mwtgh zX!hkUU&zje`%$SQJQtGfQZObfBf@fqjTrH7vkZ+-I?a>{0kR!a`SI$8c@NkOBGsMq zUHW{3E%HxCnD@&Vf;@ge3JmJ)=>LNfU0p8pEo^)d~aVa$C|fzZ@htE~M8=E3e6W zV5Y8HT-B}A^-EbB>FK)oL58AG_}EWskxm!G5m zroVbVU7?v?IByLgkj_TGjwe&qmDa&!v29qK^~+5V)6(5_f1-qvl#s}^6%K)ezQ+Sw zJ3UaAn2%bNB~EAPq3ZTCGW1oGcP7N!a=WxRAyK->XtGa9udYxUUOElbkasj*#q7Di zlmhaX@*_Y1aF|g^9J~u~^^|CXCDJ=lYw^e1VfOUG3h&ae^D`>y<#n=RcoGU})#yqB z+m9I~Iz=V>MWJ)7=%f4Ft_wLA!&7#vu?FVR+>?5T?LPBQV>Y7QlZv}yvp@>w}2YGq5~xtaOj%~Y(!6<%qD`UjP(+Gz-c4SJ_qCH;q2sQy{&ay-l5i>Z- z;NR}e76sP_RmpLq-ok15@IfGoV5mehx6r06!3OYxamQN2_$D{MDIMFaO`%lo-33Mr zu4gN~aO1?|HJ^if380B+0}k4z8AwzwnU>!hlchqeOrGiK@=UL< zY+h*P?z`;=5$CggRA=cb(4(tf5LL;3kC~IN*Tb&ocs<>X#zrwp2sqyhU;4^jHT-C0 z?2FEJPBv_5%9T^Zq6)J=29k*e8V3%VueFt+nH3EQ**Nz3Jbw;0MeBmB>#YpXrSuYj z<@*+*qg1>tD&y{B)Z2o}8E}UARo9->@2pmNqNMB?1-nfsNrza8w+73>ipi zsGNUH4$=IcHv{gp?+Rw<+=9msk$UhDsvMMM445x22;nHL${TK|?^ zm03FMa?L7zPq<=!P_Ck;Tesr&t8MaZFY)+yKLO;+chw*Ee#*p zb+fW$KLfdDIrU!hI&x1;^^I#=glT73Owce7Q!s}BqW!8WtlLxcwQ9KAqQ>1UC_}P# zk3`fjNoCVIVR2m@g>~Xrq9FJk=sTQw~E$s}7Upe#&T>sL|0R6T%xeG+yrrI94H+X)CAm7?e zllKL#_-r4|y-o4!zVKViQ~sKfD^7FMoA|JAmTxOZ=$OB$%`fz4j0?WOF)T zvp9uSCqumk!8=cMJRqFV5rX&8-zsD)inH8gf8=*G}{;P?R#<_bY0$0*$izN za|^u46Lqh*=0yaCk}s0tKlhZ(<0OsS`Yp?fxKdul=H&_Xj-U@aLz6(G~4JwY>`NmS?AXRJcu~j%S*;;^620-bO!cbQGK4g9QQp+(!dVv z4k+o?D(C0I?Y))_e+(kB&l4pbCeEuRDkr$e6yAPIab*9+0mBmC_>m|7epEL0{L5JwA zgkoPF-^5AS;bk;dVzxTq=^D-{mFb}LVm+wGAB(3|H8J`XX6GC;Lmk-@FHRms^}=cIOP$Y$*g`n@PH|; zl&~#x2}FNksp#itH9x`Vb~KoIC|=h#*|2n(#=BvEUNl7CCfk4(dO3J~WaHS_XO79! z?y`a{21U3OAP>%Tlfz{$Nwhg9?M7eDpd~gZw6?`B)pjQ2AL`)FxZx&it0q`PB<3H$ zvjsZ?vxjZOE^z@J>7BDWP%~*SA(53xm1DHq<(Ns=SEn5MP0hz@yoQddLvmaw^54WEb?TqG@IH4Yn1?DS9*rxrtAZzif<%zukOfAX=rm#u>hG!MGe1+! z)IQ3#qsu>J!eVr7w?W!O<@-~iQ$4g$-!HpThJ%NU*Q5qqats^1J!Wxw=%K?KX19PZ zugv{MHWH+uYO!!DQR5PJp=(x&RX{PBcBMa57RIr`^#PI1_j;W+m8W>p`I+TT@K`~` zbN@Mq5$9JQGO+hM+(Z{6vIXqp3EV0sUA_;HTeo z9~71+Gv7__4F4>@`n=3kiXH7xU~9&OkuWu*UW7D_X%M4s^p{@SU+EuI6=kA z{BWqpZZ{#ji*j6&=GikXZlScu|$rqPaQ`0!7ofxORts;lnGq8F;885`BQ}pFfKhH(Z znIU&o?Q|ns z&35K?i$VpJKVh%}pUn)Bm*b;GF8WOfNXHdv&7Se2dgkIFdex91!D0_ZB5l?3+sSD~ zcLD_`(X=AGB1=Mh!w7|VP_}^5RC4sef!^F1eM+rjf&?t_clsmERb;;V%V~aQMC?f) zNhBRZJtm){h5CNWbad{~k_?{rWGg8=HM!gpXpsWwqOyzzf`kT?4@&svi zH9W8dG96-zrJX=%>M&DMHoTf>cAK2#nx^tb(A~@50e%m#On@nGT+hk(%NU28mCSoH zN8;c+!$CmeM|(#F5Pe~z78{9oS~DUX7$CFEHtvxG2EFIqk#|O!#-$eb7dgkpQ8KtX zF^O4=X>@pY&=n#SL4e6m9>Aco3|)`PHs$Y(F3W*fi^wM?5Uf`(_W4n{Q!gdI$w-d*7@!E38w{*MoKZKHQ3NY++J;D zvgpo|s?R~g;H!@*_Hysh!SxfAq$q?#1#H&9Yk^ z%zJYUIJ3N(gc0v|C!Z^Cqa=_A?tKp8IV$H{$NR2x^HPReFDJNOBX>@`daETGKry6x zmk2{)0fs_7G|QefJS#htHASvVQgsWlkz(F|ci+Rf_%^5)6x8}*Ss?4YATj1*$Q`6G z3&w<2P4gi&lmPd->Gac@N4LrDMhh7~hXN}SkH?W?@$^ymmjWhfWK}HbbV6)Xog}Ve zJL7f+Tdl_JEpJ|-2q?xwUf!LA*2#gYM``_{TwDJ3d}i@pCD zBr0V=5km%(SwqOsPOZ4IaGIdcp9h2E@t6CV8*J1)uoY67GcO zcRQGg3)R3px>}0iCQ|_sg=$#IDO4wcSNWFZH_?K7+fRQUL9_r&6#;}<^roZJxUdf- zVnKg~iOusFa&17e@_rTDrCvGjqpx3#r=ut0mJ{SB4nX}$ zV}k}EzXq>MinxG-PDW&T=l|oy3HU3 zN^tHT$7at%I@LioEz-4vk(lH=ru5`*m)$ir7~dmeR{3_l<6VWSoCCpX1E?AMUho&Z6$>#n*81ngt^>828RmITJ}ZJ*%(Rs{pYc2LVvh4X zDCxR(p7%4@S{~#xa*s9&R3Mm%d|IYS5}Fi~|H;JmTXwta0USeZe*;3Gl0Uvyzs+qX zebl}1?4-Zbs^q%yYV{OlrS)>#MSS)2=nK6mU5lL(3(+zR@}i!zk-IIZk~OcHRO6N;3OL?;deI}te@MmHU_(LQxf?a`ShwolAG zB0G1K8(jNN>9-$b!5k#4z1K!dN9ujHt#8Zs0B^S@cTBN@6{z=Ytxrc^5H2(MQ515w zspKxa_naEl@@3}LCoDQzb6C&H5cINHcl9ASxk000X=LOd$x8|ZcMFukWIb3x@HD`R zbT;u*60;Iz$WxtoMvY}BiaO>8yqwM;DyDxcE-UN!$fQ-pPZbmRRpS060tztdA zW_)uSS@q(njAdHsenO_d4Nh*;U@)Fa{~4~Y^+cph_r1bK%MI#@Kj9A1DG;DTBDMSd z@Y~V@XWlZ=MM^IL<;7JOzVsp3S?8+?QR);#WOS+@`n0xA^)kuY2Ng;>1tFKF3bDQd z-U9@~FwLb96F})ncz(iGIqNzI5=po|LV*0`{zAV$5OH-qmP}U4GA4dNN_8SFY z6au3nF4Vie)3WXKHI2b(tYurLB}kq+?JQ6KJ3cZB|h@5^^WhIy^?9FoTpoPyO?O$q@THBWzs>| zab;9OO@LB4tA^~${uLu11k+!Tuzmuq3gQS%#+5piTO|J>Km85$Od*#bJoh|_ko$p< z`CA}f)(LO}U{UY|+J6erOCTgg280!M{xCv+evl|eLWp&OG5H@;9}QE$VyszpZ2q4D z_io(>f52#OBSP~Jv4IE&5DWk&K>Y7Wt^Yl+SR(KTx3XfZRsQ!S`_H%hdm+A4t^WL$ z`2E#?FT{WD7~pIAO91D;PsBfZ?Eama{>l9J@6`0~)bv+V&Hw*meb{IrgCPQ~9nLOH zOZ<8VK@zmCbpIF;F@%hoUEzRcc{`k&+zd{LNrlW*kjs5Fy`tkW8VoHil z;&t*r{b#>_WfSWDgO=uY0op%1rr$qy3}xD+`1G2B++QC5&(BIxyCS5{nyCKOY5w+= zh?7##p_A==e=-ukedPOFq~J72xt^*2*NcBLgtv%DgYOaT{K-52HQXN*niOZQ+tB~r zuqX(B$U=y+Xa3zNGm}X{nIoTb{@t)(Nto$YNajxe-6$VN5s3=!=uAZd_AB_&P}Nl_ IQo0`ae^xGLpa1{> literal 0 HcmV?d00001 From 4aad156066a52fb0dae66a31d9802281b3ccfe8b Mon Sep 17 00:00:00 2001 From: d33bs Date: Mon, 22 Jan 2024 06:03:55 -0700 Subject: [PATCH 53/53] remove content and images ported to blog post --- README.md | 536 +------------------------------------- memray-flamegraph.png | Bin 38131 -> 0 bytes scalene-web-interface.png | Bin 223573 -> 0 bytes 3 files changed, 10 insertions(+), 526 deletions(-) delete mode 100644 memray-flamegraph.png delete mode 100644 scalene-web-interface.png diff --git a/README.md b/README.md index 2dc7001..7d44a16 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,16 @@ Demonstrating Python memory allocator reference counting and debug. The goal of this repository is to help demonstrate Python memory allocation using source controlled code. Work for this project was originally inspired by [cytomining/CytoTable#75](https://github.com/cytomining/CytoTable/issues/75) which explores related topics. +## Development + +The following are suggested steps to get started with development for this project. + +1. (Suggested) Install Python from [pyenv](https://github.com/pyenv/pyenv?tab=readme-ov-file#installation) (or another way). +1. [Install Poetry](https://python-poetry.org/docs/#installation) +1. [Install Docker Desktop](https://www.docker.com/products/docker-desktop/) +1. Run Poe the Poet workflow(s): e.g. `poetry run poe run_all_tests` + _(Poe the Poet is installed as a Poetry env dependency for the `runner` group)_ + ## Project outline ```mermaid @@ -51,532 +61,6 @@ A "runner" command-line interface (CLI) is provided through [Python Fire](https: Container-based pipelines are provided through [Dagger's Python SDK](https://docs.dagger.io/sdk/python/) to help isolate potential OS-specific distinctions for memory allocation work in Python. Testing workflows are designed to run "locally" within a developer's environment (for example, leveraging [pyenv](https://github.com/pyenv/pyenv), [poetry](https://python-poetry.org/docs/), and [Docker Desktop](https://www.docker.com/products/docker-desktop/)) or within [GitHub Actions images](https://github.com/actions/runner-images) (`dagger-io` installs the necessary dependencies). -## Definitions - -### Computer Memory - -```mermaid -flowchart LR - -subgraph computer ["Computer (resources)"] - memory["Memory"] - storage["Data Storage"] - cpu["CPU(s)"] -end - -style computer fill:#fff,stroke:#333 -style storage fill:#fff,stroke:#333 -style cpu fill:#fff,stroke:#333 -style memory fill:#86EFAC,stroke:#333 -``` - -_Computer memory is a type of computer resource available for use by software on a computer_ - -Computer memory, also sometimes known as "RAM" or "random-access memory", or "dynamic memory" is a type of resource used by computer software on a computer. -"Computer memory stores information, such as data and programs for immediate use in the computer. ... Main memory operates at a high speed compared to non-memory storage which is slower but less expensive and oftentimes higher in capacity. " ([Wikipedia: Computer memory](https://en.wikipedia.org/wiki/Computer_memory)). - - - - - - - - - - - - - - -
Memory Blocks
- -A.) All memory blocks available. - - - -
BlockBlockBlock
- -
- -B.) Some memory blocks in use. - - - -
BlockBlockBlock
- -
Practical analogy
- -C.) You have limited buckets to hold things. - - - -
🪣🪣🪣
- -
- -D.) Two buckets are used, the other remains empty. - - - -
🪣🪣🪣
- -
- -_Fixed-size memory blocks may be free or used at various times. They can be thought of like reusable buckets to hold things._ - -One way to organize computer memory is through the use of ["fixed-size blocks"](https://en.wikipedia.org/wiki/Memory_management#FIXED-SIZE), also called "blocks". -Fixed-size memory blocks are chunks of memory of a certain byte size (usually all the same size). -Memory blocks may be in use or free at different times. - -```mermaid -flowchart LR - -subgraph computer ["Computer (resources)"] - -subgraph memory["Memory"] - subgraph heap1 ["heap 1"] - direction TB - subgraph poola["pool a"] - blocks1["blocks"] - end - subgraph poolb["pool b"] - blocks2["blocks"] - end - end - subgraph heap2 ["heap 2"] - subgraph poolc["pool c"] - blocks3["blocks"] - end - end -end - -end - -style computer fill:#fff,stroke:#333 -style memory fill:#86EFAC,stroke:#333 -style poola fill:#BFDBFE,stroke:#333; -style poolb fill:#BFDBFE,stroke:#333; -style poolc fill:#BFDBFE,stroke:#333; -``` - -_Memory heaps help organize available memory on a computer for specific procedures. Heaps may have one or many memory pools._ - -Computer memory blocks may be organized in hierarchical layers to manage memory efficiently or towards a specific purpose. -One top-level organization model for computer memory is through the use of ___heaps___ which help describe chunks of the total memory available on a computer for specific processes. -These heaps may be ___private___ (only available to a specific software process) or ___shared___ (available to one or many software processes). -Heaps are sometimes further segmented into ___pools___ which are areas of the heap which can be used for specific purposes. - -### Memory Allocator - -```mermaid -sequenceDiagram - -software ->> allocator:"I need some memory, please!" -allocator ->> memory:Allocate portion of memory for use -memory ->> allocator:Allocated memory for use -allocator ->> software:"Here's some memory to use!" - -software ->> allocator:"I'm finished with that memory!" -allocator ->> memory:Free the memory for other purposes. -``` - -_Memory allocators help software reserve and free computer memory resources._ - -Memory management is a concept which helps enable the shared use of computer memory to avoid challenges such as memory overuse (where all memory is in use and never shared to other software). -Computer memory management often occurs through the use of a ___memory allocator___ which controls how computer memory resources are used for software. -Computer software is written to interact with memory allocators to use computer memory. -Memory allocators may be used manually (with specific directions provided on when and how to use memory resources) or automatically (with an algorithmic approach of some kind). -The memory allocator usually performs the following actions with memory (in addition to others): - -- __"Allocation"__: computer memory resource reservation (taking memory). This is sometimes also known as "`alloc`", or "allocate memory". -- __"Deallocation"__: computer memory resource freeing (giving back memory for other uses). This is sometimes also known as "`free`", or "freeing memory from allocation". - -### Garbage Collection - -```mermaid -sequenceDiagram - -participant software -participant memory allocator -participant garbage collector -participant memory - -software ->> memory allocator:"I need some memory, please!" -memory allocator ->> memory:Allocate portion of memory for use -memory ->> memory allocator:Allocated memory for use -memory allocator ->> software:"Here's some memory to use!" - -software -->> garbage collector :(software finishes with memory usage, sometimes implicitly) -garbage collector ->> memory:Free the memory for other purposes. -``` - -_Garbage collectors help free computer memory which is no longer referenced by software._ - -"Garbage collection (GC)" is used to describe a type of automated memory management. -"The _garbage collector_ attempts to reclaim memory which was allocated by the program, but is no longer referenced; such memory is called _garbage_." ([Wikipedia: Garbage collection (computer science)]()). -A garbage collector often works in tandem with a memory allocator to help control computer memory resource usage in software development. - -### Python and Computer Memory - -```mermaid -flowchart LR - -subgraph computer ["Computer"] - direction LR - memory["Memory"] - code["Python code"] - interpreter["Python interpreter"] -end - -code --> |interpreted and\nexecuted by| interpreter -interpreter <--> |allocates memory\nfor processed code| memory - -style computer fill:#fff,stroke:#333 -style memory fill:#86EFAC,stroke:#333 -style code fill:#67E8F9,stroke:#333; -style interpreter fill:#FDBA74,stroke:#333; -``` - -_A Python interpreter executes Python code and manages memory for Python procedures._ - -Python is an interpreted "high-level" programming language ([Python: What is Python?](https://www.python.org/doc/essays/blurb/)). -Interpreted languages are those which include an "interpreter" which helps execute code written in a particular way ([Wikipedia: Interpreter (computing)]()). -High-level languages such as Python often remove the requirement for software developers to manually perform memory management ([Wikipedia: High-level programming language](https://en.wikipedia.org/wiki/High-level_programming_language)). - -Python code is executed by a commonly pre-packaged and downloaded binary call the Python [interpreter](). -The Python interpreter reads Python code and performs memory management as the code is executed. -The [CPython Python interpreter](https://github.com/python/cpython) is the most commonly used interpreter for Python, and what's use as a reference for other content here. -There are also other interpreters such as [PyPy](https://www.pypy.org/features.html), [Jython](https://github.com/jython/jython), and [IronPython](https://ironpython.net/) which all handle memory differently than the CPython interpreter. - -#### Python's Memory Manager - -```mermaid -flowchart LR - -subgraph computer ["Computer"] - direction LR - subgraph memory["Memory"] - pyheap["Python heap"] - end - code["Python code"] - subgraph interpreter["Python interpreter"] - manager["Python memory manager"] - end -end - -code --> |interpreted and\nexecuted by| interpreter -manager --> |allocates memory\nfor processed code| pyheap - -style computer fill:#fff,stroke:#333 -style memory fill:#86EFAC,stroke:#333 -style code fill:#67E8F9,stroke:#333; -style manager fill:#FDBA74,stroke:#333; -``` - -_The Python memory manager helps manage memory for Python code executed by the Python interpreter._ - -Memory is managed for Python software processes automatically (when unspecified) or manually (when specified) through the Python interpreter. -The ___Python memory manager___ is an abstraction which manages memory for Python software processes through the Python interpreter ([Python: Memory Management](https://docs.python.org/3/c-api/memory.html)). -From a high-level perspective, we assume variables and other operations written in Python will automatically allocate and deallocate memory through the Python interpreter when executed. -The Python memory manager . -Python's memory manager performs work through various __memory allocators__ and a __garbage collector__ (or as configured with customizations) within a __private Python memory heap__. - -##### Python's Memory Allocators - -```mermaid -flowchart LR - -subgraph computer ["Computer"] - direction LR - subgraph memory["Memory"] - pyheap["Python heap"] - end - code["Python code"] - malloc["C memory functions"] - subgraph interpreter ["Python interpreter"] - subgraph spacer [" "] - subgraph mgr ["Python memory manager"] - pymalloc["pymalloc"] - end - end - end -end - -code --> |interpreted and\nexecuted by| interpreter -pymalloc --> |"allocates memory for\nsmall and temporary needs"| malloc -mgr --> |"allocates memory for\nlarger or long-lived needs"| malloc -malloc --> pyheap - - -style computer fill:#fff,stroke:#333 -style memory fill:#86EFAC,stroke:#333 -style code fill:#67E8F9,stroke:#333; -style mgr fill:#FDBA74,stroke:#333; -style pymalloc fill:#FBBF24,stroke:#333; -style malloc fill:#FBBF24,stroke:#333; -style spacer stroke:none; -``` - -_The Python memory manager by default will use `pymalloc` internally or malloc from the system to allocate computer memory resources._ - -The Python memory manager allocates memory for use through memory allocators. -Python may use one or many memory allocators depending on specifications in Python code and how the Python interpreter is configured (for example, see [Python: Memory Management - Default Memory Allocators](https://docs.python.org/3/c-api/memory.html#default-memory-allocators)). -One way to understand Python memory allocators is through the following distinctions. - -- __"Python Memory Allocator" (`pymalloc`)__ - The Python interpreter is packaged with a specialized memory allocator called `pymalloc`. - "Python has a pymalloc allocator optimized for small objects (smaller or equal to 512 bytes) with a short lifetime." ([Python: Memory Management - The pymalloc allocator](https://docs.python.org/3/c-api/memory.html#the-pymalloc-allocator)). - Ultimately, `pymalloc` uses `C malloc` to implement memory work. -- __C dynamic memory allocator (`malloc`)__ - When `pymalloc` is disabled or a memory requirements exceed `pymalloc`'s constraints, the Python interpreter will directly use a function from the [C standard library](https://en.wikipedia.org/wiki/C_standard_library) called [`malloc`](<%5B%60malloc%60%5D(https://en.wikipedia.org/wiki/C_dynamic_memory_allocation)>). - When `malloc` is used by the Python interpreter, it uses the system's existing implementation of `malloc`. - -```mermaid -flowchart LR - -subgraph computer ["Computer (resources)"] - -subgraph memory["Memory"] - subgraph heap1 ["heap"] - direction TB - subgraph arena ["pymalloc\narena(s)"] - subgraph spacer [" "] - subgraph pools["pool(s)"] - blocks["blocks"] - end - end - end - end -end - -end - -style computer fill:#fff,stroke:#333 -style memory fill:#86EFAC,stroke:#333 -style arena fill:#D8B4FE,stroke:#333 -style pools fill:#C7D2FE,stroke:#333 -style spacer fill:transparent,stroke:transparent; -``` - -_`pymalloc` makes use of arenas to further organize pools within a computer memory heap._ - -It's important to note that `pymalloc` adds additional abstractions to how memory is organized through the use of "arenas". -These arenas are specific to `pymalloc` purposes. -`pymalloc` may be disabled through the use of a special environment variable called [`PYTHONMALLOC`](https://docs.python.org/3/using/cmdline.html#envvar-PYTHONMALLOC) (for example, to use only [`malloc`](https://en.wikipedia.org/wiki/C_dynamic_memory_allocation) as seen below). -This same environment variable may be used with `debug` settings in order to help troubleshoot in-depth questions. - -__Additional Python Memory Allocators__ - -```mermaid -flowchart LR - -subgraph computer ["Computer"] - direction LR - subgraph memory["Memory"] - pyheap["Python heap"] - end - code["Python code"] - malloc["C memory functions"] - subgraph interpreter ["Python interpreter"] - subgraph spacer [" "] - subgraph mgr ["Python memory manager"] - pymalloc["pymalloc"] - end - end - package_managed["Python package\nmanaged allocators\n(ex. NumPy, PyArrow, etc.)"] - end - mimalloc["mimalloc memory functions"] - jemalloc["jemalloc memory functions"] -end - -code --> |interpreted and\nexecuted by| interpreter -pymalloc --> |"allocates memory for\nsmall and temporary needs"| malloc -mgr --> |"allocates memory for\nlarger or long-lived needs"| malloc -malloc --> pyheap -code -.-> |may stipulate\nthe use of| package_managed -package_managed -.-> malloc -package_managed -.-> mimalloc -package_managed -.-> jemalloc -mimalloc -.-> pyheap -jemalloc -.-> pyheap - -style computer fill:#fff,stroke:#333 -style memory fill:#86EFAC,stroke:#333 -style code fill:#67E8F9,stroke:#333; -style mgr fill:#FDBA74,stroke:#333; -style pymalloc fill:#FBBF24,stroke:#333; -style malloc fill:#FBBF24,stroke:#333; -style package_managed fill:#FBBF24,stroke:#333; -style mimalloc fill:#FEF08A,stroke:#333; -style jemalloc fill:#FEF08A,stroke:#333; -style spacer stroke:none; -``` - -_Python code and package dependencies may stipulate the use of additional memory allocators, such as `mimalloc` and `jemalloc` outside of the Python memory manager._ - -Python provides the capability of customizing memory allocation through the use of packages. -See below for some notable examples of additional memory allocation possibilities. - -- __NumPy Memory Allocation__ - [NumPy](https://numpy.org/) [uses custom C-API's](https://numpy.org/doc/stable/reference/c-api/data_memory.html) which are backed by C dynamic memory allocation functions (`alloc`, `free`, `realloc`) to help address memory management. - These interfaces can be controlled directly through NumPy to help manage memory effectively when using the package. -- __PyArrow Memory Allocators__ - [PyArrow](https://arrow.apache.org/) provides the capability to use `malloc`, [`jemalloc`](https://github.com/jemalloc/jemalloc), or [`mimalloc`](https://github.com/microsoft/mimalloc) through the [PyArrow Memory Pools group of functions](https://arrow.apache.org/docs/python/api/memory.html#memory-pools). - A default memory allocator is selected for use when PyArrow based on the operating system and the availability of the memory allocator on the system. - The selection of a memory allocator for use with PyArrow can be influenced by how it performs on a particular system. - -##### Python Reference Counting - - - - - - - - - - - - - - - - -
Processed line of codeReference count
- -```python -a_string = "cornucopia" -``` - - -a_string: 1 -
- -```python -reference_a_string = a_string -``` - - -a_string: 2
-(Because `a_string` is now referenced twice.) -
- -```python -del reference_a_string -``` - - -a_string: 1
-(Because the additional reference has been deleted.) -
- -_Python reference counting at a simple level works through the use of object reference increments and decrements._ - -As computer memory is allocated to Python processes the Python memory manager keeps track of these through the use of a [reference counter](https://en.wikipedia.org/wiki/Reference_counting). -In Python, we could label this as an "Object reference counter" because all data in Python is represented by objects ([Python: Data model](https://docs.python.org/3/reference/datamodel.html#objects-values-and-types)). -"... CPython counts how many different places there are that have a reference to an object. Such a place could be another object, or a global (or static) C variable, or a local variable in some C function." ([Python Developer's Guide: Garbage collector design](https://devguide.python.org/internals/garbage-collector/)). - -##### Python's Garbage Collection - -```mermaid -flowchart LR - -subgraph computer ["Computer"] - direction LR - subgraph memory["Memory"] - pyheap["Python heap"] - end - code["Python code"] - malloc["C memory functions"] - subgraph interpreter ["Python interpreter"] - subgraph spacer [" "] - subgraph mgr ["Python memory manager"] - pymalloc["pymalloc"] - gc["Garbage\nCollector"] - end - end - end -end - -code --> |interpreted and\nexecuted by| interpreter -pymalloc --> |"allocates memory for\nsmall and temporary needs"| malloc -mgr --> |"allocates memory for\nlarger or long-lived needs"| malloc -malloc --> pyheap -gc --> |"frees memory with\nno object references\n(including C, mimalloc,\n jemalloc and other \nfunction allocated memory)"| pyheap - -style computer fill:#fff,stroke:#333 -style memory fill:#86EFAC,stroke:#333 -style code fill:#67E8F9,stroke:#333; -style mgr fill:#FDBA74,stroke:#333; -style pymalloc fill:#FBBF24,stroke:#333; -style malloc fill:#FBBF24,stroke:#333; -style gc fill:#FCA5A5,stroke:#333; -style spacer stroke:none; -``` - -_The Python garbage collector works as part of the Python memory manager to free memory which is no longer needed (based on reference count)._ - -Python by default uses an optional garbage collector to automatically deallocate garbage memory through the Python interpreter in CPython. -"When an object’s reference count becomes zero, the object is deallocated." ([Python Developer's Guide: Garbage collector design](https://devguide.python.org/internals/garbage-collector/)) -Python's garbage collector focuses on collecting garbage created by `pymalloc`, C memory functions, as well as other memory allocators like `mimalloc` and `jemalloc`. - -##### Python Tools for Observing Memory Behavior - -###### Python Built-in Tools - -```python -import gc -import sys - -# set gc in debug mode for detecting memory leaks -gc.set_debug(gc.DEBUG_LEAK) - -# create an int object -an_object = 1 - -# show the number of uncollectable references via COLLECTED -COLLECTED = gc.collect() -print(f"Uncollectable garbage references: {COLLECTED}") - -# show the reference count for an object -print(f"Reference count of `an_object`: {sys.getrefcount(an_object)}") -``` - -The [`gc` module](https://docs.python.org/3/library/gc.html) provides an interface to the Python garbage collector. -In addition, the [`sys` module](https://docs.python.org/3/library/sys.html) provides many functions which provide information about references and other details about Python objects as they are executed through the interpreter. -These functions and other packages can help software developers observe memory behaviors within Python procedures. - -###### Python Package: Scalene - -![](scalene-web-interface.png) - -_Scalene provides a web interface to analyze memory, CPU, and GPU resource consumption in one spot alongside suggested areas of concern._ - -[Scalene](https://github.com/plasma-umass/scalene) is a Python package for analyzing memory, CPU, and GPU resource consumption. -It provides [a web interface](https://github.com/plasma-umass/scalene?tab=readme-ov-file#web-based-gui) to help visualize and understand how resources are consumed. -Scalene provides suggestions on which portions of your code to troubleshoot through the web interface. -Scalene can also be configured to work with [OpenAI](https://en.wikipedia.org/wiki/OpenAI) [LLM's](https://en.wikipedia.org/wiki/Large_language_model) by way of a an [OpenAI API provided by the user](https://github.com/plasma-umass/scalene?tab=readme-ov-file#ai-powered-optimization-suggestions). - -###### Python Package: Memray - -![](memray-flamegraph.png) - -_Memray provides the ability to create and view flamegraphs which show how memory was consumed as a procedure executed._ - -[Memray](https://github.com/bloomberg/memray) is a Python package to track memory allocation within Python and compiled extension modules. -Memray provides a high-level way to investigate memory performance and adds visualizations such as [flamegraphs](https://www.brendangregg.com/flamegraphs.html)(which contextualization of [stack traces](https://en.wikipedia.org/wiki/Stack_trace) and memory allocations in one spot). -Memray seeks to provide a way to overcome challenges with tracking and understanding Python and other memory allocators (such as C, C++, or Rust libraries used in tandem with a Python process). - -## Development - -The following are suggested steps to get started with development for this project. - -1. (Suggested) Install Python from [pyenv](https://github.com/pyenv/pyenv?tab=readme-ov-file#installation) (or another way). -1. [Install Poetry](https://python-poetry.org/docs/#installation) -1. [Install Docker Desktop](https://www.docker.com/products/docker-desktop/) -1. Run Poe the Poet workflow(s): e.g. `poetry run poe run_all_tests` - _(Poe the Poet is installed as a Poetry env dependency for the `runner` group)_ - ## Test Modules This project focuses on leveraging Python memory observability tools to illustrate what happens as code is executed. diff --git a/memray-flamegraph.png b/memray-flamegraph.png deleted file mode 100644 index 3039b9ed6b68e4fcb7c1e4ee85d0b53adaeea5ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38131 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 vUe)4e@hvR`y3_#%N>gTe~DWM4fF5N_7 diff --git a/scalene-web-interface.png b/scalene-web-interface.png deleted file mode 100644 index ad9c13d5d779dabc1f874dbc80c459c17aea05c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 223573 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
RmIV7! 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�?FNE1y-Ip>)J2JG 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