Thu Mar 29 15:28:16 2018 UTC ()
python36: updated to 3.6.5

Python 3.6.5:

Security
* Minimal fix to prevent buffer overrun in os.symlink on Windows
* Regexes in difflib and poplib were vulnerable to catastrophic backtracking. These regexes formed potential DOS vectors (REDOS). They have been refactored. This resolves CVE-2018-1060 and CVE-2018-1061.

Core and Builtins
* Fixed jumping out of 窶忤ith窶� block by setting f_lineno.
* Prevent jumps from 窶腕eturn窶� and 窶脇xception窶� trace events.
* Update Valgrind suppression list to account for the rename of Py_ADDRESS_IN_RANG to address_in_range.
* Pdb and other debuggers dependent on bdb.py will correctly step over (next command) native coroutines.
* Improve suggestion when the Python 2 form of print statement is either present on the same line as the header of a compound statement or else terminated by a semi-colon instead of a newline.
* Fix possible crashing in builtin Unicode decoders caused by write out-of- bound errors when using customized decode error handlers.
* Improved frozenset() hash to create more distinct hash values when faced with datasets containing many similar values.
* The __debug__ constant is now optimized out at compile time. This fixes also bpo-22091.
* sys.flags.hash_randomization is now properly set to 0 when hash randomization is turned off by PYTHONHASHSEED=0.
* The optimizer is now protected from spending much time doing complex calculations and consuming much memory for creating large constants in constant folding.
* repr() on a dict containing its own values() or items() no longer raises RecursionError; OrderedDict similarly. Instead, use ..., as for other recursive structures.
* Leading whitespace is now correctly ignored when generating suggestions for converting Py2 print statements to Py3 builtin print function calls.
* The repr of deeply nested dict now raises a RecursionError instead of crashing due to a stack overflow.

Library
* lib2to3 now properly supports trailing commas after *args and **kwargs in function signatures.
* Avoid failing in multiprocessing.Process if the standard streams are closed or None at exit.
* Skip sending/receiving data after SSL transport closing.
* Fix ctypes pass-by-value for structs on 64-bit Cygwin/MinGW.
* Fix inspect.signature() for single-parameter partialmethods.
* Expose several missing constants in zlib and fix corresponding documentation.
* Fixed tarfile.itn handling of out-of-bounds float values.
* The ssl module now detects missing NPN support in LibreSSL.
* dbm.open() now encodes filename with the filesystem encoding rather than default encoding.
* In os.dup2, don窶冲 check every call whether the dup3 syscall exists or not.
* Rewrite confusing message from setup.py upload from 窶廸o dist file created in earlier command窶� to the more helpful 窶廴ust create and upload files in one command窶�.
* In tkinter, after_cancel(None) now raises a ValueError instead of canceling the first scheduled function.
* Make sure sys.argv remains as a list when running trace.
* Fixed asyncio.Condition issue which silently ignored cancellation after notifying and cancelling a conditional lock.
* Fixed refleaks of __init__() methods in various modules. (Contributed by Oren Milman)
* Fixed guessing quote and delimiter in csv.Sniffer.sniff() when only the last field is quoted.
* socket: Remove TCP_FASTOPEN, TCP_KEEPCNT flags on older version Windows during run-time.
* Fix a rare but potential pre-exec child process deadlock in subprocess on POSIX systems when marking file descriptors inheritable on exec in the child process. This bug appears to have been introduced in 3.4.
* The ctypes module used to depend on indirect linking for dlopen. The shared extension is now explicitly linked against libdl on platforms with dl.
* Fixed asyncio.Lock() safety issue which allowed acquiring and locking the same lock multiple times, without it being free.
* Do not include name field in SMTP envelope from address.
* Fix email address header parsing error when the username is an empty quoted string.
* distutils窶� upload command no longer corrupts tar files ending with a CR byte, and no longer tries to convert CR to CRLF in any of the upload text fields.
* uuid.uuid1 no longer raises an exception if a 64-bit hardware address is encountered.
* Fix the error handling in Aifc_read.initfp() when the SSND chunk is not found.
* On FreeBSD and Solaris, os.strerror() now always decode the byte string from the current locale encoding, rather than using ASCII/surrogateescape in some cases.
* The nis module is now compatible with new libnsl and headers location.
* Improve ABCMeta._dump_registry() output readability
* glibc has removed Sun RPC. Use replacement libtirpc headers and library in nis module.
* Ensure that truncate() preserves the file position (as reported by tell()) after writes longer than the buffer size.
* Don窶冲 unsubscribe signals in asyncio UNIX event loop on interpreter shutdown.
* The SSL module no longer sends IP addresses in SNI TLS extension on platforms with OpenSSL 1.0.2+ or inet_pton.
* urllib.parse.urlsplit() does not convert zone-id (scope) to lower case for scoped IPv6 addresses in hostnames now.
* Fix bdist_wininst of distutils for CRT v142: it binary compatible with CRT v140.
* A single empty field is now always quoted when written into a CSV file. This allows to distinguish an empty row from a row consisting of a single empty field.
* Raise NotImplementedError instead of SystemError on platforms where chmod(..., follow_symlinks=False) is not supported.
* The getnode() ip getter now uses 窶亙p link窶� instead of 窶亙p link list窶�.
* Ensure TCP_NODELAY is set on Linux. Tests by Victor Stinner.
* The locale.localeconv() function now sets temporarily the LC_CTYPE locale to the LC_NUMERIC locale to decode decimal_point and thousands_sep byte strings if they are non-ASCII or longer than 1 byte, and the LC_NUMERIC locale is different than the LC_CTYPE locale. This temporary change affects other threads.
Same change for the str.format() method when formatting a number (int, float, float and subclasses) with the n type (ex: '{:n}'.format(1234)).
* Importing native path module (posixpath, ntpath) now works even if the os module still is not imported.


(adam)
diff -r1.9 -r1.10 pkgsrc/lang/python36/PLIST
diff -r1.5 -r1.6 pkgsrc/lang/python36/dist.mk
diff -r1.17 -r1.18 pkgsrc/lang/python36/distinfo

cvs diff -r1.9 -r1.10 pkgsrc/lang/python36/Attic/PLIST (expand / switch to unified diff)

--- pkgsrc/lang/python36/Attic/PLIST 2017/12/19 09:37:14 1.9
+++ pkgsrc/lang/python36/Attic/PLIST 2018/03/29 15:28:16 1.10
@@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
1@comment $NetBSD: PLIST,v 1.9 2017/12/19 09:37:14 adam Exp $ 1@comment $NetBSD: PLIST,v 1.10 2018/03/29 15:28:16 adam Exp $
2bin/2to3-${PY_VER_SUFFIX} 2bin/2to3-${PY_VER_SUFFIX}
3bin/pydoc${PY_VER_SUFFIX} 3bin/pydoc${PY_VER_SUFFIX}
4bin/python${PY_VER_SUFFIX} 4bin/python${PY_VER_SUFFIX}
5bin/python${PY_VER_SUFFIX}-config 5bin/python${PY_VER_SUFFIX}-config
6bin/pyvenv-${PY_VER_SUFFIX} 6bin/pyvenv-${PY_VER_SUFFIX}
7include/python${PY_VER_SUFFIX}/Python-ast.h 7include/python${PY_VER_SUFFIX}/Python-ast.h
8include/python${PY_VER_SUFFIX}/Python.h 8include/python${PY_VER_SUFFIX}/Python.h
9include/python${PY_VER_SUFFIX}/abstract.h 9include/python${PY_VER_SUFFIX}/abstract.h
10include/python${PY_VER_SUFFIX}/accu.h 10include/python${PY_VER_SUFFIX}/accu.h
11include/python${PY_VER_SUFFIX}/asdl.h 11include/python${PY_VER_SUFFIX}/asdl.h
12include/python${PY_VER_SUFFIX}/ast.h 12include/python${PY_VER_SUFFIX}/ast.h
13include/python${PY_VER_SUFFIX}/bitset.h 13include/python${PY_VER_SUFFIX}/bitset.h
14include/python${PY_VER_SUFFIX}/bltinmodule.h 14include/python${PY_VER_SUFFIX}/bltinmodule.h
@@ -1341,28 +1341,28 @@ lib/python${PY_VER_SUFFIX}/encodings/utf @@ -1341,28 +1341,28 @@ lib/python${PY_VER_SUFFIX}/encodings/utf
1341lib/python${PY_VER_SUFFIX}/encodings/utf_8_sig.pyo 1341lib/python${PY_VER_SUFFIX}/encodings/utf_8_sig.pyo
1342lib/python${PY_VER_SUFFIX}/encodings/uu_codec.py 1342lib/python${PY_VER_SUFFIX}/encodings/uu_codec.py
1343lib/python${PY_VER_SUFFIX}/encodings/uu_codec.pyc 1343lib/python${PY_VER_SUFFIX}/encodings/uu_codec.pyc
1344lib/python${PY_VER_SUFFIX}/encodings/uu_codec.pyo 1344lib/python${PY_VER_SUFFIX}/encodings/uu_codec.pyo
1345lib/python${PY_VER_SUFFIX}/encodings/zlib_codec.py 1345lib/python${PY_VER_SUFFIX}/encodings/zlib_codec.py
1346lib/python${PY_VER_SUFFIX}/encodings/zlib_codec.pyc 1346lib/python${PY_VER_SUFFIX}/encodings/zlib_codec.pyc
1347lib/python${PY_VER_SUFFIX}/encodings/zlib_codec.pyo 1347lib/python${PY_VER_SUFFIX}/encodings/zlib_codec.pyo
1348lib/python${PY_VER_SUFFIX}/ensurepip/__init__.py 1348lib/python${PY_VER_SUFFIX}/ensurepip/__init__.py
1349lib/python${PY_VER_SUFFIX}/ensurepip/__init__.pyc 1349lib/python${PY_VER_SUFFIX}/ensurepip/__init__.pyc
1350lib/python${PY_VER_SUFFIX}/ensurepip/__init__.pyo 1350lib/python${PY_VER_SUFFIX}/ensurepip/__init__.pyo
1351lib/python${PY_VER_SUFFIX}/ensurepip/__main__.py 1351lib/python${PY_VER_SUFFIX}/ensurepip/__main__.py
1352lib/python${PY_VER_SUFFIX}/ensurepip/__main__.pyc 1352lib/python${PY_VER_SUFFIX}/ensurepip/__main__.pyc
1353lib/python${PY_VER_SUFFIX}/ensurepip/__main__.pyo 1353lib/python${PY_VER_SUFFIX}/ensurepip/__main__.pyo
1354lib/python${PY_VER_SUFFIX}/ensurepip/_bundled/pip-9.0.1-py2.py3-none-any.whl 1354lib/python${PY_VER_SUFFIX}/ensurepip/_bundled/pip-9.0.3-py2.py3-none-any.whl
1355lib/python${PY_VER_SUFFIX}/ensurepip/_bundled/setuptools-28.8.0-py2.py3-none-any.whl 1355lib/python${PY_VER_SUFFIX}/ensurepip/_bundled/setuptools-39.0.1-py2.py3-none-any.whl
1356lib/python${PY_VER_SUFFIX}/ensurepip/_uninstall.py 1356lib/python${PY_VER_SUFFIX}/ensurepip/_uninstall.py
1357lib/python${PY_VER_SUFFIX}/ensurepip/_uninstall.pyc 1357lib/python${PY_VER_SUFFIX}/ensurepip/_uninstall.pyc
1358lib/python${PY_VER_SUFFIX}/ensurepip/_uninstall.pyo 1358lib/python${PY_VER_SUFFIX}/ensurepip/_uninstall.pyo
1359lib/python${PY_VER_SUFFIX}/enum.py 1359lib/python${PY_VER_SUFFIX}/enum.py
1360lib/python${PY_VER_SUFFIX}/enum.pyc 1360lib/python${PY_VER_SUFFIX}/enum.pyc
1361lib/python${PY_VER_SUFFIX}/enum.pyo 1361lib/python${PY_VER_SUFFIX}/enum.pyo
1362lib/python${PY_VER_SUFFIX}/filecmp.py 1362lib/python${PY_VER_SUFFIX}/filecmp.py
1363lib/python${PY_VER_SUFFIX}/filecmp.pyc 1363lib/python${PY_VER_SUFFIX}/filecmp.pyc
1364lib/python${PY_VER_SUFFIX}/filecmp.pyo 1364lib/python${PY_VER_SUFFIX}/filecmp.pyo
1365lib/python${PY_VER_SUFFIX}/fileinput.py 1365lib/python${PY_VER_SUFFIX}/fileinput.py
1366lib/python${PY_VER_SUFFIX}/fileinput.pyc 1366lib/python${PY_VER_SUFFIX}/fileinput.pyc
1367lib/python${PY_VER_SUFFIX}/fileinput.pyo 1367lib/python${PY_VER_SUFFIX}/fileinput.pyo
1368lib/python${PY_VER_SUFFIX}/fnmatch.py 1368lib/python${PY_VER_SUFFIX}/fnmatch.py
@@ -1619,26 +1619,29 @@ lib/python${PY_VER_SUFFIX}/idlelib/idle_ @@ -1619,26 +1619,29 @@ lib/python${PY_VER_SUFFIX}/idlelib/idle_
1619lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_outwin.pyo 1619lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_outwin.pyo
1620lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_paragraph.py 1620lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_paragraph.py
1621lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_paragraph.pyc 1621lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_paragraph.pyc
1622lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_paragraph.pyo 1622lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_paragraph.pyo
1623lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_parenmatch.py 1623lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_parenmatch.py
1624lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_parenmatch.pyc 1624lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_parenmatch.pyc
1625lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_parenmatch.pyo 1625lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_parenmatch.pyo
1626lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_pathbrowser.py 1626lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_pathbrowser.py
1627lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_pathbrowser.pyc 1627lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_pathbrowser.pyc
1628lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_pathbrowser.pyo 1628lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_pathbrowser.pyo
1629lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_percolator.py 1629lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_percolator.py
1630lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_percolator.pyc 1630lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_percolator.pyc
1631lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_percolator.pyo 1631lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_percolator.pyo
 1632lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_pyparse.py
 1633lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_pyparse.pyc
 1634lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_pyparse.pyo
1632lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_query.py 1635lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_query.py
1633lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_query.pyc 1636lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_query.pyc
1634lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_query.pyo 1637lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_query.pyo
1635lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_redirector.py 1638lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_redirector.py
1636lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_redirector.pyc 1639lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_redirector.pyc
1637lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_redirector.pyo 1640lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_redirector.pyo
1638lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_replace.py 1641lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_replace.py
1639lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_replace.pyc 1642lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_replace.pyc
1640lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_replace.pyo 1643lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_replace.pyo
1641lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_rstrip.py 1644lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_rstrip.py
1642lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_rstrip.pyc 1645lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_rstrip.pyc
1643lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_rstrip.pyo 1646lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_rstrip.pyo
1644lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_run.py 1647lib/python${PY_VER_SUFFIX}/idlelib/idle_test/test_run.py

cvs diff -r1.5 -r1.6 pkgsrc/lang/python36/Attic/dist.mk (expand / switch to unified diff)

--- pkgsrc/lang/python36/Attic/dist.mk 2017/12/19 09:37:14 1.5
+++ pkgsrc/lang/python36/Attic/dist.mk 2018/03/29 15:28:16 1.6
@@ -1,8 +1,8 @@ @@ -1,8 +1,8 @@
1# $NetBSD: dist.mk,v 1.5 2017/12/19 09:37:14 adam Exp $ 1# $NetBSD: dist.mk,v 1.6 2018/03/29 15:28:16 adam Exp $
2 2
3PY_DISTVERSION= 3.6.4 3PY_DISTVERSION= 3.6.5
4DISTNAME= Python-${PY_DISTVERSION} 4DISTNAME= Python-${PY_DISTVERSION}
5EXTRACT_SUFX= .tar.xz 5EXTRACT_SUFX= .tar.xz
6DISTINFO_FILE= ${.CURDIR}/../../lang/python36/distinfo 6DISTINFO_FILE= ${.CURDIR}/../../lang/python36/distinfo
7PATCHDIR= ${.CURDIR}/../../lang/python36/patches 7PATCHDIR= ${.CURDIR}/../../lang/python36/patches
8MASTER_SITES= http://www.python.org/ftp/python/${PY_DISTVERSION}/ 8MASTER_SITES= http://www.python.org/ftp/python/${PY_DISTVERSION}/

cvs diff -r1.17 -r1.18 pkgsrc/lang/python36/Attic/distinfo (expand / switch to unified diff)

--- pkgsrc/lang/python36/Attic/distinfo 2017/12/19 09:37:14 1.17
+++ pkgsrc/lang/python36/Attic/distinfo 2018/03/29 15:28:16 1.18
@@ -1,19 +1,19 @@ @@ -1,19 +1,19 @@
1$NetBSD: distinfo,v 1.17 2017/12/19 09:37:14 adam Exp $ 1$NetBSD: distinfo,v 1.18 2018/03/29 15:28:16 adam Exp $
2 2
3SHA1 (Python-3.6.4.tar.xz) = 36a90695cda9298a0663e667c12909246c358851 3SHA1 (Python-3.6.5.tar.xz) = 5a7a833a36f1006257d298787f4c38493c5d1689
4RMD160 (Python-3.6.4.tar.xz) = 0fd34bf6748133728106b0d12c354e8b45d62d79 4RMD160 (Python-3.6.5.tar.xz) = 213ced5e09552468b1efc855727b743a3ab30e8b
5SHA512 (Python-3.6.4.tar.xz) = 09ba2103ac517ac4d262f00380c9aac836a53401ce252540c17fd821a3b92e1ddf32528d00772221eb3126b12cb95b62c3ac3e852f4951e6f2eb406c88c848a2 5SHA512 (Python-3.6.5.tar.xz) = 6b26fcd296b9bd8e67861eff10d14db7507711ddba947288d16d6def53135c39326b7f969c04bb2b2993f924d9e7ad3f5c5282a3915760bc0885cf0a8ea5eb51
6Size (Python-3.6.4.tar.xz) = 16992824 bytes 6Size (Python-3.6.5.tar.xz) = 17049912 bytes
7SHA1 (patch-Lib_distutils_command_install.py) = 6fc6f5d918b7581fc62cd0fe55857ee932c3a341 7SHA1 (patch-Lib_distutils_command_install.py) = 6fc6f5d918b7581fc62cd0fe55857ee932c3a341
8SHA1 (patch-Lib_distutils_sysconfig.py) = 6822eafb4dfded86d7f7353831816aeb8119e6cf 8SHA1 (patch-Lib_distutils_sysconfig.py) = 6822eafb4dfded86d7f7353831816aeb8119e6cf
9SHA1 (patch-Lib_distutils_unixccompiler.py) = e7aa684fa186de7a01486c3d8bfa177afdd22ef9 9SHA1 (patch-Lib_distutils_unixccompiler.py) = e7aa684fa186de7a01486c3d8bfa177afdd22ef9
10SHA1 (patch-Lib_sysconfig.py) = a4f009ed73ebbd9d9c4bf7e12b7981182ed8fd7c 10SHA1 (patch-Lib_sysconfig.py) = a4f009ed73ebbd9d9c4bf7e12b7981182ed8fd7c
11SHA1 (patch-Makefile.pre.in) = c91aac5b238dbfe149be63a2486b6f4c5b959280 11SHA1 (patch-Makefile.pre.in) = c91aac5b238dbfe149be63a2486b6f4c5b959280
12SHA1 (patch-Modules_makesetup) = a06786eebffadecedba5e3a50a9785fb47613567 12SHA1 (patch-Modules_makesetup) = a06786eebffadecedba5e3a50a9785fb47613567
13SHA1 (patch-Modules_nismodule.c) = 1bafe9b06359586d027a77011b103877590d947d 13SHA1 (patch-Modules_nismodule.c) = 1bafe9b06359586d027a77011b103877590d947d
14SHA1 (patch-Modules_socketmodule.c) = e6bdb8990cd9b8cf0b0ff48e6ae7b664681a9924 14SHA1 (patch-Modules_socketmodule.c) = e6bdb8990cd9b8cf0b0ff48e6ae7b664681a9924
15SHA1 (patch-Modules_socketmodule.h) = 13a3290eb72078067060d3e71b7baa08f3eb591c 15SHA1 (patch-Modules_socketmodule.h) = 13a3290eb72078067060d3e71b7baa08f3eb591c
16SHA1 (patch-Python_thread__pthread.h) = fb81eaa604b4ed7c1b64c3f4731d58a8aee257be 16SHA1 (patch-Python_thread__pthread.h) = fb81eaa604b4ed7c1b64c3f4731d58a8aee257be
17SHA1 (patch-configure) = d999d63bd437500a3a8f176fcd5aa3c48ded836e 17SHA1 (patch-configure) = d999d63bd437500a3a8f176fcd5aa3c48ded836e
18SHA1 (patch-pyconfig.h.in) = 58e2c03489f9b6e4d88f144d8c09773f92eacd61 18SHA1 (patch-pyconfig.h.in) = 58e2c03489f9b6e4d88f144d8c09773f92eacd61
19SHA1 (patch-setup.py) = 95d4b411b81e18635556af6c8c4e7af6a8a2a14c 19SHA1 (patch-setup.py) = 95d4b411b81e18635556af6c8c4e7af6a8a2a14c