From 8a06bf5903506feb3f502dde30c63b9360a853bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Tue, 5 Oct 2021 18:10:04 +0200 Subject: [PATCH] Add optional support for ZStandard compression BAT now can take advantage of the `zstandard` module to handle Blender 3.0+ compressed blend files. If the module is not installed, the blend files cannot be opened but GZip-compressed and uncompressed files can still be handled. --- CHANGELOG.md | 6 + blender_asset_tracer/blendfile/__init__.py | 49 +- .../blendfile/magic_compression.py | 169 +++++++ poetry.lock | 421 ++++++++++++------ pyproject.toml | 4 + .../basic_file_compressed_zstd.blend | Bin 0 -> 94882 bytes tests/test_blendfile_loading.py | 58 ++- tox.ini | 2 +- 8 files changed, 529 insertions(+), 180 deletions(-) create mode 100644 blender_asset_tracer/blendfile/magic_compression.py create mode 100644 tests/blendfiles/basic_file_compressed_zstd.blend diff --git a/CHANGELOG.md b/CHANGELOG.md index dbd42f6..f002aa6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ This file logs the changes that are actually interesting to users (new features, changed functionality, fixed bugs). +# Version 1.7 (in development) + +- Add optional support for ZStandard compression, which is used to compress blend files by Blender 3.0+. + The `zstandard` module is binary, and without it installed BAT will still be able to work in a pure-Python environment. It just won't be able to open compressed files from Blender 3.0 or newer. + + ## Version 1.6 (2021-07-27) - Support linked collections used as input in a Geometry Nodes modifier. diff --git a/blender_asset_tracer/blendfile/__init__.py b/blender_asset_tracer/blendfile/__init__.py index f2d1231..8579d14 100644 --- a/blender_asset_tracer/blendfile/__init__.py +++ b/blender_asset_tracer/blendfile/__init__.py @@ -32,14 +32,12 @@ import shutil import tempfile import typing -from . import exceptions, dna_io, dna, header +from . import exceptions, dna, header, magic_compression from blender_asset_tracer import bpathlib log = logging.getLogger(__name__) FILE_BUFFER_SIZE = 1024 * 1024 -BLENDFILE_MAGIC = b"BLENDER" -GZIP_MAGIC = b"\x1f\x8b" BFBList = typing.List["BlendFileBlock"] _cached_bfiles = {} # type: typing.Dict[pathlib.Path, BlendFile] @@ -151,46 +149,13 @@ class BlendFile: correct magic bytes. """ - if "b" not in mode: - raise ValueError("Only binary modes are supported, not %r" % mode) + decompressed = magic_compression.open(path, mode, FILE_BUFFER_SIZE) self.filepath = path + self.is_compressed = decompressed.is_compressed + self.raw_filepath = decompressed.path - fileobj = path.open(mode, buffering=FILE_BUFFER_SIZE) # typing.IO[bytes] - fileobj.seek(0, os.SEEK_SET) - - magic = fileobj.read(len(BLENDFILE_MAGIC)) - if magic == BLENDFILE_MAGIC: - self.is_compressed = False - self.raw_filepath = path - return fileobj - - if magic[:2] == GZIP_MAGIC: - self.is_compressed = True - - log.debug("compressed blendfile detected: %s", path) - # Decompress to a temporary file. - tmpfile = tempfile.NamedTemporaryFile() - fileobj.seek(0, os.SEEK_SET) - with gzip.GzipFile(fileobj=fileobj, mode=mode) as gzfile: - magic = gzfile.read(len(BLENDFILE_MAGIC)) - if magic != BLENDFILE_MAGIC: - raise exceptions.BlendFileError( - "Compressed file is not a blend file", path - ) - - data = magic - while data: - tmpfile.write(data) - data = gzfile.read(FILE_BUFFER_SIZE) - - # Further interaction should be done with the uncompressed file. - self.raw_filepath = pathlib.Path(tmpfile.name) - fileobj.close() - return tmpfile - - fileobj.close() - raise exceptions.BlendFileError("File is not a blend file", path) + return decompressed.fileobj def _load_blocks(self) -> None: """Read the blend file to load its DNA structure to memory.""" @@ -271,7 +236,7 @@ class BlendFile: log.debug("closing blend file %s after it was modified", self.raw_filepath) if self._is_modified and self.is_compressed: - log.debug("recompressing modified blend file %s", self.raw_filepath) + log.debug("GZip-recompressing modified blend file %s", self.raw_filepath) self.fileobj.seek(os.SEEK_SET, 0) with gzip.open(str(self.filepath), "wb") as gzfile: @@ -280,7 +245,7 @@ class BlendFile: if not data: break gzfile.write(data) - log.debug("compressing to %s finished", self.filepath) + log.debug("GZip-compression to %s finished", self.filepath) # Close the file object after recompressing, as it may be a temporary # file that'll disappear as soon as we close it. diff --git a/blender_asset_tracer/blendfile/magic_compression.py b/blender_asset_tracer/blendfile/magic_compression.py new file mode 100644 index 0000000..1cb06ae --- /dev/null +++ b/blender_asset_tracer/blendfile/magic_compression.py @@ -0,0 +1,169 @@ +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# ***** END GPL LICENCE BLOCK ***** +# +# (c) 2021, Blender Foundation + +import collections +import enum +import gzip +import logging +import os +import pathlib +import tempfile +import typing + +# Blender 3.0 replaces GZip with ZStandard compression. +# Since this is not a standard library package, be careful importing it and +# treat it as optional. +try: + import zstandard + + has_zstandard = True +except ImportError: + has_zstandard = False + +from . import exceptions + +# Magic numbers, see https://en.wikipedia.org/wiki/List_of_file_signatures +BLENDFILE_MAGIC = b"BLENDER" +GZIP_MAGIC = b"\x1f\x8b" + +# ZStandard has two magic numbers, the 2nd of which doesn't use the last nibble. +# See https://tools.ietf.org/id/draft-kucherawy-dispatch-zstd-00.html#rfc.section.2.1.1 +# and https://tools.ietf.org/id/draft-kucherawy-dispatch-zstd-00.html#rfc.section.2.3 +ZSTD_MAGIC = b"\x28\xB5\x2F\xFD" +ZSTD_MAGIC_SKIPPABLE = b"\x50\x2A\x4D\x18" +ZSTD_MAGIC_SKIPPABLE_MASK = b"\xF0\xFF\xFF\xFF" + +log = logging.getLogger(__name__) + + +# @dataclasses.dataclass +DecompressedFileInfo = collections.namedtuple( + "DecompressedFileInfo", "is_compressed path fileobj" +) +# is_compressed: bool +# path: pathlib.Path +# """The path of the decompressed file, or the input path if the file is not compressed.""" +# fileobj: BinaryIO + + +class Compression(enum.Enum): + UNRECOGNISED = -1 + NONE = 0 + GZIP = 1 + ZSTD = 2 + + +def open(path: pathlib.Path, mode: str, buffer_size: int) -> DecompressedFileInfo: + """Open the file, decompressing it into a temporary file if necesssary.""" + fileobj = path.open(mode, buffering=buffer_size) # typing.IO[bytes] + compression = _find_compression_type(fileobj) + + if compression == Compression.UNRECOGNISED: + fileobj.close() + raise exceptions.BlendFileError("File is not a blend file", path) + + if compression == Compression.NONE: + return DecompressedFileInfo( + is_compressed=False, + path=path, + fileobj=fileobj, + ) + + log.debug("%s-compressed blendfile detected: %s", compression.name, path) + + # Decompress to a temporary file. + tmpfile = tempfile.NamedTemporaryFile() + fileobj.seek(0, os.SEEK_SET) + + decompressor = _decompressor(fileobj, mode, compression) + + with decompressor as compressed_file: + magic = compressed_file.read(len(BLENDFILE_MAGIC)) + if magic != BLENDFILE_MAGIC: + raise exceptions.BlendFileError("Compressed file is not a blend file", path) + + data = magic + while data: + tmpfile.write(data) + data = compressed_file.read(buffer_size) + + # Further interaction should be done with the uncompressed file. + fileobj.close() + return DecompressedFileInfo( + is_compressed=True, + path=pathlib.Path(tmpfile.name), + fileobj=tmpfile, + ) + + +def _find_compression_type(fileobj: typing.IO[bytes]) -> Compression: + fileobj.seek(0, os.SEEK_SET) + + # This assumes that all magics are not longer than "BLENDER". + magic = fileobj.read(len(BLENDFILE_MAGIC)) + if _matches_magic(magic, BLENDFILE_MAGIC): + return Compression.NONE + + if _matches_magic(magic, GZIP_MAGIC): + return Compression.GZIP + + if _matches_magic(magic, ZSTD_MAGIC): + return Compression.ZSTD + if _matches_magic_masked(magic, ZSTD_MAGIC_SKIPPABLE, ZSTD_MAGIC_SKIPPABLE_MASK): + return Compression.ZSTD + + return Compression.UNRECOGNISED + + +def _matches_magic_masked(value: bytes, magic: bytes, mask: bytes) -> bool: + """Returns True only if value & mask == magic & mask (ignoring trailing bytes in value).""" + + assert len(magic) == len(mask) + + int_value = int.from_bytes(value[: len(magic)], "little") + int_magic = int.from_bytes(magic, "little") + int_mask = int.from_bytes(mask, "little") + + return int_value & int_mask == int_magic & int_mask + + +def _matches_magic(value: bytes, magic: bytes) -> bool: + """Returns True only if value == magic (ignoring trailing bytes in value).""" + + return value[: len(magic)] == magic + + +def _decompressor( + fileobj: typing.IO[bytes], mode: str, compression: Compression +) -> typing.IO[bytes]: + if compression == Compression.GZIP: + decompressor = gzip.GzipFile(fileobj=fileobj, mode=mode) + return typing.cast(typing.IO[bytes], decompressor) + + if compression == Compression.ZSTD: + if not has_zstandard: + # The required module was not loaded, raise an exception about this. + raise EnvironmentError( + "File is compressed with ZStandard, install the `zstandard` module to support this." + ) + dctx = zstandard.ZstdDecompressor() + return dctx.stream_reader(fileobj) + + raise ValueError("Unsupported compression type: %s" % compression) diff --git a/poetry.lock b/poetry.lock index d73bd98..99c5db5 100644 --- a/poetry.lock +++ b/poetry.lock @@ -64,20 +64,23 @@ testing = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "pytest-black (>=0.3 [[package]] name = "boto3" -version = "1.18.4" +version = "1.18.54" description = "The AWS SDK for Python" category = "main" optional = true python-versions = ">= 3.6" [package.dependencies] -botocore = ">=1.21.4,<1.22.0" +botocore = ">=1.21.54,<1.22.0" jmespath = ">=0.7.1,<1.0.0" s3transfer = ">=0.5.0,<0.6.0" +[package.extras] +crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] + [[package]] name = "botocore" -version = "1.21.4" +version = "1.21.54" description = "Low-level, data-driven core of boto 3." category = "main" optional = true @@ -99,9 +102,20 @@ category = "main" optional = false python-versions = "*" +[[package]] +name = "cffi" +version = "1.14.6" +description = "Foreign Function Interface for Python calling C code." +category = "main" +optional = true +python-versions = "*" + +[package.dependencies] +pycparser = "*" + [[package]] name = "charset-normalizer" -version = "2.0.3" +version = "2.0.6" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "main" optional = false @@ -120,18 +134,18 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "coverage" -version = "5.5" +version = "6.0" description = "Code coverage measurement for Python" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" +python-versions = ">=3.6" [package.extras] -toml = ["toml"] +toml = ["tomli"] [[package]] name = "distlib" -version = "0.3.2" +version = "0.3.3" description = "Distribution utilities" category = "dev" optional = false @@ -147,11 +161,15 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "filelock" -version = "3.0.12" +version = "3.3.0" description = "A platform independent file lock." category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.6" + +[package.extras] +docs = ["furo (>=2021.8.17b43)", "sphinx (>=4.1)", "sphinx-autodoc-typehints (>=1.12)"] +testing = ["covdefaults (>=1.2.0)", "coverage (>=4)", "pytest (>=4)", "pytest-cov", "pytest-timeout (>=1.4.2)"] [[package]] name = "flake8" @@ -204,7 +222,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "importlib-metadata" -version = "4.6.1" +version = "4.8.1" description = "Read metadata from Python packages" category = "dev" optional = false @@ -221,7 +239,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes [[package]] name = "jinja2" -version = "3.0.1" +version = "3.0.2" description = "A very fast and expressive template engine." category = "dev" optional = false @@ -285,7 +303,7 @@ python-versions = "*" [[package]] name = "more-itertools" -version = "8.8.0" +version = "8.10.0" description = "More routines for operating on iterables, beyond itertools" category = "dev" optional = false @@ -338,11 +356,15 @@ python-versions = "*" [[package]] name = "platformdirs" -version = "2.0.2" +version = "2.4.0" description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.6" + +[package.extras] +docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"] +test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] [[package]] name = "pluggy" @@ -382,6 +404,14 @@ category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +[[package]] +name = "pycparser" +version = "2.20" +description = "C parser in Python" +category = "main" +optional = true +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + [[package]] name = "pyflakes" version = "2.3.1" @@ -392,7 +422,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "pygments" -version = "2.9.0" +version = "2.10.0" description = "Pygments is a syntax highlighting package written in Python." category = "dev" optional = false @@ -466,7 +496,7 @@ six = ">=1.5" [[package]] name = "pytz" -version = "2021.1" +version = "2021.3" description = "World timezone definitions, modern and historical" category = "dev" optional = false @@ -705,7 +735,7 @@ python-versions = ">= 3.5" [[package]] name = "tox" -version = "3.24.0" +version = "3.24.4" description = "tox is a generic virtualenv management and test command line tool" category = "dev" optional = false @@ -736,7 +766,7 @@ python-versions = "*" [[package]] name = "types-requests" -version = "2.25.0" +version = "2.25.9" description = "Typing stubs for requests" category = "dev" optional = false @@ -744,7 +774,7 @@ python-versions = "*" [[package]] name = "typing-extensions" -version = "3.10.0.0" +version = "3.10.0.2" description = "Backported and Experimental Type Hints for Python 3.5+" category = "dev" optional = false @@ -752,7 +782,7 @@ python-versions = "*" [[package]] name = "urllib3" -version = "1.26.6" +version = "1.26.7" description = "HTTP library with thread-safe connection pooling, file post, and more." category = "main" optional = false @@ -765,7 +795,7 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "virtualenv" -version = "20.6.0" +version = "20.8.1" description = "Virtual Python Environment builder" category = "dev" optional = false @@ -781,18 +811,18 @@ six = ">=1.9.0,<2" [package.extras] docs = ["proselint (>=0.10.2)", "sphinx (>=3)", "sphinx-argparse (>=0.2.5)", "sphinx-rtd-theme (>=0.4.3)", "towncrier (>=19.9.0rc1)"] -testing = ["coverage (>=4)", "coverage-enable-subprocess (>=1)", "flaky (>=3)", "pytest (>=4)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.1)", "pytest-mock (>=2)", "pytest-randomly (>=1)", "pytest-timeout (>=1)", "packaging (>=20.0)", "xonsh (>=0.9.16)"] +testing = ["coverage (>=4)", "coverage-enable-subprocess (>=1)", "flaky (>=3)", "pytest (>=4)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.1)", "pytest-mock (>=2)", "pytest-randomly (>=1)", "pytest-timeout (>=1)", "packaging (>=20.0)"] [[package]] name = "watchdog" -version = "2.1.3" +version = "2.1.6" description = "Filesystem events monitoring" category = "dev" optional = false python-versions = ">=3.6" [package.extras] -watchmedo = ["PyYAML (>=3.10)", "argh (>=0.24.1)"] +watchmedo = ["PyYAML (>=3.10)"] [[package]] name = "wcwidth" @@ -804,7 +834,7 @@ python-versions = "*" [[package]] name = "zipp" -version = "3.5.0" +version = "3.6.0" description = "Backport of pathlib-compatible object wrapper for zip files" category = "dev" optional = false @@ -814,13 +844,28 @@ python-versions = ">=3.6" docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] +[[package]] +name = "zstandard" +version = "0.15.2" +description = "Zstandard bindings for Python" +category = "main" +optional = true +python-versions = ">=3.5" + +[package.dependencies] +cffi = {version = ">=1.11", markers = "platform_python_implementation == \"PyPy\""} + +[package.extras] +cffi = ["cffi (>=1.11)"] + [extras] s3 = ["boto3"] +zstandard = ["zstandard"] [metadata] lock-version = "1.1" python-versions = "^3.7" -content-hash = "04a2a4dc4cb762b1d3732dbde23d7e499b42b1bcee3dd8566e395237541135b0" +content-hash = "752af7e3e64005a9867d6eef5b8d2ee6e767935907c453e5513b1fe00829e0c6" [metadata.files] alabaster = [ @@ -848,90 +893,120 @@ babel = [ {file = "backports.entry_points_selectable-1.1.0.tar.gz", hash = "sha256:988468260ec1c196dab6ae1149260e2f5472c9110334e5d51adcb77867361f6a"}, ] boto3 = [ - {file = "boto3-1.18.4-py3-none-any.whl", hash = "sha256:649ed1ca205f5ee0b0328d54580780aebc1a7a05681a24f6ee05253007ca48d8"}, - {file = "boto3-1.18.4.tar.gz", hash = "sha256:7079b40bd6621c54a0385a8fc11240cff4318a4d487292653e393e18254f5d94"}, + {file = "boto3-1.18.54-py3-none-any.whl", hash = "sha256:f22a77098cd70ddf848df6981ec57b92178e9d8eb74637edbdf4173bfa9279fa"}, + {file = "boto3-1.18.54.tar.gz", hash = "sha256:2d81dc484020059fc738165984304107d4db1c6774b6310d08c892a1751f6980"}, ] botocore = [ - {file = "botocore-1.21.4-py3-none-any.whl", hash = "sha256:dca7f283d4e7a1c9f456f5a23e55725ffc1b7d34abd089eb2c7651359aebd977"}, - {file = "botocore-1.21.4.tar.gz", hash = "sha256:317d441c8f3f03591761e3478de6ab34b22b333038d819bc24f2e74b64f22201"}, + {file = "botocore-1.21.54-py3-none-any.whl", hash = "sha256:56b74a5186bec835baf580b2d062ea1738d3ff5a573653d41b3ad1598a5b77c4"}, + {file = "botocore-1.21.54.tar.gz", hash = "sha256:46127b3a385d0ec73d1994b8958b23b79e0613e12c486371a100df992b72a1b9"}, ] certifi = [ {file = "certifi-2021.5.30-py2.py3-none-any.whl", hash = "sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8"}, {file = "certifi-2021.5.30.tar.gz", hash = "sha256:2bbf76fd432960138b3ef6dda3dde0544f27cbf8546c458e60baf371917ba9ee"}, ] +cffi = [ + {file = "cffi-1.14.6-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:22b9c3c320171c108e903d61a3723b51e37aaa8c81255b5e7ce102775bd01e2c"}, + {file = "cffi-1.14.6-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:f0c5d1acbfca6ebdd6b1e3eded8d261affb6ddcf2186205518f1428b8569bb99"}, + {file = "cffi-1.14.6-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:99f27fefe34c37ba9875f224a8f36e31d744d8083e00f520f133cab79ad5e819"}, + {file = "cffi-1.14.6-cp27-cp27m-win32.whl", hash = "sha256:55af55e32ae468e9946f741a5d51f9896da6b9bf0bbdd326843fec05c730eb20"}, + {file = "cffi-1.14.6-cp27-cp27m-win_amd64.whl", hash = "sha256:7bcac9a2b4fdbed2c16fa5681356d7121ecabf041f18d97ed5b8e0dd38a80224"}, + {file = "cffi-1.14.6-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:ed38b924ce794e505647f7c331b22a693bee1538fdf46b0222c4717b42f744e7"}, + {file = "cffi-1.14.6-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e22dcb48709fc51a7b58a927391b23ab37eb3737a98ac4338e2448bef8559b33"}, + {file = "cffi-1.14.6-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:aedb15f0a5a5949ecb129a82b72b19df97bbbca024081ed2ef88bd5c0a610534"}, + {file = "cffi-1.14.6-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:48916e459c54c4a70e52745639f1db524542140433599e13911b2f329834276a"}, + {file = "cffi-1.14.6-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:f627688813d0a4140153ff532537fbe4afea5a3dffce1f9deb7f91f848a832b5"}, + {file = "cffi-1.14.6-cp35-cp35m-win32.whl", hash = "sha256:f0010c6f9d1a4011e429109fda55a225921e3206e7f62a0c22a35344bfd13cca"}, + {file = "cffi-1.14.6-cp35-cp35m-win_amd64.whl", hash = "sha256:57e555a9feb4a8460415f1aac331a2dc833b1115284f7ded7278b54afc5bd218"}, + {file = "cffi-1.14.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e8c6a99be100371dbb046880e7a282152aa5d6127ae01783e37662ef73850d8f"}, + {file = "cffi-1.14.6-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:19ca0dbdeda3b2615421d54bef8985f72af6e0c47082a8d26122adac81a95872"}, + {file = "cffi-1.14.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d950695ae4381ecd856bcaf2b1e866720e4ab9a1498cba61c602e56630ca7195"}, + {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9dc245e3ac69c92ee4c167fbdd7428ec1956d4e754223124991ef29eb57a09d"}, + {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8661b2ce9694ca01c529bfa204dbb144b275a31685a075ce123f12331be790b"}, + {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b315d709717a99f4b27b59b021e6207c64620790ca3e0bde636a6c7f14618abb"}, + {file = "cffi-1.14.6-cp36-cp36m-win32.whl", hash = "sha256:80b06212075346b5546b0417b9f2bf467fea3bfe7352f781ffc05a8ab24ba14a"}, + {file = "cffi-1.14.6-cp36-cp36m-win_amd64.whl", hash = "sha256:a9da7010cec5a12193d1af9872a00888f396aba3dc79186604a09ea3ee7c029e"}, + {file = "cffi-1.14.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4373612d59c404baeb7cbd788a18b2b2a8331abcc84c3ba40051fcd18b17a4d5"}, + {file = "cffi-1.14.6-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:f10afb1004f102c7868ebfe91c28f4a712227fe4cb24974350ace1f90e1febbf"}, + {file = "cffi-1.14.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:fd4305f86f53dfd8cd3522269ed7fc34856a8ee3709a5e28b2836b2db9d4cd69"}, + {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d6169cb3c6c2ad50db5b868db6491a790300ade1ed5d1da29289d73bbe40b56"}, + {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d4b68e216fc65e9fe4f524c177b54964af043dde734807586cf5435af84045c"}, + {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33791e8a2dc2953f28b8d8d300dde42dd929ac28f974c4b4c6272cb2955cb762"}, + {file = "cffi-1.14.6-cp37-cp37m-win32.whl", hash = "sha256:0c0591bee64e438883b0c92a7bed78f6290d40bf02e54c5bf0978eaf36061771"}, + {file = "cffi-1.14.6-cp37-cp37m-win_amd64.whl", hash = "sha256:8eb687582ed7cd8c4bdbff3df6c0da443eb89c3c72e6e5dcdd9c81729712791a"}, + {file = "cffi-1.14.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba6f2b3f452e150945d58f4badd92310449876c4c954836cfb1803bdd7b422f0"}, + {file = "cffi-1.14.6-cp38-cp38-manylinux1_i686.whl", hash = "sha256:64fda793737bc4037521d4899be780534b9aea552eb673b9833b01f945904c2e"}, + {file = "cffi-1.14.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:9f3e33c28cd39d1b655ed1ba7247133b6f7fc16fa16887b120c0c670e35ce346"}, + {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26bb2549b72708c833f5abe62b756176022a7b9a7f689b571e74c8478ead51dc"}, + {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb687a11f0a7a1839719edd80f41e459cc5366857ecbed383ff376c4e3cc6afd"}, + {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d2ad4d668a5c0645d281dcd17aff2be3212bc109b33814bbb15c4939f44181cc"}, + {file = "cffi-1.14.6-cp38-cp38-win32.whl", hash = "sha256:487d63e1454627c8e47dd230025780e91869cfba4c753a74fda196a1f6ad6548"}, + {file = "cffi-1.14.6-cp38-cp38-win_amd64.whl", hash = "sha256:c33d18eb6e6bc36f09d793c0dc58b0211fccc6ae5149b808da4a62660678b156"}, + {file = "cffi-1.14.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:06c54a68935738d206570b20da5ef2b6b6d92b38ef3ec45c5422c0ebaf338d4d"}, + {file = "cffi-1.14.6-cp39-cp39-manylinux1_i686.whl", hash = "sha256:f174135f5609428cc6e1b9090f9268f5c8935fddb1b25ccb8255a2d50de6789e"}, + {file = "cffi-1.14.6-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f3ebe6e73c319340830a9b2825d32eb6d8475c1dac020b4f0aa774ee3b898d1c"}, + {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c8d896becff2fa653dc4438b54a5a25a971d1f4110b32bd3068db3722c80202"}, + {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4922cd707b25e623b902c86188aca466d3620892db76c0bdd7b99a3d5e61d35f"}, + {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c9e005e9bd57bc987764c32a1bee4364c44fdc11a3cc20a40b93b444984f2b87"}, + {file = "cffi-1.14.6-cp39-cp39-win32.whl", hash = "sha256:eb9e2a346c5238a30a746893f23a9535e700f8192a68c07c0258e7ece6ff3728"}, + {file = "cffi-1.14.6-cp39-cp39-win_amd64.whl", hash = "sha256:818014c754cd3dba7229c0f5884396264d51ffb87ec86e927ef0be140bfdb0d2"}, + {file = "cffi-1.14.6.tar.gz", hash = "sha256:c9a875ce9d7fe32887784274dd533c57909b7b1dcadcc128a2ac21331a9765dd"}, +] charset-normalizer = [ - {file = "charset-normalizer-2.0.3.tar.gz", hash = "sha256:c46c3ace2d744cfbdebceaa3c19ae691f53ae621b39fd7570f59d14fb7f2fd12"}, - {file = "charset_normalizer-2.0.3-py3-none-any.whl", hash = "sha256:88fce3fa5b1a84fdcb3f603d889f723d1dd89b26059d0123ca435570e848d5e1"}, + {file = "charset-normalizer-2.0.6.tar.gz", hash = "sha256:5ec46d183433dcbd0ab716f2d7f29d8dee50505b3fdb40c6b985c7c4f5a3591f"}, + {file = "charset_normalizer-2.0.6-py3-none-any.whl", hash = "sha256:5d209c0a931f215cee683b6445e2d77677e7e75e159f78def0db09d68fafcaa6"}, ] colorama = [ {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, ] coverage = [ - {file = "coverage-5.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:b6d534e4b2ab35c9f93f46229363e17f63c53ad01330df9f2d6bd1187e5eaacf"}, - {file = "coverage-5.5-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:b7895207b4c843c76a25ab8c1e866261bcfe27bfaa20c192de5190121770672b"}, - {file = "coverage-5.5-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:c2723d347ab06e7ddad1a58b2a821218239249a9e4365eaff6649d31180c1669"}, - {file = "coverage-5.5-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:900fbf7759501bc7807fd6638c947d7a831fc9fdf742dc10f02956ff7220fa90"}, - {file = "coverage-5.5-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:004d1880bed2d97151facef49f08e255a20ceb6f9432df75f4eef018fdd5a78c"}, - {file = "coverage-5.5-cp27-cp27m-win32.whl", hash = "sha256:06191eb60f8d8a5bc046f3799f8a07a2d7aefb9504b0209aff0b47298333302a"}, - {file = "coverage-5.5-cp27-cp27m-win_amd64.whl", hash = "sha256:7501140f755b725495941b43347ba8a2777407fc7f250d4f5a7d2a1050ba8e82"}, - {file = "coverage-5.5-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:372da284cfd642d8e08ef606917846fa2ee350f64994bebfbd3afb0040436905"}, - {file = "coverage-5.5-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:8963a499849a1fc54b35b1c9f162f4108017b2e6db2c46c1bed93a72262ed083"}, - {file = "coverage-5.5-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:869a64f53488f40fa5b5b9dcb9e9b2962a66a87dab37790f3fcfb5144b996ef5"}, - {file = "coverage-5.5-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:4a7697d8cb0f27399b0e393c0b90f0f1e40c82023ea4d45d22bce7032a5d7b81"}, - {file = "coverage-5.5-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:8d0a0725ad7c1a0bcd8d1b437e191107d457e2ec1084b9f190630a4fb1af78e6"}, - {file = "coverage-5.5-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:51cb9476a3987c8967ebab3f0fe144819781fca264f57f89760037a2ea191cb0"}, - {file = "coverage-5.5-cp310-cp310-win_amd64.whl", hash = "sha256:c0891a6a97b09c1f3e073a890514d5012eb256845c451bd48f7968ef939bf4ae"}, - {file = "coverage-5.5-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:3487286bc29a5aa4b93a072e9592f22254291ce96a9fbc5251f566b6b7343cdb"}, - {file = "coverage-5.5-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:deee1077aae10d8fa88cb02c845cfba9b62c55e1183f52f6ae6a2df6a2187160"}, - {file = "coverage-5.5-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:f11642dddbb0253cc8853254301b51390ba0081750a8ac03f20ea8103f0c56b6"}, - {file = "coverage-5.5-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:6c90e11318f0d3c436a42409f2749ee1a115cd8b067d7f14c148f1ce5574d701"}, - {file = "coverage-5.5-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:30c77c1dc9f253283e34c27935fded5015f7d1abe83bc7821680ac444eaf7793"}, - {file = "coverage-5.5-cp35-cp35m-win32.whl", hash = "sha256:9a1ef3b66e38ef8618ce5fdc7bea3d9f45f3624e2a66295eea5e57966c85909e"}, - {file = "coverage-5.5-cp35-cp35m-win_amd64.whl", hash = "sha256:972c85d205b51e30e59525694670de6a8a89691186012535f9d7dbaa230e42c3"}, - {file = "coverage-5.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:af0e781009aaf59e25c5a678122391cb0f345ac0ec272c7961dc5455e1c40066"}, - {file = "coverage-5.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:74d881fc777ebb11c63736622b60cb9e4aee5cace591ce274fb69e582a12a61a"}, - {file = "coverage-5.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:92b017ce34b68a7d67bd6d117e6d443a9bf63a2ecf8567bb3d8c6c7bc5014465"}, - {file = "coverage-5.5-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:d636598c8305e1f90b439dbf4f66437de4a5e3c31fdf47ad29542478c8508bbb"}, - {file = "coverage-5.5-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:41179b8a845742d1eb60449bdb2992196e211341818565abded11cfa90efb821"}, - {file = "coverage-5.5-cp36-cp36m-win32.whl", hash = "sha256:040af6c32813fa3eae5305d53f18875bedd079960822ef8ec067a66dd8afcd45"}, - {file = "coverage-5.5-cp36-cp36m-win_amd64.whl", hash = "sha256:5fec2d43a2cc6965edc0bb9e83e1e4b557f76f843a77a2496cbe719583ce8184"}, - {file = "coverage-5.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:18ba8bbede96a2c3dde7b868de9dcbd55670690af0988713f0603f037848418a"}, - {file = "coverage-5.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:2910f4d36a6a9b4214bb7038d537f015346f413a975d57ca6b43bf23d6563b53"}, - {file = "coverage-5.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:f0b278ce10936db1a37e6954e15a3730bea96a0997c26d7fee88e6c396c2086d"}, - {file = "coverage-5.5-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:796c9c3c79747146ebd278dbe1e5c5c05dd6b10cc3bcb8389dfdf844f3ead638"}, - {file = "coverage-5.5-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:53194af30d5bad77fcba80e23a1441c71abfb3e01192034f8246e0d8f99528f3"}, - {file = "coverage-5.5-cp37-cp37m-win32.whl", hash = "sha256:184a47bbe0aa6400ed2d41d8e9ed868b8205046518c52464fde713ea06e3a74a"}, - {file = "coverage-5.5-cp37-cp37m-win_amd64.whl", hash = "sha256:2949cad1c5208b8298d5686d5a85b66aae46d73eec2c3e08c817dd3513e5848a"}, - {file = "coverage-5.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:217658ec7187497e3f3ebd901afdca1af062b42cfe3e0dafea4cced3983739f6"}, - {file = "coverage-5.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1aa846f56c3d49205c952d8318e76ccc2ae23303351d9270ab220004c580cfe2"}, - {file = "coverage-5.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:24d4a7de75446be83244eabbff746d66b9240ae020ced65d060815fac3423759"}, - {file = "coverage-5.5-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d1f8bf7b90ba55699b3a5e44930e93ff0189aa27186e96071fac7dd0d06a1873"}, - {file = "coverage-5.5-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:970284a88b99673ccb2e4e334cfb38a10aab7cd44f7457564d11898a74b62d0a"}, - {file = "coverage-5.5-cp38-cp38-win32.whl", hash = "sha256:01d84219b5cdbfc8122223b39a954820929497a1cb1422824bb86b07b74594b6"}, - {file = "coverage-5.5-cp38-cp38-win_amd64.whl", hash = "sha256:2e0d881ad471768bf6e6c2bf905d183543f10098e3b3640fc029509530091502"}, - {file = "coverage-5.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d1f9ce122f83b2305592c11d64f181b87153fc2c2bbd3bb4a3dde8303cfb1a6b"}, - {file = "coverage-5.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:13c4ee887eca0f4c5a247b75398d4114c37882658300e153113dafb1d76de529"}, - {file = "coverage-5.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:52596d3d0e8bdf3af43db3e9ba8dcdaac724ba7b5ca3f6358529d56f7a166f8b"}, - {file = "coverage-5.5-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:2cafbbb3af0733db200c9b5f798d18953b1a304d3f86a938367de1567f4b5bff"}, - {file = "coverage-5.5-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:44d654437b8ddd9eee7d1eaee28b7219bec228520ff809af170488fd2fed3e2b"}, - {file = "coverage-5.5-cp39-cp39-win32.whl", hash = "sha256:d314ed732c25d29775e84a960c3c60808b682c08d86602ec2c3008e1202e3bb6"}, - {file = "coverage-5.5-cp39-cp39-win_amd64.whl", hash = "sha256:13034c4409db851670bc9acd836243aeee299949bd5673e11844befcb0149f03"}, - {file = "coverage-5.5-pp36-none-any.whl", hash = "sha256:f030f8873312a16414c0d8e1a1ddff2d3235655a2174e3648b4fa66b3f2f1079"}, - {file = "coverage-5.5-pp37-none-any.whl", hash = "sha256:2a3859cb82dcbda1cfd3e6f71c27081d18aa251d20a17d87d26d4cd216fb0af4"}, - {file = "coverage-5.5.tar.gz", hash = "sha256:ebe78fe9a0e874362175b02371bdfbee64d8edc42a044253ddf4ee7d3c15212c"}, + {file = "coverage-6.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:3dfb23cc180b674a11a559183dff9655beb9da03088f3fe3c4f3a6d200c86f05"}, + {file = "coverage-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5dd5ae0a9cd55d71f1335c331e9625382239b8cede818fb62d8d2702336dbf8"}, + {file = "coverage-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8426fec5ad5a6e8217921716b504e9b6e1166dc147e8443b4855e329db686282"}, + {file = "coverage-6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:aa5d4d43fa18cc9d0c6e02a83de0b9729b5451a9066574bd276481474f0a53ab"}, + {file = "coverage-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b78dd3eeb8f5ff26d2113c41836bac04a9ea91be54c346826b54a373133c8c53"}, + {file = "coverage-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:581fddd2f883379bd5af51da9233e0396b6519f3d3eeae4fb88867473be6d56e"}, + {file = "coverage-6.0-cp310-cp310-win32.whl", hash = "sha256:43bada49697a62ffa0283c7f01bbc76aac562c37d4bb6c45d56dd008d841194e"}, + {file = "coverage-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:fa816e97cfe1f691423078dffa39a18106c176f28008db017b3ce3e947c34aa5"}, + {file = "coverage-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:5c191e01b23e760338f19d8ba2470c0dad44c8b45e41ac043b2db84efc62f695"}, + {file = "coverage-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:274a612f67f931307706b60700f1e4cf80e1d79dff6c282fc9301e4565e78724"}, + {file = "coverage-6.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a9dbfcbc56d8de5580483cf2caff6a59c64d3e88836cbe5fb5c20c05c29a8808"}, + {file = "coverage-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e63490e8a6675cee7a71393ee074586f7eeaf0e9341afd006c5d6f7eec7c16d7"}, + {file = "coverage-6.0-cp36-cp36m-win32.whl", hash = "sha256:72f8c99f1527c5a8ee77c890ea810e26b39fd0b4c2dffc062e20a05b2cca60ef"}, + {file = "coverage-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:88f1810eb942e7063d051d87aaaa113eb5fd5a7fd2cda03a972de57695b8bb1a"}, + {file = "coverage-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:befb5ffa9faabef6dadc42622c73de168001425258f0b7e402a2934574e7a04b"}, + {file = "coverage-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7dbda34e8e26bd86606ba8a9c13ccb114802e01758a3d0a75652ffc59a573220"}, + {file = "coverage-6.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b4ee5815c776dfa3958ba71c7cd4cdd8eb40d79358a18352feb19562fe4408c4"}, + {file = "coverage-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d82cbef1220703ce56822be7fbddb40736fc1a928ac893472df8aff7421ae0aa"}, + {file = "coverage-6.0-cp37-cp37m-win32.whl", hash = "sha256:d795a2c92fe8cb31f6e9cd627ee4f39b64eb66bf47d89d8fcf7cb3d17031c887"}, + {file = "coverage-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:6e216e4021c934246c308fd3e0d739d9fa8a3f4ea414f584ab90ef9c1592f282"}, + {file = "coverage-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8305e14112efb74d0b5fec4df6e41cafde615c2392a7e51c84013cafe945842c"}, + {file = "coverage-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4865dc4a7a566147cbdc2b2f033a6cccc99a7dcc89995137765c384f6c73110b"}, + {file = "coverage-6.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:25df2bc53a954ba2ccf230fa274d1de341f6aa633d857d75e5731365f7181749"}, + {file = "coverage-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:08fd55d2e00dac4c18a2fa26281076035ec86e764acdc198b9185ce749ada58f"}, + {file = "coverage-6.0-cp38-cp38-win32.whl", hash = "sha256:11ce082eb0f7c2bbfe96f6c8bcc3a339daac57de4dc0f3186069ec5c58da911c"}, + {file = "coverage-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:7844a8c6a0fee401edbf578713c2473e020759267c40261b294036f9d3eb6a2d"}, + {file = "coverage-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bea681309bdd88dd1283a8ba834632c43da376d9bce05820826090aad80c0126"}, + {file = "coverage-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e735ab8547d8a1fe8e58dd765d6f27ac539b395f52160d767b7189f379f9be7a"}, + {file = "coverage-6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:7593a49300489d064ebb6c58539f52cbbc4a2e6a4385de5e92cae1563f88a425"}, + {file = "coverage-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:adb0f4c3c8ba8104378518a1954cbf3d891a22c13fd0e0bf135391835f44f288"}, + {file = "coverage-6.0-cp39-cp39-win32.whl", hash = "sha256:8da0c4a26a831b392deaba5fdd0cd7838d173b47ce2ec3d0f37be630cb09ef6e"}, + {file = "coverage-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:7af2f8e7bb54ace984de790e897f858e88068d8fbc46c9490b7c19c59cf51822"}, + {file = "coverage-6.0-pp36-none-any.whl", hash = "sha256:82b58d37c47d93a171be9b5744bcc96a0012cbf53d5622b29a49e6be2097edd7"}, + {file = "coverage-6.0-pp37-none-any.whl", hash = "sha256:fff04bfefb879edcf616f1ce5ea6f4a693b5976bdc5e163f8464f349c25b59f0"}, + {file = "coverage-6.0.tar.gz", hash = "sha256:17983f6ccc47f4864fd16d20ff677782b23d1207bf222d10e4d676e4636b0872"}, ] distlib = [ - {file = "distlib-0.3.2-py2.py3-none-any.whl", hash = "sha256:23e223426b28491b1ced97dc3bbe183027419dfc7982b4fa2f05d5f3ff10711c"}, - {file = "distlib-0.3.2.zip", hash = "sha256:106fef6dc37dd8c0e2c0a60d3fca3e77460a48907f335fa28420463a6f799736"}, + {file = "distlib-0.3.3-py2.py3-none-any.whl", hash = "sha256:c8b54e8454e5bf6237cc84c20e8264c3e991e824ef27e8f1e81049867d861e31"}, + {file = "distlib-0.3.3.zip", hash = "sha256:d982d0751ff6eaaab5e2ec8e691d949ee80eddf01a62eaa96ddb11531fe16b05"}, ] docutils = [ {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"}, {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"}, ] filelock = [ - {file = "filelock-3.0.12-py3-none-any.whl", hash = "sha256:929b7d63ec5b7d6b71b0fa5ac14e030b3f70b75747cef1b10da9b879fef15836"}, - {file = "filelock-3.0.12.tar.gz", hash = "sha256:18d82244ee114f543149c66a6e0c14e9c4f8a1044b5cdaadd0f82159d6a6ff59"}, + {file = "filelock-3.3.0-py3-none-any.whl", hash = "sha256:bbc6a0382fe8ec4744ecdf6683a2e07f65eb10ff1aff53fc02a202565446cde0"}, + {file = "filelock-3.3.0.tar.gz", hash = "sha256:8c7eab13dc442dc249e95158bcc12dec724465919bdc9831fdbf0660f03d1785"}, ] flake8 = [ {file = "flake8-3.9.2-py2.py3-none-any.whl", hash = "sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907"}, @@ -953,12 +1028,12 @@ imagesize = [ {file = "imagesize-1.2.0.tar.gz", hash = "sha256:b1f6b5a4eab1f73479a50fb79fcf729514a900c341d8503d62a62dbc4127a2b1"}, ] importlib-metadata = [ - {file = "importlib_metadata-4.6.1-py3-none-any.whl", hash = "sha256:9f55f560e116f8643ecf2922d9cd3e1c7e8d52e683178fecd9d08f6aa357e11e"}, - {file = "importlib_metadata-4.6.1.tar.gz", hash = "sha256:079ada16b7fc30dfbb5d13399a5113110dab1aa7c2bc62f66af75f0b717c8cac"}, + {file = "importlib_metadata-4.8.1-py3-none-any.whl", hash = "sha256:b618b6d2d5ffa2f16add5697cf57a46c76a56229b0ed1c438322e4e95645bd15"}, + {file = "importlib_metadata-4.8.1.tar.gz", hash = "sha256:f284b3e11256ad1e5d03ab86bb2ccd6f5339688ff17a4d797a0fe7df326f23b1"}, ] jinja2 = [ - {file = "Jinja2-3.0.1-py3-none-any.whl", hash = "sha256:1f06f2da51e7b56b8f238affdd6b4e2c61e39598a378cc49345bc1bd42a978a4"}, - {file = "Jinja2-3.0.1.tar.gz", hash = "sha256:703f484b47a6af502e743c9122595cc812b0271f661722403114f71a79d0f5a4"}, + {file = "Jinja2-3.0.2-py3-none-any.whl", hash = "sha256:8569982d3f0889eed11dd620c706d39b60c36d6d25843961f33f77fb6bc6b20c"}, + {file = "Jinja2-3.0.2.tar.gz", hash = "sha256:827a0e32839ab1600d4eb1c4c33ec5a8edfbc5cb42dafa13b81f182f97784b45"}, ] jmespath = [ {file = "jmespath-0.10.0-py2.py3-none-any.whl", hash = "sha256:cdf6525904cc597730141d61b36f2e4b8ecc257c420fa2f4549bac2c2d0cb72f"}, @@ -972,12 +1047,22 @@ mando = [ {file = "mando-0.6.4.tar.gz", hash = "sha256:79feb19dc0f097daa64a1243db578e7674909b75f88ac2220f1c065c10a0d960"}, ] markupsafe = [ + {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, @@ -986,14 +1071,21 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, @@ -1003,6 +1095,9 @@ markupsafe = [ {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, @@ -1012,8 +1107,8 @@ mccabe = [ {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, ] more-itertools = [ - {file = "more-itertools-8.8.0.tar.gz", hash = "sha256:83f0308e05477c68f56ea3a888172c78ed5d5b3c282addb67508e7ba6c8f813a"}, - {file = "more_itertools-8.8.0-py3-none-any.whl", hash = "sha256:2cf89ec599962f2ddc4d568a05defc40e0a587fbc10d5989713638864c36be4d"}, + {file = "more-itertools-8.10.0.tar.gz", hash = "sha256:1debcabeb1df793814859d64a81ad7cb10504c24349368ccf214c664c474f41f"}, + {file = "more_itertools-8.10.0-py3-none-any.whl", hash = "sha256:56ddac45541718ba332db05f464bebfb0768110111affd27f66e0051f276fa43"}, ] mypy = [ {file = "mypy-0.910-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:a155d80ea6cee511a3694b108c4494a39f42de11ee4e61e72bc424c490e46457"}, @@ -1052,8 +1147,8 @@ pathtools = [ {file = "pathtools-0.1.2.tar.gz", hash = "sha256:7c35c5421a39bb82e58018febd90e3b6e5db34c5443aaaf742b3f33d4655f1c0"}, ] platformdirs = [ - {file = "platformdirs-2.0.2-py2.py3-none-any.whl", hash = "sha256:0b9547541f599d3d242078ae60b927b3e453f0ad52f58b4d4bc3be86aed3ec41"}, - {file = "platformdirs-2.0.2.tar.gz", hash = "sha256:3b00d081227d9037bbbca521a5787796b5ef5000faea1e43fd76f1d44b06fcfa"}, + {file = "platformdirs-2.4.0-py3-none-any.whl", hash = "sha256:8868bbe3c3c80d42f20156f22e7131d2fb321f5bc86a2a345375c6481a67021d"}, + {file = "platformdirs-2.4.0.tar.gz", hash = "sha256:367a5e80b3d04d2428ffa76d33f124cf11e8fff2acdaa9b43d545f5c7d661ef2"}, ] pluggy = [ {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, @@ -1070,13 +1165,17 @@ pycodestyle = [ {file = "pycodestyle-2.7.0-py2.py3-none-any.whl", hash = "sha256:514f76d918fcc0b55c6680472f0a37970994e07bbb80725808c17089be302068"}, {file = "pycodestyle-2.7.0.tar.gz", hash = "sha256:c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef"}, ] +pycparser = [ + {file = "pycparser-2.20-py2.py3-none-any.whl", hash = "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"}, + {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"}, +] pyflakes = [ {file = "pyflakes-2.3.1-py2.py3-none-any.whl", hash = "sha256:7893783d01b8a89811dd72d7dfd4d84ff098e5eed95cfa8905b22bbffe52efc3"}, {file = "pyflakes-2.3.1.tar.gz", hash = "sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db"}, ] pygments = [ - {file = "Pygments-2.9.0-py3-none-any.whl", hash = "sha256:d66e804411278594d764fc69ec36ec13d9ae9147193a1740cd34d272ca383b8e"}, - {file = "Pygments-2.9.0.tar.gz", hash = "sha256:a18f47b506a429f6f4b9df81bb02beab9ca21d0a5fee38ed15aef65f0545519f"}, + {file = "Pygments-2.10.0-py3-none-any.whl", hash = "sha256:b8e67fe6af78f492b3c4b3e2970c0624cbf08beb1e493b2c99b9fa1b67a20380"}, + {file = "Pygments-2.10.0.tar.gz", hash = "sha256:f398865f7eb6874156579fdf36bc840a03cab64d1cde9e93d68f46a425ec52c6"}, ] pyparsing = [ {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, @@ -1098,8 +1197,8 @@ python-dateutil = [ {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, ] pytz = [ - {file = "pytz-2021.1-py2.py3-none-any.whl", hash = "sha256:eb10ce3e7736052ed3623d49975ce333bcd712c7bb19a58b9e2089d4057d0798"}, - {file = "pytz-2021.1.tar.gz", hash = "sha256:83a4a90894bf38e243cf052c8b58f381bfe9a7a483f6a9cab140bc7f702ac4da"}, + {file = "pytz-2021.3-py2.py3-none-any.whl", hash = "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c"}, + {file = "pytz-2021.3.tar.gz", hash = "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326"}, ] pyyaml = [ {file = "PyYAML-5.4.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922"}, @@ -1240,8 +1339,8 @@ tornado = [ {file = "tornado-6.1.tar.gz", hash = "sha256:33c6e81d7bd55b468d2e793517c909b139960b6c790a60b7991b9b6b76fb9791"}, ] tox = [ - {file = "tox-3.24.0-py2.py3-none-any.whl", hash = "sha256:c990028355f0d0b681e3db9baa89dd9f839a6e999c320029339f6a6b36160591"}, - {file = "tox-3.24.0.tar.gz", hash = "sha256:67636634df6569e450c4bc18fdfd8b84d7903b3902d5c65416eb6735f3d4afb8"}, + {file = "tox-3.24.4-py2.py3-none-any.whl", hash = "sha256:5e274227a53dc9ef856767c21867377ba395992549f02ce55eb549f9fb9a8d10"}, + {file = "tox-3.24.4.tar.gz", hash = "sha256:c30b57fa2477f1fb7c36aa1d83292d5c2336cd0018119e1b1c17340e2c2708ca"}, ] typed-ast = [ {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:2068531575a125b87a41802130fa7e29f26c09a2833fea68d9a40cf33902eba6"}, @@ -1276,50 +1375,102 @@ typed-ast = [ {file = "typed_ast-1.4.3.tar.gz", hash = "sha256:fb1bbeac803adea29cedd70781399c99138358c26d05fcbd23c13016b7f5ec65"}, ] types-requests = [ - {file = "types-requests-2.25.0.tar.gz", hash = "sha256:ee0d0c507210141b7d5b8639cc43eaa726084178775db2a5fb06fbf85c185808"}, - {file = "types_requests-2.25.0-py3-none-any.whl", hash = "sha256:fa5c1e5e832ff6193507d8da7e1159281383908ee193a2f4b37bc08140b51844"}, + {file = "types-requests-2.25.9.tar.gz", hash = "sha256:4ec8b71da73e5344adb9bee725a74ec8598e7286f9bcb17500d627f259fe4fb9"}, + {file = "types_requests-2.25.9-py3-none-any.whl", hash = "sha256:543ba8b3b23e38ac028da1d163aecbbc27d3cc8f654ae64339da539a191a2b1c"}, ] typing-extensions = [ - {file = "typing_extensions-3.10.0.0-py2-none-any.whl", hash = "sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497"}, - {file = "typing_extensions-3.10.0.0-py3-none-any.whl", hash = "sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84"}, - {file = "typing_extensions-3.10.0.0.tar.gz", hash = "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342"}, + {file = "typing_extensions-3.10.0.2-py2-none-any.whl", hash = "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7"}, + {file = "typing_extensions-3.10.0.2-py3-none-any.whl", hash = "sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34"}, + {file = "typing_extensions-3.10.0.2.tar.gz", hash = "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e"}, ] urllib3 = [ - {file = "urllib3-1.26.6-py2.py3-none-any.whl", hash = "sha256:39fb8672126159acb139a7718dd10806104dec1e2f0f6c88aab05d17df10c8d4"}, - {file = "urllib3-1.26.6.tar.gz", hash = "sha256:f57b4c16c62fa2760b7e3d97c35b255512fb6b59a259730f36ba32ce9f8e342f"}, + {file = "urllib3-1.26.7-py2.py3-none-any.whl", hash = "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844"}, + {file = "urllib3-1.26.7.tar.gz", hash = "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece"}, ] virtualenv = [ - {file = "virtualenv-20.6.0-py2.py3-none-any.whl", hash = "sha256:e4fc84337dce37ba34ef520bf2d4392b392999dbe47df992870dc23230f6b758"}, - {file = "virtualenv-20.6.0.tar.gz", hash = "sha256:51df5d8a2fad5d1b13e088ff38a433475768ff61f202356bb9812c454c20ae45"}, + {file = "virtualenv-20.8.1-py2.py3-none-any.whl", hash = "sha256:10062e34c204b5e4ec5f62e6ef2473f8ba76513a9a617e873f1f8fb4a519d300"}, + {file = "virtualenv-20.8.1.tar.gz", hash = "sha256:bcc17f0b3a29670dd777d6f0755a4c04f28815395bca279cdcb213b97199a6b8"}, ] watchdog = [ - {file = "watchdog-2.1.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9628f3f85375a17614a2ab5eac7665f7f7be8b6b0a2a228e6f6a2e91dd4bfe26"}, - {file = "watchdog-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:acc4e2d5be6f140f02ee8590e51c002829e2c33ee199036fcd61311d558d89f4"}, - {file = "watchdog-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:85b851237cf3533fabbc034ffcd84d0fa52014b3121454e5f8b86974b531560c"}, - {file = "watchdog-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a12539ecf2478a94e4ba4d13476bb2c7a2e0a2080af2bb37df84d88b1b01358a"}, - {file = "watchdog-2.1.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6fe9c8533e955c6589cfea6f3f0a1a95fb16867a211125236c82e1815932b5d7"}, - {file = "watchdog-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d9456f0433845e7153b102fffeb767bde2406b76042f2216838af3b21707894e"}, - {file = "watchdog-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fd8c595d5a93abd441ee7c5bb3ff0d7170e79031520d113d6f401d0cf49d7c8f"}, - {file = "watchdog-2.1.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0bcfe904c7d404eb6905f7106c54873503b442e8e918cc226e1828f498bdc0ca"}, - {file = "watchdog-2.1.3-pp36-pypy36_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bf84bd94cbaad8f6b9cbaeef43080920f4cb0e61ad90af7106b3de402f5fe127"}, - {file = "watchdog-2.1.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b8ddb2c9f92e0c686ea77341dcb58216fa5ff7d5f992c7278ee8a392a06e86bb"}, - {file = "watchdog-2.1.3-py3-none-manylinux2014_aarch64.whl", hash = "sha256:8805a5f468862daf1e4f4447b0ccf3acaff626eaa57fbb46d7960d1cf09f2e6d"}, - {file = "watchdog-2.1.3-py3-none-manylinux2014_armv7l.whl", hash = "sha256:3e305ea2757f81d8ebd8559d1a944ed83e3ab1bdf68bcf16ec851b97c08dc035"}, - {file = "watchdog-2.1.3-py3-none-manylinux2014_i686.whl", hash = "sha256:431a3ea70b20962e6dee65f0eeecd768cd3085ea613ccb9b53c8969de9f6ebd2"}, - {file = "watchdog-2.1.3-py3-none-manylinux2014_ppc64.whl", hash = "sha256:e4929ac2aaa2e4f1a30a36751160be391911da463a8799460340901517298b13"}, - {file = "watchdog-2.1.3-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:201cadf0b8c11922f54ec97482f95b2aafca429c4c3a4bb869a14f3c20c32686"}, - {file = "watchdog-2.1.3-py3-none-manylinux2014_s390x.whl", hash = "sha256:3a7d242a7963174684206093846537220ee37ba9986b824a326a8bb4ef329a33"}, - {file = "watchdog-2.1.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:54e057727dd18bd01a3060dbf5104eb5a495ca26316487e0f32a394fd5fe725a"}, - {file = "watchdog-2.1.3-py3-none-win32.whl", hash = "sha256:b5fc5c127bad6983eecf1ad117ab3418949f18af9c8758bd10158be3647298a9"}, - {file = "watchdog-2.1.3-py3-none-win_amd64.whl", hash = "sha256:44acad6f642996a2b50bb9ce4fb3730dde08f23e79e20cd3d8e2a2076b730381"}, - {file = "watchdog-2.1.3-py3-none-win_ia64.whl", hash = "sha256:0bcdf7b99b56a3ae069866c33d247c9994ffde91b620eaf0306b27e099bd1ae0"}, - {file = "watchdog-2.1.3.tar.gz", hash = "sha256:e5236a8e8602ab6db4b873664c2d356c365ab3cac96fbdec4970ad616415dd45"}, + {file = "watchdog-2.1.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9693f35162dc6208d10b10ddf0458cc09ad70c30ba689d9206e02cd836ce28a3"}, + {file = "watchdog-2.1.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:aba5c812f8ee8a3ff3be51887ca2d55fb8e268439ed44110d3846e4229eb0e8b"}, + {file = "watchdog-2.1.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4ae38bf8ba6f39d5b83f78661273216e7db5b00f08be7592062cb1fc8b8ba542"}, + {file = "watchdog-2.1.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ad6f1796e37db2223d2a3f302f586f74c72c630b48a9872c1e7ae8e92e0ab669"}, + {file = "watchdog-2.1.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:922a69fa533cb0c793b483becaaa0845f655151e7256ec73630a1b2e9ebcb660"}, + {file = "watchdog-2.1.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b2fcf9402fde2672545b139694284dc3b665fd1be660d73eca6805197ef776a3"}, + {file = "watchdog-2.1.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3386b367e950a11b0568062b70cc026c6f645428a698d33d39e013aaeda4cc04"}, + {file = "watchdog-2.1.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8f1c00aa35f504197561060ca4c21d3cc079ba29cf6dd2fe61024c70160c990b"}, + {file = "watchdog-2.1.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b52b88021b9541a60531142b0a451baca08d28b74a723d0c99b13c8c8d48d604"}, + {file = "watchdog-2.1.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8047da932432aa32c515ec1447ea79ce578d0559362ca3605f8e9568f844e3c6"}, + {file = "watchdog-2.1.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e92c2d33858c8f560671b448205a268096e17870dcf60a9bb3ac7bfbafb7f5f9"}, + {file = "watchdog-2.1.6-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b7d336912853d7b77f9b2c24eeed6a5065d0a0cc0d3b6a5a45ad6d1d05fb8cd8"}, + {file = "watchdog-2.1.6-py3-none-manylinux2014_aarch64.whl", hash = "sha256:cca7741c0fcc765568350cb139e92b7f9f3c9a08c4f32591d18ab0a6ac9e71b6"}, + {file = "watchdog-2.1.6-py3-none-manylinux2014_armv7l.whl", hash = "sha256:25fb5240b195d17de949588628fdf93032ebf163524ef08933db0ea1f99bd685"}, + {file = "watchdog-2.1.6-py3-none-manylinux2014_i686.whl", hash = "sha256:be9be735f827820a06340dff2ddea1fb7234561fa5e6300a62fe7f54d40546a0"}, + {file = "watchdog-2.1.6-py3-none-manylinux2014_ppc64.whl", hash = "sha256:d0d19fb2441947b58fbf91336638c2b9f4cc98e05e1045404d7a4cb7cddc7a65"}, + {file = "watchdog-2.1.6-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:3becdb380d8916c873ad512f1701f8a92ce79ec6978ffde92919fd18d41da7fb"}, + {file = "watchdog-2.1.6-py3-none-manylinux2014_s390x.whl", hash = "sha256:ae67501c95606072aafa865b6ed47343ac6484472a2f95490ba151f6347acfc2"}, + {file = "watchdog-2.1.6-py3-none-manylinux2014_x86_64.whl", hash = "sha256:e0f30db709c939cabf64a6dc5babb276e6d823fd84464ab916f9b9ba5623ca15"}, + {file = "watchdog-2.1.6-py3-none-win32.whl", hash = "sha256:e02794ac791662a5eafc6ffeaf9bcc149035a0e48eb0a9d40a8feb4622605a3d"}, + {file = "watchdog-2.1.6-py3-none-win_amd64.whl", hash = "sha256:bd9ba4f332cf57b2c1f698be0728c020399ef3040577cde2939f2e045b39c1e5"}, + {file = "watchdog-2.1.6-py3-none-win_ia64.whl", hash = "sha256:a0f1c7edf116a12f7245be06120b1852275f9506a7d90227648b250755a03923"}, + {file = "watchdog-2.1.6.tar.gz", hash = "sha256:a36e75df6c767cbf46f61a91c70b3ba71811dfa0aca4a324d9407a06a8b7a2e7"}, ] wcwidth = [ {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"}, ] zipp = [ - {file = "zipp-3.5.0-py3-none-any.whl", hash = "sha256:957cfda87797e389580cb8b9e3870841ca991e2125350677b2ca83a0e99390a3"}, - {file = "zipp-3.5.0.tar.gz", hash = "sha256:f5812b1e007e48cff63449a5e9f4e7ebea716b4111f9c4f9a645f91d579bf0c4"}, + {file = "zipp-3.6.0-py3-none-any.whl", hash = "sha256:9fe5ea21568a0a70e50f273397638d39b03353731e6cbbb3fd8502a33fec40bc"}, + {file = "zipp-3.6.0.tar.gz", hash = "sha256:71c644c5369f4a6e07636f0aa966270449561fcea2e3d6747b8d23efaa9d7832"}, +] +zstandard = [ + {file = "zstandard-0.15.2-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:7b16bd74ae7bfbaca407a127e11058b287a4267caad13bd41305a5e630472549"}, + {file = "zstandard-0.15.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:8baf7991547441458325ca8fafeae79ef1501cb4354022724f3edd62279c5b2b"}, + {file = "zstandard-0.15.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:5752f44795b943c99be367fee5edf3122a1690b0d1ecd1bd5ec94c7fd2c39c94"}, + {file = "zstandard-0.15.2-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:3547ff4eee7175d944a865bbdf5529b0969c253e8a148c287f0668fe4eb9c935"}, + {file = "zstandard-0.15.2-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:ac43c1821ba81e9344d818c5feed574a17f51fca27976ff7d022645c378fbbf5"}, + {file = "zstandard-0.15.2-cp35-cp35m-manylinux2014_i686.whl", hash = "sha256:1fb23b1754ce834a3a1a1e148cc2faad76eeadf9d889efe5e8199d3fb839d3c6"}, + {file = "zstandard-0.15.2-cp35-cp35m-manylinux2014_x86_64.whl", hash = "sha256:1faefe33e3d6870a4dce637bcb41f7abb46a1872a595ecc7b034016081c37543"}, + {file = "zstandard-0.15.2-cp35-cp35m-win32.whl", hash = "sha256:b7d3a484ace91ed827aa2ef3b44895e2ec106031012f14d28bd11a55f24fa734"}, + {file = "zstandard-0.15.2-cp35-cp35m-win_amd64.whl", hash = "sha256:ff5b75f94101beaa373f1511319580a010f6e03458ee51b1a386d7de5331440a"}, + {file = "zstandard-0.15.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c9e2dcb7f851f020232b991c226c5678dc07090256e929e45a89538d82f71d2e"}, + {file = "zstandard-0.15.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:4800ab8ec94cbf1ed09c2b4686288750cab0642cb4d6fba2a56db66b923aeb92"}, + {file = "zstandard-0.15.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:ec58e84d625553d191a23d5988a19c3ebfed519fff2a8b844223e3f074152163"}, + {file = "zstandard-0.15.2-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:bd3c478a4a574f412efc58ba7e09ab4cd83484c545746a01601636e87e3dbf23"}, + {file = "zstandard-0.15.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:6f5d0330bc992b1e267a1b69fbdbb5ebe8c3a6af107d67e14c7a5b1ede2c5945"}, + {file = "zstandard-0.15.2-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:b4963dad6cf28bfe0b61c3265d1c74a26a7605df3445bfcd3ba25de012330b2d"}, + {file = "zstandard-0.15.2-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:77d26452676f471223571efd73131fd4a626622c7960458aab2763e025836fc5"}, + {file = "zstandard-0.15.2-cp36-cp36m-win32.whl", hash = "sha256:6ffadd48e6fe85f27ca3ca10cfd3ef3d0f933bef7316870285ffeb58d791ca9c"}, + {file = "zstandard-0.15.2-cp36-cp36m-win_amd64.whl", hash = "sha256:92d49cc3b49372cfea2d42f43a2c16a98a32a6bc2f42abcde121132dbfc2f023"}, + {file = "zstandard-0.15.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:af5a011609206e390b44847da32463437505bf55fd8985e7a91c52d9da338d4b"}, + {file = "zstandard-0.15.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:31e35790434da54c106f05fa93ab4d0fab2798a6350e8a73928ec602e8505836"}, + {file = "zstandard-0.15.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:a4f8af277bb527fa3d56b216bda4da931b36b2d3fe416b6fc1744072b2c1dbd9"}, + {file = "zstandard-0.15.2-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:72a011678c654df8323aa7b687e3147749034fdbe994d346f139ab9702b59cea"}, + {file = "zstandard-0.15.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:5d53f02aeb8fdd48b88bc80bece82542d084fb1a7ba03bf241fd53b63aee4f22"}, + {file = "zstandard-0.15.2-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:f8bb00ced04a8feff05989996db47906673ed45b11d86ad5ce892b5741e5f9dd"}, + {file = "zstandard-0.15.2-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:7a88cc773ffe55992ff7259a8df5fb3570168d7138c69aadba40142d0e5ce39a"}, + {file = "zstandard-0.15.2-cp37-cp37m-win32.whl", hash = "sha256:1c5ef399f81204fbd9f0df3debf80389fd8aa9660fe1746d37c80b0d45f809e9"}, + {file = "zstandard-0.15.2-cp37-cp37m-win_amd64.whl", hash = "sha256:22f127ff5da052ffba73af146d7d61db874f5edb468b36c9cb0b857316a21b3d"}, + {file = "zstandard-0.15.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9867206093d7283d7de01bd2bf60389eb4d19b67306a0a763d1a8a4dbe2fb7c3"}, + {file = "zstandard-0.15.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f98fc5750aac2d63d482909184aac72a979bfd123b112ec53fd365104ea15b1c"}, + {file = "zstandard-0.15.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:3fe469a887f6142cc108e44c7f42c036e43620ebaf500747be2317c9f4615d4f"}, + {file = "zstandard-0.15.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:edde82ce3007a64e8434ccaf1b53271da4f255224d77b880b59e7d6d73df90c8"}, + {file = "zstandard-0.15.2-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:855d95ec78b6f0ff66e076d5461bf12d09d8e8f7e2b3fc9de7236d1464fd730e"}, + {file = "zstandard-0.15.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d25c8eeb4720da41e7afbc404891e3a945b8bb6d5230e4c53d23ac4f4f9fc52c"}, + {file = "zstandard-0.15.2-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:2353b61f249a5fc243aae3caa1207c80c7e6919a58b1f9992758fa496f61f839"}, + {file = "zstandard-0.15.2-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:6cc162b5b6e3c40b223163a9ea86cd332bd352ddadb5fd142fc0706e5e4eaaff"}, + {file = "zstandard-0.15.2-cp38-cp38-win32.whl", hash = "sha256:94d0de65e37f5677165725f1fc7fb1616b9542d42a9832a9a0bdcba0ed68b63b"}, + {file = "zstandard-0.15.2-cp38-cp38-win_amd64.whl", hash = "sha256:b0975748bb6ec55b6d0f6665313c2cf7af6f536221dccd5879b967d76f6e7899"}, + {file = "zstandard-0.15.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eda0719b29792f0fea04a853377cfff934660cb6cd72a0a0eeba7a1f0df4a16e"}, + {file = "zstandard-0.15.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8fb77dd152054c6685639d855693579a92f276b38b8003be5942de31d241ebfb"}, + {file = "zstandard-0.15.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:24cdcc6f297f7c978a40fb7706877ad33d8e28acc1786992a52199502d6da2a4"}, + {file = "zstandard-0.15.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:69b7a5720b8dfab9005a43c7ddb2e3ccacbb9a2442908ae4ed49dd51ab19698a"}, + {file = "zstandard-0.15.2-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:dc8c03d0c5c10c200441ffb4cce46d869d9e5c4ef007f55856751dc288a2dffd"}, + {file = "zstandard-0.15.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:3e1cd2db25117c5b7c7e86a17cde6104a93719a9df7cb099d7498e4c1d13ee5c"}, + {file = "zstandard-0.15.2-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:ab9f19460dfa4c5dd25431b75bee28b5f018bf43476858d64b1aa1046196a2a0"}, + {file = "zstandard-0.15.2-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:f36722144bc0a5068934e51dca5a38a5b4daac1be84f4423244277e4baf24e7a"}, + {file = "zstandard-0.15.2-cp39-cp39-win32.whl", hash = "sha256:378ac053c0cfc74d115cbb6ee181540f3e793c7cca8ed8cd3893e338af9e942c"}, + {file = "zstandard-0.15.2-cp39-cp39-win_amd64.whl", hash = "sha256:9ee3c992b93e26c2ae827404a626138588e30bdabaaf7aa3aa25082a4e718790"}, + {file = "zstandard-0.15.2.tar.gz", hash = "sha256:52de08355fd5cfb3ef4533891092bb96229d43c2069703d4aff04fdbedf9c92f"}, ] diff --git a/pyproject.toml b/pyproject.toml index 76090cc..66106eb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -19,6 +19,7 @@ classifiers = [ [tool.poetry.extras] s3 = ["boto3"] +zstandard = ["zstandard"] [tool.poetry.dependencies] python = "^3.7" @@ -27,6 +28,9 @@ requests = "^2.11" # For S3 storage support: boto3 = { version = "^1.9", optional = true } +# For Blender 3.0+ compressed file support. +zstandard = { version = "^0.15", optional = true } + [tool.poetry.dev-dependencies] mypy = ">=0.701" pytest = "^4.6" diff --git a/tests/blendfiles/basic_file_compressed_zstd.blend b/tests/blendfiles/basic_file_compressed_zstd.blend new file mode 100644 index 0000000000000000000000000000000000000000..6a16b7bdb71f941f82d2a22bc75e6c230a49e6ee GIT binary patch literal 94882 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 literal 0 HcmV?d00001 diff --git a/tests/test_blendfile_loading.py b/tests/test_blendfile_loading.py index 368f29c..00c1b96 100644 --- a/tests/test_blendfile_loading.py +++ b/tests/test_blendfile_loading.py @@ -3,7 +3,7 @@ import pathlib import tempfile from blender_asset_tracer import blendfile -from blender_asset_tracer.blendfile import iterators, exceptions +from blender_asset_tracer.blendfile import iterators, exceptions, magic_compression from tests.abstract_test import AbstractBlendFileTest @@ -279,7 +279,40 @@ class ArrayTest(AbstractBlendFileTest): self.assertEqual(name, tex.id_name) -class LoadCompressedTest(AbstractBlendFileTest): +class CompressionRecognitionTest(AbstractBlendFileTest): + def _find_compression_type(self, filename: str) -> magic_compression.Compression: + path = self.blendfiles / filename + with path.open("rb") as fileobj: + return magic_compression._find_compression_type(fileobj) + + def test_gzip_recognition(self): + comp = self._find_compression_type("basic_file_compressed.blend") + self.assertEqual(magic_compression.Compression.GZIP, comp) + + def test_zstd_recognition(self): + comp = self._find_compression_type("basic_file_compressed_zstd.blend") + self.assertEqual(magic_compression.Compression.ZSTD, comp) + + def test_uncompressed_recognition(self): + comp = self._find_compression_type("basic_file.blend") + self.assertEqual(magic_compression.Compression.NONE, comp) + + def test_unrecognition(self): + comp = self._find_compression_type("clothsim.abc") + self.assertEqual(magic_compression.Compression.UNRECOGNISED, comp) + + def test_matches_magic_masked(self): + mmm = magic_compression._matches_magic_masked + self.assertTrue(mmm(b"ABCD", b"ABCD", b"\xFF\xFF\xFF\xFF")) + self.assertTrue(mmm(b"AB!D", b"ABCD", b"\xFF\xFF\x00\xFF")) + self.assertTrue(mmm(b"ABcD", b"ABCD", b"\xFF\xFF\xDF\xFF")) + + self.assertFalse(mmm(b"ABCd", b"ABCD", b"\xFF\xFF\xFF\xFF")) + self.assertFalse(mmm(b"AB!D", b"ABCD", b"\xFF\xFF\xF0\xFF")) + self.assertFalse(mmm(b"ABdD", b"ABCD", b"\xFF\xFF\xDF\xFF")) + + +class LoadGZipCompressedTest(AbstractBlendFileTest): def test_loading(self): self.bf = blendfile.BlendFile(self.blendfiles / "basic_file_compressed.blend") self.assertTrue(self.bf.is_compressed) @@ -298,6 +331,27 @@ class LoadCompressedTest(AbstractBlendFileTest): self.assertFalse(raw_filepath.exists()) +class LoadZStdCompressedTest(AbstractBlendFileTest): + def test_loading(self): + zstd_bfile_path = self.blendfiles / "basic_file_compressed_zstd.blend" + self.bf = blendfile.BlendFile(zstd_bfile_path) + self.assertTrue(self.bf.is_compressed) + + ob = self.bf.code_index[b"OB"][0] + name = ob.get((b"id", b"name"), as_str=True) + self.assertEqual("OBümlaut", name) + + def test_as_context(self): + zstd_bfile_path = self.blendfiles / "basic_file_compressed_zstd.blend" + with blendfile.BlendFile(zstd_bfile_path) as bf: + filepath = bf.filepath + raw_filepath = bf.raw_filepath + + self.assertTrue(bf.fileobj.closed) + self.assertTrue(filepath.exists()) + self.assertFalse(raw_filepath.exists()) + + class LoadNonBlendfileTest(AbstractBlendFileTest): def test_loading(self): with self.assertRaises(exceptions.BlendFileError): diff --git a/tox.ini b/tox.ini index 0c9a329..c54b687 100644 --- a/tox.ini +++ b/tox.ini @@ -5,5 +5,5 @@ envlist = py37, py38, py39 [testenv] whitelist_externals = poetry commands= - poetry install + poetry install -E zstandard poetry run py.test --no-cov