Python wrapper for the C-Blosc2 library.
Project description
A Python wrapper for the extremely fast Blosc2 compression library
- Author:
The Blosc development team
- Contact:
- Github:
- PyPi:
- Gitter:
- Code of Conduct:
What it is
Blosc (https://blosc.org) is a high performance compressor optimized for binary data. It has been designed to transmit data to the processor cache faster than the traditional, non-compressed, direct memory fetch approach via a memcpy() OS call.
Blosc works well for compressing numerical arrays that contains data with relatively low entropy, like sparse data, time series, grids with regular-spaced values, etc.
python-blosc2 is a Python package that wraps C-Blosc2, the newest version of the Blosc compressor. Currently python-blosc2 already reproduces the API of python-blosc, so the former can be used as a drop-in replacement for the later. However, there are a few exceptions for the complete compatibility that are listed here: https://github.com/Blosc/python-blosc2/blob/main/RELEASE_NOTES.md#changes-from-python-blosc-to-python-blosc2
In addition, python-blosc2 aims to leverage the new C-Blosc2 API so as to support super-chunks, serialization and all the features introduced in C-Blosc2. This is work in process and will be done incrementally in future releases.
Note: python-blosc2 is meant to be backward compatible with python-blosc data. That means that it can read data generated with python-blosc, but the opposite is not true (i.e. there is no forward compatibility).
Installing
Blosc is now offering Python wheels for the main OS (Win, Mac and Linux) and platforms. You can install binary packages from PyPi using pip:
pip install blosc2
Documentation
The documentation is here:
https://blosc.org/python-blosc2/python-blosc2.html
Also, some examples are available on:
Building
python-blosc2 comes with the Blosc sources with it and can be built with:
git clone https://github.com/Blosc/python-blosc2/
cd python-blosc2
git submodule update --init --recursive
python -m pip install -r requirements.txt
python setup.py build_ext --inplace
That’s all. You can proceed with testing section now.
Testing
After compiling, you can quickly check that the package is sane by running the doctests in blosc/test.py:
python -m pip install -r requirements-tests.txt
python -m pytest (add -v for verbose mode)
Benchmarking
If curious, you may want to run a small benchmark that compares a plain NumPy array copy against compression through different compressors in your Blosc build:
PYTHONPATH=. python bench/pack_compress.py
Just to whet your appetite, here are some speed figures for an Intel box (i9-10940X CPU @ 3.30GHz, 14 cores) running Ubuntu 22.04. In particular, see how performance for pack_array2/unpack_array2 has improved vs the previous version (labeled as pack_array/unpack_array):
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= python-blosc2 version: 0.3.3.dev0 Blosc version: 2.4.2.dev ($Date:: 2022-09-16 #$) Compressors available: ['blosclz', 'lz4', 'lz4hc', 'zlib', 'zstd'] Compressor library versions: BLOSCLZ: 2.5.1 LZ4: 1.9.4 LZ4HC: 1.9.4 ZLIB: 1.2.11.zlib-ng ZSTD: 1.5.2 Python version: 3.9.13 | packaged by conda-forge | (main, May 27 2022, 16:56:21) [GCC 10.3.0] Platform: Linux-5.15.0-41-generic-x86_64 (#44-Ubuntu SMP Wed Jun 22 14:20:53 UTC 2022) Linux dist: Ubuntu 22.04 LTS Processor: x86_64 Byte-ordering: little Detected cores: 14.0 Number of threads to use by default: 8 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= Creating NumPy arrays with 10**8 int64/float64 elements: Time for copying array with np.copy: 0.394 s (3.79 GB/s)) *** the arange linear distribution *** Using *** Codec.BLOSCLZ *** compressor: Time for compress/decompress: 0.051/0.101 s (29.08/14.80 GB/s)) cr: 444.3x Time for pack_array/unpack_array: 0.600/0.764 s (2.49/1.95 GB/s)) cr: 442.3x Time for pack_array2/unpack_array2: 0.059/0.158 s (25.28/9.44 GB/s)) cr: 444.2x Using *** Codec.LZ4 *** compressor: Time for compress/decompress: 0.059/0.116 s (25.07/12.82 GB/s)) cr: 279.2x Time for pack_array/unpack_array: 0.615/0.758 s (2.42/1.97 GB/s)) cr: 277.9x Time for pack_array2/unpack_array2: 0.058/0.160 s (25.52/9.31 GB/s)) cr: 279.2x Using *** Codec.LZ4HC *** compressor: Time for compress/decompress: 0.193/0.085 s (7.71/17.45 GB/s)) cr: 155.9x Time for pack_array/unpack_array: 0.786/0.754 s (1.89/1.98 GB/s)) cr: 155.4x Time for pack_array2/unpack_array2: 0.218/0.165 s (6.84/9.02 GB/s)) cr: 155.9x Using *** Codec.ZLIB *** compressor: Time for compress/decompress: 0.250/0.141 s (5.96/10.55 GB/s)) cr: 273.8x Time for pack_array/unpack_array: 0.799/0.845 s (1.87/1.76 GB/s)) cr: 273.2x Time for pack_array2/unpack_array2: 0.261/0.243 s (5.71/6.13 GB/s)) cr: 273.8x Using *** Codec.ZSTD *** compressor: Time for compress/decompress: 0.189/0.079 s (7.89/18.92 GB/s)) cr: 644.9x Time for pack_array/unpack_array: 0.725/0.770 s (2.06/1.94 GB/s)) cr: 630.9x Time for pack_array2/unpack_array2: 0.206/0.143 s (7.25/10.39 GB/s)) cr: 644.8x *** the linspace linear distribution *** Using *** Codec.BLOSCLZ *** compressor: Time for compress/decompress: 0.091/0.113 s (16.34/13.21 GB/s)) cr: 50.1x Time for pack_array/unpack_array: 0.623/0.751 s (2.39/1.98 GB/s)) cr: 50.0x Time for pack_array2/unpack_array2: 0.124/0.163 s (11.98/9.12 GB/s)) cr: 50.1x Using *** Codec.LZ4 *** compressor: Time for compress/decompress: 0.077/0.114 s (19.33/13.12 GB/s)) cr: 55.7x Time for pack_array/unpack_array: 0.624/0.740 s (2.39/2.01 GB/s)) cr: 55.8x Time for pack_array2/unpack_array2: 0.098/0.190 s (15.19/7.83 GB/s)) cr: 55.7x Using *** Codec.LZ4HC *** compressor: Time for compress/decompress: 0.352/0.075 s (4.23/19.98 GB/s)) cr: 53.6x Time for pack_array/unpack_array: 0.918/0.781 s (1.62/1.91 GB/s)) cr: 53.6x Time for pack_array2/unpack_array2: 0.389/0.139 s (3.83/10.72 GB/s)) cr: 53.6x Using *** Codec.ZLIB *** compressor: Time for compress/decompress: 0.395/0.148 s (3.77/10.08 GB/s)) cr: 50.4x Time for pack_array/unpack_array: 0.940/0.824 s (1.59/1.81 GB/s)) cr: 50.4x Time for pack_array2/unpack_array2: 0.433/0.252 s (3.44/5.92 GB/s)) cr: 50.4x Using *** Codec.ZSTD *** compressor: Time for compress/decompress: 0.402/0.098 s (3.71/15.22 GB/s)) cr: 74.7x Time for pack_array/unpack_array: 0.949/0.782 s (1.57/1.91 GB/s)) cr: 74.7x Time for pack_array2/unpack_array2: 0.426/0.175 s (3.50/8.49 GB/s)) cr: 74.7x *** the random distribution *** Using *** Codec.BLOSCLZ *** compressor: Time for compress/decompress: 0.240/0.119 s (6.22/12.48 GB/s)) cr: 4.0x Time for pack_array/unpack_array: 0.794/0.767 s (1.88/1.94 GB/s)) cr: 4.0x Time for pack_array2/unpack_array2: 0.578/0.162 s (2.58/9.20 GB/s)) cr: 4.0x Using *** Codec.LZ4 *** compressor: Time for compress/decompress: 0.250/0.114 s (5.97/13.11 GB/s)) cr: 4.0x Time for pack_array/unpack_array: 0.794/0.767 s (1.88/1.94 GB/s)) cr: 4.0x Time for pack_array2/unpack_array2: 0.590/0.161 s (2.53/9.24 GB/s)) cr: 4.0x Using *** Codec.LZ4HC *** compressor: Time for compress/decompress: 1.102/0.088 s (1.35/17.01 GB/s)) cr: 4.0x Time for pack_array/unpack_array: 1.690/0.758 s (0.88/1.97 GB/s)) cr: 4.0x Time for pack_array2/unpack_array2: 1.445/0.178 s (1.03/8.38 GB/s)) cr: 4.0x Using *** Codec.ZLIB *** compressor: Time for compress/decompress: 1.258/0.210 s (1.18/7.11 GB/s)) cr: 4.7x Time for pack_array/unpack_array: 1.822/0.898 s (0.82/1.66 GB/s)) cr: 4.7x Time for pack_array2/unpack_array2: 1.549/0.355 s (0.96/4.20 GB/s)) cr: 4.7x Using *** Codec.ZSTD *** compressor: Time for compress/decompress: 1.653/0.098 s (0.90/15.21 GB/s)) cr: 4.4x Time for pack_array/unpack_array: 2.206/0.796 s (0.68/1.87 GB/s)) cr: 4.4x Time for pack_array2/unpack_array2: 2.077/0.179 s (0.72/8.30 GB/s)) cr: 4.4x
As can be seen, is perfectly possible for python-blosc2 to go faster than a plain memcpy(). But more interestingly, you can easily choose the codecs and filters that better adapt to your datasets, and persist and transmit them faster and using less memory.
Start using compression in your data workflows and feel the experience of doing more with less.
License
The software is licenses under a 3-Clause BSD license. A copy of the python-blosc2 license can be found in LICENSE.
Mailing list
Discussion about this module is welcome in the Blosc list:
Please follow @Blosc2 to get informed about the latest developments.
Enjoy data!
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
File details
Details for the file blosc2-0.6.4.tar.gz
.
File metadata
- Download URL: blosc2-0.6.4.tar.gz
- Upload date:
- Size: 2.5 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.11.1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1673250e2c4ef18d02baf561e0740404c4a5bc482503fb91032a8d32f769fbad |
|
MD5 | e08a152fa9608d5db9ac7449090a45d4 |
|
BLAKE2b-256 | b620128ee643ac363f8cd5bad36877a26959de4955fe64a16b62dcabe2b01334 |
File details
Details for the file blosc2-0.6.4-cp311-cp311-win_amd64.whl
.
File metadata
- Download URL: blosc2-0.6.4-cp311-cp311-win_amd64.whl
- Upload date:
- Size: 2.0 MB
- Tags: CPython 3.11, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.11.1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 2e34f1e6474ec9071499928f1727d21cac426157671a60b4e14923271ce6b929 |
|
MD5 | 089f3e267949243500d22a6f7c9667bc |
|
BLAKE2b-256 | 473902bc43d5f43a4931f03a657587ff5ed4cd302cc5c6834021be5c1fa2faae |
File details
Details for the file blosc2-0.6.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
.
File metadata
- Download URL: blosc2-0.6.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 3.9 MB
- Tags: CPython 3.11, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.11.1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6d368ede8fbf6451e6d9699c34c3ba6788a63a06f03eef2486bc3210c6375407 |
|
MD5 | 947237aa0f21d5d5997173435d43291b |
|
BLAKE2b-256 | 29d31b6ff981e8d33ba60e6bc9f1f06474f23f1878e64266cde933f42f8f58e0 |
File details
Details for the file blosc2-0.6.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
.
File metadata
- Download URL: blosc2-0.6.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 3.8 MB
- Tags: CPython 3.11, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.11.1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | c089b11206a378325861966bee7f3f67ad9b1a68b58ee90e52ad8899918ae592 |
|
MD5 | bf8df9258ae809dd561a5a7943e4f40c |
|
BLAKE2b-256 | a2690132af0b380c4e7314243aa5f0dc4605e868450d94ba0d8d728f069a3dac |
File details
Details for the file blosc2-0.6.4-cp311-cp311-macosx_10_9_x86_64.whl
.
File metadata
- Download URL: blosc2-0.6.4-cp311-cp311-macosx_10_9_x86_64.whl
- Upload date:
- Size: 3.9 MB
- Tags: CPython 3.11, macOS 10.9+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.11.1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 2c37665c4fc4864442313ea9056986b17a89ebb1d2526f2c44ee8d80d2fae1f1 |
|
MD5 | be0f8098409367563e5a88f92fb951d8 |
|
BLAKE2b-256 | 9d58d71548b842be845e67248269fcec0fe7adc746ad925e085ec986e2f1653b |
File details
Details for the file blosc2-0.6.4-cp310-cp310-win_amd64.whl
.
File metadata
- Download URL: blosc2-0.6.4-cp310-cp310-win_amd64.whl
- Upload date:
- Size: 2.0 MB
- Tags: CPython 3.10, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.11.1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 64e7835f998e169376f58b975f74c15bf9dea5fd1b6284d045080b7586fb023a |
|
MD5 | 337f013aeb986c4e5c6c79b18743584b |
|
BLAKE2b-256 | 442a17a191d7ee5197a5848bca75ba4946b2d7491ccef01508556006090a0756 |
File details
Details for the file blosc2-0.6.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
.
File metadata
- Download URL: blosc2-0.6.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 3.9 MB
- Tags: CPython 3.10, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.11.1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6a0a187dd3d537d40bbe6d170f4e6f297033e88d4d057d6cfe9dab7b2a6efed7 |
|
MD5 | 42583867c7c2bdbec135678df5451d22 |
|
BLAKE2b-256 | 746969466460879e96566d24aa493c94fa71867e960b980b850aaa9bfd281554 |
File details
Details for the file blosc2-0.6.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
.
File metadata
- Download URL: blosc2-0.6.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 3.8 MB
- Tags: CPython 3.10, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.11.1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6a93e2bc081090c6d7599b2d69701bb1230fa1cb9cd4b4e5ea539da9612adc8d |
|
MD5 | 97aebe7e7c18d1cf71d20d5f6aefd0c1 |
|
BLAKE2b-256 | 98f98a8182a4264aed34b47c2fcfe50a4b2bb6c867d7461cbaba17a38dc8a91e |
File details
Details for the file blosc2-0.6.4-cp310-cp310-macosx_10_9_x86_64.whl
.
File metadata
- Download URL: blosc2-0.6.4-cp310-cp310-macosx_10_9_x86_64.whl
- Upload date:
- Size: 3.9 MB
- Tags: CPython 3.10, macOS 10.9+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.11.1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4cd9c5e8ac096cbd035031ead9d003fe39870356eb0b61dc214661cda73f7e9e |
|
MD5 | deb2d22c2c8db53f16888bd3f8b61955 |
|
BLAKE2b-256 | f77a89b324a582d2a8d7a8d2dc7416de2cfee4163cd3291ac6ea46b5229e148b |
File details
Details for the file blosc2-0.6.4-cp39-cp39-win_amd64.whl
.
File metadata
- Download URL: blosc2-0.6.4-cp39-cp39-win_amd64.whl
- Upload date:
- Size: 2.0 MB
- Tags: CPython 3.9, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.11.1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 25367472e93e07b6c8107d98852914c8261fcb0e8dbbf210a63789cde56bd8bb |
|
MD5 | ff0d751b8cd7a009f2fbfa13a73b230a |
|
BLAKE2b-256 | 29593339b18a3abd2e351cd1c5890ab9f4b32446e6673f3adbfae9da552c83a1 |
File details
Details for the file blosc2-0.6.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
.
File metadata
- Download URL: blosc2-0.6.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 3.9 MB
- Tags: CPython 3.9, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.11.1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 401faff4841e14508c57b29bd30fdd9aa310cc972aed4a35937d54e4dec79e04 |
|
MD5 | 91937d3db78be9460b29829e39198205 |
|
BLAKE2b-256 | 07f32d30ffbc043d6f81df1280342d39d1df0847417d220b84e877d59d91d748 |
File details
Details for the file blosc2-0.6.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
.
File metadata
- Download URL: blosc2-0.6.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 3.8 MB
- Tags: CPython 3.9, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.11.1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3f14657302cc07c7cc159a921e59c631cea0f0b1ae68d56eee9a4d806e08cc86 |
|
MD5 | a7d58faef224a1214bc4156a6c981d8c |
|
BLAKE2b-256 | cb95e0282ff045173ae20008762e318775cc7b90916fbcf2e8bc12875f83094d |
File details
Details for the file blosc2-0.6.4-cp39-cp39-macosx_10_9_x86_64.whl
.
File metadata
- Download URL: blosc2-0.6.4-cp39-cp39-macosx_10_9_x86_64.whl
- Upload date:
- Size: 3.9 MB
- Tags: CPython 3.9, macOS 10.9+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.11.1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0a51a8e22cbbf6aa35014e60cc72c8dd1133d5cfe1ef1c50d92e36a7ef22f30e |
|
MD5 | 2af5b6dbe209e472faca1de45b830a44 |
|
BLAKE2b-256 | bc9d478ecf714368b4e3130e493bfc9d3e0f502ea4357fa43da3c6d1369b2292 |
File details
Details for the file blosc2-0.6.4-cp38-cp38-win_amd64.whl
.
File metadata
- Download URL: blosc2-0.6.4-cp38-cp38-win_amd64.whl
- Upload date:
- Size: 2.0 MB
- Tags: CPython 3.8, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.11.1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | d28456c562460a55081f992f43f533dc066e63d46a7b45ed3977837cb5a3bb28 |
|
MD5 | e33e4212f4982added82efe96590b30e |
|
BLAKE2b-256 | ce9eb4bbb7d10ee5625ebaebebe46b83639f543207b2c54b2d76a8ae5cbfe55e |
File details
Details for the file blosc2-0.6.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
.
File metadata
- Download URL: blosc2-0.6.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 3.9 MB
- Tags: CPython 3.8, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.11.1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 93b7d30934e3e137284569323adbdd3bae6d92212beb90d922b1596053cde48d |
|
MD5 | b4bc6b2436d849d967fdb28aa510caa0 |
|
BLAKE2b-256 | 4e9852bf183d28ecdaba68ac8b028a27ee569499569ad4340ce041c4745d7560 |
File details
Details for the file blosc2-0.6.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
.
File metadata
- Download URL: blosc2-0.6.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 3.8 MB
- Tags: CPython 3.8, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.11.1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 53ea79778c583bf3e7f7a80a8a6ab38a202fb597dca3cc8c9a07a59812a73d15 |
|
MD5 | 848b3c8d959ddd98539adcc03ca72643 |
|
BLAKE2b-256 | dc1782a5755897b9abf3dc08664bf052d552cf0ec72c180fb5de8d1342b7aed3 |
File details
Details for the file blosc2-0.6.4-cp38-cp38-macosx_10_9_x86_64.whl
.
File metadata
- Download URL: blosc2-0.6.4-cp38-cp38-macosx_10_9_x86_64.whl
- Upload date:
- Size: 3.9 MB
- Tags: CPython 3.8, macOS 10.9+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.11.1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | bed770e489ed5ed9258387f82f03181691f428ea0c9a85ffe1299a6996408eeb |
|
MD5 | daf48db245ce9c75bb7acede6935c4e2 |
|
BLAKE2b-256 | 2b815300b48a6ae76826361d846da360dd904bf7d80518f5e3c69f3ae8f5f342 |