From 00478ffacac128dda1ffd1203b44b53503abcbb4 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Thu, 14 Dec 2023 18:05:40 +0000 Subject: [PATCH 01/19] gh-112984 Update Windows build for free-threaded builds --- .gitignore | 4 ++ PC/pyconfig.h.in | 19 ++++-- PCbuild/_asyncio.vcxproj | 2 +- PCbuild/_bz2.vcxproj | 2 +- PCbuild/_ctypes.vcxproj | 2 +- PCbuild/_ctypes_test.vcxproj | 2 +- PCbuild/_decimal.vcxproj | 2 +- PCbuild/_elementtree.vcxproj | 2 +- PCbuild/_hashlib.vcxproj | 2 +- PCbuild/_lzma.vcxproj | 2 +- PCbuild/_multiprocessing.vcxproj | 2 +- PCbuild/_overlapped.vcxproj | 2 +- PCbuild/_queue.vcxproj | 2 +- PCbuild/_socket.vcxproj | 2 +- PCbuild/_sqlite3.vcxproj | 2 +- PCbuild/_ssl.vcxproj | 2 +- PCbuild/_testbuffer.vcxproj | 2 +- PCbuild/_testcapi.vcxproj | 2 +- PCbuild/_testclinic.vcxproj | 4 +- PCbuild/_testclinic_limited.vcxproj | 2 +- PCbuild/_testconsole.vcxproj | 2 +- PCbuild/_testimportmultiple.vcxproj | 2 +- PCbuild/_testinternalcapi.vcxproj | 2 +- PCbuild/_testmultiphase.vcxproj | 2 +- PCbuild/_testsinglephase.vcxproj | 2 +- PCbuild/_tkinter.vcxproj | 2 +- PCbuild/_uuid.vcxproj | 2 +- PCbuild/_wmi.vcxproj | 2 +- PCbuild/_zoneinfo.vcxproj | 2 +- PCbuild/pyexpat.vcxproj | 2 +- PCbuild/pyproject.props | 13 ++++- PCbuild/python.props | 90 ++++++++++++++++++++++------- PCbuild/python.vcxproj | 5 +- PCbuild/python3dll.vcxproj | 2 +- PCbuild/pythonw.vcxproj | 1 + PCbuild/select.vcxproj | 2 +- PCbuild/sqlite3.vcxproj | 2 +- PCbuild/unicodedata.vcxproj | 2 +- PCbuild/winsound.vcxproj | 2 +- PCbuild/xxlimited.vcxproj | 2 +- PCbuild/xxlimited_35.vcxproj | 2 +- 41 files changed, 138 insertions(+), 66 deletions(-) diff --git a/.gitignore b/.gitignore index c424a894c2a6e0..25cf8b2f6f8c3d 100644 --- a/.gitignore +++ b/.gitignore @@ -111,10 +111,14 @@ PCbuild/*-pgo PCbuild/*.VC.db PCbuild/*.VC.opendb PCbuild/amd64/ +PCbuild/amd64t/ PCbuild/arm32/ +PCbuild/arm32t/ PCbuild/arm64/ +PCbuild/arm64t/ PCbuild/obj/ PCbuild/win32/ +PCbuild/win32t/ Tools/unicode/data/ /autom4te.cache /build/ diff --git a/PC/pyconfig.h.in b/PC/pyconfig.h.in index d8f0a6be69c21a..8bbf877a5bb5ed 100644 --- a/PC/pyconfig.h.in +++ b/PC/pyconfig.h.in @@ -94,6 +94,9 @@ WIN32 is still required for the locale module. #endif #endif /* Py_BUILD_CORE || Py_BUILD_CORE_BUILTIN || Py_BUILD_CORE_MODULE */ +/* Define to 1 if you want to disable the GIL */ +#undef Py_GIL_DISABLED + /* Compiler specific defines */ /* ------------------------------------------------------------------------*/ @@ -305,8 +308,16 @@ Py_NO_ENABLE_SHARED to find out. Also support MS_NO_COREDLL for b/w compat */ /* not building the core - must be an ext */ # if defined(_MSC_VER) /* So MSVC users need not specify the .lib - file in their Makefile (other compilers are - generally taken care of by distutils.) */ + file in their Makefile */ +# if defined(Py_GIL_DISABLED) +# if defined(_DEBUG) +# pragma comment(lib,"python313t_d.lib") +# elif defined(Py_LIMITED_API) +# pragma comment(lib,"python3t.lib") +# else +# pragma comment(lib,"python313t.lib") +# endif /* _DEBUG */ +# else /* Py_GIL_DISABLED */ # if defined(_DEBUG) # pragma comment(lib,"python313_d.lib") # elif defined(Py_LIMITED_API) @@ -314,6 +325,7 @@ Py_NO_ENABLE_SHARED to find out. Also support MS_NO_COREDLL for b/w compat */ # else # pragma comment(lib,"python313.lib") # endif /* _DEBUG */ +# endif /* Py_GIL_DISABLED */ # endif /* _MSC_VER */ # endif /* Py_BUILD_CORE */ #endif /* MS_COREDLL */ @@ -739,7 +751,4 @@ Py_NO_ENABLE_SHARED to find out. Also support MS_NO_COREDLL for b/w compat */ /* Define if libssl has X509_VERIFY_PARAM_set1_host and related function */ #define HAVE_X509_VERIFY_PARAM_SET1_HOST 1 -/* Define if you want to disable the GIL */ -#undef Py_GIL_DISABLED - #endif /* !Py_CONFIG_H */ diff --git a/PCbuild/_asyncio.vcxproj b/PCbuild/_asyncio.vcxproj index ed1e1bc0a420dc..76b0ffd660dba0 100644 --- a/PCbuild/_asyncio.vcxproj +++ b/PCbuild/_asyncio.vcxproj @@ -79,7 +79,7 @@ - .pyd + $(PyStdlibPydExt) diff --git a/PCbuild/_bz2.vcxproj b/PCbuild/_bz2.vcxproj index 3fe95fbf83993a..e0dc6ec187a08d 100644 --- a/PCbuild/_bz2.vcxproj +++ b/PCbuild/_bz2.vcxproj @@ -80,7 +80,7 @@ - .pyd + $(PyStdlibPydExt) diff --git a/PCbuild/_ctypes.vcxproj b/PCbuild/_ctypes.vcxproj index 253da31e9ce182..63d5fa49cd4e17 100644 --- a/PCbuild/_ctypes.vcxproj +++ b/PCbuild/_ctypes.vcxproj @@ -79,7 +79,7 @@ - .pyd + $(PyStdlibPydExt) diff --git a/PCbuild/_ctypes_test.vcxproj b/PCbuild/_ctypes_test.vcxproj index 8a01e743a4d86f..97354739c09834 100644 --- a/PCbuild/_ctypes_test.vcxproj +++ b/PCbuild/_ctypes_test.vcxproj @@ -80,7 +80,7 @@ - .pyd + $(PyStdlibPydExt) diff --git a/PCbuild/_decimal.vcxproj b/PCbuild/_decimal.vcxproj index 0916f1a2d37887..490d7df87eb1c6 100644 --- a/PCbuild/_decimal.vcxproj +++ b/PCbuild/_decimal.vcxproj @@ -79,7 +79,7 @@ - .pyd + $(PyStdlibPydExt) diff --git a/PCbuild/_elementtree.vcxproj b/PCbuild/_elementtree.vcxproj index 8da5244bac0cb6..8c9c0e42f7fe3e 100644 --- a/PCbuild/_elementtree.vcxproj +++ b/PCbuild/_elementtree.vcxproj @@ -79,7 +79,7 @@ - .pyd + $(PyStdlibPydExt) diff --git a/PCbuild/_hashlib.vcxproj b/PCbuild/_hashlib.vcxproj index 6dad8183c57ae3..2cd205224bc089 100644 --- a/PCbuild/_hashlib.vcxproj +++ b/PCbuild/_hashlib.vcxproj @@ -79,7 +79,7 @@ - .pyd + $(PyStdlibPydExt) diff --git a/PCbuild/_lzma.vcxproj b/PCbuild/_lzma.vcxproj index fe076a6fc57168..40107d4b76cd53 100644 --- a/PCbuild/_lzma.vcxproj +++ b/PCbuild/_lzma.vcxproj @@ -79,7 +79,7 @@ - .pyd + $(PyStdlibPydExt) diff --git a/PCbuild/_multiprocessing.vcxproj b/PCbuild/_multiprocessing.vcxproj index 77b6bfc8e1e483..a65397f532aa86 100644 --- a/PCbuild/_multiprocessing.vcxproj +++ b/PCbuild/_multiprocessing.vcxproj @@ -79,7 +79,7 @@ - .pyd + $(PyStdlibPydExt) diff --git a/PCbuild/_overlapped.vcxproj b/PCbuild/_overlapped.vcxproj index 9e60d3b5db336c..224bf05d5303a0 100644 --- a/PCbuild/_overlapped.vcxproj +++ b/PCbuild/_overlapped.vcxproj @@ -79,7 +79,7 @@ - .pyd + $(PyStdlibPydExt) diff --git a/PCbuild/_queue.vcxproj b/PCbuild/_queue.vcxproj index 8065b235851686..80a1c3c6a4ad3e 100644 --- a/PCbuild/_queue.vcxproj +++ b/PCbuild/_queue.vcxproj @@ -79,7 +79,7 @@ - .pyd + $(PyStdlibPydExt) diff --git a/PCbuild/_socket.vcxproj b/PCbuild/_socket.vcxproj index 78fa4d6729abb9..41af0895921bbb 100644 --- a/PCbuild/_socket.vcxproj +++ b/PCbuild/_socket.vcxproj @@ -79,7 +79,7 @@ - .pyd + $(PyStdlibPydExt) diff --git a/PCbuild/_sqlite3.vcxproj b/PCbuild/_sqlite3.vcxproj index 57c7413671e54e..9ae0a0fc3a009d 100644 --- a/PCbuild/_sqlite3.vcxproj +++ b/PCbuild/_sqlite3.vcxproj @@ -79,7 +79,7 @@ - .pyd + $(PyStdlibPydExt) diff --git a/PCbuild/_ssl.vcxproj b/PCbuild/_ssl.vcxproj index 226ff506f8c62b..d4e1affab031d7 100644 --- a/PCbuild/_ssl.vcxproj +++ b/PCbuild/_ssl.vcxproj @@ -79,7 +79,7 @@ - .pyd + $(PyStdlibPydExt) diff --git a/PCbuild/_testbuffer.vcxproj b/PCbuild/_testbuffer.vcxproj index 917d7ae50feb14..4e721e8ce09f0c 100644 --- a/PCbuild/_testbuffer.vcxproj +++ b/PCbuild/_testbuffer.vcxproj @@ -80,7 +80,7 @@ - .pyd + $(PyStdlibPydExt) diff --git a/PCbuild/_testcapi.vcxproj b/PCbuild/_testcapi.vcxproj index 1c15541d3ec735..6911aacab29b97 100644 --- a/PCbuild/_testcapi.vcxproj +++ b/PCbuild/_testcapi.vcxproj @@ -80,7 +80,7 @@ - .pyd + $(PyStdlibPydExt) diff --git a/PCbuild/_testclinic.vcxproj b/PCbuild/_testclinic.vcxproj index e319b3c0f42e0f..ef981332c6ab03 100644 --- a/PCbuild/_testclinic.vcxproj +++ b/PCbuild/_testclinic.vcxproj @@ -80,7 +80,7 @@ - .pyd + $(PyStdlibPydExt) @@ -107,4 +107,4 @@ - \ No newline at end of file + diff --git a/PCbuild/_testclinic_limited.vcxproj b/PCbuild/_testclinic_limited.vcxproj index b00b2be491b423..183a55080e8693 100644 --- a/PCbuild/_testclinic_limited.vcxproj +++ b/PCbuild/_testclinic_limited.vcxproj @@ -79,7 +79,7 @@ - .pyd + $(PyStdlibPydExt) diff --git a/PCbuild/_testconsole.vcxproj b/PCbuild/_testconsole.vcxproj index 5d7e14eff10294..69d312b17a5a62 100644 --- a/PCbuild/_testconsole.vcxproj +++ b/PCbuild/_testconsole.vcxproj @@ -80,7 +80,7 @@ - .pyd + $(PyStdlibPydExt) diff --git a/PCbuild/_testimportmultiple.vcxproj b/PCbuild/_testimportmultiple.vcxproj index 6d80d5779f24d8..c35ac83c1c739f 100644 --- a/PCbuild/_testimportmultiple.vcxproj +++ b/PCbuild/_testimportmultiple.vcxproj @@ -80,7 +80,7 @@ - .pyd + $(PyStdlibPydExt) diff --git a/PCbuild/_testinternalcapi.vcxproj b/PCbuild/_testinternalcapi.vcxproj index 558f66ca95cd33..a825cac9138674 100644 --- a/PCbuild/_testinternalcapi.vcxproj +++ b/PCbuild/_testinternalcapi.vcxproj @@ -80,7 +80,7 @@ - .pyd + $(PyStdlibPydExt) diff --git a/PCbuild/_testmultiphase.vcxproj b/PCbuild/_testmultiphase.vcxproj index 430eb528cc3927..e730fe308ab835 100644 --- a/PCbuild/_testmultiphase.vcxproj +++ b/PCbuild/_testmultiphase.vcxproj @@ -80,7 +80,7 @@ - .pyd + $(PyStdlibPydExt) diff --git a/PCbuild/_testsinglephase.vcxproj b/PCbuild/_testsinglephase.vcxproj index fb4bcd953923f8..bf4dabf66c1040 100644 --- a/PCbuild/_testsinglephase.vcxproj +++ b/PCbuild/_testsinglephase.vcxproj @@ -80,7 +80,7 @@ - .pyd + $(PyStdlibPydExt) diff --git a/PCbuild/_tkinter.vcxproj b/PCbuild/_tkinter.vcxproj index 30cedcbb43de76..117488a01621cc 100644 --- a/PCbuild/_tkinter.vcxproj +++ b/PCbuild/_tkinter.vcxproj @@ -79,7 +79,7 @@ - .pyd + $(PyStdlibPydExt) diff --git a/PCbuild/_uuid.vcxproj b/PCbuild/_uuid.vcxproj index 2437b7eb2d9399..50d81cc7916dbd 100644 --- a/PCbuild/_uuid.vcxproj +++ b/PCbuild/_uuid.vcxproj @@ -80,7 +80,7 @@ - .pyd + $(PyStdlibPydExt) diff --git a/PCbuild/_wmi.vcxproj b/PCbuild/_wmi.vcxproj index c1914a3fa5a1bf..22fa8960982528 100644 --- a/PCbuild/_wmi.vcxproj +++ b/PCbuild/_wmi.vcxproj @@ -80,7 +80,7 @@ - .pyd + $(PyStdlibPydExt) diff --git a/PCbuild/_zoneinfo.vcxproj b/PCbuild/_zoneinfo.vcxproj index 6e6389c3773397..47b5bfa5b8815a 100644 --- a/PCbuild/_zoneinfo.vcxproj +++ b/PCbuild/_zoneinfo.vcxproj @@ -79,7 +79,7 @@ - .pyd + $(PyStdlibPydExt) diff --git a/PCbuild/pyexpat.vcxproj b/PCbuild/pyexpat.vcxproj index 001f8afd89b9e9..dc9161a8b290f9 100644 --- a/PCbuild/pyexpat.vcxproj +++ b/PCbuild/pyexpat.vcxproj @@ -79,7 +79,7 @@ - .pyd + $(PyStdlibPydExt) diff --git a/PCbuild/pyproject.props b/PCbuild/pyproject.props index 68c0550f7603b7..de374a71f559d2 100644 --- a/PCbuild/pyproject.props +++ b/PCbuild/pyproject.props @@ -23,6 +23,13 @@ false + + $(TargetName)$(TargetExt) + <_TargetNameSep>$(TargetNameExt.LastIndexOf(`.`)) + $(TargetNameExt.Substring(0, $(_TargetNameSep))) + $(TargetNameExt.Substring($(_TargetNameSep))) + + <_VCToolsVersion>$([System.Version]::Parse(`$(VCToolsVersion)`).Major).$([System.Version]::Parse(`$(VCToolsVersion)`).Minor) @@ -36,7 +43,7 @@ <_PlatformPreprocessorDefinition>_WIN32; <_PlatformPreprocessorDefinition Condition="$(Platform) == 'x64'">_WIN64; <_PlatformPreprocessorDefinition Condition="$(Platform) == 'x64' and $(PlatformToolset) != 'ClangCL'">_M_X64;$(_PlatformPreprocessorDefinition) - <_Py3NamePreprocessorDefinition>PY3_DLLNAME=L"$(Py3DllName)"; + <_Py3NamePreprocessorDefinition>PY3_DLLNAME=L"$(Py3DllName)$(PyDebugExt)"; @@ -155,8 +162,8 @@ public override bool Execute() { - - + + $([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)\..\)) $(PySourcePath)\ - + + + $(PySourcePath)PCbuild\win32\ $(Py_OutDir)\win32\ @@ -52,7 +54,30 @@ $(PySourcePath)PCbuild\$(ArchName)\ $(BuildPath)\ $(BuildPath)instrumented\ - + + + ..\\.. + ..\\..\\.. + + + + + $(PySourcePath)PCbuild\win32t\ + $(Py_OutDir)\win32t\ + $(PySourcePath)PCbuild\amd64t\ + $(Py_OutDir)\amd64t\ + $(PySourcePath)PCbuild\arm32t\ + $(Py_OutDir)\arm32t\ + $(PySourcePath)PCbuild\arm64t\ + $(Py_OutDir)\arm64t\ + $(BuildPath32) + $(BuildPath64) + $(BuildPathArm32) + $(BuildPathArm64) + $(PySourcePath)PCbuild\$(ArchName)t\ + $(BuildPath)\ + $(BuildPath)instrumented\ + ..\\.. ..\\..\\.. @@ -84,22 +109,19 @@ _d - + -test - + -32 -arm32 -arm64 - - - $(BuildPath)python$(PyDebugExt).exe true - + true @@ -141,7 +163,7 @@ @@ -223,22 +245,50 @@ )) )) $([msbuild]::Add($(Field3Value), 9000)) - + + + python$(MajorVersionNumber).$(MinorVersionNumber)t + python + $(BuildPath)$(PyExeName)$(PyDebugExt).exe + pythonw$(MajorVersionNumber).$(MinorVersionNumber)t + pythonw + - python$(MajorVersionNumber)$(MinorVersionNumber)$(PyDebugExt) + python$(MajorVersionNumber)$(MinorVersionNumber)t$(PyDebugExt) + python$(MajorVersionNumber)$(MinorVersionNumber)$(PyDebugExt) - python3$(PyDebugExt) + python3t + python3 + + .cp$(MajorVersionNumber)$(MinorVersionNumber)-win32 .cp$(MajorVersionNumber)$(MinorVersionNumber)-win_arm32 .cp$(MajorVersionNumber)$(MinorVersionNumber)-win_arm64 .cp$(MajorVersionNumber)$(MinorVersionNumber)-win_amd64 - + + + .pyd + $(MajorVersionNumber).$(MinorVersionNumber)$(PyArchExt)$(PyTestExt) - + + + + .cp$(MajorVersionNumber)$(MinorVersionNumber)t-win32 + .cp$(MajorVersionNumber)$(MinorVersionNumber)t-win_arm32 + .cp$(MajorVersionNumber)$(MinorVersionNumber)t-win_arm64 + .cp$(MajorVersionNumber)$(MinorVersionNumber)t-win_amd64 + + + $(PydTag).pyd + + + $(MajorVersionNumber).$(MinorVersionNumber)t$(PyArchExt)$(PyTestExt) + + diff --git a/PCbuild/python.vcxproj b/PCbuild/python.vcxproj index 8b733865962373..4b011808b604a2 100644 --- a/PCbuild/python.vcxproj +++ b/PCbuild/python.vcxproj @@ -72,6 +72,7 @@ + $(PyExeName) Application false MultiByte @@ -129,7 +130,7 @@ +"$(OutDir)$(PyExeName)$(PyDebugExt).exe" "$(PySourcePath)PC\validate_ucrtbase.py" $(UcrtName)' ContinueOnError="true" /> @@ -142,7 +143,7 @@ set PYTHONPATH=$(PySourcePath)Lib @echo Running $(Configuration)^|$(Platform) interpreter... @setlocal @set PYTHONHOME=$(PySourcePath) -@"$(OutDir)python$(PyDebugExt).exe" %* +@"$(OutDir)$(PyExeName)$(PyDebugExt).exe" %* <_ExistingContent Condition="Exists('$(PySourcePath)python.bat')">$([System.IO.File]::ReadAllText('$(PySourcePath)python.bat')) diff --git a/PCbuild/python3dll.vcxproj b/PCbuild/python3dll.vcxproj index ec22e6fc76e584..235ea1cf9d33fb 100644 --- a/PCbuild/python3dll.vcxproj +++ b/PCbuild/python3dll.vcxproj @@ -70,12 +70,12 @@ {885D4898-D08D-4091-9C40-C700CFE3FC5A} python3dll Win32Proj - python3 false + $(Py3DllName) DynamicLibrary diff --git a/PCbuild/pythonw.vcxproj b/PCbuild/pythonw.vcxproj index e23635e5ea9411..d4db3caf774061 100644 --- a/PCbuild/pythonw.vcxproj +++ b/PCbuild/pythonw.vcxproj @@ -73,6 +73,7 @@ + $(PyWExeName) Application false diff --git a/PCbuild/select.vcxproj b/PCbuild/select.vcxproj index 750a713949919a..d7448fd4d72380 100644 --- a/PCbuild/select.vcxproj +++ b/PCbuild/select.vcxproj @@ -78,7 +78,7 @@ - .pyd + $(PyStdlibPydExt) diff --git a/PCbuild/sqlite3.vcxproj b/PCbuild/sqlite3.vcxproj index c502d51833b91a..6bcc4e913c8e77 100644 --- a/PCbuild/sqlite3.vcxproj +++ b/PCbuild/sqlite3.vcxproj @@ -69,12 +69,12 @@ {A1A295E5-463C-437F-81CA-1F32367685DA} sqlite3 - .pyd false + $(PyStdlibPydExt) DynamicLibrary NotSet diff --git a/PCbuild/unicodedata.vcxproj b/PCbuild/unicodedata.vcxproj index addef753359ed6..781f938e2ab78e 100644 --- a/PCbuild/unicodedata.vcxproj +++ b/PCbuild/unicodedata.vcxproj @@ -79,7 +79,7 @@ - .pyd + $(PyStdlibPydExt) diff --git a/PCbuild/winsound.vcxproj b/PCbuild/winsound.vcxproj index 32cedc9b444902..c26029b15a339f 100644 --- a/PCbuild/winsound.vcxproj +++ b/PCbuild/winsound.vcxproj @@ -80,7 +80,7 @@ - .pyd + $(PyStdlibPydExt) diff --git a/PCbuild/xxlimited.vcxproj b/PCbuild/xxlimited.vcxproj index 1c776fb0da3e72..093e6920c0b76c 100644 --- a/PCbuild/xxlimited.vcxproj +++ b/PCbuild/xxlimited.vcxproj @@ -80,7 +80,7 @@ - .pyd + $(PyStdlibPydExt) diff --git a/PCbuild/xxlimited_35.vcxproj b/PCbuild/xxlimited_35.vcxproj index dd830b3b6aaa91..3f4d4463f24af0 100644 --- a/PCbuild/xxlimited_35.vcxproj +++ b/PCbuild/xxlimited_35.vcxproj @@ -80,7 +80,7 @@ - .pyd + $(PyStdlibPydExt) From 2a1ef3b9707491a902a23d51b295fb5842e70a2d Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Thu, 14 Dec 2023 20:27:01 +0000 Subject: [PATCH 02/19] Fix rt script --- .github/workflows/reusable-windows.yml | 4 ++-- PCbuild/rt.bat | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.github/workflows/reusable-windows.yml b/.github/workflows/reusable-windows.yml index 47a3c10d2ca4c1..d7d6d0b2f7e073 100644 --- a/.github/workflows/reusable-windows.yml +++ b/.github/workflows/reusable-windows.yml @@ -20,7 +20,7 @@ jobs: - name: Display build info run: .\python.bat -m test.pythoninfo - name: Tests - run: .\PCbuild\rt.bat -p Win32 -d -q --fast-ci + run: .\PCbuild\rt.bat -p Win32 -d -q --fast-ci ${{ inputs.free-threaded && '--disable-gil' || '' }} build_win_amd64: name: 'build and test (x64)' @@ -37,7 +37,7 @@ jobs: - name: Display build info run: .\python.bat -m test.pythoninfo - name: Tests - run: .\PCbuild\rt.bat -p x64 -d -q --fast-ci + run: .\PCbuild\rt.bat -p x64 -d -q --fast-ci ${{ inputs.free-threaded && '--disable-gil' || '' }} build_win_arm64: name: 'build (arm64)' diff --git a/PCbuild/rt.bat b/PCbuild/rt.bat index 332ba5edcf4082..7ed29e13626d19 100644 --- a/PCbuild/rt.bat +++ b/PCbuild/rt.bat @@ -9,6 +9,7 @@ rem -q runs the tests just once, and without deleting .pyc files. rem -p or -win32, -x64, -arm32, -arm64 rem Run the specified architecture of python (or python_d if -d rem was specified). If omitted, uses %PREFIX% if set or 64-bit. +rem --disable-gil Run free-threaded build. rem All leading instances of these switches are shifted off, and rem whatever remains (up to 9 arguments) is passed to regrtest.py. rem For example, @@ -29,6 +30,7 @@ rem rt -u "network,largefile" setlocal set pcbuild=%~dp0 +set pyname=python set suffix= set qmode= set dashO= @@ -39,6 +41,8 @@ set exe= if "%1"=="-O" (set dashO=-O) & shift & goto CheckOpts if "%1"=="-q" (set qmode=yes) & shift & goto CheckOpts if "%1"=="-d" (set suffix=_d) & shift & goto CheckOpts +rem HACK: Need some way to infer the version number in this script +if "%1"=="--disable-gil" (set pyname=python3.13t) & shift & goto CheckOpts if "%1"=="-win32" (set prefix=%pcbuild%win32) & shift & goto CheckOpts if "%1"=="-x64" (set prefix=%pcbuild%amd64) & shift & goto CheckOpts if "%1"=="-arm64" (set prefix=%pcbuild%arm64) & shift & goto CheckOpts @@ -47,7 +51,7 @@ if "%1"=="-p" (call :SetPlatform %~2) & shift & shift & goto CheckOpts if NOT "%1"=="" (set regrtestargs=%regrtestargs% %1) & shift & goto CheckOpts if not defined prefix set prefix=%pcbuild%amd64 -set exe=%prefix%\python%suffix%.exe +set exe=%prefix%\%pyname%%suffix%.exe set cmd="%exe%" %dashO% -m test %regrtestargs% if defined qmode goto Qmode From 7912ba4f283cd75ae2563acd7c24b59855504611 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Thu, 14 Dec 2023 21:05:03 +0000 Subject: [PATCH 03/19] Add suffix --- PCbuild/rt.bat | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/PCbuild/rt.bat b/PCbuild/rt.bat index 7ed29e13626d19..e37c387bd4a0e8 100644 --- a/PCbuild/rt.bat +++ b/PCbuild/rt.bat @@ -36,22 +36,24 @@ set qmode= set dashO= set regrtestargs=--fast-ci set exe= +set prefixtail= :CheckOpts if "%1"=="-O" (set dashO=-O) & shift & goto CheckOpts if "%1"=="-q" (set qmode=yes) & shift & goto CheckOpts if "%1"=="-d" (set suffix=_d) & shift & goto CheckOpts rem HACK: Need some way to infer the version number in this script -if "%1"=="--disable-gil" (set pyname=python3.13t) & shift & goto CheckOpts +if "%1"=="--disable-gil" (set pyname=python3.13t) & (set prefixtail=t) & shift & goto CheckOpts if "%1"=="-win32" (set prefix=%pcbuild%win32) & shift & goto CheckOpts if "%1"=="-x64" (set prefix=%pcbuild%amd64) & shift & goto CheckOpts +if "%1"=="-amd64" (set prefix=%pcbuild%amd64) & shift & goto CheckOpts if "%1"=="-arm64" (set prefix=%pcbuild%arm64) & shift & goto CheckOpts if "%1"=="-arm32" (set prefix=%pcbuild%arm32) & shift & goto CheckOpts if "%1"=="-p" (call :SetPlatform %~2) & shift & shift & goto CheckOpts if NOT "%1"=="" (set regrtestargs=%regrtestargs% %1) & shift & goto CheckOpts if not defined prefix set prefix=%pcbuild%amd64 -set exe=%prefix%\%pyname%%suffix%.exe +set exe=%prefix%%prefixtail%\%pyname%%suffix%.exe set cmd="%exe%" %dashO% -m test %regrtestargs% if defined qmode goto Qmode @@ -59,7 +61,7 @@ echo Deleting .pyc files ... "%exe%" "%pcbuild%rmpyc.py" echo Cleaning _pth files ... -if exist %prefix%\*._pth del %prefix%\*._pth +if exist %prefix%%prefixtail%\*._pth del %prefix%%prefixtail%\*._pth echo on %cmd% From 87ba7ac898b630fa88561475f83ec1fddc58dd9e Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Thu, 14 Dec 2023 23:30:36 +0000 Subject: [PATCH 04/19] Some test fixes and new venv launcher --- Lib/test/test_ctypes/test_loading.py | 2 +- Lib/test/test_regrtest.py | 4 + Lib/test/test_venv.py | 1 + PC/venvlauncher.c | 466 ++++++++++++++++++++++++++ PCbuild/venvlauncher.vcxproj | 6 +- PCbuild/venvlauncher.vcxproj.filters | 2 +- PCbuild/venvwlauncher.vcxproj | 6 +- PCbuild/venvwlauncher.vcxproj.filters | 2 +- 8 files changed, 480 insertions(+), 9 deletions(-) create mode 100644 PC/venvlauncher.c diff --git a/Lib/test/test_ctypes/test_loading.py b/Lib/test/test_ctypes/test_loading.py index 22db97b818c17e..9f0547f4c955c0 100644 --- a/Lib/test/test_ctypes/test_loading.py +++ b/Lib/test/test_ctypes/test_loading.py @@ -141,7 +141,7 @@ def test_load_hasattr(self): def test_load_dll_with_flags(self): _sqlite3 = import_helper.import_module("_sqlite3") src = _sqlite3.__file__ - if src.lower().endswith("_d.pyd"): + if src.partition(".")[0].lower().endswith("_d"): ext = "_d.dll" else: ext = ".dll" diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py index e828941f6c779d..a3ebb11b19af04 100644 --- a/Lib/test/test_regrtest.py +++ b/Lib/test/test_regrtest.py @@ -845,6 +845,8 @@ def test_tools_buildbot_test(self): test_args.append('-x64') # 64-bit build if not support.Py_DEBUG: test_args.append('+d') # Release build, use python.exe + if sysconfig.get_config_var("Py_GIL_DISABLED"): + rt_args.append('--disable-gil') self.run_batch(script, *test_args, *self.tests) @unittest.skipUnless(sys.platform == 'win32', 'Windows only') @@ -862,6 +864,8 @@ def test_pcbuild_rt(self): rt_args.append('-x64') # 64-bit build if support.Py_DEBUG: rt_args.append('-d') # Debug build, use python_d.exe + if sysconfig.get_config_var("Py_GIL_DISABLED"): + rt_args.append('--disable-gil') self.run_batch(script, *rt_args, *self.regrtest_args, *self.tests) diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py index 8ecb23ff384362..8ca2d8424ef825 100644 --- a/Lib/test/test_venv.py +++ b/Lib/test/test_venv.py @@ -457,6 +457,7 @@ def test_executable(self): rmtree(self.env_dir) self.run_with_capture(venv.create, self.env_dir) envpy = self.envpy(real_env_dir=True) + os.system(f'type "{self.env_dir}\\pyvenv.cfg"') out, err = check_output([envpy, '-c', 'import sys; print(sys.executable)']) self.assertEqual(out.strip(), envpy.encode()) diff --git a/PC/venvlauncher.c b/PC/venvlauncher.c new file mode 100644 index 00000000000000..c1da1a3738dc09 --- /dev/null +++ b/PC/venvlauncher.c @@ -0,0 +1,466 @@ +/* + * venv redirector for Windows + * + * This launcher looks for a nearby pyvenv.cfg to find the correct home + * directory, and then launches the original Python executable from it. + * The name of this executable is passed as argv[0]. + */ + +#define __STDC_WANT_LIB_EXT1__ 1 + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MS_WINDOWS +#include "patchlevel.h" + +#define MAXLEN PATHCCH_MAX_CCH +#define MSGSIZE 1024 + +#define RC_NO_STD_HANDLES 100 +#define RC_CREATE_PROCESS 101 +#define RC_BAD_VIRTUAL_PATH 102 +#define RC_NO_PYTHON 103 +#define RC_NO_MEMORY 104 +#define RC_NO_SCRIPT 105 +#define RC_NO_VENV_CFG 106 +#define RC_BAD_VENV_CFG 107 +#define RC_NO_COMMANDLINE 108 +#define RC_INTERNAL_ERROR 109 +#define RC_DUPLICATE_ITEM 110 +#define RC_INSTALLING 111 +#define RC_NO_PYTHON_AT_ALL 112 +#define RC_NO_SHEBANG 113 +#define RC_RECURSIVE_SHEBANG 114 + +static FILE * log_fp = NULL; + +void +debug(wchar_t * format, ...) +{ + va_list va; + + if (log_fp != NULL) { + wchar_t buffer[MAXLEN]; + int r = 0; + va_start(va, format); + r = vswprintf_s(buffer, MAXLEN, format, va); + va_end(va); + + if (r <= 0) { + return; + } + fputws(buffer, log_fp); + while (r && isspace(buffer[r])) { + buffer[r--] = L'\0'; + } + if (buffer[0]) { + OutputDebugStringW(buffer); + } + } +} + + +void +formatWinerror(int rc, wchar_t * message, int size) +{ + FormatMessageW( + FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, rc, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + message, size, NULL); +} + + +void +winerror(int err, wchar_t * format, ... ) +{ + va_list va; + wchar_t message[MSGSIZE]; + wchar_t win_message[MSGSIZE]; + int len; + + if (err == 0) { + err = GetLastError(); + } + + va_start(va, format); + len = _vsnwprintf_s(message, MSGSIZE, _TRUNCATE, format, va); + va_end(va); + + formatWinerror(err, win_message, MSGSIZE); + if (len >= 0) { + _snwprintf_s(&message[len], MSGSIZE - len, _TRUNCATE, L": %s", + win_message); + } + +#if !defined(_WINDOWS) + fwprintf(stderr, L"%s\n", message); +#else + MessageBoxW(NULL, message, L"Python venv launcher is sorry to say ...", + MB_OK); +#endif +} + + +void +error(wchar_t * format, ... ) +{ + va_list va; + wchar_t message[MSGSIZE]; + + va_start(va, format); + _vsnwprintf_s(message, MSGSIZE, _TRUNCATE, format, va); + va_end(va); + +#if !defined(_WINDOWS) + fwprintf(stderr, L"%s\n", message); +#else + MessageBoxW(NULL, message, L"Python venv launcher is sorry to say ...", + MB_OK); +#endif +} + + +bool +isEnvVarSet(const wchar_t *name) +{ + /* only looking for non-empty, which means at least one character + and the null terminator */ + return GetEnvironmentVariableW(name, NULL, 0) >= 2; +} + + +bool +join(wchar_t *buffer, size_t bufferLength, const wchar_t *fragment) +{ + if (SUCCEEDED(PathCchCombineEx(buffer, bufferLength, buffer, fragment, PATHCCH_ALLOW_LONG_PATHS))) { + return true; + } + return false; +} + + +bool +split_parent(wchar_t *buffer, size_t bufferLength) +{ + return SUCCEEDED(PathCchRemoveFileSpec(buffer, bufferLength)); +} + + +int +calculate_pyvenvcfg_path(const wchar_t *argv0, wchar_t *pyvenvcfg_path, size_t maxlen) +{ + if ((DWORD)maxlen != maxlen) { + // TODO: error message + return RC_NO_MEMORY; + } + if (!GetCurrentDirectoryW((DWORD)maxlen, pyvenvcfg_path)) { + // TODO: error message + return RC_NO_COMMANDLINE; + } + // Trailing quote will be included, but we're about to reduce the path + // anyway so it will go away + if (!join(pyvenvcfg_path, maxlen, &argv0[argv0[0] == L'"' ? 1 : 0])) { + // TODO: error message + return RC_NO_COMMANDLINE; + } + // Remove 'python.exe' from our path + if (!split_parent(pyvenvcfg_path, maxlen)) { + // TODO: error message + return RC_NO_COMMANDLINE; + } + // Replace with 'pyvenv.cfg' + if (!join(pyvenvcfg_path, maxlen, L"pyvenv.cfg")) { + // TODO: error message + return RC_NO_MEMORY; + } + // If it exists, return + if (GetFileAttributesW(pyvenvcfg_path) != INVALID_FILE_ATTRIBUTES) { + return 0; + } + // Otherwise, remove 'pyvenv.cfg' and (probably) 'Scripts' + if (!split_parent(pyvenvcfg_path, maxlen) || + !split_parent(pyvenvcfg_path, maxlen)) { + // TODO: error message + return RC_NO_COMMANDLINE; + } + // Replace 'pyvenv.cfg' + if (!join(pyvenvcfg_path, maxlen, L"pyvenv.cfg")) { + // TODO: error message + return RC_NO_MEMORY; + } + // If it exists, return + if (GetFileAttributesW(pyvenvcfg_path) != INVALID_FILE_ATTRIBUTES) { + return 0; + } + // Otherwise, we fail + // TODO: error message + return RC_NO_VENV_CFG; +} + + +static int +find_home_value(const char *buffer, const char **start, DWORD *length) +{ + for (const char *s = strstr(buffer, "home"); s; s = strstr(s + 1, "\nhome")) { + if (*s == '\n') { + ++s; + } + for (int i = 4; i > 0 && *s; --i, ++s); + + while (*s && iswspace(*s)) { + ++s; + } + if (*s != L'=') { + continue; + } + + do { + ++s; + } while (*s && iswspace(*s)); + + *start = s; + char *nl = strchr(s, '\n'); + if (nl) { + while (nl != s && iswspace(nl[-1])) { + --nl; + } + *length = (DWORD)((ptrdiff_t)nl - (ptrdiff_t)s); + } else { + *length = (DWORD)strlen(s); + } + return 1; + } + return 0; +} + + +int +read_home(const wchar_t *pyvenv_cfg, wchar_t *home_path, size_t maxlen) +{ + HANDLE hFile = CreateFileW(pyvenv_cfg, GENERIC_READ, + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + NULL, OPEN_EXISTING, 0, NULL); + + if (hFile == INVALID_HANDLE_VALUE) { + // TODO: error message + return RC_BAD_VENV_CFG; + } + + // 8192 characters ought to be enough for anyone + // (doubled compared to the old implementation!) + char buffer[8192]; + DWORD len; + if (!ReadFile(hFile, buffer, sizeof(buffer), &len, NULL)) { + // TODO: error message + CloseHandle(hFile); + return RC_BAD_VENV_CFG; + } + CloseHandle(hFile); + + char *home; + DWORD home_len; + if (!find_home_value(buffer, &home, &home_len)) { + // TODO: error message + return RC_BAD_VENV_CFG; + } + + if ((DWORD)maxlen != maxlen) { + maxlen = 8192; + } + len = MultiByteToWideChar(CP_UTF8, 0, home, home_len, home_path, (DWORD)maxlen); + if (!len) { + // TODO: error message + return RC_BAD_VENV_CFG; + } + home_path[len] = L'\0'; + + return 0; +} + + +int +locate_python(wchar_t *path, size_t maxlen) +{ + if (!join(path, maxlen, EXENAME)) { + // TODO: error message + return RC_NO_MEMORY; + } + + if (GetFileAttributesW(path) == INVALID_FILE_ATTRIBUTES) { + // TODO: error message + return RC_NO_PYTHON; + } + + return 0; +} + + +/* + * Process creation code + */ + +static BOOL +safe_duplicate_handle(HANDLE in, HANDLE * pout) +{ + BOOL ok; + HANDLE process = GetCurrentProcess(); + DWORD rc; + + *pout = NULL; + ok = DuplicateHandle(process, in, process, pout, 0, TRUE, + DUPLICATE_SAME_ACCESS); + if (!ok) { + rc = GetLastError(); + if (rc == ERROR_INVALID_HANDLE) { + debug(L"DuplicateHandle returned ERROR_INVALID_HANDLE\n"); + ok = TRUE; + } + else { + debug(L"DuplicateHandle returned %d\n", rc); + } + } + return ok; +} + +static BOOL WINAPI +ctrl_c_handler(DWORD code) +{ + return TRUE; /* We just ignore all control events. */ +} + +static int +launch(const wchar_t *executable, wchar_t *cmdline) +{ + HANDLE job; + JOBOBJECT_EXTENDED_LIMIT_INFORMATION info; + DWORD rc; + BOOL ok; + STARTUPINFOW si; + PROCESS_INFORMATION pi; + +#if defined(_WINDOWS) + /* + When explorer launches a Windows (GUI) application, it displays + the "app starting" (the "pointer + hourglass") cursor for a number + of seconds, or until the app does something UI-ish (eg, creating a + window, or fetching a message). As this launcher doesn't do this + directly, that cursor remains even after the child process does these + things. We avoid that by doing a simple post+get message. + See http://bugs.python.org/issue17290 + */ + MSG msg; + + PostMessage(0, 0, 0, 0); + GetMessage(&msg, 0, 0, 0); +#endif + + debug(L"run_child: about to run '%ls' with '%ls'\n", executable, cmdline); + job = CreateJobObject(NULL, NULL); + ok = QueryInformationJobObject(job, JobObjectExtendedLimitInformation, + &info, sizeof(info), &rc); + if (!ok || (rc != sizeof(info)) || !job) { + error(L"Job information querying failed"); + return RC_CREATE_PROCESS; + } + info.BasicLimitInformation.LimitFlags |= JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE | + JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK; + ok = SetInformationJobObject(job, JobObjectExtendedLimitInformation, &info, + sizeof(info)); + if (!ok) { + error(L"Job information setting failed"); + return RC_CREATE_PROCESS; + } + memset(&si, 0, sizeof(si)); + GetStartupInfoW(&si); + ok = safe_duplicate_handle(GetStdHandle(STD_INPUT_HANDLE), &si.hStdInput); + if (!ok) { + error(L"stdin duplication failed"); + return RC_NO_STD_HANDLES; + } + ok = safe_duplicate_handle(GetStdHandle(STD_OUTPUT_HANDLE), &si.hStdOutput); + if (!ok) { + error(L"stdout duplication failed"); + return RC_NO_STD_HANDLES; + } + ok = safe_duplicate_handle(GetStdHandle(STD_ERROR_HANDLE), &si.hStdError); + if (!ok) { + error(L"stderr duplication failed"); + return RC_NO_STD_HANDLES; + } + + ok = SetConsoleCtrlHandler(ctrl_c_handler, TRUE); + if (!ok) { + error(L"control handler setting failed"); + return RC_CREATE_PROCESS; + } + + si.dwFlags = STARTF_USESTDHANDLES; + ok = CreateProcessW(executable, cmdline, NULL, NULL, TRUE, + 0, NULL, NULL, &si, &pi); + if (!ok) { + error(L"Unable to create process using '%ls'", cmdline); + return RC_CREATE_PROCESS; + } + AssignProcessToJobObject(job, pi.hProcess); + CloseHandle(pi.hThread); + WaitForSingleObjectEx(pi.hProcess, INFINITE, FALSE); + ok = GetExitCodeProcess(pi.hProcess, &rc); + if (!ok) { + error(L"Failed to get exit code of process"); + return RC_CREATE_PROCESS; + } + debug(L"child process exit code: %d\n", rc); + return rc; +} + + +int +process(int argc, wchar_t ** argv) +{ + int exitCode; + wchar_t pyvenvcfg_path[MAXLEN]; + wchar_t home_path[MAXLEN]; + + if (isEnvVarSet(L"PYLAUNCHER_DEBUG")) { + setvbuf(stderr, (char *)NULL, _IONBF, 0); + log_fp = stderr; + } + + exitCode = calculate_pyvenvcfg_path(argv[0], pyvenvcfg_path, MAXLEN); + if (exitCode) return exitCode; + + exitCode = read_home(pyvenvcfg_path, home_path, MAXLEN); + if (exitCode) return exitCode; + + exitCode = locate_python(home_path, MAXLEN); + if (exitCode) return exitCode; + + exitCode = launch(home_path, GetCommandLineW()); + return exitCode; +} + + +#if defined(_WINDOWS) + +int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, + LPWSTR lpstrCmd, int nShow) +{ + return process(__argc, __wargv); +} + +#else + +int cdecl wmain(int argc, wchar_t ** argv) +{ + return process(argc, argv); +} + +#endif diff --git a/PCbuild/venvlauncher.vcxproj b/PCbuild/venvlauncher.vcxproj index 123e84ec4e3682..ad33017e65cb4b 100644 --- a/PCbuild/venvlauncher.vcxproj +++ b/PCbuild/venvlauncher.vcxproj @@ -91,19 +91,19 @@ - _CONSOLE;VENV_REDIRECT;%(PreprocessorDefinitions) + EXENAME=L"$(PyExeName)$(PyDebugExt).exe";_CONSOLE;%(PreprocessorDefinitions) MultiThreaded PY_ICON;%(PreprocessorDefinitions) - version.lib;%(AdditionalDependencies) + pathcch.lib;%(AdditionalDependencies) Console - + diff --git a/PCbuild/venvlauncher.vcxproj.filters b/PCbuild/venvlauncher.vcxproj.filters index ec13936bf6cb7e..56a0f005a3fa2a 100644 --- a/PCbuild/venvlauncher.vcxproj.filters +++ b/PCbuild/venvlauncher.vcxproj.filters @@ -19,7 +19,7 @@ - + Source Files diff --git a/PCbuild/venvwlauncher.vcxproj b/PCbuild/venvwlauncher.vcxproj index b8504d5d08e52f..4ff074dcfc661d 100644 --- a/PCbuild/venvwlauncher.vcxproj +++ b/PCbuild/venvwlauncher.vcxproj @@ -91,19 +91,19 @@ - _WINDOWS;VENV_REDIRECT;%(PreprocessorDefinitions) + EXENAME=L"$(PyExeName)$(PyDebugExt).exe";_WINDOWS;%(PreprocessorDefinitions) MultiThreaded PYW_ICON;%(PreprocessorDefinitions) - version.lib;%(AdditionalDependencies) + pathcch.lib;%(AdditionalDependencies) Windows - + diff --git a/PCbuild/venvwlauncher.vcxproj.filters b/PCbuild/venvwlauncher.vcxproj.filters index 8addc13e977e7a..61a514395e82dc 100644 --- a/PCbuild/venvwlauncher.vcxproj.filters +++ b/PCbuild/venvwlauncher.vcxproj.filters @@ -9,7 +9,7 @@ - + Source Files From ff83554cf41e631f11c2ebbbca8d7e2b6f4062d4 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Fri, 15 Dec 2023 12:17:13 +0000 Subject: [PATCH 05/19] Finish venv launcher, update venv --- Lib/test/test_venv.py | 1 - Lib/venv/__init__.py | 11 ++-- PC/venvlauncher.c | 117 +++++++++++++++++++++++++----------------- 3 files changed, 77 insertions(+), 52 deletions(-) diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py index 8ca2d8424ef825..8ecb23ff384362 100644 --- a/Lib/test/test_venv.py +++ b/Lib/test/test_venv.py @@ -457,7 +457,6 @@ def test_executable(self): rmtree(self.env_dir) self.run_with_capture(venv.create, self.env_dir) envpy = self.envpy(real_env_dir=True) - os.system(f'type "{self.env_dir}\\pyvenv.cfg"') out, err = check_output([envpy, '-c', 'import sys; print(sys.executable)']) self.assertEqual(out.strip(), envpy.encode()) diff --git a/Lib/venv/__init__.py b/Lib/venv/__init__.py index d960bf3bd82ac5..a9b917c317755c 100644 --- a/Lib/venv/__init__.py +++ b/Lib/venv/__init__.py @@ -271,9 +271,9 @@ def symlink_or_copy(self, src, dst, relative_symlinks_ok=False): if basename.endswith('_d'): ext = '_d' + ext basename = basename[:-2] - if basename == 'python': + if basename.startswith('python'): basename = 'venvlauncher' - elif basename == 'pythonw': + elif basename.startswith('pythonw'): basename = 'venvwlauncher' src = os.path.join(os.path.dirname(src), basename + ext) else: @@ -337,7 +337,12 @@ def setup_python(self, context): os.path.normcase(f).startswith(('python', 'vcruntime')) ] else: - suffixes = {'python.exe', 'python_d.exe', 'pythonw.exe', 'pythonw_d.exe'} + if sysconfig.get_config_var("Py_GIL_DISABLED"): + v = f'{sys.version_info.major}.{sys.version_info.minor}t' + else: + v = '' + suffixes = {f'python{v}.exe', f'python{v}_d.exe', + f'pythonw{v}.exe', f'pythonw{v}_d.exe'} base_exe = os.path.basename(context.env_exe) suffixes.add(base_exe) diff --git a/PC/venvlauncher.c b/PC/venvlauncher.c index c1da1a3738dc09..2bf2ed6d63042d 100644 --- a/PC/venvlauncher.c +++ b/PC/venvlauncher.c @@ -26,19 +26,22 @@ #define RC_NO_STD_HANDLES 100 #define RC_CREATE_PROCESS 101 -#define RC_BAD_VIRTUAL_PATH 102 #define RC_NO_PYTHON 103 #define RC_NO_MEMORY 104 -#define RC_NO_SCRIPT 105 #define RC_NO_VENV_CFG 106 #define RC_BAD_VENV_CFG 107 #define RC_NO_COMMANDLINE 108 #define RC_INTERNAL_ERROR 109 -#define RC_DUPLICATE_ITEM 110 -#define RC_INSTALLING 111 -#define RC_NO_PYTHON_AT_ALL 112 -#define RC_NO_SHEBANG 113 -#define RC_RECURSIVE_SHEBANG 114 + +// This should always be defined when we build for real, +// but it's handy to have a definition for quick testing +#ifndef EXENAME +#define EXENAME L"python.exe" +#endif + +#ifndef CFGNAME +#define CFGNAME L"pyvenv.cfg" +#endif static FILE * log_fp = NULL; @@ -57,7 +60,7 @@ debug(wchar_t * format, ...) if (r <= 0) { return; } - fputws(buffer, log_fp); + fwprintf(log_fp, L"%ls\n", buffer); while (r && isspace(buffer[r])) { buffer[r--] = L'\0'; } @@ -96,12 +99,12 @@ winerror(int err, wchar_t * format, ... ) formatWinerror(err, win_message, MSGSIZE); if (len >= 0) { - _snwprintf_s(&message[len], MSGSIZE - len, _TRUNCATE, L": %s", + _snwprintf_s(&message[len], MSGSIZE - len, _TRUNCATE, L": %ls", win_message); } #if !defined(_WINDOWS) - fwprintf(stderr, L"%s\n", message); + fwprintf(stderr, L"%ls\n", message); #else MessageBoxW(NULL, message, L"Python venv launcher is sorry to say ...", MB_OK); @@ -120,7 +123,7 @@ error(wchar_t * format, ... ) va_end(va); #if !defined(_WINDOWS) - fwprintf(stderr, L"%s\n", message); + fwprintf(stderr, L"%ls\n", message); #else MessageBoxW(NULL, message, L"Python venv launcher is sorry to say ...", MB_OK); @@ -154,31 +157,39 @@ split_parent(wchar_t *buffer, size_t bufferLength) } +/* + * Path calculation + */ + int calculate_pyvenvcfg_path(const wchar_t *argv0, wchar_t *pyvenvcfg_path, size_t maxlen) { + if (!pyvenvcfg_path) { + error(L"invalid buffer provided"); + return RC_INTERNAL_ERROR; + } if ((DWORD)maxlen != maxlen) { - // TODO: error message - return RC_NO_MEMORY; + error(L"path buffer is too large"); + return RC_INTERNAL_ERROR; } if (!GetCurrentDirectoryW((DWORD)maxlen, pyvenvcfg_path)) { - // TODO: error message + winerror(GetLastError(), L"failed to read current directory"); return RC_NO_COMMANDLINE; } // Trailing quote will be included, but we're about to reduce the path // anyway so it will go away if (!join(pyvenvcfg_path, maxlen, &argv0[argv0[0] == L'"' ? 1 : 0])) { - // TODO: error message + error(L"failed to abspath('%ls')", argv0); return RC_NO_COMMANDLINE; } // Remove 'python.exe' from our path if (!split_parent(pyvenvcfg_path, maxlen)) { - // TODO: error message + error(L"failed to remove segment from '%ls'", pyvenvcfg_path); return RC_NO_COMMANDLINE; } // Replace with 'pyvenv.cfg' - if (!join(pyvenvcfg_path, maxlen, L"pyvenv.cfg")) { - // TODO: error message + if (!join(pyvenvcfg_path, maxlen, CFGNAME)) { + error(L"failed to append '%ls' to '%ls'", CFGNAME, pyvenvcfg_path); return RC_NO_MEMORY; } // If it exists, return @@ -188,12 +199,12 @@ calculate_pyvenvcfg_path(const wchar_t *argv0, wchar_t *pyvenvcfg_path, size_t m // Otherwise, remove 'pyvenv.cfg' and (probably) 'Scripts' if (!split_parent(pyvenvcfg_path, maxlen) || !split_parent(pyvenvcfg_path, maxlen)) { - // TODO: error message + error(L"failed to remove segments from '%ls'", pyvenvcfg_path); return RC_NO_COMMANDLINE; } // Replace 'pyvenv.cfg' - if (!join(pyvenvcfg_path, maxlen, L"pyvenv.cfg")) { - // TODO: error message + if (!join(pyvenvcfg_path, maxlen, CFGNAME)) { + error(L"failed to append '%ls' to '%ls'", CFGNAME, pyvenvcfg_path); return RC_NO_MEMORY; } // If it exists, return @@ -201,15 +212,26 @@ calculate_pyvenvcfg_path(const wchar_t *argv0, wchar_t *pyvenvcfg_path, size_t m return 0; } // Otherwise, we fail - // TODO: error message + winerror(GetLastError(), L"failed to locate %ls", CFGNAME); return RC_NO_VENV_CFG; } +/* + * pyvenv.cfg parsing + */ + static int -find_home_value(const char *buffer, const char **start, DWORD *length) +find_home_value(const char *buffer, DWORD maxlen, const char **start, DWORD *length) { - for (const char *s = strstr(buffer, "home"); s; s = strstr(s + 1, "\nhome")) { + if (!buffer || !start || !length) { + error(L"invalid find_home_value parameters()"); + return 0; + } + for (const char *s = strstr(buffer, "home"); + s && ((ptrdiff_t)s - (ptrdiff_t)buffer) < maxlen; + s = strstr(s + 1, "\nhome") + ) { if (*s == '\n') { ++s; } @@ -250,7 +272,7 @@ read_home(const wchar_t *pyvenv_cfg, wchar_t *home_path, size_t maxlen) NULL, OPEN_EXISTING, 0, NULL); if (hFile == INVALID_HANDLE_VALUE) { - // TODO: error message + winerror(GetLastError(), L"failed to open '%ls'", pyvenv_cfg); return RC_BAD_VENV_CFG; } @@ -258,17 +280,19 @@ read_home(const wchar_t *pyvenv_cfg, wchar_t *home_path, size_t maxlen) // (doubled compared to the old implementation!) char buffer[8192]; DWORD len; - if (!ReadFile(hFile, buffer, sizeof(buffer), &len, NULL)) { - // TODO: error message + if (!ReadFile(hFile, buffer, sizeof(buffer) - 1, &len, NULL)) { + winerror(GetLastError(), L"failed to read '%ls'", pyvenv_cfg); CloseHandle(hFile); return RC_BAD_VENV_CFG; } CloseHandle(hFile); + // Ensure null termination + buffer[len] = '\0'; char *home; DWORD home_len; - if (!find_home_value(buffer, &home, &home_len)) { - // TODO: error message + if (!find_home_value(buffer, sizeof(buffer), &home, &home_len)) { + error(L"no home= specified in '%ls'", pyvenv_cfg); return RC_BAD_VENV_CFG; } @@ -277,7 +301,7 @@ read_home(const wchar_t *pyvenv_cfg, wchar_t *home_path, size_t maxlen) } len = MultiByteToWideChar(CP_UTF8, 0, home, home_len, home_path, (DWORD)maxlen); if (!len) { - // TODO: error message + winerror(GetLastError(), L"failed to decode home setting in '%ls'", pyvenv_cfg); return RC_BAD_VENV_CFG; } home_path[len] = L'\0'; @@ -290,12 +314,12 @@ int locate_python(wchar_t *path, size_t maxlen) { if (!join(path, maxlen, EXENAME)) { - // TODO: error message + error(L"failed to append %ls to '%ls'", EXENAME, path); return RC_NO_MEMORY; } if (GetFileAttributesW(path) == INVALID_FILE_ATTRIBUTES) { - // TODO: error message + winerror(GetLastError(), L"did not find executable at '%ls'", path); return RC_NO_PYTHON; } @@ -304,11 +328,11 @@ locate_python(wchar_t *path, size_t maxlen) /* - * Process creation code + * Process creation */ static BOOL -safe_duplicate_handle(HANDLE in, HANDLE * pout) +safe_duplicate_handle(HANDLE in, HANDLE * pout, const wchar_t *name) { BOOL ok; HANDLE process = GetCurrentProcess(); @@ -320,11 +344,11 @@ safe_duplicate_handle(HANDLE in, HANDLE * pout) if (!ok) { rc = GetLastError(); if (rc == ERROR_INVALID_HANDLE) { - debug(L"DuplicateHandle returned ERROR_INVALID_HANDLE\n"); + debug(L"DuplicateHandle(%ls) returned ERROR_INVALID_HANDLE\n", name); ok = TRUE; } else { - debug(L"DuplicateHandle returned %d\n", rc); + debug(L"DuplicateHandle(%ls) returned %d\n", name, rc); } } return ok; @@ -367,7 +391,7 @@ launch(const wchar_t *executable, wchar_t *cmdline) ok = QueryInformationJobObject(job, JobObjectExtendedLimitInformation, &info, sizeof(info), &rc); if (!ok || (rc != sizeof(info)) || !job) { - error(L"Job information querying failed"); + winerror(GetLastError(), L"Job information querying failed"); return RC_CREATE_PROCESS; } info.BasicLimitInformation.LimitFlags |= JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE | @@ -375,30 +399,27 @@ launch(const wchar_t *executable, wchar_t *cmdline) ok = SetInformationJobObject(job, JobObjectExtendedLimitInformation, &info, sizeof(info)); if (!ok) { - error(L"Job information setting failed"); + winerror(GetLastError(), L"Job information setting failed"); return RC_CREATE_PROCESS; } memset(&si, 0, sizeof(si)); GetStartupInfoW(&si); - ok = safe_duplicate_handle(GetStdHandle(STD_INPUT_HANDLE), &si.hStdInput); + ok = safe_duplicate_handle(GetStdHandle(STD_INPUT_HANDLE), &si.hStdInput, L"stdin"); if (!ok) { - error(L"stdin duplication failed"); return RC_NO_STD_HANDLES; } - ok = safe_duplicate_handle(GetStdHandle(STD_OUTPUT_HANDLE), &si.hStdOutput); + ok = safe_duplicate_handle(GetStdHandle(STD_OUTPUT_HANDLE), &si.hStdOutput, L"stdout"); if (!ok) { - error(L"stdout duplication failed"); return RC_NO_STD_HANDLES; } - ok = safe_duplicate_handle(GetStdHandle(STD_ERROR_HANDLE), &si.hStdError); + ok = safe_duplicate_handle(GetStdHandle(STD_ERROR_HANDLE), &si.hStdError, L"stderr"); if (!ok) { - error(L"stderr duplication failed"); return RC_NO_STD_HANDLES; } ok = SetConsoleCtrlHandler(ctrl_c_handler, TRUE); if (!ok) { - error(L"control handler setting failed"); + winerror(GetLastError(), L"control handler setting failed"); return RC_CREATE_PROCESS; } @@ -406,7 +427,7 @@ launch(const wchar_t *executable, wchar_t *cmdline) ok = CreateProcessW(executable, cmdline, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi); if (!ok) { - error(L"Unable to create process using '%ls'", cmdline); + winerror(GetLastError(), L"Unable to create process using '%ls'", cmdline); return RC_CREATE_PROCESS; } AssignProcessToJobObject(job, pi.hProcess); @@ -414,10 +435,10 @@ launch(const wchar_t *executable, wchar_t *cmdline) WaitForSingleObjectEx(pi.hProcess, INFINITE, FALSE); ok = GetExitCodeProcess(pi.hProcess, &rc); if (!ok) { - error(L"Failed to get exit code of process"); + winerror(GetLastError(), L"Failed to get exit code of process"); return RC_CREATE_PROCESS; } - debug(L"child process exit code: %d\n", rc); + debug(L"child process exit code: %d", rc); return rc; } From e6211cbb78c03252171aa85649b422b4ee1964dc Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Fri, 15 Dec 2023 13:41:44 +0000 Subject: [PATCH 06/19] Fix pyvenv path calculation --- PC/venvlauncher.c | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/PC/venvlauncher.c b/PC/venvlauncher.c index 2bf2ed6d63042d..a16ffa42667d00 100644 --- a/PC/venvlauncher.c +++ b/PC/venvlauncher.c @@ -162,7 +162,7 @@ split_parent(wchar_t *buffer, size_t bufferLength) */ int -calculate_pyvenvcfg_path(const wchar_t *argv0, wchar_t *pyvenvcfg_path, size_t maxlen) +calculate_pyvenvcfg_path(wchar_t *pyvenvcfg_path, size_t maxlen) { if (!pyvenvcfg_path) { error(L"invalid buffer provided"); @@ -172,14 +172,8 @@ calculate_pyvenvcfg_path(const wchar_t *argv0, wchar_t *pyvenvcfg_path, size_t m error(L"path buffer is too large"); return RC_INTERNAL_ERROR; } - if (!GetCurrentDirectoryW((DWORD)maxlen, pyvenvcfg_path)) { - winerror(GetLastError(), L"failed to read current directory"); - return RC_NO_COMMANDLINE; - } - // Trailing quote will be included, but we're about to reduce the path - // anyway so it will go away - if (!join(pyvenvcfg_path, maxlen, &argv0[argv0[0] == L'"' ? 1 : 0])) { - error(L"failed to abspath('%ls')", argv0); + if (!GetModuleFileNameW(NULL, pyvenvcfg_path, (DWORD)maxlen)) { + winerror(GetLastError(), L"failed to read executable directory"); return RC_NO_COMMANDLINE; } // Remove 'python.exe' from our path @@ -455,7 +449,7 @@ process(int argc, wchar_t ** argv) log_fp = stderr; } - exitCode = calculate_pyvenvcfg_path(argv[0], pyvenvcfg_path, MAXLEN); + exitCode = calculate_pyvenvcfg_path(pyvenvcfg_path, MAXLEN); if (exitCode) return exitCode; exitCode = read_home(pyvenvcfg_path, home_path, MAXLEN); From 3a7425b31778c4e41566d4306e3d3fda14214fbe Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Fri, 15 Dec 2023 16:29:23 +0000 Subject: [PATCH 07/19] [WIP] Update installer to add optional freethreaded install --- .gitignore | 4 - Lib/venv/__init__.py | 4 + PCbuild/pyproject.props | 2 +- PCbuild/python.props | 52 ++---- PCbuild/rt.bat | 7 +- PCbuild/venvlauncher.vcxproj | 3 +- PCbuild/venvwlauncher.vcxproj | 3 +- Tools/msi/bundle/bundle.targets | 1 + Tools/msi/bundle/bundle.wxs | 4 + .../msi/bundle/packagegroups/freethreaded.wxs | 62 +++++++ Tools/msi/freethreaded/freethreaded.wixproj | 20 ++ Tools/msi/freethreaded/freethreaded.wxs | 18 ++ Tools/msi/freethreaded/freethreaded_d.wixproj | 20 ++ Tools/msi/freethreaded/freethreaded_d.wxs | 16 ++ .../freethreaded_en-US.wxl_template | 8 + Tools/msi/freethreaded/freethreaded_files.wxs | 175 ++++++++++++++++++ .../msi/freethreaded/freethreaded_pdb.wixproj | 20 ++ Tools/msi/freethreaded/freethreaded_pdb.wxs | 15 ++ Tools/msi/lib/lib_files.wxs | 4 +- Tools/msi/msi.props | 33 +++- 20 files changed, 412 insertions(+), 59 deletions(-) create mode 100644 Tools/msi/bundle/packagegroups/freethreaded.wxs create mode 100644 Tools/msi/freethreaded/freethreaded.wixproj create mode 100644 Tools/msi/freethreaded/freethreaded.wxs create mode 100644 Tools/msi/freethreaded/freethreaded_d.wixproj create mode 100644 Tools/msi/freethreaded/freethreaded_d.wxs create mode 100644 Tools/msi/freethreaded/freethreaded_en-US.wxl_template create mode 100644 Tools/msi/freethreaded/freethreaded_files.wxs create mode 100644 Tools/msi/freethreaded/freethreaded_pdb.wixproj create mode 100644 Tools/msi/freethreaded/freethreaded_pdb.wxs diff --git a/.gitignore b/.gitignore index 25cf8b2f6f8c3d..c424a894c2a6e0 100644 --- a/.gitignore +++ b/.gitignore @@ -111,14 +111,10 @@ PCbuild/*-pgo PCbuild/*.VC.db PCbuild/*.VC.opendb PCbuild/amd64/ -PCbuild/amd64t/ PCbuild/arm32/ -PCbuild/arm32t/ PCbuild/arm64/ -PCbuild/arm64t/ PCbuild/obj/ PCbuild/win32/ -PCbuild/win32t/ Tools/unicode/data/ /autom4te.cache /build/ diff --git a/Lib/venv/__init__.py b/Lib/venv/__init__.py index a9b917c317755c..27f64f2fc4a941 100644 --- a/Lib/venv/__init__.py +++ b/Lib/venv/__init__.py @@ -273,8 +273,12 @@ def symlink_or_copy(self, src, dst, relative_symlinks_ok=False): basename = basename[:-2] if basename.startswith('python'): basename = 'venvlauncher' + if sysconfig.get_config_var('Py_GIL_DISABLED'): + basename += 't' elif basename.startswith('pythonw'): basename = 'venvwlauncher' + if sysconfig.get_config_var('Py_GIL_DISABLED'): + basename += 't' src = os.path.join(os.path.dirname(src), basename + ext) else: src = srcfn diff --git a/PCbuild/pyproject.props b/PCbuild/pyproject.props index de374a71f559d2..252654b0bd285b 100644 --- a/PCbuild/pyproject.props +++ b/PCbuild/pyproject.props @@ -23,7 +23,7 @@ false - + $(TargetName)$(TargetExt) <_TargetNameSep>$(TargetNameExt.LastIndexOf(`.`)) $(TargetNameExt.Substring(0, $(_TargetNameSep))) diff --git a/PCbuild/python.props b/PCbuild/python.props index ae49c86cdf00a6..387d973ebe41dd 100644 --- a/PCbuild/python.props +++ b/PCbuild/python.props @@ -35,9 +35,7 @@ $([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)\..\)) $(PySourcePath)\ - - $(PySourcePath)PCbuild\win32\ $(Py_OutDir)\win32\ @@ -60,29 +58,6 @@ ..\\..\\.. - - - $(PySourcePath)PCbuild\win32t\ - $(Py_OutDir)\win32t\ - $(PySourcePath)PCbuild\amd64t\ - $(Py_OutDir)\amd64t\ - $(PySourcePath)PCbuild\arm32t\ - $(Py_OutDir)\arm32t\ - $(PySourcePath)PCbuild\arm64t\ - $(Py_OutDir)\arm64t\ - $(BuildPath32) - $(BuildPath64) - $(BuildPathArm32) - $(BuildPathArm64) - $(PySourcePath)PCbuild\$(ArchName)t\ - $(BuildPath)\ - $(BuildPath)instrumented\ - - - ..\\.. - ..\\..\\.. - - $(EXTERNALS_DIR) @@ -259,34 +234,39 @@ python3t python3 - - .cp$(MajorVersionNumber)$(MinorVersionNumber)-win32 .cp$(MajorVersionNumber)$(MinorVersionNumber)-win_arm32 .cp$(MajorVersionNumber)$(MinorVersionNumber)-win_arm64 .cp$(MajorVersionNumber)$(MinorVersionNumber)-win_amd64 - - .pyd - $(MajorVersionNumber).$(MinorVersionNumber)$(PyArchExt)$(PyTestExt) + + + .cp$(MajorVersionNumber)$(MinorVersionNumber)t-win32 + .cp$(MajorVersionNumber)$(MinorVersionNumber)t-win_arm32 + .cp$(MajorVersionNumber)$(MinorVersionNumber)t-win_arm64 + .cp$(MajorVersionNumber)$(MinorVersionNumber)t-win_amd64 + + + $(MajorVersionNumber).$(MinorVersionNumber)t$(PyArchExt)$(PyTestExt) + + + + + .pyd - - .cp$(MajorVersionNumber)$(MinorVersionNumber)t-win32 - .cp$(MajorVersionNumber)$(MinorVersionNumber)t-win_arm32 - .cp$(MajorVersionNumber)$(MinorVersionNumber)t-win_arm64 - .cp$(MajorVersionNumber)$(MinorVersionNumber)t-win_amd64 + $(FreethreadedPydTag) $(PydTag).pyd - $(MajorVersionNumber).$(MinorVersionNumber)t$(PyArchExt)$(PyTestExt) + $(FreethreadedSysWinVer) diff --git a/PCbuild/rt.bat b/PCbuild/rt.bat index e37c387bd4a0e8..293f99ae135faa 100644 --- a/PCbuild/rt.bat +++ b/PCbuild/rt.bat @@ -36,14 +36,13 @@ set qmode= set dashO= set regrtestargs=--fast-ci set exe= -set prefixtail= :CheckOpts if "%1"=="-O" (set dashO=-O) & shift & goto CheckOpts if "%1"=="-q" (set qmode=yes) & shift & goto CheckOpts if "%1"=="-d" (set suffix=_d) & shift & goto CheckOpts rem HACK: Need some way to infer the version number in this script -if "%1"=="--disable-gil" (set pyname=python3.13t) & (set prefixtail=t) & shift & goto CheckOpts +if "%1"=="--disable-gil" (set pyname=python3.13t) & shift & goto CheckOpts if "%1"=="-win32" (set prefix=%pcbuild%win32) & shift & goto CheckOpts if "%1"=="-x64" (set prefix=%pcbuild%amd64) & shift & goto CheckOpts if "%1"=="-amd64" (set prefix=%pcbuild%amd64) & shift & goto CheckOpts @@ -53,7 +52,7 @@ if "%1"=="-p" (call :SetPlatform %~2) & shift & shift & goto CheckOpts if NOT "%1"=="" (set regrtestargs=%regrtestargs% %1) & shift & goto CheckOpts if not defined prefix set prefix=%pcbuild%amd64 -set exe=%prefix%%prefixtail%\%pyname%%suffix%.exe +set exe=%prefix%\%pyname%%suffix%.exe set cmd="%exe%" %dashO% -m test %regrtestargs% if defined qmode goto Qmode @@ -61,7 +60,7 @@ echo Deleting .pyc files ... "%exe%" "%pcbuild%rmpyc.py" echo Cleaning _pth files ... -if exist %prefix%%prefixtail%\*._pth del %prefix%%prefixtail%\*._pth +if exist %prefix%\*._pth del %prefix%\*._pth echo on %cmd% diff --git a/PCbuild/venvlauncher.vcxproj b/PCbuild/venvlauncher.vcxproj index ad33017e65cb4b..1193e032245c94 100644 --- a/PCbuild/venvlauncher.vcxproj +++ b/PCbuild/venvlauncher.vcxproj @@ -69,12 +69,13 @@ {494BAC80-A60C-43A9-99E7-ACB691CE2C4D} venvlauncher - venvlauncher false + venvlauncher + $(TargetName)t Application MultiByte diff --git a/PCbuild/venvwlauncher.vcxproj b/PCbuild/venvwlauncher.vcxproj index 4ff074dcfc661d..1b61718201367f 100644 --- a/PCbuild/venvwlauncher.vcxproj +++ b/PCbuild/venvwlauncher.vcxproj @@ -69,12 +69,13 @@ {FDB84CBB-2FB6-47C8-A2D6-091E0833239D} venvwlauncher - venvwlauncher false + venvwlauncher + $(TargetName)t Application MultiByte diff --git a/Tools/msi/bundle/bundle.targets b/Tools/msi/bundle/bundle.targets index 9c7410fe514d19..cb3effb4434843 100644 --- a/Tools/msi/bundle/bundle.targets +++ b/Tools/msi/bundle/bundle.targets @@ -72,6 +72,7 @@ + diff --git a/Tools/msi/bundle/bundle.wxs b/Tools/msi/bundle/bundle.wxs index 8b12baae31105e..3ffc939b4f908d 100644 --- a/Tools/msi/bundle/bundle.wxs +++ b/Tools/msi/bundle/bundle.wxs @@ -82,6 +82,7 @@ + @@ -104,6 +105,9 @@ + + + diff --git a/Tools/msi/bundle/packagegroups/freethreaded.wxs b/Tools/msi/bundle/packagegroups/freethreaded.wxs new file mode 100644 index 00000000000000..121ca34ab66157 --- /dev/null +++ b/Tools/msi/bundle/packagegroups/freethreaded.wxs @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Tools/msi/freethreaded/freethreaded.wixproj b/Tools/msi/freethreaded/freethreaded.wixproj new file mode 100644 index 00000000000000..0b4bd055d77977 --- /dev/null +++ b/Tools/msi/freethreaded/freethreaded.wixproj @@ -0,0 +1,20 @@ + + + + {1B4502D5-B627-4F50-ABEA-4CC5A8E88265} + 2.0 + freethreaded + Package + + + + + + + + + + + + + \ No newline at end of file diff --git a/Tools/msi/freethreaded/freethreaded.wxs b/Tools/msi/freethreaded/freethreaded.wxs new file mode 100644 index 00000000000000..063aa28bf09fce --- /dev/null +++ b/Tools/msi/freethreaded/freethreaded.wxs @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/Tools/msi/freethreaded/freethreaded_d.wixproj b/Tools/msi/freethreaded/freethreaded_d.wixproj new file mode 100644 index 00000000000000..e1563d4f907126 --- /dev/null +++ b/Tools/msi/freethreaded/freethreaded_d.wixproj @@ -0,0 +1,20 @@ + + + + {D3677DCF-098A-4398-9FA5-8E74AC37E0DF} + 2.0 + freethreaded_d + Package + + + + + + + + + + + + + \ No newline at end of file diff --git a/Tools/msi/freethreaded/freethreaded_d.wxs b/Tools/msi/freethreaded/freethreaded_d.wxs new file mode 100644 index 00000000000000..cddf22a6c803d3 --- /dev/null +++ b/Tools/msi/freethreaded/freethreaded_d.wxs @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/Tools/msi/freethreaded/freethreaded_en-US.wxl_template b/Tools/msi/freethreaded/freethreaded_en-US.wxl_template new file mode 100644 index 00000000000000..b9747eb256d24b --- /dev/null +++ b/Tools/msi/freethreaded/freethreaded_en-US.wxl_template @@ -0,0 +1,8 @@ + + + Freethreaded Interpreter + freethreaded + Python {{ShortVersion}} ({{Bitness}}, freethreaded) + Launches the !(loc.ProductName) freethreaded interpreter. + https://www.python.org/ + diff --git a/Tools/msi/freethreaded/freethreaded_files.wxs b/Tools/msi/freethreaded/freethreaded_files.wxs new file mode 100644 index 00000000000000..7c74d129dc077f --- /dev/null +++ b/Tools/msi/freethreaded/freethreaded_files.wxs @@ -0,0 +1,175 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tools/msi/freethreaded/freethreaded_pdb.wixproj b/Tools/msi/freethreaded/freethreaded_pdb.wixproj new file mode 100644 index 00000000000000..789a4f55ae5191 --- /dev/null +++ b/Tools/msi/freethreaded/freethreaded_pdb.wixproj @@ -0,0 +1,20 @@ + + + + {E98E7539-64E7-4DCE-AACD-01E3ADE40EFD} + 2.0 + freethreaded_pdb + Package + + + + + + + + + + + + + \ No newline at end of file diff --git a/Tools/msi/freethreaded/freethreaded_pdb.wxs b/Tools/msi/freethreaded/freethreaded_pdb.wxs new file mode 100644 index 00000000000000..302ac416fe9275 --- /dev/null +++ b/Tools/msi/freethreaded/freethreaded_pdb.wxs @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/Tools/msi/lib/lib_files.wxs b/Tools/msi/lib/lib_files.wxs index a82cad596d47a6..e6f04b33bbe16a 100644 --- a/Tools/msi/lib/lib_files.wxs +++ b/Tools/msi/lib/lib_files.wxs @@ -63,10 +63,10 @@ - + - + diff --git a/Tools/msi/msi.props b/Tools/msi/msi.props index cfb3ca9e76e24c..372c4823bce07f 100644 --- a/Tools/msi/msi.props +++ b/Tools/msi/msi.props @@ -24,14 +24,14 @@ This URI is used to generate the various GUIDs used by the installer. Installers built with the same URI will upgrade each other or block when attempting to downgrade. - + By default, this is the local computer name, which will produce installers that do not interfere with other installers. Products that intend to bundle Python should rebuild these modules with their own URI to avoid conflicting with the official releases. - + The official releases use "https://www.python.org/$(ArchName)" - + This is not the same as the DownloadUrl property used in the bundle projects. --> @@ -39,7 +39,7 @@ $(ReleaseUri)/ - + @@ -63,13 +63,17 @@ $(MajorVersionNumber).$(MinorVersionNumber).$(Field3Value).0 - + + + false + + $([System.Math]::Floor($([System.DateTime]::Now.Subtract($([System.DateTime]::new(2001, 1, 1))).TotalDays))) $(MajorVersionNumber).$(MinorVersionNumber).$(MicroVersionNumber)dev$(RevisionNumber) $(MajorVersionNumber).$(MinorVersionNumber).$(RevisionNumber).0 - + 32-bit 64-bit @@ -91,9 +95,12 @@ PyDebugExt=$(PyDebugExt); PyArchExt=$(PyArchExt); PyTestExt=$(PyTestExt); + PydTag=$(PydTag); + FreethreadedPydTag=$(FreethreadedPydTag); OptionalFeatureName=$(OutputName); ssltag=$(OpenSSLDLLSuffix); Suffix32=$(PyArchExt); + IncludeFreethreaded=$(IncludeFreethreaded); $(DefineConstants);CRTRedist=$(CRTRedist); @@ -139,7 +146,7 @@ - + <_Uuid Include="CoreUpgradeCode"> upgradecode @@ -162,6 +169,12 @@ <_Uuid Include="PythonRegComponentGuid"> registry/$(OutputName) + <_Uuid Include="FreethreadedPythonExeComponentGuid" Condition="$(IncludeFreethreaded)"> + freethreaded/python.exe + + <_Uuid Include="FreethreadedPythonwExeComponentGuid" Condition="$(IncludeFreethreaded)"> + freethreaded/pythonw.exe + @(_Uuid->'("%(Identity)", "$(MajorVersionNumber).$(MinorVersionNumber)/%(Uri)")',',') <_GenerateCommand>import uuid; print('\n'.join('{}={}'.format(i, uuid.uuid5(uuid.UUID('c8d9733e-a70c-43ff-ab0c-e26456f11083'), '$(ReleaseUri.Replace(`{arch}`, `$(ArchName)`))' + j)) for i,j in [$(_Uuids.Replace(`"`,`'`))])) - + - + - + $(DefineConstants);@(_UuidValue,';'); From 052897663b439a6c0c256ab142f012d818c87ebd Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Mon, 18 Dec 2023 21:57:46 +0000 Subject: [PATCH 08/19] Add visible option to MSI --- .github/workflows/build_msi.yml | 2 ++ Tools/msi/bundle/Default.thm | 1 + Tools/msi/bundle/Default.wxl | 1 + Tools/msi/bundle/bundle.wxs | 6 ++++++ 4 files changed, 10 insertions(+) diff --git a/.github/workflows/build_msi.yml b/.github/workflows/build_msi.yml index 29282dffa37ec0..65d32c734e7745 100644 --- a/.github/workflows/build_msi.yml +++ b/.github/workflows/build_msi.yml @@ -32,6 +32,8 @@ jobs: strategy: matrix: type: [x86, x64, arm64] + env: + IncludeFreethreaded: true steps: - uses: actions/checkout@v4 - name: Build CPython installer diff --git a/Tools/msi/bundle/Default.thm b/Tools/msi/bundle/Default.thm index d1b0f5bd9c1d4a..471d37acc33b3d 100644 --- a/Tools/msi/bundle/Default.thm +++ b/Tools/msi/bundle/Default.thm @@ -83,6 +83,7 @@ #(loc.PrecompileLabel) #(loc.Include_symbolsLabel) #(loc.Include_debugLabel) + #(loc.Include_freethreadedLabel) #(loc.CustomLocationLabel) diff --git a/Tools/msi/bundle/Default.wxl b/Tools/msi/bundle/Default.wxl index 6f8befba3a2523..4091ce531afcd2 100644 --- a/Tools/msi/bundle/Default.wxl +++ b/Tools/msi/bundle/Default.wxl @@ -91,6 +91,7 @@ Select Customize to review current options. &Precompile standard library Download debugging &symbols Download debu&g binaries (requires VS 2017 or later) + Download &free-threaded binaries [ActionLikeInstallation] Progress [ActionLikeInstalling]: diff --git a/Tools/msi/bundle/bundle.wxs b/Tools/msi/bundle/bundle.wxs index 3ffc939b4f908d..9b4f072152d5c0 100644 --- a/Tools/msi/bundle/bundle.wxs +++ b/Tools/msi/bundle/bundle.wxs @@ -82,7 +82,13 @@ + + + + + + From 198082efec6a0e6662e192690dad24191eb3b03a Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Mon, 18 Dec 2023 23:34:15 +0000 Subject: [PATCH 09/19] Build freethreaded properly in tools/msi/build.bat --- Tools/msi/build.bat | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/Tools/msi/build.bat b/Tools/msi/build.bat index b9aab887c4939b..2fe8a475e7e3a3 100644 --- a/Tools/msi/build.bat +++ b/Tools/msi/build.bat @@ -22,6 +22,9 @@ if "%~1" EQU "--no-test-marker" (set BUILDTEST=) && shift && goto CheckOpts if "%~1" EQU "--test-marker" (set BUILDTEST=--test-marker) && shift && goto CheckOpts if "%~1" EQU "--pack" (set BUILDPACK=1) && shift && goto CheckOpts if "%~1" EQU "-r" (set REBUILD=-r) && shift && goto CheckOpts +rem %IncludeFreethreaded% is recognised by the MSI build, but not the regular build. +rem We use it to build twice and then build the installer with its extra option +if /I "%~1" EQU "--disable-gil" (set IncludeFreethreaded=true) && shift && goto CheckOpts if not defined BUILDX86 if not defined BUILDX64 if not defined BUILDARM64 (set BUILDX86=1) && (set BUILDX64=1) @@ -44,6 +47,20 @@ if errorlevel 1 exit /B %ERRORLEVEL% if defined BUILDARM64 call "%PCBUILD%build.bat" -p ARM64 -e %REBUILD% %BUILDTEST% if errorlevel 1 exit /B %ERRORLEVEL% +if /I "%IncludeFreethreaded%"=="true" ( + rem Cannot "exit /B" inside an if block because %ERRORLEVEL% will be wrong. + rem We just skip everything after the first "errorlevel 1" and then exit after + if defined BUILDX86 call "%PCBUILD%build.bat" -p Win32 -d -e %REBUILD% %BUILDTEST% --disable-gil + if not errorlevel 1 if defined BUILDX86 call "%PCBUILD%build.bat" -p Win32 -e %REBUILD% %BUILDTEST% --disable-gil + + if not errorlevel 1 if defined BUILDX64 call "%PCBUILD%build.bat" -p x64 -d -e %REBUILD% %BUILDTEST% --disable-gil + if not errorlevel 1 if defined BUILDX64 call "%PCBUILD%build.bat" -p x64 -e %REBUILD% %BUILDTEST% --disable-gil + + if not errorlevel 1 if defined BUILDARM64 call "%PCBUILD%build.bat" -p ARM64 -d -e %REBUILD% %BUILDTEST% --disable-gil + if not errorlevel 1 if defined BUILDARM64 call "%PCBUILD%build.bat" -p ARM64 -e %REBUILD% %BUILDTEST% --disable-gil +) +if errorlevel 1 exit /B %ERRORLEVEL% + if defined BUILDDOC call "%PCBUILD%..\Doc\make.bat" html if errorlevel 1 exit /B %ERRORLEVEL% From 65efd4e559ecb56f04145493c08e0c70f4ab01c4 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Tue, 19 Dec 2023 17:46:55 +0000 Subject: [PATCH 10/19] Test fixes --- Lib/test/test_launcher.py | 2 +- Lib/test/test_regrtest.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_launcher.py b/Lib/test/test_launcher.py index bcd4ed63bf25a0..4d204c077f529d 100644 --- a/Lib/test/test_launcher.py +++ b/Lib/test/test_launcher.py @@ -232,7 +232,7 @@ def run_py(self, args, env=None, allow_fail=False, expect_returncode=0, argv=Non p.stdin.close() p.wait(10) out = p.stdout.read().decode("utf-8", "replace") - err = p.stderr.read().decode("ascii", "replace") + err = p.stderr.read().decode("ascii", "replace").replace("\uFFFD", "?") if p.returncode != expect_returncode and support.verbose and not allow_fail: print("++ COMMAND ++") print([self.py_exe, *args]) diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py index a3ebb11b19af04..89562fa5eac62c 100644 --- a/Lib/test/test_regrtest.py +++ b/Lib/test/test_regrtest.py @@ -846,7 +846,7 @@ def test_tools_buildbot_test(self): if not support.Py_DEBUG: test_args.append('+d') # Release build, use python.exe if sysconfig.get_config_var("Py_GIL_DISABLED"): - rt_args.append('--disable-gil') + test_args.append('--disable-gil') self.run_batch(script, *test_args, *self.tests) @unittest.skipUnless(sys.platform == 'win32', 'Windows only') From 55205faeded2b0bd4b3d3953181635e930b34860 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Tue, 19 Dec 2023 21:40:37 +0000 Subject: [PATCH 11/19] Fix launcher tests --- Lib/test/test_launcher.py | 38 +++++++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/Lib/test/test_launcher.py b/Lib/test/test_launcher.py index 4d204c077f529d..3da6173cfd3f13 100644 --- a/Lib/test/test_launcher.py +++ b/Lib/test/test_launcher.py @@ -19,8 +19,10 @@ PY_EXE = "py.exe" +DEBUG_BUILD = False if sys.executable.casefold().endswith("_d.exe".casefold()): PY_EXE = "py_d.exe" + DEBUG_BUILD = True # Registry data to create. On removal, everything beneath top-level names will # be deleted. @@ -273,7 +275,7 @@ def script(self, content, encoding="utf-8"): def fake_venv(self): venv = Path.cwd() / "Scripts" venv.mkdir(exist_ok=True, parents=True) - venv_exe = (venv / Path(sys.executable).name) + venv_exe = (venv / ("python_d.exe" if DEBUG_BUILD else "python.exe")) venv_exe.touch() try: yield venv_exe, {"VIRTUAL_ENV": str(venv.parent)} @@ -521,6 +523,9 @@ def test_virtualenv_in_list(self): self.assertEqual(str(venv_exe), m.group(1)) break else: + if support.verbose: + print(data["stdout"]) + print(data["stderr"]) self.fail("did not find active venv path") data = self.run_py(["-0"], env=env) @@ -616,25 +621,29 @@ def test_py_handle_64_in_ini(self): self.assertEqual("True", data["SearchInfo.oldStyleTag"]) def test_search_path(self): - stem = Path(sys.executable).stem + exe = Path("arbitrary-exe-name.exe").absolute() + exe.touch() + self.addCleanup(exe.unlink) with self.py_ini(TEST_PY_DEFAULTS): - with self.script(f"#! /usr/bin/env {stem} -prearg") as script: + with self.script(f"#! /usr/bin/env {exe.stem} -prearg") as script: data = self.run_py( [script, "-postarg"], - env={"PATH": f"{Path(sys.executable).parent};{os.getenv('PATH')}"}, + env={"PATH": f"{exe.parent};{os.getenv('PATH')}"}, ) - self.assertEqual(f"{sys.executable} -prearg {script} -postarg", data["stdout"].strip()) + self.assertEqual(f"{exe} -prearg {script} -postarg", data["stdout"].strip()) def test_search_path_exe(self): # Leave the .exe on the name to ensure we don't add it a second time - name = Path(sys.executable).name + exe = Path("arbitrary-exe-name.exe").absolute() + exe.touch() + self.addCleanup(exe.unlink) with self.py_ini(TEST_PY_DEFAULTS): - with self.script(f"#! /usr/bin/env {name} -prearg") as script: + with self.script(f"#! /usr/bin/env {exe.name} -prearg") as script: data = self.run_py( [script, "-postarg"], - env={"PATH": f"{Path(sys.executable).parent};{os.getenv('PATH')}"}, + env={"PATH": f"{exe.parent};{os.getenv('PATH')}"}, ) - self.assertEqual(f"{sys.executable} -prearg {script} -postarg", data["stdout"].strip()) + self.assertEqual(f"{exe} -prearg {script} -postarg", data["stdout"].strip()) def test_recursive_search_path(self): stem = self.get_py_exe().stem @@ -727,15 +736,18 @@ def test_shebang_command_in_venv(self): data = self.run_py([script], expect_returncode=103) with self.fake_venv() as (venv_exe, env): - # Put a real Python (ourselves) on PATH as a distraction. + # Put a "normal" Python on PATH as a distraction. # The active VIRTUAL_ENV should be preferred when the name isn't an # exact match. - env["PATH"] = f"{Path(sys.executable).parent};{os.environ['PATH']}" + exe = Path(Path(venv_exe).name).absolute() + exe.touch() + self.addCleanup(exe.unlink) + env["PATH"] = f"{exe.parent};{os.environ['PATH']}" with self.script(f'#! /usr/bin/env {stem} arg1') as script: data = self.run_py([script], env=env) self.assertEqual(data["stdout"].strip(), f"{venv_exe} arg1 {script}") - with self.script(f'#! /usr/bin/env {Path(sys.executable).stem} arg1') as script: + with self.script(f'#! /usr/bin/env {exe.stem} arg1') as script: data = self.run_py([script], env=env) - self.assertEqual(data["stdout"].strip(), f"{sys.executable} arg1 {script}") + self.assertEqual(data["stdout"].strip(), f"{exe} arg1 {script}") From 9d9dd9b78c9fb93d567ed856ce261a0558cb60ed Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Tue, 19 Dec 2023 22:32:37 +0000 Subject: [PATCH 12/19] NEWS and whitespace --- .../next/Windows/2023-12-19-22-32-28.gh-issue-112984.F7kFMl.rst | 1 + PC/venvlauncher.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Windows/2023-12-19-22-32-28.gh-issue-112984.F7kFMl.rst diff --git a/Misc/NEWS.d/next/Windows/2023-12-19-22-32-28.gh-issue-112984.F7kFMl.rst b/Misc/NEWS.d/next/Windows/2023-12-19-22-32-28.gh-issue-112984.F7kFMl.rst new file mode 100644 index 00000000000000..429cd5bc923e09 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2023-12-19-22-32-28.gh-issue-112984.F7kFMl.rst @@ -0,0 +1 @@ +Adds free-threaded binaries to Windows installer as an optional component. diff --git a/PC/venvlauncher.c b/PC/venvlauncher.c index a16ffa42667d00..511665eb7ed741 100644 --- a/PC/venvlauncher.c +++ b/PC/venvlauncher.c @@ -1,4 +1,4 @@ -/* +/* * venv redirector for Windows * * This launcher looks for a nearby pyvenv.cfg to find the correct home From d027b9338808a71b97ef12e12219c2baa65d319f Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Wed, 20 Dec 2023 19:53:05 +0000 Subject: [PATCH 13/19] Update venv and tests --- Lib/test/test_venv.py | 8 +- Lib/venv/__init__.py | 266 ++++++++++-------- PC/venvlauncher.c | 29 ++ Tools/msi/freethreaded/freethreaded_files.wxs | 4 +- Tools/msi/lib/lib_files.wxs | 8 +- 5 files changed, 196 insertions(+), 119 deletions(-) diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py index 8ecb23ff384362..5969fa00a64f93 100644 --- a/Lib/test/test_venv.py +++ b/Lib/test/test_venv.py @@ -223,8 +223,14 @@ def test_prompt(self): def test_upgrade_dependencies(self): builder = venv.EnvBuilder() - bin_path = 'Scripts' if sys.platform == 'win32' else 'bin' + bin_path = 'bin' python_exe = os.path.split(sys.executable)[1] + if sys.platform == 'win32': + bin_path = 'Scripts' + if os.path.normcase(os.path.splitext(python_exe)[0]).endswith('_d'): + python_exe = 'python_d.exe' + else: + python_exe = 'python.exe' with tempfile.TemporaryDirectory() as fake_env_dir: expect_exe = os.path.normcase( os.path.join(fake_env_dir, bin_path, python_exe) diff --git a/Lib/venv/__init__.py b/Lib/venv/__init__.py index 27f64f2fc4a941..4e5d54b4e00180 100644 --- a/Lib/venv/__init__.py +++ b/Lib/venv/__init__.py @@ -139,6 +139,11 @@ def create_if_needed(d): 'check that your PATH environment variable is ' 'correctly set.') dirname, exename = os.path.split(os.path.abspath(executable)) + if sys.platform == 'win32': + # Always create the simplest name in the venv. It will either be a + # link back to executable, or a copy of the appropriate launcher + _d = '_d' if os.path.splitext(exename)[0].endswith('_d') else '' + exename = f'python{_d}.exe' context.executable = executable context.python_dir = dirname context.python_exe = exename @@ -222,71 +227,26 @@ def create_configuration(self, context): args = ' '.join(args) f.write(f'command = {sys.executable} -m venv {args}\n') - if os.name != 'nt': - def symlink_or_copy(self, src, dst, relative_symlinks_ok=False): - """ - Try symlinking a file, and if that fails, fall back to copying. - """ - force_copy = not self.symlinks - if not force_copy: - try: - if not os.path.islink(dst): # can't link to itself! - if relative_symlinks_ok: - assert os.path.dirname(src) == os.path.dirname(dst) - os.symlink(os.path.basename(src), dst) - else: - os.symlink(src, dst) - except Exception: # may need to use a more specific exception - logger.warning('Unable to symlink %r to %r', src, dst) - force_copy = True - if force_copy: - shutil.copyfile(src, dst) - else: - def symlink_or_copy(self, src, dst, relative_symlinks_ok=False): - """ - Try symlinking a file, and if that fails, fall back to copying. - """ - bad_src = os.path.lexists(src) and not os.path.exists(src) - if self.symlinks and not bad_src and not os.path.islink(dst): - try: + def symlink_or_copy(self, src, dst, relative_symlinks_ok=False): + """ + Try symlinking a file, and if that fails, fall back to copying. + (Unused on Windows, because we can't just copy a failed symlink file: we + switch to a different set of files instead.) + """ + assert os.name != 'nt' + force_copy = not self.symlinks + if not force_copy: + try: + if not os.path.islink(dst): # can't link to itself! if relative_symlinks_ok: assert os.path.dirname(src) == os.path.dirname(dst) os.symlink(os.path.basename(src), dst) else: os.symlink(src, dst) - return - except Exception: # may need to use a more specific exception - logger.warning('Unable to symlink %r to %r', src, dst) - - # On Windows, we rewrite symlinks to our base python.exe into - # copies of venvlauncher.exe - basename, ext = os.path.splitext(os.path.basename(src)) - srcfn = os.path.join(os.path.dirname(__file__), - "scripts", - "nt", - basename + ext) - # Builds or venv's from builds need to remap source file - # locations, as we do not put them into Lib/venv/scripts - if sysconfig.is_python_build() or not os.path.isfile(srcfn): - if basename.endswith('_d'): - ext = '_d' + ext - basename = basename[:-2] - if basename.startswith('python'): - basename = 'venvlauncher' - if sysconfig.get_config_var('Py_GIL_DISABLED'): - basename += 't' - elif basename.startswith('pythonw'): - basename = 'venvwlauncher' - if sysconfig.get_config_var('Py_GIL_DISABLED'): - basename += 't' - src = os.path.join(os.path.dirname(src), basename + ext) - else: - src = srcfn - if not os.path.exists(src): - if not bad_src: - logger.warning('Unable to copy %r', src) - return - + except Exception: # may need to use a more specific exception + logger.warning('Unable to symlink %r to %r', src, dst) + force_copy = True + if force_copy: shutil.copyfile(src, dst) def create_git_ignore_file(self, context): @@ -302,22 +262,23 @@ def create_git_ignore_file(self, context): 'see https://docs.python.org/3/library/venv.html\n') file.write('*\n') - def setup_python(self, context): - """ - Set up a Python executable in the environment. + if os.name != 'nt': + def setup_python(self, context): + """ + Set up a Python executable in the environment. - :param context: The information for the environment creation request - being processed. - """ - binpath = context.bin_path - path = context.env_exe - copier = self.symlink_or_copy - dirname = context.python_dir - if os.name != 'nt': + :param context: The information for the environment creation request + being processed. + """ + binpath = context.bin_path + path = context.env_exe + copier = self.symlink_or_copy + dirname = context.python_dir copier(context.executable, path) if not os.path.islink(path): os.chmod(path, 0o755) - for suffix in ('python', 'python3', f'python3.{sys.version_info[1]}'): + for suffix in ('python', 'python3', + f'python3.{sys.version_info[1]}'): path = os.path.join(binpath, suffix) if not os.path.exists(path): # Issue 18807: make copies if @@ -325,35 +286,105 @@ def setup_python(self, context): copier(context.env_exe, path, relative_symlinks_ok=True) if not os.path.islink(path): os.chmod(path, 0o755) - else: - if self.symlinks: - # For symlinking, we need a complete copy of the root directory - # If symlinks fail, you'll get unnecessary copies of files, but - # we assume that if you've opted into symlinks on Windows then - # you know what you're doing. - suffixes = [ - f for f in os.listdir(dirname) if - os.path.normcase(os.path.splitext(f)[1]) in ('.exe', '.dll') - ] - if sysconfig.is_python_build(): - suffixes = [ - f for f in suffixes if - os.path.normcase(f).startswith(('python', 'vcruntime')) - ] + + else: + def setup_python(self, context): + """ + Set up a Python executable in the environment. + + :param context: The information for the environment creation request + being processed. + """ + binpath = context.bin_path + dirname = context.python_dir + exename = os.path.basename(context.env_exe) + exe_stem = os.path.splitext(exename)[0] + exe_d = '_d' if os.path.normcase(exe_stem).endswith('_d') else '' + if sysconfig.is_python_build(): + scripts = dirname else: - if sysconfig.get_config_var("Py_GIL_DISABLED"): - v = f'{sys.version_info.major}.{sys.version_info.minor}t' - else: - v = '' - suffixes = {f'python{v}.exe', f'python{v}_d.exe', - f'pythonw{v}.exe', f'pythonw{v}_d.exe'} - base_exe = os.path.basename(context.env_exe) - suffixes.add(base_exe) + scripts = os.path.join(os.path.dirname(__file__), + 'scripts', 'nt') + if not sysconfig.get_config_var("Py_GIL_DISABLED"): + python_exe = os.path.join(dirname, f'python{exe_d}.exe') + pythonw_exe = os.path.join(dirname, f'pythonw{exe_d}.exe') + link_sources = { + 'python.exe': python_exe, + f'python{exe_d}.exe': python_exe, + 'pythonw.exe': pythonw_exe, + f'pythonw{exe_d}.exe': pythonw_exe, + } + python_exe = os.path.join(scripts, f'venvlauncher{exe_d}.exe') + pythonw_exe = os.path.join(scripts, f'venvwlauncher{exe_d}.exe') + copy_sources = { + 'python.exe': python_exe, + f'python{exe_d}.exe': python_exe, + 'pythonw.exe': pythonw_exe, + f'pythonw{exe_d}.exe': pythonw_exe, + } + else: + exe_t = f'3.{sys.version_info[1]}t' + python_exe = os.path.join(dirname, f'python{exe_t}{exe_d}.exe') + pythonw_exe = os.path.join(dirname, f'pythonw{exe_t}{exe_d}.exe') + link_sources = { + 'python.exe': python_exe, + f'python{exe_d}.exe': python_exe, + f'python{exe_t}.exe': python_exe, + f'python{exe_t}{exe_d}.exe': python_exe, + 'pythonw.exe': pythonw_exe, + f'pythonw{exe_d}.exe': pythonw_exe, + f'pythonw{exe_t}.exe': pythonw_exe, + f'pythonw{exe_t}{exe_d}.exe': pythonw_exe, + } + python_exe = os.path.join(scripts, f'venvlaunchert{exe_d}.exe') + pythonw_exe = os.path.join(scripts, f'venvwlaunchert{exe_d}.exe') + copy_sources = { + 'python.exe': python_exe, + f'python{exe_d}.exe': python_exe, + f'python{exe_t}.exe': python_exe, + f'python{exe_t}{exe_d}.exe': python_exe, + 'pythonw.exe': pythonw_exe, + f'pythonw{exe_d}.exe': pythonw_exe, + f'pythonw{exe_t}.exe': pythonw_exe, + f'pythonw{exe_t}{exe_d}.exe': pythonw_exe, + } + + do_copies = True + if self.symlinks: + do_copies = False + # For symlinking, we need all the DLLs to be available alongside + # the executables. + link_sources.update({ + f: os.path.join(dirname, f) for f in os.listdir(dirname) + if os.path.normcase(f).startswith(('python', 'vcruntime')) + and os.path.normcase(os.path.splitext(f)[1]) == '.dll' + }) + + to_unlink = [] + for dest, src in link_sources.items(): + dest = os.path.join(binpath, dest) + try: + os.symlink(src, dest) + to_unlink.append(dest) + except OSError: + logger.warning('Unable to symlink %r to %r', src, dst) + do_copies = True + for f in to_unlink: + try: + os.unlink(f) + except OSError: + logger.warning('Failed to clean up symlink %r', + f) + logger.warning('Retrying with copies') + break - for suffix in suffixes: - src = os.path.join(dirname, suffix) - if os.path.lexists(src): - copier(src, os.path.join(binpath, suffix)) + if do_copies: + for dest, src in copy_sources.items(): + dest = os.path.join(binpath, dest) + try: + shutil.copy2(src, dest) + except OSError: + logger.warning('Unable to copy %r to %r', src, dest) if sysconfig.is_python_build(): # copy init.tcl @@ -446,6 +477,14 @@ def install_scripts(self, context, path): """ binpath = context.bin_path plen = len(path) + if os.name == 'nt': + def skip_file(f): + f = os.path.normcase(f) + return (f.startswith(('python', 'venv')) + and f.endswith(('.exe', '.pdb'))) + else: + def skip_file(f): + return False for root, dirs, files in os.walk(path): if root == path: # at top-level, remove irrelevant dirs for d in dirs[:]: @@ -453,8 +492,7 @@ def install_scripts(self, context, path): dirs.remove(d) continue # ignore files in top level for f in files: - if (os.name == 'nt' and f.startswith('python') - and f.endswith(('.exe', '.pdb'))): + if skip_file(f): continue srcfile = os.path.join(root, f) suffix = root[plen:].split(os.sep)[2:] @@ -465,20 +503,24 @@ def install_scripts(self, context, path): if not os.path.exists(dstdir): os.makedirs(dstdir) dstfile = os.path.join(dstdir, f) + if os.name == 'nt' and srcfile.endswith(('.exe', '.pdb')): + shutil.copy2(srcfile, dstfile) + continue with open(srcfile, 'rb') as f: data = f.read() - if not srcfile.endswith(('.exe', '.pdb')): - try: - data = data.decode('utf-8') - data = self.replace_variables(data, context) - data = data.encode('utf-8') - except UnicodeError as e: - data = None - logger.warning('unable to copy script %r, ' - 'may be binary: %s', srcfile, e) - if data is not None: + try: + data = data.decode('utf-8') + new_data = (self.replace_variables(data, context) + .encode('utf-8')) + except UnicodeError as e: + logger.warning('unable to copy script %r, ' + 'may be binary: %s', srcfile, e) + continue + if new_data == data: + shutil.copy2(srcfile, dstfile) + else: with open(dstfile, 'wb') as f: - f.write(data) + f.write(new_data) shutil.copymode(srcfile, dstfile) def upgrade_dependencies(self, context): diff --git a/PC/venvlauncher.c b/PC/venvlauncher.c index 511665eb7ed741..fe97d32e93b5f6 100644 --- a/PC/venvlauncher.c +++ b/PC/venvlauncher.c @@ -321,6 +321,30 @@ locate_python(wchar_t *path, size_t maxlen) } +int +smuggle_path() +{ + wchar_t buffer[MAXLEN]; + // We could use argv[0], but that may be wrong in certain rare cases (if the + // user is doing something weird like symlinks to venv redirectors), and + // what we _really_ want is the directory of the venv. We always copy the + // redirectors, so if we've made the venv, this will be correct. + DWORD len = GetModuleFileNameW(NULL, buffer, MAXLEN); + if (!len) { + winerror(GetLastError(), L"Failed to get own executable path"); + return RC_INTERNAL_ERROR; + } + buffer[len] = L'\0'; + debug(L"Setting __PYVENV_LAUNCHER__ = '%s'", buffer); + + if (!SetEnvironmentVariableW(L"__PYVENV_LAUNCHER__", buffer)) { + winerror(GetLastError(), L"Failed to set launcher environment"); + return RC_INTERNAL_ERROR; + } + + return 0; +} + /* * Process creation */ @@ -458,6 +482,11 @@ process(int argc, wchar_t ** argv) exitCode = locate_python(home_path, MAXLEN); if (exitCode) return exitCode; + // We do not update argv[0] to point at the target runtime, and so we do not + // pass through our original argv[0] in an environment variable. + //exitCode = smuggle_path(); + //if (exitCode) return exitCode; + exitCode = launch(home_path, GetCommandLineW()); return exitCode; } diff --git a/Tools/msi/freethreaded/freethreaded_files.wxs b/Tools/msi/freethreaded/freethreaded_files.wxs index 7c74d129dc077f..adaf63c69d5ade 100644 --- a/Tools/msi/freethreaded/freethreaded_files.wxs +++ b/Tools/msi/freethreaded/freethreaded_files.wxs @@ -105,10 +105,10 @@ - + - + diff --git a/Tools/msi/lib/lib_files.wxs b/Tools/msi/lib/lib_files.wxs index e6f04b33bbe16a..b8e16b5fe238a0 100644 --- a/Tools/msi/lib/lib_files.wxs +++ b/Tools/msi/lib/lib_files.wxs @@ -26,10 +26,10 @@ - + - + @@ -100,10 +100,10 @@ - + - + From 5e7cf0a2779aff44c6a1b48f46c3ea870044a28a Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Wed, 20 Dec 2023 20:13:04 +0000 Subject: [PATCH 14/19] Avoid comparing bytes and str --- Lib/venv/__init__.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Lib/venv/__init__.py b/Lib/venv/__init__.py index 4e5d54b4e00180..f04ca8fafcc33b 100644 --- a/Lib/venv/__init__.py +++ b/Lib/venv/__init__.py @@ -509,9 +509,10 @@ def skip_file(f): with open(srcfile, 'rb') as f: data = f.read() try: - data = data.decode('utf-8') - new_data = (self.replace_variables(data, context) - .encode('utf-8')) + new_data = ( + self.replace_variables(data.decode('utf-8'), context) + .encode('utf-8') + ) except UnicodeError as e: logger.warning('unable to copy script %r, ' 'may be binary: %s', srcfile, e) From 6e38ca1e3a92e4d5fd41ece23db9fb69465a08d5 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Wed, 20 Dec 2023 20:30:59 +0000 Subject: [PATCH 15/19] Ensure Py_GIL_DISABLED is consistent --- Lib/test/test_venv.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py index 5969fa00a64f93..09ac6091c05f9b 100644 --- a/Lib/test/test_venv.py +++ b/Lib/test/test_venv.py @@ -289,7 +289,9 @@ def test_sysconfig(self): # build environment ('is_python_build()', str(sysconfig.is_python_build())), ('get_makefile_filename()', sysconfig.get_makefile_filename()), - ('get_config_h_filename()', sysconfig.get_config_h_filename())): + ('get_config_h_filename()', sysconfig.get_config_h_filename()), + ('get_config_var("Py_GIL_DISABLED")', + str(sysconfig.get_config_var("Py_GIL_DISABLED")))): with self.subTest(call): cmd[2] = 'import sysconfig; print(sysconfig.%s)' % call out, err = check_output(cmd, encoding='utf-8') @@ -321,7 +323,9 @@ def test_sysconfig_symlinks(self): # build environment ('is_python_build()', str(sysconfig.is_python_build())), ('get_makefile_filename()', sysconfig.get_makefile_filename()), - ('get_config_h_filename()', sysconfig.get_config_h_filename())): + ('get_config_h_filename()', sysconfig.get_config_h_filename()), + ('get_config_var("Py_GIL_DISABLED")', + str(sysconfig.get_config_var("Py_GIL_DISABLED")))): with self.subTest(call): cmd[2] = 'import sysconfig; print(sysconfig.%s)' % call out, err = check_output(cmd, encoding='utf-8') From 011478bf4e55d7f26e661c007db5df32d235756f Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Wed, 20 Dec 2023 23:07:01 +0000 Subject: [PATCH 16/19] Update PC/layout script for free-threaded --- PC/layout/main.py | 110 ++++++++++++++++++++++++++------- PC/layout/support/constants.py | 3 + PC/layout/support/nuspec.py | 9 ++- PC/layout/support/options.py | 19 +++++- 4 files changed, 115 insertions(+), 26 deletions(-) diff --git a/PC/layout/main.py b/PC/layout/main.py index accfd51dd978fb..d176b272f1c19d 100644 --- a/PC/layout/main.py +++ b/PC/layout/main.py @@ -41,7 +41,7 @@ VENV_DIRS_ONLY = FileNameSet("venv", "ensurepip") -EXCLUDE_FROM_PYDS = FileStemSet("python*", "pyshellext", "vcruntime*") +EXCLUDE_FROM_DLLS = FileStemSet("python*", "pyshellext", "vcruntime*") EXCLUDE_FROM_LIB = FileNameSet("*.pyc", "__pycache__", "*.pickle") EXCLUDE_FROM_PACKAGED_LIB = FileNameSet("readme.txt") EXCLUDE_FROM_COMPILE = FileNameSet("badsyntax_*", "bad_*") @@ -126,9 +126,9 @@ def in_build(f, dest="", new_name=None): n = new_name or n src = ns.build / f if ns.debug and src not in REQUIRED_DLLS: - if not src.stem.endswith("_d"): + if not "_d." in src.name: src = src.parent / (src.stem + "_d" + src.suffix) - if not n.endswith("_d"): + if "_d." not in f: n += "_d" f = n + "." + x yield dest + n + "." + x, src @@ -141,17 +141,45 @@ def in_build(f, dest="", new_name=None): if lib.is_file(): yield "libs/" + n + ".lib", lib + source = "python.exe" + sourcew = "pythonw.exe" + alias = [ + "python", + "python{}".format(VER_MAJOR) if ns.include_alias3 else "", + "python{}".format(VER_DOT) if ns.include_alias3x else "", + ] + aliasw = [ + "pythonw", + "pythonw{}".format(VER_MAJOR) if ns.include_alias3 else "", + "pythonw{}".format(VER_DOT) if ns.include_alias3x else "", + ] if ns.include_appxmanifest: - yield from in_build("python_uwp.exe", new_name="python{}".format(VER_DOT)) - yield from in_build("pythonw_uwp.exe", new_name="pythonw{}".format(VER_DOT)) - # For backwards compatibility, but we don't reference these ourselves. - yield from in_build("python_uwp.exe", new_name="python") - yield from in_build("pythonw_uwp.exe", new_name="pythonw") + source = "python_uwp.exe" + sourcew = "pythonw_uwp.exe" + elif ns.include_freethreaded: + source = "python{}t.exe".format(VER_DOT) + sourcew = "pythonw{}t.exe".format(VER_DOT) + if not ns.include_alias: + alias = [] + aliasw = [] + alias.extend([ + "python{}t".format(VER_DOT), + "python{}t".format(VER_MAJOR) if ns.include_alias3 else None, + ]) + aliasw.extend([ + "pythonw{}t".format(VER_DOT), + "pythonw{}t".format(VER_MAJOR) if ns.include_alias3 else None, + ]) + + for a in filter(None, alias): + yield from in_build(source, new_name=a) + for a in filter(None, aliasw): + yield from in_build(sourcew, new_name=a) + + if ns.include_freethreaded: + yield from in_build(FREETHREADED_PYTHON_DLL_NAME) else: - yield from in_build("python.exe", new_name="python") - yield from in_build("pythonw.exe", new_name="pythonw") - - yield from in_build(PYTHON_DLL_NAME) + yield from in_build(PYTHON_DLL_NAME) if ns.include_launchers and ns.include_appxmanifest: if ns.include_pip: @@ -160,7 +188,10 @@ def in_build(f, dest="", new_name=None): yield from in_build("pythonw_uwp.exe", new_name="idle{}".format(VER_DOT)) if ns.include_stable: - yield from in_build(PYTHON_STABLE_DLL_NAME) + if ns.include_freethreaded: + yield from in_build(FREETHREADED_PYTHON_STABLE_DLL_NAME) + else: + yield from in_build(PYTHON_STABLE_DLL_NAME) found_any = False for dest, src in rglob(ns.build, "vcruntime*.dll"): @@ -171,16 +202,28 @@ def in_build(f, dest="", new_name=None): yield "LICENSE.txt", ns.build / "LICENSE.txt" - for dest, src in rglob(ns.build, ("*.pyd", "*.dll")): - if src.stem.endswith("_d") != bool(ns.debug) and src not in REQUIRED_DLLS: - continue - if src in EXCLUDE_FROM_PYDS: - continue + for dest, src in rglob(ns.build, "*.pyd"): + if ns.include_freethreaded: + if not src.match("*.cp*t-win*.pyd"): + continue + if bool(src.match("*_d.cp*.pyd")) != bool(ns.debug): + continue + else: + if src.match("*.cp*t-win*.pyd"): + continue + if bool(src.match("*_d.pyd")) != bool(ns.debug): + continue if src in TEST_PYDS_ONLY and not ns.include_tests: continue if src in TCLTK_PYDS_ONLY and not ns.include_tcltk: continue + yield from in_build(src.name, dest="" if ns.flat_dlls else "DLLs/") + for dest, src in rglob(ns.build, "*.dll"): + if src.stem.endswith("_d") != bool(ns.debug) and src not in REQUIRED_DLLS: + continue + if src in EXCLUDE_FROM_DLLS: + continue yield from in_build(src.name, dest="" if ns.flat_dlls else "DLLs/") if ns.zip_lib: @@ -191,8 +234,12 @@ def in_build(f, dest="", new_name=None): yield "Lib/{}".format(dest), src if ns.include_venv: - yield from in_build("venvlauncher.exe", "Lib/venv/scripts/nt/", "python") - yield from in_build("venvwlauncher.exe", "Lib/venv/scripts/nt/", "pythonw") + if ns.include_freethreaded: + yield from in_build("venvlaunchert.exe", "Lib/venv/scripts/nt/") + yield from in_build("venvwlaunchert.exe", "Lib/venv/scripts/nt/") + else: + yield from in_build("venvlauncher.exe", "Lib/venv/scripts/nt/") + yield from in_build("venvwlauncher.exe", "Lib/venv/scripts/nt/") if ns.include_tools: @@ -208,7 +255,6 @@ def _c(d): yield PYTHON_PTH_NAME, ns.temp / PYTHON_PTH_NAME if ns.include_dev: - for dest, src in rglob(ns.source / "Include", "**/*.h"): yield "include/{}".format(dest), src yield "include/pyconfig.h", ns.build / "pyconfig.h" @@ -552,7 +598,6 @@ def main(): ns.source = ns.source or (Path(__file__).resolve().parent.parent.parent) ns.build = ns.build or Path(sys.executable).parent - ns.temp = ns.temp or Path(tempfile.mkdtemp()) ns.doc_build = ns.doc_build or (ns.source / "Doc" / "build") if not ns.source.is_absolute(): ns.source = (Path.cwd() / ns.source).resolve() @@ -565,7 +610,12 @@ def main(): if ns.include_cat and not ns.include_cat.is_absolute(): ns.include_cat = (Path.cwd() / ns.include_cat).resolve() if not ns.arch: - ns.arch = "amd64" if sys.maxsize > 2 ** 32 else "win32" + if sys.winver.endswith("-arm64"): + ns.arch = "arm64" + elif sys.winver.endswith("-32"): + ns.arch = "win32" + else: + ns.arch = "amd64" if ns.copy and not ns.copy.is_absolute(): ns.copy = (Path.cwd() / ns.copy).resolve() @@ -574,6 +624,14 @@ def main(): if ns.catalog and not ns.catalog.is_absolute(): ns.catalog = (Path.cwd() / ns.catalog).resolve() + if not ns.temp: + # Put temp on a Dev Drive for speed if we're copying to one. + # If not, the regular temp dir will have to do. + if ns.copy and getattr(os.path, "isdevdrive", lambda d: False)(ns.copy): + ns.temp = ns.copy.with_name(ns.copy.name + "_temp") + else: + ns.temp = Path(tempfile.mkdtemp()) + configure_logger(ns) log_info( @@ -602,6 +660,12 @@ def main(): log_warning("Assuming --include-tcltk to support --include-idle") ns.include_tcltk = True + if not (ns.include_alias or ns.include_alias3 or ns.include_alias3x): + if ns.include_freethreaded: + ns.include_alias3x = True + else: + ns.include_alias = True + try: generate_source_files(ns) files = list(get_layout(ns)) diff --git a/PC/layout/support/constants.py b/PC/layout/support/constants.py index 8195c3dc30cdc7..ae22aa16ebfa5d 100644 --- a/PC/layout/support/constants.py +++ b/PC/layout/support/constants.py @@ -39,3 +39,6 @@ def _get_suffix(field4): PYTHON_CHM_NAME = "python{}{}{}{}.chm".format( VER_MAJOR, VER_MINOR, VER_MICRO, VER_SUFFIX ) + +FREETHREADED_PYTHON_DLL_NAME = "python{}{}t.dll".format(VER_MAJOR, VER_MINOR) +FREETHREADED_PYTHON_STABLE_DLL_NAME = "python{}t.dll".format(VER_MAJOR) diff --git a/PC/layout/support/nuspec.py b/PC/layout/support/nuspec.py index dbcb713ef9d0c0..a87e0bea049427 100644 --- a/PC/layout/support/nuspec.py +++ b/PC/layout/support/nuspec.py @@ -24,6 +24,10 @@ amd64=("64-bit", "python", "Python"), arm32=("ARM", "pythonarm", "Python (ARM)"), arm64=("ARM64", "pythonarm64", "Python (ARM64)"), + win32t=("32-bit free-threaded", "pythonx86-freethreaded", "Python (32-bit, free-threaded)"), + amd64t=("64-bit free-threaded", "python-freethreaded", "Python (free-threaded)"), + arm32t=("ARM free-threaded", "pythonarm-freethreaded", "Python (ARM, free-threaded)"), + arm64t=("ARM64 free-threaded", "pythonarm64-freethreaded", "Python (ARM64, free-threaded)"), ) if not NUSPEC_DATA["PYTHON_VERSION"]: @@ -58,7 +62,10 @@ def _get_nuspec_data_overrides(ns): - for k, v in zip(NUSPEC_PLATFORM_DATA["_keys"], NUSPEC_PLATFORM_DATA[ns.arch]): + arch = ns.arch + if ns.include_freethreaded: + arch += "t" + for k, v in zip(NUSPEC_PLATFORM_DATA["_keys"], NUSPEC_PLATFORM_DATA[arch]): ev = os.getenv("PYTHON_NUSPEC_" + k) if ev: yield k, ev diff --git a/PC/layout/support/options.py b/PC/layout/support/options.py index 60256fb32fe329..f1a8eb0b317744 100644 --- a/PC/layout/support/options.py +++ b/PC/layout/support/options.py @@ -32,6 +32,10 @@ def public(f): "nuspec": {"help": "a python.nuspec file"}, "chm": {"help": "the CHM documentation"}, "html-doc": {"help": "the HTML documentation"}, + "freethreaded": {"help": "freethreaded binaries", "not-in-all": True}, + "alias": {"help": "aliased python.exe entry-point binaries"}, + "alias3": {"help": "aliased python3.exe entry-point binaries"}, + "alias3x": {"help": "aliased python3.x.exe entry-point binaries"}, } @@ -47,6 +51,8 @@ def public(f): "dev", "launchers", "appxmanifest", + "alias", + "alias3x", # XXX: Disabled for now "precompile", ], }, @@ -59,9 +65,10 @@ def public(f): "venv", "props", "nuspec", + "alias", ], }, - "iot": {"help": "Windows IoT Core", "options": ["stable", "pip"]}, + "iot": {"help": "Windows IoT Core", "options": ["alias", "stable", "pip"]}, "default": { "help": "development kit package", "options": [ @@ -74,11 +81,19 @@ def public(f): "dev", "symbols", "html-doc", + "alias", ], }, "embed": { "help": "embeddable package", - "options": ["stable", "zip-lib", "flat-dlls", "underpth", "precompile"], + "options": [ + "alias", + "stable", + "zip-lib", + "flat-dlls", + "underpth", + "precompile", + ], }, } From 82176899cf37de6deeed77e2b2e79fd8d2e0d0e8 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Fri, 5 Jan 2024 13:50:26 +0000 Subject: [PATCH 17/19] Update docs --- Doc/using/win_install_freethreaded.png | Bin 0 -> 236250 bytes Doc/using/windows.rst | 64 ++++++++++++++++++++++++- 2 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 Doc/using/win_install_freethreaded.png diff --git a/Doc/using/win_install_freethreaded.png b/Doc/using/win_install_freethreaded.png new file mode 100644 index 0000000000000000000000000000000000000000..0aa01c1df6e051b1585228b0f963c5aaf2d0da5e GIT binary patch literal 236250 zcmY&<1yo$i(lzc*@WI_7xVtB~yM(~t?(XgmK>`GK4ek;WTqgK1xVy`rckjFRdw;Dp zYu1@Q)2FNIbXWE6UD2w_a_A_;C{R#P=nC@E>QGRyNKjDFCrAi?e(A>5!~F9F?W!&( z2~|4@IQVk`XC?7b0t%`j5%t*&{?9eClf0fQ6cj4ir>%?nWXr?_Iu!VZ_#_Pan<{Zp{^bmUoMo}jNQ$DMOExD<+(fjhzkh=B!AB+ z?H`C1{1RV<>8s@WZy)!pUn!|JlAujr+>NNF9o0+>yZN!+8=DxD=oECeamR}H%J@6~ zs~SeH7Ps{J5%r53?8{;ei5%QxbO+d{q4!glgD6Su6#BcbMfEa;Vp!8GyXJ| zSzY4xT+NXqLqhqH{yh3w@Czl_{R-q%*vW^CagOW$671j)GRO)2M+WQAeW?$Ef!8bb zH{|75i!J3Owc-BBXB`K@VLg-$2ogqZlnqGNxbB1hGc?+Hxp`Oxe9 zN^p<1W+pUUqA)6LwbMvQ+(?Hp@tAIm(uD;`*Z(uZMKyBgG6NlJC^%wR_u&!5-7=+l z_h|86a$jo5O|nNvFpf1GoT5BzfC1e!ZFP_MJo^9sS(V(ZjD#V0yFmSSP;V_<2E83W zmir)j%6XsHQJF1m(zZr5ws@N;@=qz`d9(2HBf)}M3B(l7$GCSE~e zb){kFUA1)BjC9RROtlq!alM46bPYQmxG!p`Xi8K?ugY$=CO%KF_pg)BZ3oH13{^9` z5MyZH7F)J#`_R)K>4VV|+wU`AncZ5Ifi2q3B z#`{B@KU$XLt7qQN5f*CBL)s2_>;7|Fj7(v#F_m#<$y}-Kdq-r^HF4M=1PLjeth(A{ ztn%FdPZ@l*%o0RJ{}G8o&gmqOaIh>)sVHo)Irwgg794E$2s@19qjb)g@jQoKM;+|^ zWI>}#S#7JvclDN0MzEyzz(J+GtJV1NUp&_(9PIYyJ-WC`KHiPC37?hV%_+MH!T;>M~@ zR`o>aCq}}awI)VPUhDMe@{yk^pGe(O%!P*!Z=hs3`q$i>=O%?6f+b8e+|5jEf^Gg) zyWIwkpbmQnEqA={yy#Fk&wamx#ia^GLkrpFG3pUQcu|PpHjUvtjb`KRrD~7Zy@*;!stlKxQM* zPd1+DqN&K~*~>t9V%tX4EVvXB1nE~aoW}9iiOTt))Zl$XY;jIhV!SlTIrPB z7+ItLEXMu)V5^|-MC8T`9S4(UIGUnt=IC$}zhS+*c5dhSN|XgM$O#!x*Od|5#|}B&{PaU!DDSWb8=8oVgxf zft8w)vsSQqd0Pkyjo)^-edr zX4R4A_)TeA*u7aLgh~ya9Hr7lm1#smOV#jW&ab;z3i+HqhZpr5a=~fmMaap26*{+t zBWIOX>|*C2f7qD{5r+if$bW-<$yh~rv@N34);0lm3^cx5iF!G+Z}HZV;`o7Wm>#@& z=n@tibD8ADiLZ#I{w2|rGETxTQ;KKfr2Y*FIa*rRD@4AlqsWYNR-gAy94pKQXd$DQ z(ebTQj6MVlhxnvLNaCqJlU{`}q#ac_O(mnnzDm}~DXaIa$jmvVtZ2~oDu?sE&n-f# z7&l7>p09JTeL|)in=h)JYYR@`w`>pY`2riFy$_l?m!*L>iCj-OfC2i0(~8j1wjyrS zMHSL-y#SJ)^Oe7S56+Z!cTbmhhgBa&GoB0u3~*I4#e%D_UMurTDB%=*+RyXR4v0-~ z7x$kVYn`zes#)p>y0w+z-MNrLlU4;1$Uc6H_f^kRWj&HOF~_B1`8z)h8%E4w)!bS(4(-#3vnxl zFWHN6iaqH#??!+y(_?<8KkFHG8n5>3c&{zR#q9{|E+Yk`+86;t|iEz*z##dG}?U8ROK} zDd{{}U3$0$w-z^gV9gdAd%|}bFE`*Y!HD$un6`NHAYph@k_V}5UF31ICduR z{(;c*LW|IUGMkX+^+WUNEJ4+-3RW?VqB1XUXDtsC4G+V+Vffr6UQfgvH@o;R2PB+Z z?Gw&>{wk&hBW%@qPpn%h3WWkA@yNII(s4xe`5S~$liU1JW%KV5w|7ouOY7h)hYhA%CluPx7kf9yF02Zl3aRToE)XR< zCQ3ep1oR^X5XGYKQk8nM=LJ6b^B?A2M8(-Bw8Zw{QBw{V)FGJ9M}wyuPbdIfuXkg= zv)M-Eup9YGwn`>W`+zzoq1a^wG?3ho>v#<`wK56H5k>VTF#pAXn7OAiS8raHSUGaJ%BF7oK(C^e~07$$%9%d`n6Sg;9`Q(OA2xC@~H zE3SksN_t#lB9!>wFV@H@yebdz*)!Tdevg;_E22hjh>lrOQJGJFb(f=|Eu#>nB)W*c zQIa&*0LyDJFf%)7Qmtie+Qb+g00{$*W!i7Q^-?oeK^WQZH6aIu=u1;83V5 zWnO@Uksu8OVt05P1vib5M#pxxNPL#mkq(olWPcA`)*L->UyKOOb7ku*42~>n=hyj= z>hxZb(dZ58vIP8Pf2)g>Fz^+R|0*wby4Ih*2C}tb6iagUMmYSCt(a!Z9*#WAZz4m6 zK2T*ci00>pYOw~-vUhRdBGelaQKc{W*ESwh_ZO-MRcCvf!129PwnHewQkir zoW8Uk;q;L5z~o^|YL)LR@JP;!WxwJ%qEMC}y+ZzM++#|rs-{K*!KK@g95#v5K8e^G z=`GL z(@k)VBT^DTO2_NOqPuy!_~z?$sh7DmSJ4-Q9XQba7JykJ7>5sQfhQX$h_dwj;82r` z5dH#8JJlm{2B?7wR(uRoRWf@pgu0U4dp2$nnNCW z+8;Z7Iq%CaK;P}tUEo5h%vx&=YYMdh46WEV2bG8tIePm%KCKEP1qpVst_G15d_$4A>Xpura&7)D3yqKL zb=BelPTWi>h+nBHFe?XeTl}QT)2<>l?M^C7C6Puq>m>%yf6F0ioy`+NQs#ishF26#Q}bVka3<8@P;+I+IMuKHxY! z^o@|~m_6(qBtn#d9YSA@3!BG^Ft>ivp(1 zrw@o9US3fRUH!z+NH|d(dtYfD$wlA6Mtli30?x8=>RSJ-eig;tGxWer$t~GDY=Gr( zI!7ugvmdB{u*;3u2}E_g^#{3sb~FlBdUd8=Zas>!BI`t*D68%V5^Mxh4$49ntjOm( z*vQ|*;BGu2rsQ}gvpa`l-Juiu{TwIc`JCtXJ=P5X+?c6B9ns=69ME>=x@a-}X|r~NJQ&pe$B)_>@KT5cwOvnbQ)aD;RC|eEK*n=ZQiMB_>iy>k2>)L_E+j#)Ber{>^*0+jy=19x1lNnj&(WM&o zd$~@Z6%*KPiBtc3;gllu`ITvFEhB(}>Z+=l)fxG&Dwld`o~mxTA9W{eKvj}@83Hz# z>aR?Xbv}v5G}|n1YOq+bk(MqsJ&H+h-`)+}+~#5%+AHV^=X-M}*h&fKIzW>uzJ#3^ zhYh#R66Onfp}C3aNC(Bh?m&qjqPy7=(aTDb7|wAL@&SIMM7qn%ddYL}+OLIJ>b-aB zW|vlrtH;=(CE>gViJ1*K>sU-DXF}F7 z*9R6bMWdt6sVJZE)DwY1XI^q6ZUehKxb>E6R`-xn$h5>(Q&Zzjt&fv+6wZg(OLYoS zPGlwg*C-V+KaEjJ{;(!u^AG8#0|P{FvZMV{oB?*Y4Lw{#ri>C^UNl~>&LSp2XAFcq zB)7BQs7(P`arIuCUATgfCQK6vLq8bh?h}~pz3OVp-xA<4J!pWyt()C)JxtYJV8VSy zpELcJ#9>q`@Y&ll9|G!y;|#g=dH@s?Gs>`jf|Ro|{N(p*Z98QnT9b3(Fa?tN`^<}- z_v|s8^}6WjBNXrOwjl?jr-SzF-SN!iUO3?bMvawh8No3krM)Ih_^c6&Gk$ve$2Vk9^AiXK9z`FlyY7qe@%E2^&<)NItB`;yx#%Y-NwQF z{XWBnx0zG2$ll8}Bdv8SY}!PI5_H|V7D#mCnBP+Di~cZy9@7Ys3Q3x+MJ0P~B1C2$ zl5andKqL3X{;Z-Kwz2k#q%3e{-VJ^+suB@+qfa}sbb-VoOOY}w`8epA%n49kfH zqh_+>YuiV*87+}R&SF<<8_WOf{Q>dXK9vH!QdS`xv*LHSZhJRC0(?=PgxkZyO(f&I zriQ(Su|RoKz&*l%*PWg|mV;VSlNI^7#)tYn6Y)x0DYz@PcIY1UEvV~6vUQ?yI&h5N zFyIEg<0l>G_w1AdWh0*=dtZHb(Xa@)&1%$I**oJGr~5vMdq{lXaJlnR5q}^oiYw~* zv=XY*F>={g?+ISQ_kQolyj);9$UJyO^HK7gmf`OwUR1!>u52<@izm*D-UQ%|PEqL# z2R7RV6?Aih2`ti$kBE+oy}iTO^zM=c0WS?s>xpA)#*Ev7%8y#5PiQ$UM`3|$LSz=B zU%ny0JxvH;I85&Rl>H#dY-hwpphR~zpkQSjLn`FCHCjm87W*?4nn3 zoQ)EBxr1R0osTATMVzDOH^`Vp4I(BS{K@Q>J^DON{Nq#wv<3a?ta4P)q6Svu^Q$9N zdPu5A_pZ#2o$1Za>#?oZWJeBHQJs&ZaFcVB=|+rk4L#@92t9wmcPKZ=#A;tc2x4x( zbSRRNVlQF8*XBx|Zx-;uIAxEJ?m=UY53`Y`gA$v}3)8k=-kh_HRc&{LUi_IC9!A%V zg}nxI)MF6eEBuB$`ThL8(YpI`_TJ`hZ(z-y@{{r!79Jk8f4p4cIxH3uQC!pH+ZVv- zgldWogGFk*^4cThhpnS*TfR9U8qecmC$R5JV4%#SGmZY3fb%R6;(S-kmDC$*B^bCF zc)0ZIKO0-{G+Z62nNKlrB83OkYQs9KQv=l1R?O$IO|K`TV0{V~59umP+8}(ZgI}#1 zx17|no+(8o>wW=L>wSmIH1?+_d%NElz?&M#EOjGRF+qR8YMO z105kZ@{J6H_-cH9@vSkfOX3QeP?9XgJ4q?V#)tXz$;L(o+5P4P1^Zfk_)as6V+VxT(Xf%YMZed4!W~M=2Noh1HSq_|b z>QCc{pCGm)?8gb)z7wo6-KfQE7^q+sM=XLr*l{DNpdj#izSnDQ@MGdf*s~6#*wbY2 zoH}7hjJylh9}#Vs(`r3zP0u!bJEv6G3>z8LWlGBS2wA!R?2AC=^=Mmd$V=cTd__;g zjmdR%daXn?BCREm(@Gqqb^=<;32+Tnl2B&qxDz6q3hctsnBy(>j@|Wo87{j<76)T1 zJX%olh7bbO1i93An3uZo=Rdyx^&7zmW{C5X8&-i~TKwl4IeASUkIz;`ECkjw-!dn8 zS679@&e?(pk(&{4b3G*L zBnXQ43S*~z&v)c)W;B+m;!^|%2Sc4FfTQO7QEKChJ<@p!llK?XdMs4ZQkNjfABP(XuB|a7xI@Y=J6gfFkxrGwkliK)kp1 zBNZF3uA7f!WPV4s?~ZlDNe`Hv9^TgIM?K!X`pm(1bRCUspiA{a!#eMzzV#u~7erT| z7}PubViE`_=DeuzlrF=xv@C5FyEZJw9=}Nz)?rfgaHavLHoUB~6yM~1zsqQvuCV1Z z^nmmxr8X$UQS!z9g-!hjN{Sz@wa?|SJ3hHLbr4+7%8TJEv$IoO&uK-j^Y1h+2-7{7 zm^&&Od_##SgNN6mDzz|K^&0ri!0>Z)+{!rW;p+2dzt}T8=_7gVM5+kt{vOnL5p9(F zntzdYPY1$4FcY%dU6q}?Rt3)e{5<;obrbUa^&Im3_MFN^|0p>mbxL%UUaYpCz!s%G zpw0W*TFVlzGCb-b?0i_}o!NY!Zl0T=TpaNX0&9+(uWZQ7ukN2a<{z4mrs3OG?}%$3 zuKYn=Kx&8XXQwzJCbFiokK$gRSP(G8kfXl@)rugPf>#d+DJ(6_aorScLBEYS%(3|L zWD7Y0+tMCz%HrYl@1Q+S$C6q{_ixWmMIJ34QUpM)NcS%?a>cH~^`@tq+#ePC#TCkG z?f;+&cSn5AGmPE!-fKAT2)2t96m9oEI-EH))_p~)dEy_UPN*i<5%?;iB8PyIon$@@Mrnu+!^>nu>LQ1idVo%|*1dgKvGEcNaWS z1&ku6RUPViN-~;|h558#&rS!Eyb9_h4ddq@f5Zmgm*6W##iDppQ-uRr)T6zd=)twj z4t)Xyh7peR0U^Z+q8Onnux#Cj_$)@;1UiPkLW(h$rS_u7KbK?9bf5+kgy93*FN~jG zBYMG!d>e`2;?d%E4idAXqOA7^LU5xny(D62RheD17TxGIEACPf_*O(V%5y^{bjz)i z{v*Y2pl`GI2Z`6cU%TKKSp^HFM;9H?Zlkg1(PFK-;;#}NLR7?_`69?T5iom&$>#`Q z{2wuwc#^0`@c% z1Cs8B8Lat{$FzOqY@!IR8+q|3E3-R($6<|<_~nd$W9{|qnvXHbpsz&QEYD_K6s`-BR9>Q1qCaU_)QjTOUj7@`Y7(Y-Ysgl2&2{`zG&1h)pEV7-x2Eaya zel=j1-OZ5cAioX_>c|sLszdBRHxDG7=t(c*5$_{wy(!j5g z(s`xd{pgAWRMp4s@SKb&Cgdavwt$hwWzbUfT&~FP=XOmGN7=!UH{p1UFTRC(E1V3> zikSf?IA2-gr;D`pO%NlduP#bgcqjXAn=S93?qf^qvI*bYy&G!9fnj|~$$RK*Q}AUj zF=;S|n@NgZpp~P<8JpBiWDs!tHD7WNnXN~mmmseBzTWx2nD zu3XE+Dn~*N3~C7=2Y36RQu^A?TTLQFa;jqU=^8n5x8v21YdcDru`JTDw*W)|*mlfP zaqe;O?2fHEdoDiNg8E1reFX56s#DxIY&Cmeb2KG=0GVTL@jT^!kq3%%N^-RU>Q?iY z*}J5UE!Yw^M{yea&~_4?fbu2TK_U!~`gm;{Q?IqUq8A0kc?|tp;BT1q4#{WZig3HBk!cl2Mx+e?=Dty8bl8v zZC38C#O?Z7YX4<6+PDb6)1T`x7+-wM22o5G=Jm2Vln;-VF~5Ho$SOk+8vlgX+)ju~ zlZdu*a}Pj8IrA7D;*m36RJO}YNjUgg2E6k4gTlz_IoBr5FbvUp;C{`vCZ^m(ccHB_ z&XUe1DI26VFn#gV(|uaQr*T6xw}3RbE-9xW_wOi;=r@bOG`+o$zHhZM+e|V8(bxyx z9mRLpF?rsx{d|43AENU}=bdoIS_99BE8im2Q1j+{o(3f; z->Y5g_lM&uQyxN95sRRW#W%f)83r|ahXUr_b5f`$H@H)$A#ZxC0x#_w>?fCdo$ zu=A)UXLd+%CxH>&b5^8yXhf5fF^OwY@m2j!g5?eR{`~30dL?;JyS}xqi$>)zM)pdZ zl*5(z{6%Qac{zUXFm85MrU^TD0J2^E*G?=FHq0>6nnrrmQ&Q7VPI{P+BIWbd`J-oj zD4&_PeI0fL?C{WweqR~IB~T`F{Sr!9@I}(^^`iG;lFPGbgVFzDtj5Y>;Zml<*?YR& zHR(&MV&cIR6xqE$>GO-A!0nPah}`lic~m%=j^A+1W;B_Q=ad)_ID$?na{B?``;$M9 z=hg1oHZv&Z$9uP^U;T{Tvrf15etDeL?<}6usW>a&Ni4{ev#|G_=1FevW>Ryf3C4R| zO0pqGM@2~=IHV|Wiu;+Xp3|fbwU>OmzZ~4d!pEoE?&13U@d?3CRoTrir1mK>3TbeS z-9NtS?NROvYg9}Ee&!RDb+eO)q+9Iky84o@qi{m|y|iD$C$a#~jb0A>%ccGK3f%R; zCmwsHPnv1+CBWS4Z0Yy<*WuxEeO(mUj#zP$4vYAC&iyxD&nNKrFI*~+36+guPWrs~ z?@eW9kXaz1$2^`FSWLrdvb4=?snv}Wj!G?gl;;UMDn-!Cv!km7Yy4NoCfKTHg!L@| zxvlpB=QPkeCgG;}OiZo_YjNfER+!B9)ndp4rswteW3$5?^i<#rvZ&u4-u1pKzv$DZ z&u>C8*NP~A}{5?$aO-umNH z?EU%gmGc3Ux{*?yS7g_Kd;P?z#4Tmt10{cUD01WGO74d*I6#I!M8(;znELX|E$ch?f2l$dS7442s9G5l3svq zrhjFk@6N?;^#>Us@#}MD**VDI>U?jhV05icG}hK3fLO@mli9)Q-9^7`CZ$*}6!Wb5 z#qAOM7$`7EhhS1XbDf?_3{`%u9^a_bqhIcYU; z0i$6V*2fi({!qTWD%k;Y2OlWvgl;4m@1xQ@Hs5=Ji&VtK*cN-Uj$lbhKgyL_yH|vP z0pl^Ar_ttUA#clf2K$Zk=t<{?N<(;+}yX1YT9X` zd25}{Ua@SJ)9|f`m*b!~jmC}OrVJZ3f2`)bRQj7RA zt836xu{7?Y59B?94FX(S>juUwCZ&>-)-%a_V8&}Yj-Y=i7DN};FIuk@MdCazFz+%G znY235p_jK{enK8@+Aj(QS6Z_PG<2G{GNhRqT>z;m;Qr{O)T zn8?;KY$us^P6dn5d@GdO9js1OA8IA29r`|(Z)aKTFmklKwg#J zf-oXm(s`vRH6I&n4*WiS{wZPY1tW>$fdW1b85p2qG2l>mB#oQhGHkY9K|B%ikWy^Q z82hyrkLVx@)9K+LCwYWJ!+jKbe9U6E%uUX`8xR?i!sK=)qI=mopo6>K$9MLI`|%UY z{QzdD4P`ech~E;?Cy^-ORKy3IJ7qjik5{9Aj*g-jTJo$)LrV`?VHfK&NL-6Hmb;O% zbHSx)afq(1QNqpyNj!Bs+^B2HvS#*V(Z62^@+C9J##;gu_+JY?Vh~2~o(P)%sx0+7 z|CTyasX`(W;H+>`@3VuWi8m!Jdq|}j&Lg!~>wldkdjFIDel#?Z!gYo2gVznIK>jZ` z1nIM5or#C(67rmH%@V2Ke*M`J8`vqWM2((`Dk>wj(vmfO>xroC9xeKV_C&?Uj)n+u zaa^qsB+WM>^E$55MCc$k+st7cEmUhYla0w(hApCXU4xWxkqW$i1Mf@wb+WBHUN=Y84 z$iQF=H|KB;4)xMiO<$eDQeFyE^!#zslO|s9LWO@Xg!y7PtnK0!_s&a&nQ7iu%v;|s zmG1s@Fmt;5jUi6pl>28sC*F>wfH_jKq_6aC@6eyq-PB<)iWPIPqvp3Ac`8XtqT;O1 zftx;J*svRe3fp(O7D295l9~NWgKAqcI1GEF8@H6scOj+?cCOg@9E3B`hE|h%TTLh{ zVK!^r#02D_gPl(tUjrGJThZjyM6J*+lQRv%7@IuJAC@K4(zN?^h(PpgOUQ$_=((B( z6SaQ8Ov+B-igp3d6VH|D7Z5|&vl(&EgAEK>_p!}2e^J}|!mjHBSLyMkyLe)&coSP+ zMuoU9I0ajcR7MV~k=I_@n{xV_BRwaQ4e34bu7ftyoGE_S*KRa@pJ68;0NL z%}0)>);cDU#;*unAuQR7X_t% zhlwo_cD+u&{nmWM2+2B2Pqv_h=xKK$8+`M&AY4;Bvx6hEZOzSX=2Kpd)*cLY7lSd} zUywlfy5c-bMt&!zX+C#skF|mp&G@Cni@~ErVI?y+^^AQ=Bx-J|2avcP2)oGUYqG&? zc3AYP`sq)Cjt~Q+Pt>qYKBbQ$dkGlRMb0*P{`L7h*g`nh=O)==qqb?@plD)tF|Z*1 zLo_)DlJ#;2=4?h?-*WutxX7`F)pRERv&q(*VT-B2XmYEUpt%u~xXF}BqC__OvG3G5 zzhpUAJpX$NLa;4^oxFntki3Evz%6)NE{q&thS#qN8nyg~!Gk4Fm1Wzv)KVncphAa*scjx-LN0;x^X{FsH{}yer{4uUI$SGt z)YSbRq*^l&Yk+Di{rYkZu~k`!tTIxA5ktZ-q=|_g;-IEsovC^lD8zisCgBu_Jv3TXZJD%joVQO0AcS?h_a{3 z_q7K6__3AFFL>FCIY!}{hvLFVVTC$fsiXAJcxPD;~Geu0)T$GN9Pz_t6Jjr1jKWpy}@ub_DlrT2l zvt&tmy+%nP0x(4@Wq3QtDL`Qv$#9?5g2aR7hbKIGy(+-a=P5Hi#8l z2luDGif+!!>({TLBhXeDfZ!D|CsGP>b{m~Ta$ydoI_vPalu`8&8V16((QAB2VHFp~ zUtA#oAYkDh9zEooBX7dWDXxNH_{cCn3Mw)P9 z_`n7?A+0MV{LMD{tDAt&fNO-1f7r;Op?_eRN%4O<(@sw3gG5OG!@vu0;wxQK1HNbn z3|J_y2oLeCAzaB=V<57+2}L>_a+u$F?niI>pTmD1xsiL7uD4r5r@<+Eldbd5&JC{V zbP&c)8o3wY{g%~?FmYUzSY8)5grK*Q4RJMnJXEQR7UPg7%4o7LFO}NjUS3oqU^)68 zQ2zn;LCe#0y~Db&IstEPe+emoa9&7O4F2n!7{=4|=rtQN97Y?xHJe`RE9bW~SI=Mryq*{O(_9!F^2#<_1_Od;Q60LgJAu3|CNCQ>y`Q zCw$i*9^+=vC8E!^cOW4f9TjGD#syjy9{<8MsRLPB9JE_{PKxWNLMotY>dT;|Mdh-r z`GZl)3?#WC_1gs0)k+Fe6Z*LG&hn+mMVpZTSF=Gm+A3dF021Pj;A06pcmE!eB*?C_ zJy_Aq9_+4=jdJF1=~vuYGdgfv=Fp{bSdmhv5|#I`9-E3+JxKq!e+mC^YK2Yluf%33y-78}B}HAl?t@_bIRIfmo|Cp6m(PfEGDk6`j$% zyGlL^Blw8MobRMRM!X@IKFNsqiHnE1Y~KrDN4ZwdGBqsdl0T0=LGB@;8RQ@tw^ z{Vy{ioVSxJ9e)#upIiHmpdVx+6M3X;#J85hIC_hC9b6i_Gp8d`n~T&$j!a}9pmDo8 zC_qmJFJ^*CRnzcKT1%Cdp%aCz8lH7-IwTuTN%tPdxnU+M5u1++4Qy5lGO zfQ+mbSX5M$qphjAy)^E2Xeq|PD@sKL6OA0bT=<`j)7}-3xX9itP@0K$eMC*i&rjIg z++0;xH|qJ>uUB;OOI{w!395v{sY6;uhJ4P<*tI+`P+dLcdbI4IwTA=ftD7}Se206i zA}JYiO^IV^IUrmbavtUM<{4|D%`%!~F(ir@auOF4GkaTad|OdjslTjIjt5|?r8+kPBNDuqfWmwmvOaKN_7Db-Vfzi{=typ z)}fI`5zE)xXTH%`Z?7(fU18+QkwnLX&ntu5?Rfj%j#u<_bU!X)u)24a>(0+PY9j3! zSy|_t>#nsFxonpIqS~IXgn*U8@3#gs&###a0C@-lz|f0nu$5?x8vPgcFsZQ|EHkBi zz@He>BZBgbI{S-)#%wpa*2iw%baS6mBqVDq%00q$TW>8io(T=d`zs2iyvBw1vNGvW26bOocSrRPCF(5owvXT9zQ0u6aKQe_bk4|jO2|&Ak1DusTdphW5O@y0<$X+i zC$%Gv{`a~1AHKSOk?Q@b1?Fn-6IsBw88kRzs0?bxHe{?u0JD2Mye)@rad7HQvdHr0 zABz3x*N=Pok|`w-Ol&+XeI%5_LRW^q?@-zD5c!B3jubb9L@TW;CE~2tK^-eCg%vZ%-LkF8RUGdW3SZ~abLEbC1IeK)mYU>$u=kwBk^K%r})VdB!EJ5EX;&& zgT$fM_Z`l4FK0F7;sYNeLduBSRGrz;-Nx^4@>yHhzNvhh8jw(|Az>6;Iiq)zg5_!y zUngStb0vCrO9M2jSeKG?N!=lbF@E#8BmB(1O2ypo+Unl>#@6NH6PobF&zcI#{kU5C zrBN_8O6L5;eAytkx-Knx8?}-SoM=07(o=kYsl4UNC) z+hFZG0=RpEHyxXSc59OW8!GY)woYe|VY2 zND5c#%yo0K&$zSJZwYt|k=TeQ6 z<-_u_`mSE0__kjsSQ0+r6K87$JA|jART`IY|FE|Qp~_JKiG-Wc&8A!9W~e+?G1*>L zh+3(6Yt^8KbGpd+xEF}t!U0+u!l;+ja0BbcJnSoMr{2X%>ziSHDQB4rNF5P zRHW)ls*}lYvBI1UJ)y&n4+`DFOBSs{HT zu%r%%3Siy2kvqB?VEX4#7`?=Qo>llM^(#5k?c`+{$_R0+iI`@gB$h*Vm?j&C z_zc@|BudVrIWAM7--+~MaC_-}{%M5iA;FePL75c!7sW*Bivz{}4`t38RT!`ai8GLF zMx1Zp;+r@9zSh^A<$r2WrpK(WX=Ni!vfXb#pZKEh333k;BjN*aCkd1M3}A!MR`1a& zc!6?38ab*Q?uhjXC^RQ5tpSOqJ+W zDG|Y*?`=rE2JJTfb?^K){4=fH@OQqb`Z6iLR(pP7(dsm$euv0QNM zq(sr7(*Ze(loz|PKiuMb32{AYdJEDF8dU52%3-R;_rZ1{l*e?xF%NMfFScLosHq8$ z_@F+>D)4ckpv`fB=i+ZUFq&Z&Eevyi)VE3*wn}|ObFR_!88U>SQyy?5a`P7BuxI(bo0JoN^U$Tb!rde-SsJt-o8~Vsf_{!TEZbi$s`X5jI zJs>z2mLoCEQUtUpr@EkMEZq=xRUKdzf;(o&1rLxE9n zWZmYoCCgU+IiEEAjw+=IsgE$bO{|$J`VDMJNJRrdcKuyuW zrQOzza*ZOQUSDftS4I6vazF4sp5U@_TMt~SkcVT+I_XKJbM(bYh+NzZIYzXVI|<5G zB;Ta);l&rgUAV2Mg2VW&B;OK7+}^O&V!ZvZZD+`G#ZR;V<*HtIE^D-Pxc8^rfOapA z@8R`qa~FM23`%N&x3HPsQJHRiz%J^%ZISaV{x8Tduv571zsuubQPcw6ztGD5C z65?oo&qbCY$N?XNW(V$yLpc>T4h9y-B*joeHy+^)N-3`mEowI?ri3$n0O#Agv+CSO zX1|5<^5%#Tg_dbTHs7!84AP*cPaT(2)K_P8 zI5GMAJSTv>Sh`yb=wr_#eeI~i3y|s6PcW%vPWpPLEMrsAJA#$-j=(%*zUII#)GJHc zXy6K6VFQ*0vQTzF_W|^H2=5+S91)zR@r#As{OqTOiM4#xq#cJ{JWO}flw0)P6Rz85 zi7j{8u!x`_!R$r!RbK-x{eb5ao)SaGk%Ro+V3{XBURqN%X;WkCVR?G+wi`6-+Gx+-RUYtYy zYb6tH8IC(KLiH$?m4AqOy2>1jKwWWv-P~>FiE8ErRkh>|@`F_lP9Ph47+2vfdJA0>^lD3fh9{pZYbxGX=XXcM^aRKWQLOhMsyjDLjtl2z{t1t8$XqJMK-R{9fg7SA1nwpxG4W1yHwgW zV+YvrvL@7&kyhY4F+vRFi_C_IsM~B=See=EOrYo#|8zqNcZiDlR>7@+IDvareo#G+ zpdBi*ebe63tE!m0?*rp&sd7sA4M>!m&L&~F4*IiUoR=Dg7%t4{<22w{s{8FfsvvR^ zFNr5@c)PIpHZ4W_d3inzm(`xqV(D!7Qove%27K__oEU3nG0I2{ZrR}u6eqjU;LaSM z_%(K2fg$q?K1*~xz3$zGLSdtzE*jSO1U(>IbD>mLQNCQR^2P*W`vN5SkkdWQHJRdy z<{vjbEZwo;5j{nz~=&=kVvO0 zstjJ*4Va|O(x9Gz)Fnh-0=G(tpf9_{^M&%Hts)i3B2hzW7l||)X;nc)J;Q#o7J6;n z3Ac<8uQoV1Zx)BY+b~gat=5FIDCz^$&OXqCyz!7p=Qb}z5iBs2OIxbp^VaAm$XqR% zP9(sjc{5_fqYLmUc~JSUp|Iq)5myj-Gu*0U0CqbI&kG1{qCS^jbwB8V7c5t_QRA3L zYJa-xHkiXNTAt3nzBw-M{KqWyV&_?A5b?mx9mSG7Wn|Jiy&J=73}|ql3t-4LsyxNv z57aK%i+-dVT>zm+`e`xFwRE(U#^-3lo3{LJT99Y0eHYKlMH;5I!_UyBR0XLK%W{$s zF1mpNnw2^|+o!7oL_CuFDDssIY8K7-xrVavq%SoOnhvk@S z(r^a8Ihi*+O(`u-6uy9Pt6C8v*vQp59jjWIR=U@_M^cuqhH5rB;N!clyJ=c}zx{Nt z!xdVP;e*C#_Fj8lTe>B~kKdGgvc#vh zTHN4!eBV3(D|fo9udklEYLyLt&3Qy*;sx=|o5W0VU!B~c+L6G0`Cs8Pu^NrGFA@9y z5Bop_zlT`y#wZYhW&9vf6R~>ig_obf-h_b1a}~PGMsJmyJWS)B10~6fA*uG2qq@?k zw8gZG`vMr^k|rQ5#I&(KP)`-_#*6FkFLehHcrEG0Q`DGXy%HA^8meV9FUyIrU&c7_ zW?GmoDp-b3TT@&m%E~lsDJVhd zPp)i#Q6)buB`C{Rq~s&c>~rhScy#eTe)BzHf*kz-zP8K!NI}7;TK2a z8VCXoTM98wyX@83?5v;?l1?Q9ekV zmEd^_m=?P=6&Lo)PHLVGNR}b@2?45We>J&oaSyBnU zN9=>eFd#u^9z*;M4YkCbc`Q_)SJr~*469+_i9V85phg74)Ir0B^#=&U6xApBj8Vi+ z*3@}0qjJ}JY*;=M&n}Z=x#k=E_`@vB-&%qa4$ptx1&&QHLc?OjA8w2$li<*ZFk@=Q zIwT}q{E?o4stE^%ibCY2ev8jvya~76b`$>g$m4i%+9Z6vYBg4@T!~fUE?>43pMU;5 z?s@Pw+;Q0r_{+aO!lZRsDF4~WIKPX#uxas^c#Eg0@9*G7HMTCDi^V^D21K<-tJZChwQ(UPOkIQB1r?HR#_qpGbrp4S z-1+Cw*f3-2eOA*r_Lkfoz+h|EihSfP{uoa_{sjJh|C^ZbLk4jCo%rW#6EJPsG)$d3 zRb(2bO!*$~y!`~O9FT~m3nt*5zu$w0pZgC!U9=0OKY3ZxUcf%(ti`;E@8Yj7y@{FW z*(lhfdm%tfKa4y7G5q-Bk9h3-ap)&@saf>r;Nalka4^8Iq(+3f5ZKGX&u{_yl|TtG ziE03mB?YxaHPBxR0a0~R4VfkJ^~zE;{hAs$>f+OSYwD(tj}9%b3PObhxF139-dFh$ z8eENVxjJ)MzS(45b6TkG8a1`SL=h$XBtLJb2!V4CeGp;go= zFCQ8vn5Oac*Qq-YYK#b&?l%s!F7+Pdpf#6<)r*#5%6DNn`h?*);gVr!vwa?>e?A*) z@(OiBvA(=}U*K5P5<3PB6t0thZ)iAQZ5?%`A=KpYM+C$LikH4u)K{)X8bW<}jd&UM zhCRx7<*Wpv{?oQz1XUIwZ~Y{^_2i?t_l0R#nRqTPeEbzWbN4m4@XQl2dh}=L9`a^_( za%mI)XnYXd8=;1RX~>@7#Zk)A&=6Hh&h7pIlU)1aNrLVt|E5zWf$<_bGeGg;n9h6* zn^_O9tc0~Z!Lkz1ygFOJa6ley1Jk{*inLGL&E-g5{6P=S1ZAzjx{XUQ8z-aB$m4O! z=)o8!Wkp7wy4a1IuU*wGA5a@BMr@TF9J=q%?&Q}v(pAhx6yC#o6 zA|NhMy!5@IzH&9v5bDcogsJ-&?LErWjJ1~E=fSE2IiHD=U8$J!*(-SBoi!2~iSur} z6o0tjWQ^xhm?LC=B1aMoql;F9w%!7!fJ6laMZwPzj4-hYl zgM)*^Zw;K)_5Xa<5yMxFFdrpUB+L_D0Vok7k(BPOa7>%t5?nPPm`-S#CVF|rRT5{Q^w#{V5nu?k1nAdthA1T)=}7BNz3U$S_1lh9f#60x?lW!o1DIrY#2CoUFn+CCoH6 z4!k@X=ZV)Oh3c?+w6O*@FVl6Yl+7nnLv#WR3lZk`YmjiQa*Ptua`a0a+h^kf+imu7 zcx8V^gvvNlehR95IoLYobA0f|`&iuTY@B`eX*juEI4XC)jn8K0qq^-#jOg7OEn-E# zbgcfau*XHnNneMhOXgtSqJ`qF#PT((ux3Xte4*ipDon+!Z>L~hS~H9oe>8^lZi}$Y zbyzw3D@y@_?8oh>Z;sqqata0Sz8=uAorbux<&K%$bKp3zuT)iWOKU zZCbZ|2MT>*h>VXxgnSRQXFP9Y5G$)nk(ss*i)PQq+=UCZ-78nF#KzR^C<{qIY+?+; zg9GZQg;L~YZotZ=bEVG_*U z{txlZjBx19N82!pvCJCtR4nb@*&Ddx*DpD*XmN;z)JSIIc0 zr(;)D@hXoT~}daEmupCQL_(Gtv=zX(f~E!9V}u3ftkIfX%ph)YIv zILBH`IXE~t{LjJPdh)s-XH3TQS@S1L6c-g(Dffi85&6srv$mB#lt%b#N7)1XS+hTF z)^DY*QDBXMD3NH9SWn_b5-6t(!b8K)eGFqxxj@KJh)2+@`a=iowz*!(#Z!k}E+CAj zx1M9cgKP8EPOm+7nj#tXai!u~va8F5C{!ZGns=!3ZJk#5?l=hOvWtpgH$PQ)y5I^0v*w zTUU?4byDxphd#xvBa;xl@Zb2)4X@!pTGnDTZhrJ;j30j#`nD6J#BaNJ4XpN|c^J9iDx{E`Cgu2xpGw1d4$o~Z*0W>ozW2; z;uqlUn{UU(k557Kiyy};58r@sErSrIU0`3zQMhe0=1=NwTE(p zc$ojryG39ffouLXPFxL1Twoc0J}-}j>1R#<3F^`1NYpPvXdV&jrPw;uv1tOkoJeOA zyg1D-qI$h_lV;+z4c=z!pA!c@gW!#3Wf=iw> zuyewvn44COq$5UQK*v@R&ywC4Da2P*iXEck-G5wC*=( z6AEeN|avXQyFDUKLF7K8eSkk@y7q%i$}M$#8D#$q3@V6IQsCzF{oJz z62j83;+s$K*5(xS?AaaN+Q%YXj)&d>F5HHd(`I4C${aN7(*m0oPR3_n%|XzpaX4}8 zVD#S7KFo+gn>Nz!cJYXi@i6CE1#&k{$LCM~4R_u*0n4iU;qar5 z#E9d@VpzZaXpvZkoUdNOS6h8ZPtQSSRu~4Jd>n=zzKSLUE5}elWWbQZ$HL=R>Y%K*Iww>Ay$ZW1u6@6p{#X# zwC@y!=;|HVvb_?ChaZU}&pZXk4H<~xV@^W9fg>@XT{L3DGO_Z91z0mLJ29~r5js@+IiI04UGeJ*Z$cOim$48)1Yj>V`WjzE{LJIkC zTjRijdi-UXpZPqZuZ93U%p=0E8lj$U8Wnn?2Ix~rSo4dQEud@a=JBd+ocx?PU;{xL z8zlBY4%U794ko-k8LLjX4mX}T4#Qe=IYcCa%d1ej<0Z^oxD7L^`s0+rozN*IhBx$0 zM?I8et;MA0{)i{u+kmZugz(&UH}3rXRXFeXF*xCblW^LxM_@pcJk0;*ODrws8QEZ>J*p*gxUMi-w|m z(+DMN`MJ3W>3Sl5f7SK4?$Yyc`Z34gxN*nhm=nbSX|)?WvKL_4jAFDI)(@Tgc0_YB zMEUJ1%TLF$Z$7~ERX%K)I|GYajmMw<`T%ad<~*Ey?1>mR_5>U|pbbJZ=3ryyZp_=! z6{81sLEpCVI(BSV*^V{%@wMA=-NRFn5pq1vx&Kbwd)uFI)p@65%+V*{gp*Fi@uLT! zcU&xz4)21NVjM>Vl_7oFn|SxxoAB)N!*Iqu_uwx#-i$w-Dfy2*21lQKB90u~9LZ&A zSpD$_*c90T9R>_U$M|49_bT$`SiE{Co_~HCmi0IVf4ccD-2TVkF!SUn9;dJTu zu=W*LJ984Ir|$rYTVmiTGS-LfYl)Ghai}w-PoKPqiK|n9YCYHggS9w=BVobxqOh?g#PEU4OuN zr<{Oe#85ir)KM7LrWn{Y7jtK?1QObz^YGqi7Z-!5=DpB=$VePBpeYJd*Wmjl5jgsS z>u|??*Wm&gyJL?$0)sjx$hjluO;r|FPMwZPGu9w-;0YLg)DU!vH3ou?;VZY}@y9;L z%#J7F`djYB9XI_Rm!EeGjyd)?j63EOoH(RA+C^qyXZiws`JYlWAJ7$DyUO{hU$LKh z{&be}Cqc)#eA`O=`0h>k^CyvrJNYg=^~fE#`r@;2>``NI(n%-bq*IT@;GQkeHo7ZX zHRB5(<#$9!*ulZU;eQLg-u(;)f?;2c2>wWNGaegU`|kK5BHDjrEbNacc_q26nE#D=hGbDIVz$ggrO3%@i6o6!Ej98V1x$zn4$N z3lkb<8JkDkJ!+CX>hOc*sFPAp-wr02Q7A=8-Xcu;Y5_h;2gVQWhK?QL5hk5sf8r9F zp#R9r(X6!uKAVoknLCil!g_b#jFqrK>{|CNKL26`Rur6uJ8u%QcE)h@Y9*vNApr?O z?3#7%j}hnGfxlgQD*DH87BX;j;*rv#D~2848Q775H)k%v&b$Im;rJ5;+qWTg-fKvU z>Wcxx2cu&`jNUmQ+8;I+C!cl(M)m82t;}PGa4LTk^1{a-k3c9tD+Gftg%JdA#FbUZD z9Au`=#HaU7!RGQHob!)cal<($VtBXKh>e$iOFQCXgy8iYgd;CL27{7f5hK5uRi!I1 zZ^l%7G^smIyzzSc`MR?)x^Hu&Bubs}@kngi99@Q;jq}ev7Z)5QEnmC}E7tBnMWxhP zRe-`xlkn}NWtf_KB(A;oTKw*!qj6Y=BqU1Ng!ni#Y10)0Prn(rUv(x5q6~at;FVtjg3R|cH*hmO?%NWWrNRT$fB{oNk z!^YsmKi`ORP8f@(n1Ih_F2(!}ycQb#wDV^>wn`~BqqMjf*<03&F9Kb9_eHn1?a(A9 z4)OfXB*dXjo5OMVfKlk%BNSl=GBN1j;Nb8pL8BW8BxHUvcgP6`Ab{l8CrsCYGGLq` ztTmwD=945L({xQfrdpGapsP!A0-3Qy^65lXv=A7S^ooiq-HTx2xxT+j>kgNz8znR} z$QTB}A)bN27n<2R10X7Ge+knk1C6K0D`Wl4V^Px&X*b(Kfh3OM-WRnzh9CQK(V+Zib9IV`(rwbd+aW6tv#zrjsLcD!?V8~(Z5Fbs7 zX+}3ZDo%)DoEV^TTzs6hDnn^$8A?ivQHEqRNos=Ll5gvdLhR0Ai2wwNk;;R4!blA2 z-WhF4#5`kI4d0j~G#fk&LsB|QU>>&ZEWj?>H_|X)RysCJdmry35jgw*aK#DzFr=Lr zztUgRZ%=~55SbW@s1O-bUpaOyn1wlWKf{_nysO_IJtE~W6yzg6zeWnBj)df-_aK>Oi^#~y*BjyVSXo6*<{7%%BSXj~Wc>UB7V zoh12|q+!9*^(ZYfn+>WfE95x)boP?x0Keb--QoM%ZTSYls*4MexlG9VHlgYRF2lHC zhha#IP=xGp+~Sbfb|l6gJru`v0G7{RgH`L(^rna(KjHkz;rSzoh>S#Xizd?9GHhA5 z7Mr(cp|G-2`(pYahCx`gFC5{(4(W-IP{vr}1?eNKku~IIogl4zDdF!Y=C?E}FvwTH`SU2wnY)O^C8H3TOMKhth zLb!y0Q7Wq=5Ru#+!w2_3SK;+vd^{7YHl(9eb(mh3mK0;#hKa}&Mn7ciAhZ&)&sEkn zPrLDq4e^J^CLlVD&maf@^~9v0N!MXGvaf`9eTLa-)6qi<@yuzN%20VK> zCpx%md!2bOkzTtsAZ?G0L%cpxb2rM$Dp4ssm1#w}x!AgN8g`)x`u02w9a7@-&bXMx zUcUqMcwYri7#Sxqp4cKb!b{l)q7fO< z1Sy@xTgvZ{iQQk=>?OrT*r`)ZTwquS(neDKe(l?#L&ro!Xu|@=OTyLFp=gra1g*Qa z1G2XvYfBn-$@!=`1M*pD*ssHjtOI_3nN(g@hHV?yAX~<;^|2$-wS8M%&l)&})WN(# zL2>BVu`OED!ko7S*_oNh)x4~YIKcC#+?+og*T~i_(RJ)q80*VG&R1{ag~y)3vu}Qf zg{yX=u(1B$I|l~`hu;z!)j;5HCV#vw5i{$&8UAgH=`+P#yv$hCe*rOhy^EZ`obd<7 zi3ZJ2H8ccxXN;SYHO>meh%Vc>2UMrPYoC7xfKig4(JJ%@me)qr#OaKIh=o;4_=&!L3cPX@rrC6U z28R9n8N9r;;KkW^mZ2>tG5U9~LHBG_6(D!(TzvK29HbTmquKW9nDEMDxL3&PU+=yf zcZ>Y>FL&eq2cN;ab23p77Z1$(2n*M3LONHjD5_Cbx=RRr6>=ohJ}D95dwGyjHJ?u9 zjb{xQjzdDz?ihAtXEeiRyf|wec4W~E2}1eSP1v;Ld8}!94vrjqG`b~3>hdB(_kjGh z^D+6wf8r5o?_Ib20oR}QJ6v())wts?f5AOZzlM)yXX+wJ=B|6#7|XLHE+PWv<$ZPA zCJ;l{wps02PX}kpN~t(161`eCLui;;inB)*gcr&4qO8J)3Xb2}X_)l>3wYw$XYkB3 zMxOS&&*GW?OvJYfI9*eU>X1^D2bH6=JO|s;cPmNlmYgV6n~|sw<~!ic9@L+u4wxwz zu`x+#-9@}r`B=L;71>2a9?9P?C4zF~=kG-NGV!*IK+EJLeUx!cdHG(;XJlwN!o%eI zRo{RyPJS~Y!jr`#{pXX>WbA6b(LV+JCh{@NJCTu|t20#HlH(B(LGz$)-@Hc24`p~t z3Ys=ii%Eai)HwFz0M8#$YtBIlhc-vYp%>$CZ#{xLhA+fdZ;Si8yYaXC{)UGid<-9a zF&|sxKzl#Q4h{|uzd1Cjfk4QdzKF*u>{L=DUe>j z~Rpmn^UzX-GhC+pqATB=&=iY-buG0-d7?&D_lN5v^ zl$Jw1U<;%Qt-qSfl!Qb3g)?eNkyjY6-8HE1+O#wj4@!2_?KDB6wemEU6W^kU>mkF)1|f_Gkg3=cf?FdljM zVLYtz5FUQ~X}tW^Qmjwo+K45Xxh5T3GTBFJDVO72fC8}&cqdhqo8!?CcDgO3cY|Pn#BB5iMTQ*_EC&D$4>W866bV5?3_md*$Tv6(5eD~h-c;pYa z;vX+9K;_8GaK>}b+3ii??2X3U{B^4_pqf@9t=zakbBqI?&_m#WSPLEUun9 zLNJr!eE8vq^~(qEBkhFSrM^{q)2ljC%w0-1%=og`B-Kwdyyt!3Gf0K>0rN z?agL%%!t=TO>8~N>YP8!tD)*}#3c8^$a62nRrgQ8TdzET2X9M8{?h00;KR4!?!P~W zcfOd7)wz`iv`Eas!NK9zg8%+Ey)KlXQmFb+5_6H!-pdC`GVfaPNjdbZD;H5i3K|+8 zL#&m6ONj7jvGMCgJ5Y@Az*L5HbE>!%y2rp64KxZW%6+=Lh#QkRa}XpKRKBNz8fkacHNIG0;?+3t@=8D*tq`7c0U3kp>c>!0{E!@-9^Q^ zgrZ)Eu~%IrWYbss9;}X|3{!Aa6SU}i9F9D^xhR@|Ih%JPeOEfRrmeuI+mbP~b1(F7 zCFhhGcCin3A$7*Pc;mh|@O`)OxbC69;g&!C9>2fx3S4o;<+%KJ<1zlMV=%aHYs9et z%ZYf!|7+0TjpZ9!a*MGcBMW7^M&1~yby0K51S2{+8qv~4B(_EO5o2)HnP=e4GtX>5 z&cfNJpMWv_J0meD0--^1h>j1^{_HF+hOc5z>Zny!$yiHzQ5hdi?U`iz?6{X9u_>DO z8G}&?)rida0TbqIM8+;TNxbh(y=OGz*-6P$x@k35&;1CK5QbJQ`(Q}VWW?yIGCSvE zpoYE>_4@SzCAs<7xqXS8Vkv0ayg3rRO%3(suUAJMux_>>JiG~7w`~IMgqglQ8-;~@ zY%8vh1)l$Y2@K1JXB^N7sPJ(!GQ(!ppp*uJu3N9rb=G0Q)rbx=ON(d} za4AF-pJ2r0MH0si%7N`6*d|>PAw*kRYYYRs)6s*pqK4SBPm)LDJ%d6%j1YDD%~vT0R#e)g2h-i9l>@Hw-`@rd!jkHmW6niA>v!!&_KrgDcn0W`P*6}IHgDaGg>On=NK16>)DofcyFsWHTd$11 zxj90=h{iKRJ@AfOSVRO`ck6{_UFDSgXdbp?X6hY!E*A2)!J8$mMlRNGNJH8T35@K3 z<}F)^p=MGVs%Ee73fZ#ecZD7~&SA}v+|GX1Tt zDe2(g;PC55qZQ7pziq!U3Ut;$Tpa_OCs2q0*LrI%e&!;>3yxVzWbS^G zwsoqDpTgvL$-r>SknyRiBg>(#I!?luLQO7_GdlRQDr}$3#z&0@5o%yLFN1$} zz@Nv{L&Jo*sLO1iHtUNCt3$O&JVo2%>9R8vwtgNTZHK>Q2MeSJY*O}4WGulC*0UV@WXq+$Jf^UmU^gamXOauQl4OY!$V!skCO z!J2{!8GAD(DwRdpzIHjjojL{E%q~w3TMamN;)KS;pzENK=-gAd(c(pzKW!>jF3&`_ z^9EzYp!NtCqtiPG{16x=1Kauc8u_pG=rZ^Sv}zd-eE%UP&X|uSdF7}I9BY(eml$G` zf0&8on~W+Q>;34sc?d!<;+u5As57s|xPGC)tS9lehhM?VU;T*1+jpa&R1A23|BO@= z?n36K6_`2UdHmEY8e`8n6X%~Y1g)dY7GOW5F{JuAQzqf-iBqsTGY{p`IKMtQ zj=R!kWB#Jqm?rs#3Yj0?GX;_6707z7$ccb3-R!;&g(bx(DwgjYJE%HLwtB(tMaQ9e zpV2tHQ(GY82mG*T5$5eILTQ!vowYj3rBAEB$2Z^4#7D)z(Ifg`VE4BEVcc6a`vU8z zswhQC!EO|pwRr(ZLen-q(V-h3&nv%~F_DOr{EdDgb#QQS_=VB9ziWD-;~gV%KjYdb z^Kf11Z{2V1mKpJ<*A<&zU2{FUx-#(!Oh8HB$QX6(pM%I&PutMi(wEMrV=FvLZn>K!^6T6&O5-mnQu?%g;|KT zHGY(|i)gz8h&ae4h%KVgj#ik8(_lTY_X zFh6zKwhGt>-u2a)o&SnL{9ItGDzPIo9rJ(SyH1(`XN^FgHSg(5N2h z+rJBjwFY*~Sb|ln*P)1vJSGuI{YT=YUhRe2e1~W5c?+L@ITNcgGmw_C9T}OMuyX#_ z`0SYn@$eVL$PJC7QfjUZMuo>Bs`pR~?a&=j>*nBxdDHOCy2CKKcX#w|CT$29(x6~D zzam2P4T_7V&BRwzW@1U&Rw2|G$V^{{HM73O+Yh{piQi{~&zI51gi85ZHA{GZj*=W! z&tvn;c@@?i&3YV*@qcKIc9?@#uKO!qdgUX`TC^S++cJ@nk&f+IYo+f$;MP>qblb( z+g;C)?+LG?v8~W{)aCf=^;h8d{?W*u`!w$6=Jm(l$G5YVV)N$B*t}^IHgDO2jT_ct z{&yeX<@+weRX6+}UYH8>zxWPZdfA0Ix>GE4%Sf%dtM!dKN##G_yN{m6BNM*I%yp^Q znzvjTorXG(8ph-4f$0C8;TTi>}3M7Gv(L zE!dF04VhW#*d>hHryXWp=3D6X%CsXW2GQ-tVB85qadPW<`1eCk;FVXu#LT5KhG`uC z3~ZP4XWh(+nDBp(;iGqc1jgQp3r;u!qdVEX6dr6f`#|9NV^O+mD^}0=1e4~=xthxJ zMe3DfpOLl&YZtA;%B4R55iQZIOKUU>GxgTo3UP37aQO9uH;V#)9s`A!4lB$@;V&U? zIZ^nC4vPOx%3WLGm=68Mp>vP^ej?{!;J*k3LN1iNsM@>TBpD?8miU@9bKO*fK?yS{ zg^4#Q#)zOnU@uTiqft;+E(U@~Nm)63|s^8OP>*9;s>^Vi< zCa1uwU-i;YVOfomPft`I>kz}tr2cQQ?>8xXy(&x|RN#$n_+W6hhC{dMq|2!Tcv%F?G{>->dS zke-H3ho6T_PCgDtb&l5`2s5-alEaY_l822u=3>_LHQ2uB8_byWJ?6}wgfG8*3NOAn z5m}waU}UE#1g%d+!JtzxX7FL?)12pCCCUoYvEuu0FmJ^UB#*reNB8f5HssUP?u|iE zkQlzj8!_+G>6p7=2YQ@vA%-8;87;%j`4b)&kCgU35VPY4tXa7ZQx{Cf)UOv|x)>}o zXTFDzKYk9+JpLVi$ZCTTXAVM_#ArlF9~0ZOKw?Zdia-4klh!TA{7F;r&F4R2_U!NR z-FFl5+G}s%mDiuaixaZYYS%J=zHACM&7Xz|)2HJ5 z*|Ra}v(Kcym+|G?1RQ_mD71^H!iv>p7<|fc7_`qfDc44DR3cJ3^hS>kF^J4wgL#Wr zVZ9vJAEtecPe1+u|9R&fyesm~JO9CZpL~MPW^ToyP9A8r z{O)97#gyszc4jKNk3JE@dq?8U`=7v!X_K*dju;Hzy@A)>dIz6OSb+5<$K#^AuEL)# z7>0H+VXDF$7x|6`C!ivGC9+q}#1CsSux8;@d^hK7%$_w7TVswwx0X_OLgGoIi3!E84yWKfHcAZhm66jOQ%; zIBOCnPyPnqyzwU9f9o~8KDRlJyy8my;hM4N)g)Rkj2r|{wS$9$!~YDt-W~jJQa0R7 zNEk2BMuNqE=!pz$fY=KXLH_EW9gu*%6K+XA(@6NOUuP5;$7My5$<8itu&X7^4apSh zrIh*1%t1vt-S2U-=G{37J_g|3+Bs(8o11{UhZo! z2ifG&yYvC%U5yxVnaX|zLJ2xO+9%N?t{Mg+ItGjrP#@#eFZBfK*6|X*&95~`9^ITw z5wHwl^J*KJ$3&Vk2OGRbm1bvP%c3Xnqxf^WpM}$gG)Ge(d!qr%|VYkjKA-oyd4nH5aJ@NovxalN>W^BQRDO2#n`|sncuf9R+vv0!f5C0XH z9n}MEidT!WVyVqLRvv8KVd3%Ud-!0qZJvX?-QgI2AmKKv3Bwl+bxKm7}L-+nHR8kmTkl6{>Vdd@o9I@O@7SgFg8_)sCk zo$EVtlCN;9^te)f`FNZ)#-s#CBcTzKtR4AD0!3piYHT`=ghYjE%MC-CGQT~L<02uqiIj0vB`R1>yc&1C z_5gl&{Nd;onI7x?g_ z`S@|+HYA<>XFT-rUAXy@Bhe$?JU+HIBGK)*^Q6w(aB)~V(iY9YyidNxN3WH`w_EgU z)#6r`VU_rDD&>gP>VGg|nh(TrzkeK0efA0-zHlU>H_eoBe;*%x^o1OUmB_6=5|=;t zHol#3C$2fBH(G}AW$g&O*1*mdaB(SDM8|qU`odKL2`3G} zLq}isFN{0mB7I5@38mh}Jp^GcMe=E92}tT?C`evNZtYuD{YC&qIWyC|I3aiX=3}qC zF%C$gNshU!s0uzWU9#&e0^|6yp)xTF$|@>RTv~>r!Xn*&5G6-4DJ~L8v6LtzC&VBz zHWu+Qk%*7xBTmEoWIPZ`v{|9I1d8oe!cFnWJtgo+GmnM;9Psj~SA?+|^5XQO?&Vc| z410bHzX1}EH!zR7HeOscK*Y7nnfRod`ug~DBO)>a5fOWN34sS+K{hhBtiy&~K?qN5 zhu%F~B2f%D)1!T%966iUVDpwtxGTb_=!tF|J$AObCWc9ys#MCo8_X@hDXs&;R|iVYda%#B2=Zk^DvLlZ-; z>p^94E_Q6&h^^VVDB!&e&QQfBpjo>v=$ssk!cA+jVe3v*HtB-)9Xp{lS2&5e>?_@k zZEIE|J+~YYt^1&J+h$18S(HFXzVaQ|yksM`=T#!Ub2oHo-wX*ll~EfNd0EKVnu%>W z`6%_7h2=0vWV@5uTi+S#vb1G7fWpq+2G?#MC zV&pqxO4UYX5pu;S+L*o*xg~u2Ruw|RA`siG1KPE1g`}!1Z00*Fc7`IkOGk9&kJcwMCAVsgcCC^Sp<`3`pc0j$W+~pg`|r5t!A}u; z^|N^7zAJG=#1?E$-6rRReD_&K`W~0m5^bgLDKX(@)~H@oqC7{8qtrB{7jPFtFhawU z(56#&v}qoR@X$PLTa}6}Tk{dxvOU^&?}!xndej}us?t1UZ%vne<@x)?n;0>%P0^%H zJG5&VXN=QYUHUK1pLTNoh(hi`$lsBHZQFKXr~H1}mrk<((Fx7arcE2POo-Y`{~a70 z9DaUSu9TObkH;Up6Zb#z+?^85r(aX}N*O*bkHUK;d@P)uRj50oz+cfo(VtZNvugcT z_}fQ0Km*|kzkv`)><%@s@22-8rzHFu(1BHwO#?yVbQVFbJ&aSLuX(x8z=|nHmtksE zV?m7r8U(z|nX=5|hkBO=w`GIkSo*yDMtg{BpCv{O* z;7kDHDb!$RB2*jW)iJI@%5h1Og-v5UYB1E>%byqfYasl5;Mo1Id#*>zcz-eQyJn94 z0YS>>Y85ZoAdGS^VDUd3YpI`gdH?%>84I>|&%8AT!rfvZG`ado+<(AslOrUrGYHMFY?a| zmWo_&WyneR>1UiJ+7vDuBEh%BUyTO&tE{fnSpYM8V03Yr2=lN4>Z6}!D6 zC8r46#?CQph&Qu(1fTu!(oNq2$_D1MWkqz1SjNl4GFp~#gqN3wgXXQQR2?>*rI=pJ zIAFT>_p5=|XWQ)qg1>Ct9($xPFx@YjLE(?{!u2DdtQS*1YL2x(f8BEaI4>NCy`=?U z51qA8bI$qm)scE3MH(J2BMMJ(T^i~Jh_duhnN5&2iqJp>fFkkq)w2+;imbgiH9qRGq(RBBko&M;7?=Cwuv_Z-j_ z(@%9ty0k;n#W>*J12qunuPE2Yn^IAfx5pqdEDX_N81T`i`gl|E^TlX(&3|3+QpkSt zVy(-HNaPvM#xb7dBwqW-c9OI+jd?{(E&=02NZ2i@Cy}>#^r9>An$Lp`>uDwVD9opI zFwKH>(QpubG!O_i47_@5BLe*gHP{~&FMJ^Imlg4%Y9TP)FJ79!ALoVZM?hIGX0Nb$ z1I0_KN%O*i*jriv_R!e?{Q2t0UQtheEBiz}W#r!vf1DToui>wwKJoG#Ahg&Xy7pgL z-Ey@``s2NDL-6OTBVKZY@aOfy4WMCtwtPL}<#2FtaQLmF(Pt3I!GyO8IWweJIho3D z&u_@T=Ze@($JQ@7CF~gw0rAE#5K=E`N~$$1#(_6;AVE(*$I_Hn!@%b)D^g)u)*yK# zjmCk`S1x&c`f@ZbHL8#}wv|sOiizaRL5OZl=8Mtz-h+rRz8KBCyP+ZQQmBsw^$Y>( zGw~uG8CN5Tq+NvRynqt+BFZ>5kOI<`(0dnKKasbfpF%x0kA!VLo0IW6W8jI+XAKaF z|3a?nsLu;KI5_M9?$P0zQa*~=!NI}7;m}2+8VJ0mn7ha%vLub-3Mn-5+w&XZFJ#m+ z1Z@e`U) z#81?%u(6&VtBdD~EvKES1J=f;6HyP-Rfm9v1!o`ZqfY}31Dls|8qWe=IgN7`f`dZ? zknfPM9DG+^aYfC$MI0O)92^ckG_HXlQgcU~1UJC{8x}+SX(SlGdBd@Nsu1HOABnu? zWtwMXFfUyZE$t3}8Kfy7@QIVw;CLWFslri5O^ zrZJu(9~wvaXDY2`^e&OUg?0fl*NKCPcR1b(d&r+KCA4h{|tASeQH$*nN} zUC_08B4R@MO?Pl`aBw&j(YTCBt|oR9ttGnZ{zk>l3Ya|s;`fMt;2nR>LnDA=qVbhV z{(V02>yjbQ2%tz_E+aDOVjzf1zx;c8CC;XEw!&wY6_trw!hHu~9Pp_{KJoLdwy_bM zJ)ndkMht_Ps0c)H|3P@DzCqc(xJ!w;=-(Ge7mN`g0ZZB$_Q<*tdylBwbQ1PJ!@$lq z1d@09EwQ)80HJ;_UPW}MalpEmE4xH3~s`uMqaXmgM)*^A%#X|O~TDUp2@r9N_K^$8UJrkl++t?Z$0N2-fucA1Z{7gUp; z1oX4tB=j^wEb+H94)oI?5RaBs@~$V3qs9BOEE1A(NMWZ07B3cX|g z8x$d-+COo%uO#)-cOxcEXA30W_`N*hlH}`#W%ZNz8$*G4b-9d;r5Xc__jIy6%kYoy zG^nWHk|H09%gRw&Y943GHzrq#j@a;EB*%v7%z=HZX>?R1Vxwssm`9r`DQ7*>Mlx$9 z(Q^DO8Q+_bHgLI4aB$5sAFI!jcDp}-;2sN|IbeClQHSKwIz>pI?W}^;$$IL#EJN`V zZ^_T{CXGoFCw?_7RF8pQzFk2(b7zf6PAkEaf zu7eUa4rpM6hXx}dHe8H@2whgheFt$dd}Fe>Tw)Xvj^L1*b^9dW zoDJ|3cUE*j;@zqDW)n!tLqbB;Pu5=Zz6vLdcpcoy@_{$6Xaa76PR2a#c797Kw-5QBucXz_c- z0g1UXZ6WRAS5mKJ+7g2rA-Si)M}n_Jx1KzKQj4H_!yVi1q?3+qTYsMS{NHzO&bruF>tffc zS+hpX8gq;Xw#jjN5C}`2%b9XxQKY!23~4PdR0gbb?>`Fv*W<)otbzy;@^67LiUndd zaT2$Z$w7%F+erXyy7LG++nNv2yZp-yULUJOE`r<+0e=QX8MP;D3NMkO2O%9-J&(Ct z{&hMFEIox+95B+HGyL5sWH<|)1+A?FI4pvbffY5)O!5pnw|x*Lk+dTz73GW)?sXvs z+=8DEYlc@@+6TXpnzvnkT!wC%6t;a>9euF&GOGWV`?BX@_)2yxZgbglY)DTCD*wu@a;!zp(WILh~$`# zS+4&Z`{PS`jC?Bi8afT4*&wcvR;;Whc(7EA0uuulex3@=9?bz27rM+bhoN3Bp`?0m z7mebCWWDBqOy$1R$`2OTitwprPqm3e#|mk(krWr|U#h%Jbc|$?w5UA!&Y(6B2>`|b zvEJxput7$6hz4iyF!+I`#p@rEb@+eNiXQj^~?WfxLrv(jcr5@$t- ze)smPe@~-0*rKA91YcY2|435dLwregT`BU6F=x!Ds;d{3=<6q`l8oVMIqb;N{8ZZE zP%7Os5mdsiJB}5?E-gDRwd*_&UFO0?V#ls#G2z6=GYb*j6_#m*u_BwygUnZTLLzTx z$as1hgrTNkSbD^Ff+{R2K`5m_V`M-lNP|KCG6Uz;j}3-FWkK2D{(%y{@|D8n$!&ayhmdR-xNDA20uQ)6$SxNLb4q;Wbh?1X`k}zFjJSI3eJogsi~d5+gg4uZZ-KHfn>Vl4sn^-a8+E0 ze~!e%!Ya-z(Q>lN)r=XK8l#6!UUnxuaAa3gi<`oS-DC~<~)kZyuD>sQ6D)1a&Y@QJKH)_?LfjRd0F95&>J@-;(o+|)^k@B*x@HS0EIZZU4 zCe4(J{)O4dwJ1Z$(E7?4=3FJ1?9hZf;Cqe3_W~bszfdseab@(z`}99?ivNC~!zA-X zh?&&D3`oLsMg?W?4A87Nu%t`6>IJW*#u^79!vY0V7o^}GCND8QsBP?*iQf=*#QfE(8iQxTNhu|D(pdC_ z-F+Ga1!fd|AaKHFJlrda2q3I@Aud@>v`f&B`C*0Th9&BD9PoWc`by|{6c2p-vtQd7 zv%_2Wgzdg*>g_P!hDon)_G6MCUw-SUL5UsfQ7Uu!KkWJS6gC)R{|dg>+YUXWDI_%^ z-6lmPRUw@tZO9vpAy*zw=oe#%*o-4Ao))*(ZkxtH(G3oGgA!4t^o2?M z1!C?Jvx;V5Nkn8x1teqRf%h#M#DLfoKHQ8#_DC`%xAh|ZO`9t=4>Snq`?{4AGK}0- zDdfut)c~$C zI1q@R-l!WNkIO+^MkZ?bd4%{I{$oW2wcEu%ocEV6=L!0r`2YW`MuMfD!i@ZX^;4#p zqM}8!Cb=ZRq2|L}GOJ3nf|Vv&p}Jb$hBgRb z`H$wLpYq?WU>0ZgB`8kPuUX3W`Qw*FKg4F)Nx*2XlR9#!St1fx;w1g_5q50wy_iH| z5V*3F@7KY}FI;x&34(`%Db6h=dw($Zc|E6)9YO9Vut9Mqq#iabxxW`Bn5-|LC?lWF z?m8NbS)KlQdA@w~HFaMex6-GxZ0W_;u+`RZMTS^2UX?+PW2g!(C{(Ko>;XIb*NzU4 zMc@179GaM%T(p-zUn-X&P+~R`Z;Mf_*NQ}^SuJcr5(xeQxQdSfym%|Sp2d01#XkDI zir2V6quajx4qWL0L6%ptCPkE;Bd^5nYs7g$CxO=*#MJrryf;;um*ucox=5 z#pq8Z^h)^dk)4`S>RM(q zH3Ne1bpHtBt=rY(-7Cs(3%_WULEeIvjQXJpJZWfJQCnf0 zN8H93lJ0V|6j5b<-`I-;8bEQn~OmgRVgLMNHM=y<@J*smWA-grt z=YAW3-K5uyq{k{Z3w3bm-Xu*L{x8c%b`7{hh6X^16**U`r z`UDWRqymVUJSn;bU(M+MG1@=4pm6%?I6z^29-`^rZAm?SjFf6O`A}&3UE>;hzbJqN zyea18YWhwvuLc&Yto+6p&C3}Fm*wV@s_gWYzpRMHh)j3(C{~oW`~$mg9h5XAwF(wR z1&(PAT^PKQN}s*8h2FvCbA;gy z?u&U=lywVx4#d-DB4hVmS*%_FneDcSnl*V}c5FT2$bxSOx2>rK@=ybQa`Yu}sv7Rj zP@I#m*h>8Gyk#>wVGKMJ)LNx)@qaGV7$63hvoA*Sp5_0@s;4^iCouVkjls8$F3}O` zef2#{F}(v7T8w8~~dcvRI^nOPFrt9ntRDn=BEvbt)K zb18+ymmAj?v{j-q#hDMwyh8ap#ue*`Lj0tVJc*fk(lm!N3L5q#AfFXR83<~EMl~_9 zocSIH9&9)Xa%K~7lhKM9- zyQkLoT1)Y|9t+$tQUU=3H+;TBS@DM>V;vf|mj4NmvL>+pyRI{;%>s|7tm!!zA3bK)vDMihhUBOf6E+HBEC1dojra&1yYn zB6t9O-#n&XlG?P?txr1~YlHha+Bz~z;D;)`QEu?M3n9RwcHrh7XLPdxGFx+UWOZsS z$$)-WUniuf8d1B^i{yYw8yFs=X>vO)nrhu;xW7S2@K60tmA(xm{&gX|dsGIir8L@bRTy5092n+i%llu{K=P%Obe~6uSwi>-?0pI)ykHs+1i1?R!k1Yxlb96>}^AP)GJ2!GJ zD(Z;Ej$3zV@Tfzf_FrtgbqqGkU8v~fnW8+it)&$gCJ3(=TR*inj(RG-*c4WZUvZA@`q{8th1$sAp-yzvfeGFy9s}u^eki z-c`%YiguSfFzXZLxros;UOF(qRZ`bVBjxgkZ)9yTo;bMI=Jlk}v>z2Uw3xaKBckZ6 z_urLe3%CWC{r#ojlE<9?Tr*!D4_V;Q21Vi0ZE2j{9C}c3@GE(917xqA-3{Lv({)?y zMb%Qy$aa6+AU!axn$NYM8e*XL$7J8{I0L_`v`Q^W#duZUK!@HYJCS0X8%l4>mp;muqQ-eve-O=PV8NwuA}1h2CO?LUO}Xrnkvd6mmLa`u zr$`hv{jgY8?(SGz-%@-xXu`H_B&g}z7>kKDBa{d{3&PJ~DH0ydSnym9prngm^OM=+ z4Qcl-@w_jrE_NI^j$5*Af;Kw&NZ*E9>{)~f#U$84(WWf%S4no%w+Sq4N`%0UsaR%I zf%lR#8kJb^3n{3qA57D`pRkgmihU^HI23R;A@alSv!{~(*{)<(tT||~w=`=klQHCg zd!p7lG4UqBDa&Co#|JZpQXq$x6AHj_?0#o8^nY~c_nU0sz6ZiP9}Fp(^{<|fQgmX@ zr*fW}fgYBdSf2V_op%!DoNk4>dqLF*cA1}yd0sCXe((F8Uf0nnPOm=}>Y3HX_h4B* zcSv#qKD@C#Z@hBYu59_=o>i--NF;XUQv`}3_@{mAj|5Q3haI&u|F)v;p@(+1eM42q zChc&;3-H=k{r5O0Ye&Znkpw6A$1fC?sr&1)`RSWcz%{>vzbUCl*Q?e)pZCk_x4W8A zdbl*TVzkodA1r}8cwSyPcm82_@5w>kYD$K*2Z8rs7efBb(;Zv*IRVp`*PVfWK{ltX zNp)=etP%N(Y!Qo1(Aq-1R`@DuRo9mZhMAG z@)NXFAY@f_kN6@R#zPD0M@ca0N1oPo=?+t2;w^BQ4*Mc+#XE~JfAlvwPac0cg(?Na zx9fSp57mY!4f}ua&1}a3@_QHR1cQG>8bp5j`eOZg&VX9N-`8M>~hgqjM)W`sd zrV@Qdk#ha9IWw?zJF;87ow0NBV{`b90FpWcd7tO@>fY6J`xnW`)?`ZLRwLg>cx$-> zx|w3Fl!PAhdnNSs%Nol3## z^Y`!XZvW41(wEZp-0+A?`Y2?m=Pb<-g`{+}%tsoxuSppoP5tQ>LyqUxh50~Wbnpk$ zn)aYaw2H7C1FTbff7tptwk1e5XB3`VjzR=|dbxE$jovz^N1$ zNSI>iQb-j`sIvd0lq91e!5V{Qha#m&U_m=l+WP>%-~w)0?lE(GlMbViO{}3)E^?IN zNr;L1PK4(aw4p$TH)ls*}<_?xKQo!!^0 zcV7W@V&*-~o7o6)A7iT&S+X_>W)FX>io7=BhIKoRChuB-oK{h>8h_mC7lrwk!0Ec5 z;>l(HbNj%AXe$Z%kW7FKFlrPgLsTbjnco>^9T>^uYBVIobP@Gb#xNVOm)7>$BD7V) z#yE0+`5t8T$&Mt|4Cw)gC}g)m*!Z}EpM2himw)oYk1l%)!ja>GrQqlA2JwvHVTBbi@2AF-s)!c0V!f%2;I1Vl+!D&co*&3|>JZkHqB+Oaq z$6i})h8#KwK^A84#~&KLB0KQ3km(Mk7SmQ^%YE?ToVxJt?0Cmq@0%aL&L&(15>1P} zc-W2)hal&VpkF$OrS$lPUiRe0UdsIRogN_je8F(#+&@C9gWKekui}dk6B;%nQciee zrwOzY5Ivrdnm$pwUI`!B1wMe!cE49?&wiJyK@?Ygjd5w^7vMXbL$ zl8jt#MW8ON+|3nxIoYyD2z-&`-d)fRK%Qib@|m$c0{0y0=2!*vqtHfwp+L8qoTPmD z;pKnc@E(o)*?lC!v*L!{4CgWJW|YLsom)*ecE&QhkL=&hQ*A-lf846q(jr}+5n)<} z-voOp!Z0x8RPb7(AFp{#D-AlRx45u{y(b=RZ;!cDiHhl7|(5 zm@(NleK65)Uv@pwt;|*vT+QF~$WHT_j8$zJZ)gXN>GR?Mn@qyl#kIqFc!vE1IZ(XZD{j(?^`%|nV4O7@JZIym z3$Zf7c$tyI!(Ix|Ta;EE5x&`!V}IKpf~=sXNsh6E{Y5*zMaRU!hA5Hqy)gASHY!Wt z&=(;D1%UI*QOIGMLVU-iPQ*nYBY9`aPDCFeE)<&_hNggg;kOd){O^UYlG*_h$n)`E zr|}XtR7B!wu8(1}fJp$n7}iN7#kw7*>tE2Kl{Z30vNLR!VF7pnM&T-oXIToMaY`S~ zV%6j~?v2u}$bBQySoM7rvms5`U=zfB)=PM_bXZRuz1da$a%QM?RsMog& z>hGE$59r$VBlcLnYlv9B4AruzwFQm3 z@l*qQzE36279sLBJ4An(Ma;F!X|V&u_*unqw_`*f@umlk4Qei4%vG} z*@QP^>;zmg>BM8wT@GoC9GD$fG3`z~dyg)p$$jUo3PmMM3DZ31D>P`*CT}^8uALuA z*ErVZ>%@MK7r+_G=R{lYbd#JxEq2< zvtD?Sn>0v?>MxQN7e53TZ)>c*3)vHw}Eu{1V_K=tJFAFg2JMF8U++~uuvWfd~ z!2Aaq(ahT0MvsQC-yxlotaHf$m0{8)zTcN zD){~8fhoklp}k;W9m!8Ppcpk85QS5zx8Tj|`bcOyX{>TS_pjUCeN;;#QZF@s7Dh!w zY8LvS{pWVLc|976yj@yHG-RJan2>b-)z_#^-g**VC>CoYz;--*3;CfubOrPC_AsO z_)2{FOKJoKnMr=IsZQt?`Iom?186omaQFnLewr=Nk`qzPA4k(ZuUFcI)C#N?SinCM z?Bx2XSZP3$qTy&ipP#m!hR8XM{r23tpz7&eofn-=U%Soj@+7u(5|DBK8u^P z$_-CZv)tWwW$cT4d`Bm$&e+6eu@=2)GqU6m^nLVx+pN*rZk(tcsPPnv&Y)zFSgl1n z?s*f`ycbI_teLBh`n#?|uz|ZC&rPuWSqVdA^eCnO7>Rd1`Hy}tJz_jdxt!p?fbLQG zisyo5PDVgd3@e2+qaaB5(^7&Fvws~G6YHxMqfGJWhe7j*?Br2^!-Y2@Rg{Gdr7)DA zj7?!ms5MR@rZD(TIzC~k3(^md)e7~DOyQZd`3R`IO|T&^T;SY$+7(-qY=zVgMEl{~ z9v1oR&77JV;{=jnzpp==$@61qgnCUg( z68h#)@eIB2->oEU-xnF~kJ0Z(>r~&9Hk_;1JN#QYwA*wS@&=e~&$wf8zPgQt0oG9)A?c9`LzNju;dr0ixc=D={i%ThF*ApbQXbw2MP}KBN}nX$J1Z$p z^RQ;lFQtL~?@WO)*~86ZF7m*)GWMiRUB=)Nmy?vuy=gJ0J8!M6ms6$wh5^xrhcDHL zcgJO5ALcC5f0q)Q%wLilC?912WCKpJWDLB6$ItYzciHGKnIR;OG-fMEYY2Aq*7mlV zWV2aT8p%hD#4D0Qix=h?#KJ=)D%gdZkQ)3!(Yvi zi)X~^$I&j~N0P)lAhS|^DwjP=iNPcG%8hD-{e5fj^(yL17xiU=ce7Bk6e4jt;OP|5 z)2`13Zv~Jx)ebLz)q+{GTGQ%4j8ZrZ{jObG7;xJ~e$BpU#~R1w=-MhYKCGejty9bN zo^xBKD`B|u&>-|y2`6|Emdj)~9StL$Edl>@OF8T>pa;`I>}BWJi?oMIvExov-|r!u z+g01D*%4Fsb`fx%p_T6kK~*21Pzewb8H2GD_|SnnZjxc<>LdGEpmT`IO=}7DhcPE! zE1jyyJ_G4!LDZ%@kL?aZ25(@X9W8%XtURwfMx=UB;{{`}h^^!I%y0uAB+E;5bFqNbj(BzVKeYdi-AJ9*z#O{i*TCW=- zCS9Y*KITBWnpSu^qW$S$;IhH#$M@*d4O=UNo6apQrjhZCR-}nP4pL<(S^~{olVHLrH5T`6xaz-#zs$lK4MsPbA#QhH z3gwF46vG=g5$|S1SJiXdF*XA`FipS{Mj!#X2~9J+kW!DbiP!VFaH@uGM=Lf?GXaoK zC>T+rK-06;2Au5q@u`J;+S~eoC0jfCM2{QLv`!pi_KnJ-1BN2+A#&SQ_3oVWh7q&B zoFH7XE*V7;u8cjj=_1YH)*C!y@AIKtwjv)A8E?68K(`9Rh{BqwA~VFkqr{(K^%6;f z_+q6V>k_ZTa$iH+gq`7qjr0jM7ak?A8BDff~LJpePR~?+6d=r5cxsO|}?3^B4x___b6OHd7S{~V*@8R11$gI(8J;BQ$BXe(%vma%t!YIlx8hj*o ziXF_Pqm#7JfuyCdmQ)z7Z$xNsN7JH#aC}si_r3Jye>z(8I;~m0{&N`9aNexP+(Pal^14 zy%wj5nUw>#k2limIp}G}8^ALa=fV9q7~qUXT1`b&?1i}D{l)>3xjC2#B)Z)QBy?nC z4B3v=X|tAR1=GK;*y#GkWpM52=UM{Gurn_-h6ZMir~C7~2ocha(YE|u`*V!X>p5%r zdOMOxHLxp8OGp=pcz(G3aT`%+RFQAj$`}bjB&X=h_S0U`<-u<|n-%GBogec!Tc}^} zGXV8+CO^T`&>Q-;n?d9Wl8ptVL>+RkxH4&PiesU*IRsAd+nJt6$Bcj*WJ)6F^J)Nk zUCn;ls=9y5LGYlP!o2XH!k@BS!FRE{y47nmj7D%gDoW&SV?smN+=`H_n3qRNE z6y$GRKXODf5jDwgJdzP!Z&SXg#rbrv9*_~9m8MewtF9(VVl6pwkH{qkk?CUG-!QNu zxc31%KqbpkBUH@??j9eCW%&M*>-0Wv;9}h`7j4`FKP};5SORQ%)g!tLiU#`hzQ$B@ z89UG|rclUFqYD~V9q0{o3$@$|J9n8BuWvd@GlN%01!wTei4)2MWebpYled@~8wG!& zo>y2#CnnHm+S$3did$N+I5;@gD>^!KxzQvfB%~D-Bz$~$-`?K^8pS)g$C$ZV$=Gd~ zDUlRK#S4&EPbQfqC<+}v%?Dpll{&>h!4n7QQ6d8=sDR^`pWv@f=F3RRZK7W zzL>RHi9y6hw#&lku^JZCV}C>Vd)V)ASkd0i{7`lBWB!3dj?&eHIE?CK^7Eq?N0t{F z$zm%zhAJ5&%n#p-QRB>G83mFnVuuX^g=exo!u~Y7udNw3K$4WqK*UPNi2(D@X%>&jleP_<`z{8h*lAVHk_;HQ+vB1qvCSb9}ve82$o|76Aje-ZCp{Da_c zp3mss+Eso1pju9@o>ZKmLu3TU9yiO>7A$@aUoMyTp?zJq?hqjl*xh z%EU02$Bu8tc6lj5K{JbN-}s&zi1FJ5wO2`0=NL&1r+7 zb-R%T6^32b%Fv!yX>~@5;%q6Bp?wBG?${Z#KB%L zut?Ch3aTHvWT6dFf-eryK$v}rZb^+v!?tr8P&l{EzKN@nl^ypExnJSr3(zHw&zw>2D-RXqfK`sE$1dlzTVek$OK<|Em9HRyT5g7~9*6oq}&<@T*4T zYkdk~KIP1K45TAg)jKRaXkZN0l`BUX#ZL`#-94xC8~K=;7AHq3p~|oKF68hoRhp!A z@IwA#+fu?1#wbBydfq>!Ed(eG?vhQv3(4m>v*7Uhm~7qir+5fjR4V7?qhB37RrZ5M zD63uK0YbL!i`+JU>c5|ZqxaNAZnpFd)39J4%a6#xJ|PNrOK#kZDKY*wHd6sb0Uh_z z7wPs88ZbgP6-BqIcHfx4XHdm@asu1=3jsL)QhTSt4>Jn9l8l_LYLlf-Cbb^_YF|T@ zS9yX#WG3w{`t4|mrcrneN~Z6_E)Z?npb%N@O0UWiR#yE&UQW}?_~gkel@+9k$>56O zG|~B|D4PxE9U?XtehU;h&UEs9vjF*KVV=@Ke#mV+5cv9V-Y>J&YQn;QegRo) zrmTz-fq)aTJrGI8&#y0Y4fZ?Vt5cINkZ<4{Zr&c-%2p9eDOK*?Pp1>Q3~=+!{ynP_ zZh)O7JkGJ=HNG4l6V(kO3egSv)ape@*A#uXJy_2-m*jV2r!|wN=Du;RJm8pc<2}+w zGQZIY9$wvYxf$sw3{h(ef(hVmPhM`MjqM33bipB5>=0RKJ_~V}@T)0tLrZCAoauE7 zIS>Q|NRU$%#2Vh>{cB>+vM^Z@N<)kt;D*p~K2pJVN}K*L2JOj!)#=y!bGSAkspqTn zUJl4TM`bZkk)@A^#;JlBWK&y4vY_?>(tayTtvdF84$ z17Ho}v48tzJs)GcC$>8$ZZ;=UP8moRr{I!&_I3udiBt5_dOC_j1(iw z=oyo7yb}{fiBp+d)@-}qySvdwhg8*DU@_xV`=oP4X#0EzO6j~*{Lk6&7_W6FjxU=SGR9&@)^EF`ZIwXaDGi-}LMIz4mX`+gzc0 zJ#~EHs_Vg3t$|80Jw3dS+r7Z6nLvRkST)K-wj<*5NMKH}W-Dayi}2*@mKXvqKd_DO zfB_Mg-Fo)wy>Jzxyerh{gPLFPc9qKcV@L}QI=BytybhfrJAt-evYfqnh}V5}d;D6^ zNa0d>-!0ghtdKAAc?b1W?z4yxza}6>_$nIW&3E|)x2`al(pok zhV6kR&YVvAKQl+!P3X}{CK6B^otA@=c zv=-q{)9p2~KNsIj@Dm)D!*?fyI^Fc0pD#I5ft4okE3dADEAc*d!nlo*k@2~MQ~7vB z@xq=(6S`@>^praBb^F@mUp(2N{IXh4;P5m6(uA6((LEa!oGfa5?uOjBt4C~U%n*er z+KV5FFqQrk2xWUrEKHH_kBa*w41X{1X)-fXQ3*~@Pj}$Ga-NbqLPJL%Qf*VbKa)vQ zJgNpvT;!C-Y@}|K-ff&N$s{2Gy{AG`7C--+11Ge?Rk{D>;KGSNVC*t)Si-d~e9k(^ zD}z(Uw!G%WIQJ3LL^C*pd9>>4&G_^fQg8^yOp`@l!wavzk&zZzt0Kl(E)noVL+@!3 zU@>vMBmPU>aCnSa>I=waxGy#fe7WIk@( z$Diz4+OP{P@CD^`#2saj7wy^=!bK*sx>y@mf}jM~tzX+>Afts)`OujcZ;h6y6R*EO zV}9j3DiO+VfQlEl!f3f9hF|LDen~)y+cg4s#sDh>*J%Mai#`^5MtSO39V3MaYZtuv zv*AnA9Ao;kvY^Vy^s{yu`#&8fo6MLS>bU1{#hgge5=m95161E%@~it6>~9D7+xW_Y zM7Ev|LeCzx8EnjXEQ8N#oNVuAS&E>P+xxcZ4pIhrWTIkvtr};4{#iA zv4>{D$BXGbeZT)Ocl9F(pU5SLdROVqmYbkp8oVp% zzv;B*elOJ4qC)oT*Uac;ULiI&izk`q&I77J!oTO#QXv%*6|RlN-CGUllE@}XatB&} z-Ai0d7Vl|nCyALHsH}-GHj##Ejn2Y*lLAVwBZ~&Lv~09mDDYPHtX0C;(=DF+eGce% zl;TXmjcy*{EGP0GsPGp zTPH`Ri)T|7D)2q<+xVvk+%@-|_?X4{8t931@~HD#RY?$gysn;-&6H!={+AC6LF2qLjJg2iUKZIECWi4tgPZ&)lB`TLMQ8ogTD5VlL{})vM?Wefxen!&pXC-2|Dg9pNVo5UM zbWo*QIkxI~e~2Y?jJC0|e&T9gMG$|4_u?Ck&*UH-0*6fPLLOqi0gz zBtM^$3V7A$Tn^pkVagyo8S`t#WaY`%3mA<%9dX`3O3+QGPY{YYxZy_flL}soDHP;q zSdCs2`NvVfx>l*)eJ>gvZAEdU^uJO3H=F_F5gHeil3;2?T^p2N~(`Bgg>cRsyiRN4}AgyWjrP?Rb3k-boza7!#G5pB{W{zr9W;x6KB zP1}?FaeHzaEk%k40s2;q<w?od89$aQy0%&9l9YWGDK91Q++7SMMsMAHr!-d zUmCUOie#t?p264rgFc_U76vA)DeKAGet${qItsx^8SB=pGb(HEK&ulyhg&~nST9T>&4 z^=&{pL8Gh$*pJy5OVDI6cW145rElgNe_3B>m`{w)2~8;DgQv^Qg(OJVaEWbT7I{Uh z^}U{mjhtkMYa?$QQi$43HsNao7E()cV@sk><` zC~3VI_33NHVj}WT^s+oG>|kA^^MST>^MJ$8<{HPcZm8SvyWjnZUvr z>(9ApV`SKMXhLeyI5B9{o6c%&z4FB!wcjO$uDid zZ4?Bh?aP#lbis@8h~q9txo`101t9sR0NeI5A5W>c?O4aRPRQ&nNcHnh=1+g z;&f77%Ea$V{5kDk{Qu;VFM!fWY)6Z87pAeZJj#soC4f&!YD5}X^sR_ETofppWr;Mf zo3Z{t&zR-QfbfQe%bBQ+A-9WSKjd!BYResuXm1jhSEd|i&v~Qhn^^02C`^A?80cUH zz?t!DmE>=oEk$C~8o>;J-Dqr347A&Gfp!j5@qw06go;6jVrD~a<0pyv&|wrS|L2Wb znFpFDQT7b~uCN<)Tjlpl@z-<_K9U+gGQkF%|5H5Jkn6iNFwwQ6-<%be7j>~^rQyL? z011m@!1R!*&=a~9MFS^*k__q*zV9#27yp~37f9@zpR zcd&!N_blh_CIDM8Nl?}(SMYw(sUtK2Pp~EXXZH1^8S-wvQuhtB1Q*Ss{Nk^~tWi;O zvPN_s;7YG?Xk1ie9v3XMFhL~fp0cGy{p5tc0x9%_{fVV?#B{h|?$FfffSGj_D3P?6 zMGb3fG0H&V_0~ zmr&IHlu=L+4M4j6e}R5n!Joj$T=b!^j2UU_>HO8tUklxnG^O>epc)|^T^xc zOzv#&x($t~@8{HRU1|gQXu5>|;8xhSm>t*J@?RUU2>w-#LiEM0-~Og%MzuP+CZ?e6 z+Kl6ksCkEYD`6TYyk*a*J;-Lh=4<#;W@fjFg(V^SIHD>PqNhJZu zh488H<;p`3q3xt|UVX#{P$}f6!2cE$;^063b@s`<#nUK9l#~3x{p_A{UV7#>FvfHl zxs7p5wz}o^t2`nf+-q{hj??aMJ=`g$y^(~<8AQe4w6GG=cf23JP)8RLzfy*DOkXU? z?(`RD*~z52GNO>HjdUk1?U!pWg$*~&R!iFVzt#VScf673rVSAl-brJ))#OX+p^&se(XZwSIiAy5JsV>&EyEd{X_clM>1Pq#mBe5m5^4) z2D_&!K<1c7KCx8^gP*c^P3n5lvzrzODweuQ>@0_||Go_a|GU`jR3vqg&o~+$vsEro zUizNC9^-P*^M^-qwE%YEw#e0?PMg~L+IBNnk+l@k_*pkI6dnIan4OX9y~^2IBf^i? z^S)Yx_R;k&fbU~Q(UcHap~?3v%u7MRV9AfZmmI(5R*m94VXQwy&7{<{7$TIs%hWbP zSmLL@Q@3UxYP4H>zDHDOhs`&PmxI(2rv3W?2y_o;k|r8>{|b{}4%nWMBhVQ%!bfKW zV#~I$A?EZ;K1JMJ2Nd5m>jeNBf_+!;cacm}KTHv#<1iUGhE{qCu^*0!3-P^qe3eh}qI$of$5ItKt{EUL66!}93{BO)N|KQVh37%^;RakAzaFY{!%(@y zS?$JQ?hDyqvp&(*k#lP9uX%c*rJ!f|z*yf6M157NyMNWTaI~_G_^On1vD1(VyIfPN z#5o<95z4B)$c?H>W1pE`cba1z>z6fF1NWsxCYiJ$!uU0y!k1XFcM7dt=ru-y*jzfa zIVoZasfSRnV@XIgW)?Ezk#+iBuz2(2bWtT=5oiohC@G*To;O`9 zli~6(iP_M>T8x-TOyz|??HB>J&$u{Eq>}sy?5&(OeUs4Wwg@&k;$~^$DyY2Xy(94< ze5X|QYKu0-T5lyDPiJ8?nTE$36W&@cGoTffPY!pkU#+7Qs&uIF0_nupL_KSw{(R|ktLlpo+v+0uD|+R&Jr!7$U zS7{ve2YCr-dM~c_70uQgE;V=BMO@v=tMt|jYq#1(sN44q$1h_uh_bMb^$*Vqq3g5Tz(EeP6qFiIQ2@#}BlIZ^f@sfVg--~kXM=fP z$Z|RnSc-&3st0c~IEkaos;g18gslg*SF)(JG6!VNfL#O6gC!9n6oiyaJ)UBI#`sdO z(A?7k607a>%}>Nn?*mBCT|b-G%U`|3#{C|z=ZUzLWnunxH;Z~Zif%n4r#IM>0R^g^ zE*VPig8v^^UlkNr6Shf$+u$&`1`SSd4eoBi-Q5Ov_W;2i0>K?Za2ed)-Q5RYzN-Cq zxAyMTx#+4s)#vT*_c1Y|qycEmL92U;UDCB+-!Z%$MJ|Q@yg?|ZkxX{?pIb-sOjp)H zi=YzE8`r#(j?uzCNz~ri%(s}5cWyjYEMFtcHoaY^WMRdtC?=E(j)HR~(AXaBI)sGU zw-wLLj$cw%pEQY7PU6kElYi}jwxonNIz(UiNU($2NEktx;{REFNe8H;N!38+wQe6c zNHHXe4<|@;@I-F?u$8&nM7uKgjt144RY(q zMZN=FDHklo>uDy7MF3##Uo%;G6f?wn@^WTtmlt8UyKf{KLT=_c&~*}36P8QVbGa|X zNiCk%HlA{_^Pald1(no$LPimLQaQ3|OCGONTpKS;jQQsskGoANkb#f(CWD`pMp5u{ z58bR&=4nJyXVCucvKzYF{R>753m^iaEL_B}HF5npj#_#*XcZ=o zfAE>NOjQ=zy0pUwMO|$!Z)o3YnJMq)A01Ra;uOL?PHf~n0k5E)dBb!|;;XvI0C{Tn z>k;;iq%T9PO*LKk0gkLJ)}6o|q8x&Zlvru!C%EF{Y?0O-|#F10h%EpyZto@N=q0cRx$oIqs(iXJ#1ZfLd)i#ztGayqB2rt-6U^RMH0#CkK zl0B}ghpc=*nq`*xH_wr7HR=d!)lqzJUC281-K3!DCkUkP)=&10{Zrt+%qgGBiuSJ$ z$d65-DmYJ=WJ3t8_iO>dXprHT#Q+ZBk^x2RecCRL7YPN?02cEBr9waL!=SQM7+rRC z9qrL|S(EXgYD70V4`)PpbJlO*TMw(_RD;yxtg{%283S3A>hLqH=xe!cOs`NrtL~@=!FET$OgoU+dBjw)swHr$|CjvX4jU! z_dGOy`<#KAjE)W?Qo3`%Mb<@GN+Yh=6>YxFhtFJIMqFjvkcwI`Q1KzT;1~OHd5y!G z55Jo)CKyFtOa=UP^y$W@V$mSXoPgQ1XXbAU(lbuZ6s6WZN0#?qJ;Zv!1G4$oTxjPt3ztof z*s^jtfH}7fO_SzJ;<|F-WMh9phirQjDeK&K9HAb*>Go zwJF;XKW36edx*oe&16r%XY5qdww~7GekI8ENO`tFIcp?lSe|rqN=PWQd4c4Y-BMck z>xe<`tAV|w{uZu}`vRd>R(AYLFayi`UHG4KgQ!*mua(}k&ZOgmO^d&a2|(EBUUq5Y0cKldHw{CS{6OW{e^`TJ9YjPLT9<)5Ws^@}&sb3vNOrws6D zjQ5rQMP+}^u?Ab(5Sa~QS1Vpl7kso(zs`hE;6}9HS-XB+sE)F>ZeYPrgct&Xa40ri zV#Y_U5obX!Vnv}xysU)-xR;xDMvmVfq3$=T{OmTo;7CFFyIZ=2`8`^2cdWyX0p)-R zc5%GGjV=GvwJc<31JCfNiGscp?pebpu9?&zs(p7g5{KG!u=z|cVqoJ9j^Tb@Sq$g? zt4@IC`xWZ_k5S7Cp%32b3*Wx)HEs@Mg_NazVhwb);!9hX8d3L_&QF9NDLu$-f=lx1 zN&`?=t!}X^-DtSU@C`}Jw?d_^-?HHnS4t!ej@xzMW#aM2J^xo{vORX7 zK_+Ib^g46*>SX%_{(XR~py)Rc^SJz%$4YH2$BS~UmTMcIm;0R-$=d~8H!Vh-~HjR-w>Zq)nezC!V5D6aMq)bibv? zLgDtLaoc@nv{TM>Rj0odT@#U;3hLKV-j+`WFDKO?kF6EZ?o&A{`IWR!M>C2bbQsyX zsl?d24=b~)wf_f|NGuBzUW9P6gn980dxIJsEo$W4f<|PWx45GaD{j{)I9q|(lx+9{ zRjHcZg_93y`?w>mijUfPOKy_sCaQcnnduyp1^JzJS3t0j7(tnH?+R$1Qvg#Pu?4E7 zG~q@&`E&g~-8F`1eBFImM0WV{74lSDAY7r7doenjs0 zLpC9`9$?_h4&~w3fVkw%Y4q?yCl$##CEbAGc_P%SQ|%YqbA)`kH!QH&{=)N8`Oet} zSvIZ^(n8IwLX=$a4dXJ<3!&J4^y;@iUFJYj)FX&C6k?~h-c1pASF=7I!beOGNcrbs z=s*6$=lWUd>#Mau-A&nH5f5~#!3_=nQ^^g>o2jDIlS+a34YMIF1-NVLu6eqp?!J)EJwW*9Y} zfm0D~VbkwKS(BNd;a8oS(`*lA$D^dQW&!x6@^x@mwt?~9F!5kDb6-a+;icYNI>>p* zeb=11UlR>gQY}rHA0NC~wN)1k{eq595X_9G-fi4mu%;X>`d56=--Uq(WzLc;=T`z0+hzu3VlIqk z5}qJ+($Vj7>ppEaXMPRz9uZ#rV#|7tyr(sZ!F!fA!b2ZE183nHhfnwYA+<&sDe4x9cH#lb|O+CEhQDW_=^%JMxA!S#P;5<9eGht4sm)cHGWNv66!{3C^EUn5#)#b6S5-9g=McmdkLFOVjm=>#1Xddr`oqP;{`BQa>*PC^N;Qc3! z{qwF2v0R0GexY{=KyUSK{HeUtZyB&HE`^sIGDNMdK{-$0+l( z4Ih5SU+%#XK6Tb(z@s^U*_%5$u#9ORGi&qyHHN{0Ss|@o?F$I(>wRR?gPiRB| zrClr`;sX@?QhIT7(2zKk;;Up$B{-DyS9n`qR~Y#D7i3LI(w>uCi~L#ZtzVL7U}ugW zcEldgM7Uan^firOxdSH5P0qq5AL8|6PH@|R^{4rAle_A2N7@4@PJb`veX5g9PM%4% z4qRl?vB38|kL{`8=gYaI4(?WS#EvC3IauB)t)J0*4s9V7i4U8Rs65=Ro5*ss+QDxc5a@#TzR^e1rtTU9F<>mk$dgZRn5s=lWm$>pemh zz+brbMAs*w3J=iI7qQTdv*^tfa^2tlLPn9J2%e@xcOWW|{=xmBPw1-W%;nd$Pi=Xc z@W~p#BEhts&ciDqKtd+Tf%1H9bL2*#&=W)6&YDJ4&iXVypb+}gU=UIqSk~8WT+(_M zeLdhX&`-`p4`pEyLP_}zyWjQav#S9yLFUo!gxxe{De+%B-7(jK<-k4JXCp(l><~&Q zQI!wlj69e9@mFrKUsnGzQU1*vpRUY)elK;sy%2)Jum5fIl7M~d)|lTYNa`I293%tA z#Ei2fJrNsyH-EWm{ebse;^#pSLoCYg`)A96Ttmal6OKU#kNIp<_?EUcB z^u}c}%fS$3^_hmra=WvQiH`rCJcmlUH&^iqkq+p$51YouffXzn*EMNn!fI|qQg%XM zh#Vy%XH78u3?`@dLAhCmD%h{6}PlH?PCj^nObZu`KZVujvABRYgC9TBi7Dt^~@ z4)vb{kr??-bU^MJAr(xML~ci_FtlMZivhfj4*r}yDJ*DxhX6%Aa-@1L6a6(gUDqqB z7*cjjQT7reISFV0@wm932rPj$Qo;p-gsTc%SPVg^5uRNCVX4xU6Og35fc31htN`j2*nvI;825rueS@pcqHb6?F8Fz!{XKEBwNymspUMWEn6QmdkHEZ7K z=YC3hGlVcy;*b_HtQc3K=Z0{TK2f}_RTm3G886=PEFM($66!*xf7o}smk8fNJ`?8^ z62(QSYh90bUUmsI@64~9_qXF!1>eMZJM}O1vKm6&-6ShZF|G&c!Mbzn;x3jynCxgq zN|8*V1&2L|xOS=)`J(w+*DV?D6stVf9-ZN$WC#!*j0z?V69ilxjP}K_v!nm@g$Agt zOzyLFFQA9kqUi-`*P9z&N6wDS2kdh){3zH#KRcl$f;o2%&L{E(=LFX7lo*{RxE6(J zE9JH$lFm*X&X>TWT}X5%_R_A3hk4$Bvb>knVu*Q&dIz#2ms0h_?6Ao7R|dY^aOwBy z(%s`Y62+SF&|Izd@zh&PKQtu&5v!IXao*UShQzU0trsm(2-#36 z!)^P=p~IE5#0plrJx|9VkpXjv6`fv=plE60o{L`K8U$u z`!yIG9x&uxQa5EIXpsvB0XIzTP^$1~eSPfIN)Tt5^RJS6qFB0nJX-BlpXEg-dQNW! zj1Au-fjq8X;lzAGzCA}NZ}b50Q)aDzQ!fQSs?-!ky~!jtzQJ4MioPoNW;pFHrE$9e z!*>0`R_TQxXz8&G)J)(&Q5@R6a?ChP>~n@5!38Bb0<36sKfD6AhX*7-s6ZgZGo;ig ziN$KzRSuXCCz3Qk;UY#+(7_W!PeABCJs<_=e&7;(T2J<2a45q61dKW11&>QfxGBIA z=$uUYI8x&BtA`4@B-bwcqf_SyL0jYsUz-qx&$3%XzN=3iAo>{Zr_n~>oT%;b@XCdN}_Iv_QP zoltq2XR}huVkhV3>eqcS%hLnfF8+5o5np?e6h;^q!CK~<=r#(fZi*0~1Ig7hGK_k> zFLU%-C?!s%=`Lim+vUmF%N+Zfe))1Lhqs}bX9$wVd0L5~1!uR)=tjHoh>Bae6gZ*p zPZTfcBXs`0P!4)H5l`zhtF`qOQYVOB0sgflIAe(TZuyx;d>Jsv*i5tHv;EkBkm zg5lcT*)(Fqthq-f4z_}mo8d-TOEtzWw=?Yh?T+NbmOl6D0#CpDK$1{NYpLu5C?8~u z=gOoQ=yulST+H5m;Z+BGhF?suvL|B?3+L!-;oWcF%?-ipk-6Efge$ zNa2yFhf`5#%v3)FqHJH zIElOX+DF`p3(Nn4oZ&(YH!p{{y}@$2j#FP+9_u@|9u~4=5v7e>v%XM#G2xa7$1^(1 zVM{w9oJvlO?V-anR&%DnTzqOu+}V5~dE(ZsSsATS$2IoYMUVqdqeXTLnzpH&`SfBW zikV0#O5op>_sUB&o_Nnj!}A`QlsIjpT!)iR@L>1HC9LxRDF=$l$un|qsX1l~8n?;n z?oa!g*L_<9o*LTle-*-(RyB7^C`{*RC4C*(i-z2OI?TlW42`DtX<8>eoPYE0kjdE9 zd~`{6jO7}K956GeRB5^@d%2>DKwe$4hRKGw!|Muz;O1fLT!=r^lc8zn^@Ums$ztEdbol=1h$f*y}p|HWVpes$mm!e-f={g$|-+6 z5dnkj;HdRjqKL5VDS6Q#ViX)sv|zOL5NL7EhL56^T>o4M^8X|=oDq2aIeCr`o%QG| zN<5W`UPSWiJfCT{Cw~Ymm*Ih?!xnRAJMqKYkrV&j8#M?17>f&O4f=e(>bs*3D4vkO zWZbamo&{WR$X!3PYFN$O`_@;RmeFmJ5^@b&6Cex;?WYXN!hY|fLdi%7gmIPt!QDj1 zh}zns$N}JO=QXq#(2Pvp{3`q&oL=tUyd4+x-n(Q;JL5F}IGhlE<o3v3w;%Cw)n7+;uA*lKK653)sVhq#@)f1RSN+~RoEuRqc+xbw8Nga>yDQA zuODD$M71yWXryeM_sNY$cOAS94U0-DQ$euLCtEY-@SO=_iyd{3ts=4ZHdQ@StCbP$ zN7izryqNe`ZE@}><9s(ny2l1FXFB(J$tYwSA*^Xmd+IHxL5V<~!9dYyK`__G{%F(jYO=srX!YRt*GJKfX3!*fd6^xs%Q`AsoK{&)K7HW0|c3maEKL{!NWM0|3M!Rd#ff?2pV zakpji8gfT&5w6YCQH=4Wa#xo&eODq;L_fotBGP9Zs{-!^=BJ79P12uySUWZNx5D&T zOk;F0xGZI2`0oZ-=oo=5OukRkt8_pjX^HxoPm)>)L8Y%t_9l;Km1CBiD~1@bE`e0x zD*;d9rBWJyvYvUZBsP8L!!9`c$ho`VUr?2uV1?(t&=XwwCP}9XN)axSTC6^OT~A{t zI{Nd9A@rs@+P;N3nj>fO*Nx#<`vd;`Ii=od9kJ=npn=m@gmkts!tJ=4R-!1C{u`R% zRfZPd&lq@w@qN44MYpnD0b4t)2Z0M$muk+IpHt##Tyc(3iHZAXwF^3vuft-b-c$^3Wu+x#WGEyIUa<9F#+K5g;;>7e4=JtWlv| zw>9~eyAE$B(y8``_27Sg{xp6b+MmDn!`D%g88UI&)TaJo~MBT-c?l-B|e4ACXEqWD+9KtS6sk9LCojD=U zP%>o17#gVJAUzQEbh8m!iTj(DrpaC_8`+DNS1ZeX4{L>9eA~lpJIM;LdB21@?>ykt z~cM9cf*tRy`sHgJgochjFXax zOB9YWs@(|3HOA2{KP1^P3EK_b1A?H9q9Vl&`b;L57Ix;nNfNFv{Gpl+c=3B*qLs8& z!dv^09kGsl9x63W2CKX;?*Ps@kluTkMjBwZ5h9SooGb&WzSgAq6Qb|Vq=gbM{_0ri zlQk=63U`7aC$W)f!r^1u)!vTyP{q8SLqOm$v+KS=RXCeI6|LO!+UcyqrWhOgqfEWl z#KZvI$N`n0{U={j0u^?!;rDest)zC?i&Ojn>7ywrgj6?Ulf%Bde3M@xO_?u75%Rr# z`;}TbEl21mtT;M-!g1l~qSJp@ExtB`p!h zgu@v>(+afv^BH)Ou53KT@9(2PXY;et#ebyFQKM`&-t0&o_5&o&<95c&SHV-JqBeRM zNHSyBRL3(>+l8LAmEVvL^sq;t7-S+CCo;b(&C&3~ykR5)F@J__)!P@DT#Mw7kovuQ zud;bl!9jNOTNXbr&=xWkwPEpa`71TjQLXVQ#9%>xvStI zPW>Xv`>T(K6Nug^EcPY7_x5k|&ZlXSL#KzzmZum~F?d9UrJOZk=cP*IF>qZaENyj> z;FqPdN^#oNP7ECa`!2}a76KBgu;sf|+ApQ(eZA<*@q24Ec(m@KWT@hH1*mR`!)y($ zxT>Ci@AM(>x8;r(ul`*EyTaLA6i8ltq%&;|gJ^HBaod(o!~`ijHI20dkMJ_+)Bsz! zISC$8w^`XHEdRpF>^PC!LxduneZz%rB(++iZ4a)iESUj;cz<3rx7`vsB3u{vJC^`b zIVZ$HOJvbwe9cYp%0;T3%+Bd~`9x1khe&e#HF~FoTxpcn$<*X_KtD4a>nR!S)PMgz z_mrq=FEjRa-;@z3+O4rok;anxiiQ1*eKtG^mNx3QNXBY1AG~c%bb1`ua0(C)pVWAL z_a!UPMJl54CQFmifP6e}7-!^HT6~x00SX+i2<_ABHQ5RFU}{^TZ$F8F(?RtVT#^H> z{1k?1_~Vpd=NN55WKWx^aD!6FM@Lym^iN?aDPWa0)E)@dTIQ>%8smDZPmJ zVEUjGqUdOVTnxVluf4rNSiJuG2lvaie_p-3<|W!8fqmCDhGY>Bk?u8-#|cPHq8}G8 zq#M|n*=#&>{0-vXjkK#Vmp>%D(m-@buh~+4`s^Qb__-(#=BZ_#XzQ*lDpXiTeNckPY zef1-@gHKARyf$C0jUvzSlU{(4FEj=wIqaK+24HaIk6p)i}~MYcYvNkE00fw(+y!WWq#^eYb*XEDv(8stJa|X>#l> zB9(6i&F}aX#LRv`I2|xBc%o|$jk>^oOH-?EQ)hQ~*Klt8i&jS?TnD?kv08;tkWW^P zj@g=Gg?<}eUe6YyV&~4fKfMiEVGDdrHNSBNROf7+tT9S7umLU z5MiCiIrtplm$K=J-rieNn2-#+(8T(f9y=*_=L&B#59+C zb6fKT4Cu$7c_!z#`G)J;2w17BOK7x%uXDK`jMQA8c9m1oi|r^~lRT?&$EmBYuYEcZ z*J^D*s7lu~IVL+-&GC9Nf-FKcoWC&ZFN@l7+wq5mskC_zd%-l55*Lbdav%BZVlBbb zSsYENI6^&pob~*=%dB-9VLDy70v0`vrDk>VXb|bvVvcm`%bUbJIh?^&tSAF`55;G0 zA{?iPCU>;@&LP|m)2{v!(q!8zzT+SFRwJwufb~9l~K#|iAWn9*1XhfXy z4Kq6I6J&XAF^V`2-$Z=}_tyX3UQOrP%mG^g1*|y0X4KueF@PK7&h86y`L1G*_K1n6 z^&tG6X%;dH1YdA&bh*Db-Oo-RqK7pQ;_r<&m~~rjWdAgF+~A*s{Z@*7lP*=@*v?#- znGui8@e`)52A#LK0|rPXmlJTB3m*}qn?*)D`E?+4!&@-XH8uJOz9~MwQ4e|-_$0%q@-f|0m_3B903x%u3?V1?WIE7p7H_* zceAh5FRz^rhW*M6r>%y4Cy}V@~WRivNX~>Raq!ZsE!vl^Zr%JJ@!)(30 zP`=;thr^Pa1MfV6cQnm^(*_Er{I|th-V_h=FA6$$a>~cSyV{z@;E+cxO|9_xv`+|5 zd*sji>1hH^Y*oHS$Wb(}fCIGXg4*FbWiZbBwH9(zek~u-0`}+tyMHSw>3Qk*c1EZz zX{$p#(mpTAGk$`9{rX|Mb1wPBVvW+c;6@7;Om9_JDw==z1bO!{@Eau5Bwlr6p!K8 zfe7@Ts%#;9V-fVb8&k6vcqzdzPET3A^y`J<_U!`2x4e0>x81blF@^nm=N>H7m^+(ELM^g z_}Bk0Vf``gcBsunFC-dd?*%|^#>x8?=e*H{K!r*gqD7EJyy53quzzW!w(|K1C{N9$ zcU$#Qt`I?|e|8j6%lpDnu@ozPI#tHKUNB908L_VVWvTV$26niU_rU|zZ3nQresieX zP4xqZGne%t%l_BaovRkxT==#5Ow|z8R_A^>N7YuAZ63W4={+?e)M9{UtsZ5{0^fI=+<0~u;O z+_q+og?>O>h(-e}I|#&_isx<~Y5KB0yb?OO%V57eHvZwj<=vIKT`zeVMcxpv>#2x= zCgs8(!YRM(8ToSP(hb{k-G%~_6xSv;@-+@Qrx3FAnRNPR78!vUe^xfsZ+ z{sHpv?G8{cay~Ivf=36k14V-eVJk;ue>s@1Aeg}^7xc>7KAIvZ!qdUAXHd==e`dVs z;|{2@$Ajiu4Y{#ow4!95n2 z;oEUfzj1Em4`Dml#;zRNPJ;&j)Yj{M6+kqi@Leka1H<&t-37`I#qoipdKGKy5uuF|`sE*MD|aoxBBKOrp2!q2?;JD)fH0Zd&F{A1twRRcnh_Y;Cy zfFe{oMRJNIvfgiKUV}$JoY2ShBPT5!y0Siiypp2wP51)hUtSy>*yJa@C9KsT{{6Rm zt`=KYAUsamV26$>yprwp8}B0Vl5&X40c;xo6O6{E4^R*nh38Rp3<1miPHr2sgrzpk#z=ie6WU9 zd`c0IYCi$7NyV@iDN(76b4oYYv!RbB>G%ZlDBF76-x+%uItbB%J(CTY51DjA3BUavxm*_=0=mD`K$<2lF2l876M+@F$7dYl z*m`g9zWk5;MO3Am++P+0Ng%x40SUXxX`T;-pl6SyDIqbZ!GHTa`ngDsS`$Jm*ez+CR&@oeiA=P4M|Wndp0nldGHGpZf#1pb6+%V z@=M&ljIIB>{>#?9tkYHA6!6mS6!w_*Pl8jh+)Dk%diA|N{Ri&<^OD97glbg$C2=a7<*GuJfngkw+OYXLE$^q z&RJK^1x+$U!(6>WytuyGqJ7fJ(7muFm4Hwlw@I1-N+v-$Ai}z%wvLh~h!3EyZ3H-v zPYnK<2sD4Wi=+9FAy6!iZ$}#}6T_gE;LP&DWJm0nIX{4&uBcJl3rp^gQ%rGDX`piC z9!0z^D#OMRVn`#lRGIs-@RL~obh-k7Lh(-fZp9jrkKL0;`Dij?;F>q7sjOh8&2M+C zQn}n|%fJ7*bWJ|PQaUYabDw10uzG*@KO#~(u)NVg<6bh+3=Sg=P~9f8gzxx}Eh|XY z)R!?CJvTC&oe=9w+)s?F9Qi13n+C0jicWCbuYkZwyEA})`i@cHj}87ESs^kwPrmR! zdFZ7}Xli1mHa&@>x8))JfF0okXnI*GI4l>r;fuuo(T{#STnf9O|6c{H<>Y4IKG_Rq z*9mVYn$`b^r!6NZkvZVE77)gy|G!rUK~)}5$u%JM5QT?!#Fx-@raJ!T|2w>2<0MhY z49>a)U*bTG#kQ|`K8yd5mM>o)BGy5%PYp>H6=XV*{3?Ypufv zV;A>WNVDJI#Ft(Z$-w}ew|Zj6qE2o$1#8$AMavr( z`_zkI(&?~*Y*VFPR!14|pZ`{%1;W2rz|;P|IsXl$7cziV%`Z14kMs?zk=~TL4t*)& zR184D$pSg1z?x`Sr;|$%Fl9n6>&@du^^>!zO-tlC=Ql;c2MFNT5X7NQ zL8IhMEh$}6n;~NGefB~kw6vL2C9>loCA?M8!a~vLF z=aH%Gatjr=kC#`mgi5+WM!-z7^}D7RfD`)2tuh4%6P7R|?Gp6!R%pk&F`v+06N?_8 zSuj);><|I4+e<0^TIiw+B9r46qRXN|k%Zo>7C~)PH7xDqPJe}5mZgfq3mLGN-CQf^ z^LaPdt{_^7A_9n+BpT(>-Z!DLV)FAvg2QIee3+cLPd}nyaOQ0nJE95}5tSmd19ONz zbH1l7$`~GpC7qCoB?Yr=`Iwr6MUHvh z5h@h8GR6RE99qh{Gf_ch)I^L9eff28MD&#dZ`)pMEH<^}H30AElbXz?f1Wx@l2(nh zrM48-Vn*uhGABQjmnaZ@vdc;OytSVz>J}Y^SxU)2?c+pQ&ob1yIDUl> z)X7<4rRl_|uKp_el?T3Y7N0SBT0+NRdj!fr`V;Dp>gDJQe;VcXq=O-n@#~#y-VKhF!zK4-rE}v7 z^f&#UXN4rFFJ3>#+-S?~zPIbeEBR*#woSM0W9^h`y3UL6s=3NF?3&!|#2eLE_{(zbo4;kuKy z`G#aY=6D=~a631`!7PZ@I!ummb*90A>(E0pAsFJn{`6kM@53MV`$19$MsX^8>JPEk zl=dFF7su(q{=_ZiT?v=w)b8KaT&_?* zi7%B(SbD<4T`FXE%{XL&CG^q^4kP*ZWBE51U>x4FwhN)veM5)6stw(248-ida{H zudb;AT;`@tGbVD$yOPb15L!I%{LDZz_0+cKYmey+!=0mODR&Ai9S>xo@*UJFtVyEY zTGoJ%Q)?pQ>jc=`Yiwp_n`vd~1ywiU?L=2ld|lOufYm{|Jo?S=Q+GrwxC+9);UemX zC%nGw2J<7$xc6d=8u-KH+VX$*k*o~>39V#>GdJySom4(*{Y;5BTY}Zf)CnS%q<1Q6 z`}A$hoj$ki`*if(79Vn1PDQ4peZ=e&D}Q0kHplVzfzVy21gyc4C{S-$6< z)FI`=->DVac!biQrfGUH$CL)!DJ%A1;%F?Vr6lcLLz4cEHuDBsPvCot?LhDger<$}r`eu`ghGiCzg85KreT+*H-Zf|J1@QtJW=|+to|Yxpu=C!&n1xcPwz81{#nqUj$@l(K$a_j;?G?@>x|dNH{n9tR){M z@9&5{>QeO{VGqbTT#i#pMOwJZs!B^++@>)_sLpvU{Sjo+5)Ip``1gKdWl^|!#K=r@ zhh5!Zv14>UR3K)eX>6^m zviWpWN&#Q0s|ABR7Lt@Z>yuHU33ih?c9c@^i(@&}k^&b^T~x!5H_IOa6H#cf?y960 z0RFr@$I|ZgbCDUi@WTX*+&|`m*2LWwUGq?6n+~>Kzdc_)MF|)`Kkid%C8`FD!P7hC zHGFcD$6XvUHhWduk^SNh1g@97u2&blMs>$}d_P=u&l=$?VVN&=cpiW=)Rm#Vh07&b z(TTOD8y|Rz&*|<-Y~CsMH;9i07f~|N0?9=_A;=KNkFt;V_Cv?8bbqpOpBxQ`aacYbB634|gPi9dxX3m@QN((#&rSGhN(Me{uI_IJTiv z^n|4!8BtQ*fT_<$<$rQnnba_l-Ba>X{}NlvIeB@CWA9D)gP=^DCne=uX{AkY(q4p< z6reGlcpr>AUH=&;rLnYx)m}4J`ZJ+<(>&a)rshwSf@3d^hUJiMy6H8AGNGdd2{wWg zWmVKuY)eQ9oVuNw;ThQF_-VmNIGGY+*<&lWt1n*P~x zkXRS{sdXL`SVPC7d^jGxP;tY;Zw~1hV+Z4>?|4RH2nCa&4j8cWj|Y0Op?5kPfTyg| zntZ0W%X`LfX`&88+Usjb%H30q&Ftx%k&Z)I4dzTg5^VrRp0&2a@-$|o)KQoG^};j+ zEoBqUU-cyDuNgjNld${W1 zpe%G6L>pngonh9i?6CFSCaeX^<+E(eed5f+Qj;|d(5*)4<_bXtFBUS@5gT*CKK-55 zMhxYLB|lMV6IlW{BweCAHfcM7s5hDhsbMxZQp33(7d%DKZQ zQc4tRfBF$vmouXZ?;C;BvZ3B)1D_xZ<~KNXO4WocBjKCz>Z@ft|6cZ7pNNUn3Ni6R z%OWZX%GLN?we!A=_}u(A;Pm zpC}VQ$;nH$C?a3~au8FMVUd|<90(E;2(iH1r`XtzPs8{V@$G7wj!mDjf3aiJjQ@SH z^XerW`KtTpYw5f=xt%b7&rniRGp^Ch%1wf*69Pl3PaNLGE8IVZ`%R^83jT+Ab1e^t zp7F7AB?3VVE8jwN`-=W8H{`4HPLiI^jdv7eL9NI!$&AgFiI~$=u6%k5qC{y7V>)E( z2TF@Gm9`oobS#tX(&bC~xBH$Fh|d5ycBK!-(yvbl7hEvD#Nml|M}?rnS}v9g%AbF0 zi2Nv36O+;7gpb(?$Y(2=K8`v4nu>3T6JJL^>|fipIyXH}=TSvBZaZo&oo09hY{)z584n156eIbsf499&fi?ZI^eS)F^<`g{l}s1D-mlaZLUg z@d9@g`XC#U{q{Qe{RV8YM_kH-B+0Arh5D^}f2=yLVNSUcPLy)3Sn&(N;FGrt^{?73 zFoX}^dOS8+s3g-jO&CPZrzvYnP2DaQmD^awlKN%M*HTDkL$0E zFq5VxHlyXnNea$rCK+&16pGgrd?m_l`$sGemO>%Qlbjn~a9j{o+|eT-H1Kc48bgFm zNXCv0=$V6TxBKsOJUsM(9C79ymcsWTQ-_4QaTS_)b%R6WUoqm_ zA6fVPn}7!A&g6muh>@(_u58VDmM8QT+KouhI>R;FiT<0Ro*W9PYTt9ygZjh>!e(K@>dE;7(RXgSi#B9}NczpEI_KW-@yG*RpL?Nmn zRUbvDIQxMwf+Aw<*s(D0Hx3~{%~)H3j+3Me+&!$3%(c{)LPo;}JNre@H0|V3=A&N_ zBd8Xpl|dGDsC7(<>MujNV;~_#43iAn(o*8!!!5h%iWBEcG4tS^vTiJ_nu{6^)4*2$ zmRD4U!HCQEp?di26We37$*H`Cfja@snhd2*ZE)P^?q}&Yp-?R-}Rwrf?Ww8-1|NWUaVK~AWZ() zVc4eZKe6!pCddLjc9t)(jBac)gtOliN`yIEGhTZ7Me~1BY5)19l49x~?w@M98%H?R zyRGGq*Z#p98z~jz(}8XfC=m2u{|3)|G-SNp#_rI^sLEol1=yg>s^9JMT*2_?{n`D< zAdhE0(D&qC#92YSI||W)3lJ4`C6v;4`8oy6h!Oe)=yWB4>xUgAr{x0lU1+prlfvP7 zQ(ktP(uLi}iw8Wwarxg<2=Q=0s518;rRmQQKX!FEa7@FZ_s^k!Zyy>mhC)`-A2O>3N{J$u zK|&%eqS0LrN-bc&zHY|diBS$tz}k^`KlSu@?c$_4=7x1Q@Mj%DRS-A!X59Gq@Coj* zElf>`{PtWB2 zz^3(@KFRqq!ykCO4*hdznAlYMn9}4SFHtY?0REm{nYk+HLB~eN#nhg@^HF$*L%X5n zyF(-AJJKfUtO!Tn7>x)>qYJk5z z39tJwb#^j&VR7}mAgAOIq%41Y2~xpKv}GY%DZ?KZpDN|*OjvVZ!65&q>}|+AX4{?a zu~U*RD1amC+Hox^N-=~=dDN#A>??=Tm&pZ}0TNw_4u1B-4o zVw}xu#uIe=9{jvGinqaxe^S7?@-V5wpmhiu(WxDh#2hvji+~g&haq7~8RFzF<~p*O zxhCJU*e5|Eg%#zD@SnWKGwwpmdg3%awi8r~Jm~mV_hN|rsL>PwoA{7&DF;JlP_G&5 zsK}fIm2cy&{By0yYWGD0Yq=@^&*+zMx$p!MVdx~~K7~+(rF!anoDUn&4G{X$L1^tZ&N=#%M9V?zxn4+a};%!d|5I^a%0A@>J z77iKuFt2o2pX0W6UgSy*!M%ME4S=C31Ftjpi7LI{}v#J$t9 zeo}ml;>x0sPCzJ!{(*P6=xFhv4z%^tB*&p@L>6yb11E?mM~^d=&Id^jrsv^FENCF>siEUKf3GN8gYxP9{|9)JQQOEr>TpO7OsZnCSIN{zC zSywZ`xcKzoo~DANQwsBajmo*6Hnipo2@)a9zW+Z;AuYMRv&40W$yF1p2^0}8VuOX> z`hjFUeloyK*qXO49u@SM`>LNq>S;NVk>Ya+0K4J7=2*DPv^Zti*b(gpJOgf|KI~S5 z=(}O_nKnf+Qwf?cR(|Z(&Rw5~1*Af3aK849Fj+`}{D8aWN*r^IU4LfRfhih}$w45& z0>=+DnP1BJkx2I4owbiy?#u9dxshb4?ONY|b({knG8w9%<{;4qI=*F&R1LtF1%2rp z9#`5pk5KAlKIyN;skXB0`_n}UHohaRUR5XA45RoZMDI?bX6*9U8tk`yY47?+S=C-r zErOXSH#Y>ozi8mkGv(`_;X9x!6(A>{aQr6-HW3zzPgW^xid08?dO2PCx=HHTPuI8yE7tS!2m-kJywOY zgDxY3A3{?FrICfdR4I187~9vRY|0{y20Oa^b%>0~jwbAkUdjG&8CvyU&L|$IBgxA^ zL-GL*J54szTpouzuho}Q99#EZJ-rZ6CUgvOVx$qRk6qr{>~cr|SZ(0>1++j%T>20I zy7+008fOBVW9FE3y&gluU>GBsH!<4wvg_pYG_>w<)TLP8kaUO;ER5d>{3iihx6&qq zOMNmpTs|&)C$v~!Jr+-8 zO=#Z{bidybS@?55fI#XKfbR3-1-6x>?yoj7E>d(Yvo0aV@9o#M@9 z)s@L?w>8J9ctt#1R1IHcZL%x2ifcrSm9(lp4$j=l4yAfttuUOoFZ++w`ZX)dMmiV* zL=6IAGuXPSUr2UWH;q3Lxj2`L9v#pLJUdYc!qF?x_jMgN-9jku#Z`U~1j#xuhs!g+ zG|{}wWdF^Kkaeaux-Z8IQT~8LSGzJw7x*cBi+DP-_RZJkDp)q{X-HL3K;ig1hj_G9 z8FA9ZVYHQQZRHo!r@WxX@G=sifTm&&aWyQE$?gpGK!Bm%R}J55$W8wzyUq?5ew0Hs z&}Av>RG}r{hR05GxZ;?b$ekijr=uOASsf>RD5gIJ$tjZ;b&A#7BAwI8}HwUvfKKF<((X;cQo1YCs?1s@8Wys-43qS7MjQuWUN1v z>d4|}OfoZM*?=gxSrJ1}kfV}d%*QpiN4(db>V>Kd8gYb|M{N;-Jcq(V7T)5(#m}L7 zQdEZx;{b#F3*{I;M5RxyDsZ^|uJ=T5Dj-N_e+LuC&YNS6HV@)cZ?J(&IyOEOlqeNF zYbPygh26d40I_8X?3;~}y7~UKdwdqt%Nh~+Geb3pM`p63tb0poCgz~SMv^dXS^N5N z>NCx2Z9s+nCf~t+a{NZr2#&1Z@_vWmoX&C^7Z};CDI7N}^8BK-F~%j4CU=+aW`$YvwzuLa?~O?LK(4(M=AW{~$4LvP{5dP1`a^&@~r>}wW9 zwqAttxKb?a<_)^$LHy;o-Ro1S8M*#_T;$N zsMpw$0uLp``@1L{Qoe8QztlfK)Qg30xm<@qqhPb)c)DmeUpSCT>28uvZJ#!LEX}wd z6milG_@MRGu}S&X8HW`&LMp$#qs58g*(aZ!C%T5a|vD z$P-wo3FpKa^m*ClZsxP6=M&-uq6sd>KMGEoRY(p#VyAyBNrP?wN!dd zq`8048fgdph)Y^qf^jwxqo3BNX}9{Y{C<+lCy9|L2SUv{F>j~ZZ&=54_HgyKxM#S1pK zfbagRO1r7lXXF3eIW9%Q4-47tbsu{z{c$YvnM*4kk*DAOLk5S4AHq27DuH&I0*iT$ zPux=c=C&Og{UA{OY}dtMC0f(gGS9Q^r|y^6FO!URpM*+)y*ohCiqpTY7HadstlX|} z2aHzcaZtXG$<=e^tLcbHq^AR%Bn;n2;!PV_+gZ?XQvQK!^1DRR)!{BZ2(V3NPMX_2Gi!SNi#~oz2>)wd@7Q-ST zLC)rc#ME|B>#_TscC%JhyE}-RJ8aU^gK}gM7FA+LbnRhFE8R>_bkcYQ5;n*R_umo( zUii0vHMp`94W5Ju4pcjQq0w&pvU|aTWldcqM@$fIgzcS}V-WTY(Q5D(IB8k>C++K# zBm>Z(`;9<;jC|h%o0(3uc+X5o4c1M|M=Thvki6)3AqwZ)FBPWfdl#<7{KPd)T!Y}# zKU_|?q0lRgljU?(;t6dpwQyx7f4>hECz@g0x4<-U{n(c2!E+aUN6_~?5l;X0;qCLs zniypn5oen86f%u|U{=uqic@`_HL+l@p&;g$cDoYAiC+*OA?9(9H}Oa$%-kLE zvEfZw8XGO?P!8{#cG=%I_Bk-;^n9Ju(v2Wv0~17vDw72)qW(sTwz1w7XIMV_dih=__v+fcD;+2&chtc&0%yr+QFH~ zkSih6kS;gC#R4Gh<68joM*J=L{%!K4Q^g>vfr~FJC>Y&nUu*Yq$5GO=(%m!S{9+sX3_|v zNshtf+Lo-KkQ<;cF1^uTzK`?yMlkF(dW2T?dX3E$8g4^=Ds5Vjy!@+caHX>qZ4vo5 zFf1I`ibr{*<@Sjjk!nJ-i9IXMhjJ~CA;pk@FtF)?oDGe>=Q3q9&toM~1P>o(ti=72 z)-OF3Ibdc*G~Mgq0#Ef8v~6LQZmY&e<>H$rt1mmD7;eD<+=bw?DBh z%nDd(Wr%;p#608~ZN84z`Hj1sPmK1(ofpyAaP;Esv z`yMp?GDp(}4t5gH?|^+G8j%umxWHhky|Lp(u+t{DR;MlDNpkFkwzp$>orVvD!YG~S z5aBls?k`7%HKj&R>iM?skwry@)O6jL z>s;T{v~E`s&Q}{@vwrynn-P9Gr^e)CA|Ip^Hfd`!8vyoSR~+uRN%FxYkNf8$MzQ#Z z#pvlA)xZY>rXdSNO>$~?+?E>saBPF01EO*y7}FI}mvib`^&Xgy=YQiC&$x{z*ZODp zvu{1jU>RA^NSD|EtEr*=C9ak<{6TNXcQ?Bh>vf*5Znoo0Qm*$rNavUVN-Y)qtq2!M zxlHfxP+P$Ke?tANx7n;bMYlE+-oEHucH>f0L$2V<@ldS|d%CcPt6-t`{ekNwTC(OW zZ9zPz4Vq6eDTQ(k^(i3hIf23cW7+X;}zNB!fQrXBQ?OnrQO5i%COg1r1yLZB*xeG+4qJ+<&UMyWvmTxd}dKO@uS)ATGjrX5YK6iOA+jJ-;9|mQ_f5l#-ZA zoL}k*8N@iRa+76c#baS9P?}i8;_N|Ilet0M!*2s2^@vO^vd9{WF6dwpH*^pxY&` zUo!cHG%k&;F1`ETtZ)tRSC3vSf1VF)^yAH+qsHs3522t&8{uJRT!WDIWrM(zy^ok9 z9Mgh`ut_4N>G!XGVnZ z8cxc}6`)H&{ucCNGGzC(8yJJ(se+IPXW8kqG?ZA}hhYZ}CiUwJ@(Z0?99*b|uR zx-kx!U=#J&GEL<^Q~Nah!6QA&jV`_x$#jq{kIQavDoEdUN88$9BlP#ML2ls=&Ht+% zZfm`lRa4Bj`Ofo>4(8A1cZ3L&sAuzGxY2+VMkBxq4?*+C^Zeb$L?CXi7nJ4C4-Z~v zY&$5eau|(8-Tk;286alL37b7JQX>Y+zmvj6BT<&!X(jiFUQ0^BfFv$zpIAv*n9xam zo}?E8Pq&EyamOMCcq8z(PlzHHI!`;BHZ=q4X8N6(=;iQ!5E55k1pf^LE@cAhY(e?5?=c+XgE-5|m2 zdJLq23nl}@5PECS@<42eb!qp#C2io#2F-mzi~Vx4I0u41@Jj4%mOJ7}K-X)s5!~Ry zM$~pEfD{cM7`e85KoA=4we5Lb;~Ytipix9c3^6YB$HKP*eGY$tz4 z`AC~6jNgHmV>NfyvaWj14p@)nP>f(6B9DjDB?d~Vb|%s;`?^ryggd`aDRl`#?6B^@ zA+yYu--)m7YlA0!(~M`>KYI1J^#j{`+L3$o2*T-^1YqaG1``w9@SuXw39#w(8ySXS zc>{(-q7cPdCfWZa(6kYt8lP}FJM3|C#BY3Xb)R~3GvVcgEF{FKMto``{oc_^1CYEx zboG>D17*ZQ!Ikz5yV1WOC4B56A`KS$6i-8Q*`ebNJg=hL-YN+VS@8T^r3&1AS6Ogs zQ4fR<{G9aF*}JFcK(}3~b^PF46k()^c_)503^9k36$*I(T67&r&y=PE93u`aSF&;o zO$Xeo9O39A^ATl!aWHc(Obd&^)8m|! ze`mRKl#yy;O~|fqL!0YC<~-os4Rrc!;s^{h#esS0FF=$~3F$d5dUR`?2^YQ&t<#c7 zo}IEct*o{UN{#Dq0}5vYqlHY>U~X_xJ3to!zuRG4FVR9&x}YS(d5!EUF~>7JBBQcQ z@!rT2Wrj@?BFmg`8IX}#R1Kb`q(~Fe%K(Y6J8@6Q_@?P5Z8qj#J}u*@4Ie< z2$bc3i9u;fX#oN8LT2DF&mZ0#x#y@^0gwVi@w|Q;4%!4t%0HrU3gRQP3k|`?F`%1> z2m~zZ<|&6hUCqGEnwRv73BUanZKvy-E;*wNwy%54L_xh#IH%-Jl~5q`Wo80VAr$LZ zyY!D&vpV$YHU$Cn0Zdte;3C77!VUX;}r4SPQP^-7abXvrXq3F-B1bQ^9IrGj(I5FN0pBipeSnyQ=CGQMHm<~p?=QM!j8+KMHGli^mp$wblB~DJ7!HgSRwtx_m>{Hp-! z@2x{exg$}M>=(Uxo^Pcty~#D_n9^kef7x8V-q4Uj&T0-Pi=q#wR`q7p;+pX_y3p!G zYR(F7MlXwh!zjvvFss^5_kc zr&+SO8~F#6Tzc+KAHAKES3&3%aSB-G^;abO--H@|NRmzFk!2$g*`f`!L$c zp9D<%h;|FX-Q1zuk8krRBr`-|#g!3v*6Er97lhgdxk{;*xO_SvEbZ_+WuUJ;zXU22Grp z7tWzPo9p=76vSPDNRHOtQ{+)rxKr5OGhjt6wthi8%*Qw(}z8oTN)@lU%C z2}uLTR3fW%Jm&hKo4Jl6`ku^Th$4S~`H%hw9(xtO!VFcowRTnxcAqE} zXus|6{j64g5+O+bqDPqU^c)9SqH}@b#FkA|rSwLpQP_E_XxL8n`(KL3*ZA7o%9>lOT8mgtlOdpuIAmUrRLnR zrs=kTix=j<-sXcB#J${>AcMrd>4f7@XOVD3g9^%zBue z+xw3yIiG(m$rUpE>XTepi`p~BuCo1#C)la+b}GbcRzDkyDhpz>kv&uO1CX`+bkGUA zkan?Y$@E+aR<6@tgHk$o(?Ch#W@uig0*7U66pp-2wOS>oKt!ku=YJC#u=R4!!Z2+N zMgdjhp##|dR@+r!f53OgjCa=>8iA_Vyg`~>h`rI!<$s@J=_H)KqK+rJ?y*^g56GD4 z*`a1^_EGog{?BG3Ml_#;a`ux4o#^w$WC`{Z=?K0y38)tL3vZL-h_MB}m#9XzS^pK2 zdMJpZ0?=0BYHkl|YSE$^kZRQ8=>SpA>8nX|rEZv zs~zqo7|$RaiJ)CYlusG@EwYmA@)MCU<8SK$F>ku<*k)466!5_m6EJ_c+jZZjT=1z- zRKl^%QcFmgZzEZ*Dyf|=Arp6>&7_0&+M#@W?pcnJ3$?XsWR4i`l+x4Cj-O4WCVH&^ z<7|=PMPNwROSyNJjBwfiP$cmYPw-0kP2~0eDjuhyKDmpTnXhx3SW-nV<6#tpt8XWM zMYV=FUP<21F;;gN7#A$X=VOIj|Zz zwYSdyz~3c1T_RRXFv;)g$0n{^_(E;D&Y!WnIuE#s9fhz@b0C#b4lJH4nKs#0Wt9!= z$H#N{E^YsN{{PMkNA~-F2Zke=;~vH;o4+DwB`8&|H>|q;LRP zNc2iZm}e^#CHBsOj9)Y-uNgauLZ0?py?$aOSqklyOq~H4<3vJ;h&(SJubGHO0K}_w z>*XOqbj1&=ck8w)h<|*JC)1xt3WTysK{Uy3v5jafm>%L8zDf1ty5;R*+5Ft$m88># z`X@Zc`P9P!X;_ZGOM*pj?uT`zMyzz1t{RyDN1n&o{V7!0h>}8g^+F2a;>WfBpU3Xn zx%U&~z-m+xS0pJ)M7|&rbt_pvkjPpMtMp?3W}{=d9;UH&#AVhvZ?aMqMk~(2^HC>S z)r(0@dI?a{Cmy`U^@$=q3mlsokLtXOB7RqooTX$gA|IE9BwVrWZLFVyX=hoHwRkrH zM?8E8iE+M5K@#riQa^~BgX*Xqh&bhI!ob)@wJx5T0apYv;UNd*W~xef?>=SW$?4J( z7+OT(E2QWO@M)5-Zwz6<0H{N=;ovK}|N9%>01n>((8yhZwS43B*PzaOyo_5-X&73A z0}Jta%lp95^6)^JY7>hxv3>P?XaP^!JdW?4X|2`>=r>UZ@}PDla7qJz@a`%v+A}Y) zbERW;PvfRA%!(H7ngcM!*mHdP3(JB9bh={ovqcW}ztGv5b3`(ssGX=tmmOOgiVy^% zXWd{2E=vP~_cw;1-D(Fo(LsEbV`kf#h*jZ#I_&>Fcvv3f zf8NXtF=#d#!EKlwJuaTn>ixe8Fyw@nAl~D)#@^Mh?In)mR&Nds94Q_9W=ZB8(lioE z&pgbdxM-o{hSU)tzHBIX6!#Hav+VMMDm4+#C3Tm-!Z_(^$UZf-)r|}~srmXlN0v9$ zkfLL_=mXMHf+dY6y;D%a9uu;g1aK7-a?b-<30Qt{xKoe^J5DRdxN&faT1f*ZDT=;C zq6a(t_!FNgGR|e2uG>PzZC6lBN3RM0cYa4fpIgQc{@B_hN2U#PCI5g!;V{-ceL@a} z4UE9U4{It)$GT}XAZx|f+UdnyP(0r~LLcKkH6ElLx4&nQm^Zh=tAuPc#XO2gmiH-o zsb`QGs&Yq`&` zV1^?*kemJqp*_41{h!Cwq2a#`#N2pk5m^I6-@gubMq5o_y(u9KN>4pxyKCPe*)^kM zVjCIEa!t3)tNj*jPl;ChX8vVZRwz-b{VT1H!tS027yt9?L?>8=((f&!71S%7YxGSZ z$uy^=M#5M&(OAM+FAjF9b_DHh113szv*J6}J&w7@l`~M#NxgiK#q(yYM8G!XP7gw# zXh5#1`18o{8SGdLi}K)nBSLY`wC-&bP`7W^O--8zGljIVi@X}sCOIt!k_uH0Sq&Ur z;MFN?dJ&|T(cdt+ojJ?t)1*baL z^Drq&x97;n{v+klcJg~Zwsc1>L$D^K?-=fny!IpZ{BNT=VDxE355J#?`M{@)ikMQc zp+93hV}3=uS>Dh1uh(=6KjmSl{ZzSw$2Iw_)_;89b|Li##`1DIbM+9RzuOl8r9ZY%Y`KGv1KCiA z_XP%7lVKI&FWZ&Q!{m&t2vUx&dZ*;YbUT<|@4UAt^8=`JgUJ*my#MZyL{z}>)yr$bvD!* z+ky+sxT)aV+uQcpc=&XE-^B=wFyT8VCnu=l1i8}B(a|xT&z0`w@#3uA`9=p=d14ouE zZh6p|NI%`UzC%fQIf|-LeI$i4m%!n~C(X$DCnU~K-XIZi)C0$yu3TOve}2K~ZS|*I zlC}tgt;>+V=EErySh|AIfRJKKyb&4=WIo8j5h2zDXOi5m&%{bMUg87I*T~ieTjpmh zbCbOFU&N=S27SX*fvrWPFB1Dk&p?=NaFM0ajH*a6Err>b&u$h>)Xns^2WPD3=e)U} z6TY{~d;N4IUS?5#01))TI$N%l78CmdgG%HxA)u?Fs)~sMyVE{(;Gg-O1kJ`iGd@8a5n5Li&@ug@5F7z;C!Bqo@;m@iM&-QE9u6S=Beh(D`yCU z&~i3V>kGO$`Xcnvtf)~4$ld5VI&o^QwL-$c{ZFq^;N}44FX=YQT5Awh2GFs;Ekmwj zYIgPmukKsa$a`X@MhiaU;1H#^S+AybEYG?6c3DW93_^G++=#oWL7xS_VFuj$&v&1< z*>i|;XB7Lc$TIH#zg3y_)2jUbX^}<2J!?|5s1rRz=9*gg{S5@h)B)b_Ml~Tt`;z%V zq_%=c4t^(v*HTnHTats`r34Gbpc3(bQ3E3hC{eeCo4Xy#4p&(CF%)Jxdh0P}uj6Qi zSGyz*e@7i~OaktctuA)=Y=V+g&G}#?h?4fihZ;5+(^l_eV|!=rDI`Lmqu$HZlKS^V z>{K_)j3`?4BG#k8l<~HTerRGBX;TSOt#HbG;fuaMZQf1l6pY)^ODd*GSh8AW3UJdV ze19Kx7v0J_t5fkK?N$oh+(3=krZ{&VTXfrq46yO&Cun9eC~m^D62u0@ef{MOzBbyS zsH-Q&#-;=yCXX)AhlYfZ(9pnTaobC&s9+cy8y9cpesk(jTCo!!->JRc{7edNC+|<- zqk*b0`t}2r1brss$)vxK5^R|a6+C<|NfT>ie~Gzc)L&tHX5sP5+~|1Wzijld`xR`u z>Epv|kNN}Ftk58jCnT#a5Bq&{yD5LsIDGN|$^a@Jo%%=RBcN*Id)cU_?@k}JNfGAiYQJ=M9ev}`V{9}F7OurF-m zBHMI}wQr_fN6Doc+gdQb%=xiC&{Dq|!&L<|^>)4V?9MFbgMFjta*0x1m#FxtCuzLy zpH>(fHiJa{H~Xua69M{32G1cq#CT%|R&c45p+4a7cA-@WA=wUzm}) z8S?F2lo76C;nSDdbcL1QcBbjcw(4k$v-2-qH!gweKZE(*$S&WO&%ofj+WNPwuO3(R zfg_%~j-AhTOtw*dae)m!-O!~zF4#Hk!^DSyP zO^p-3hR+QV(LX9w^Kby6U~8`;5;3_8t;Nnuk8r4TZDs^%fv^VszX+vaGiS)SYClZw z$#E%3@;ppM*Sza$(V16L!;#Roe-&ldN4)(B6KNA(JcojR686qr(r4GqF)eH%L-h`< zG(9J{9Jz3h{Sy9naiQ(2y$lLD1(Zu=S-0J2==+-YFG({b8j;t>A-xu*POj)_g;y6f zuQ;{AWbrFAauM&^aoSbY9iZ8pwFT3CwG)tW5g|p1{)b?@Hmw%-y{RW-jtib>O<0L) z@9C~3W;fz7&G1gB)HpQddehjJbgeV(k+-u4?>QA2Zh_tvXJ9Jul%>)gdxdxV^PaZ# z&u0ml4D~KKxquvM(s{T5(_`x^u?4Ts`D=tz0rl?hcwbFeUJp4(uC*VLw%#581?C4NZ;*Kp4p9COz=o?r7$ zZR;SvnbCV)2ak1{WmFbSS?yj(j?MAijHyxPrma`pDnMr&EQI#1Z;lXF-pygp*){b4 zobInNbBxGwhJVLeiYX29Nf|3WgT8sB4s9d#xtFTMO{LyPYunhnae+LuhPwzJSU^IW zoahZe-(z)J0_djKf8}>461C#w4?Fd^hiPTCuMlKJwydd^@C?p~#N@03HApHDEi} zdsK1aA>3lri0n}ip0waj`hGl1ldw{Lt$^Qw+kNewsJyOf;FG;e5nWKPw&>y3gELO^ zOL0S!yOa3Rmt1z_#_P7q2I?2TU@~6V>$3_i>Bbtjnrh+2n(qi_lMz9k6<|tF(OY{u z7F~!nV4<^{xrF+>+TDMb6YWVy16PIf-*}84Y8?9d(Hhs@uQnyKgIA~879|A^d^ zUAAp5D*jBi{FYf)+eVc79Y+gr;ShzdeOu9N0;N-Zbi^`#tY){i4~N^qH(n&ifuZBlHT8 zfKr2U6yUs;%_Ki1Ke*U9M9N4@B-I5JvfE08N)SI`%ub$ZMjD%ra>#1%+ed0Tleb)! z?)$A6x}J{GN*dS}6cKtG#TTJF$D$eQx%5}gzd0||r0>} zrhVGD0D@tqVI)j`EWk8h1f>jua4-Fc- zawKdPZ#TCC0kOp!0HkBz6^h8*iS{`J-;H1hNbpGuo;nMICYcEw?|hTd8=OB)RWW@d zS$@$~>>w;EeunSf^)J6Awfyt()R~A)V3UKQfq|egf1%h)UQLqfY>yVx z0vpqU-j?6|et37SWIz3}CZiS!DBLrcI29gv4VW{t??} z(2ic}`#00z%=~COB5JiQ5})lyA>I6>#&Mw&c7SLw?Eg!>aF7~cp^y_}rMVftDjtl! zO*eRH-vhdJ?Qkg17!sR-h~c{v(B-4Yg!j8e*2*EF(~X}KB&@steO1>u8Rhoj5Yu^# zGLf4QHIPrWZ@&>k&Kc_<^|c7xFFE4+Oh)3wFx7M6BQFyvHvj8+MafbG9C7DxX_y-) zTU~-OxZVvKekEhEGAC}bXO@<;6ps00h!!L5X7cpMRx63z(Q?skKb2}HJDjQieu9L< zPXDvDsass5IoSM7YXCVX(xw6kBLOornvedPRwGugtf-I(M>^OQd!b~1>aE*VMlf~6%D*cB`+KdFhTHGLk(EMPGMjY5; ziUUgs=*keai0yNDstM9Nvm?%RQ@Aq+Q$POmQ0;trs8U+<+xnu`G}=we`)qO5w#+qu zL1+s&B4bg{+d9c6$}~oSrQ%d0)6koh1j^>Ssbg=;pP`#sZ-j0l4rDcyYZ91u&2)pc zN3Rl1g8%N2?WLYl#pup%6#`pQm9O0bOlbe#pPF0nPli`(Z>AMjBRe}0kd@ho33rZ+s zd?Hk}_oZ{u04=mT38(CO{p%~bb<{P3T|QomAK zc#h6v?~*%G>1PcFgbir}jzDZ{$F1!qqIVB#IvXjnGF5j6nVQl}TgTj zD+?ZsJ3U>iU)&QBqtw1@nu+m>@_uIrp4{J)be;lcv61ptZh+KMc>H#7<_(^(3&cx$ zrIPYzUDyl7grGB)N)jgentq@!y$~pAlH-Z;zCQrIA6>isYjn$bFu4_v6y;o-)#UKu zSLVHnP_qbPA$ZjxbFxh*G@X`9=?o#r6Dw1BZX!_S$3~E*#>)1$Z~gg^K&NcqFcVWB zmKadL#V6|}<)b4=M|i<9tk_#JFKx6Ppe8|JGeY8rJnf%==sw0Xk;#SPSc3sr`2*~@ zP{vCq3Pyv9g(C7Pj0W>K6~1iK`P^O7gR6fcnNQ+{?5A7XW~ISeII->S2Ch}tUN2#P zguD7#9rIfu!3?|!nDE32_ATuIM*BxBYUyF_dLD zvbb`T7e#wiOg7R2ODy~Xj2e4PbY_Ks8j2HDxr3<|Fb*ScAReNCDf;cjy)^9)sI`~t zji4oG{TV_C+dU?UU5LIc45-=t4u1PZ$lAkzlh_|-jK+)b=iL3~XFIWqD*KFZN}RYe z=8sI9`dOYYJsGT!{V=E!#-=21CrTKCBg4ifq$teZ7@E})gVhx$GH^Sv2U!l5tB6|H z-w|U>rUqtuaR7h+KrY?aOnlD`&oUDG@sU4}532uM9f7PB^^Fkhe!Y~NE*NH*o0E>khQoJnDY zXP~iKb4Zm+l2+Ox>uX<1=$aE#4E|8gb%h9B~^aOl6(kGnB;PeEe{trXiSl|KNN^BIZwIV1dZ^ zKvZI`xQLDH=oYfgEcs%>lOw9|K3SBYXaI~d9KQD-G`fr&=%t+Z@}S*#ymaY%PCH3| z)$}LzBSlv_fq#kv#PWB3dkLquEO~AGeFrp-y1x>}zdE?>E~^qcXPz3C-wx_Q{TlYd zCSmYM1D+4%C=BZ1_ zf{0Z#)?^BSv0wS?O(ywAYU0DXc3B>Ou7_|E`$c!M`vs3Po0Vuu$}Q6y%_yc&h--vjZm{5Sm7j~`c68l`U}hNcPE4&>gkAw$Rwht4r{ z%WYmnVT;4mz9^?Ki*jC}IJ`eA3&&R3MQikFTW7#vX>`u@qkZ>Sq_~H-3oo)J#Cdlm zdd$7i+3+1-E=8Gx4PPm8T&^*7j z?&oUyb!2$6+`Cd$)4L$=uU4}eUAn?y8gmAv7E{&3o!c+5ZF2Krp`!%S6-4*Rg&_DW+d}6|Vl&nK*UoaFk`N$DIrE zan^}qS23_>naH$_mbS0K7e0CprjN)*+L~MO+t#yj?R8(kmFFFY<3@zAf8A!R?;VNr zW~QQU<#YJeA3AXA_r8m-Tza~U+brbPK8@Gc_akf4cvOdLvEj`fh@Er|uKMz&xM0o< zOdZyNb+6YVt!Nx(95)V?6-6it@58<6=i}#}{|KhnFgS2OT8_8ub+Y7l8wsHPfrUst z{VYtX%tKCS3toL@1=`1)g^Mnni%OaAw9*MU^PDqr-1M24H6e(dkFP;z#RyEDT7jOO zi?RI8W~9#l8+`K%=i$UjqfnmFgiX(ELv+GqOqnqp>7f+ljhumV&Nxj1uvwTsI)vrF z+=#qW#$n7zpi##0*(ZB2=}R)FpFJP*B2baT)h`I#R;*Nb7kCX}t>(4DS&qJ|fO`n%=&nbIBlq zR|7;1`%jg0^wmKZq7e)NI7lL?bvQQBh?zSlr?OJ6bEm<9$U8ma-1Auo(=VztdZ||L zt=7H_1O{r1P-0Fc&0fBzp#9wTG>Q}U1RlP(2W#JW5>Gz-Antwo4J_HX8k^r(jzt^V z5$)0`8ZSTERmlY zqJ4{VL1M@xj1QZu`Xkz=AdNiX*he>esr|=qP<^!50Ola``DQ{W!^NDiAW$# zY!jK;GPXTYnJ2L=5X#1Q35I4*AFgMUGSY`*=GiCW^pDQRtjb(u$oK^d%28fYfULeg zbagbMecMXh+m(XWwa?*C_uh+p?tTidZ(M|xb@iyN??5z~hWwFpaMmTKV|=#!He(?a zkDZLk6=jHpdZ5p`%e?pZhY=6=p|6)$)A>_ygDqg6(yLH1aV{=CbsgSV-GJ7nZgg*c z9jltEFnq#POpsVOzcd@=`JH&}{`+z7-FM>77uI0Mngg=m=-2D?h^C-q+H9P1(qt6q ze8~99!sI@P1IMFpaaA@71NC^}o_lfMeZQ9gY9l(9G|3o6(8u3IqzJRGx(FA1Yz{`4 z!A7j+1e|r@ezfg4fc*{qx}S^lWKU-kI<~LE-O1y#;SH>;t;O!jf>COfoFbw z8*abvVJvLTLUv{zWG1!SK79D_@peG3=-5IWCH13p`ThJLN_@J;m`|ch#4T!94^Z?E+ z|91}-a}ChhHNll}=y^L)Y8nF(=k}Ulf^Dk9Z{=yEH+Uczpt-<7gBGdhwe!71PkR$~ ztau5XXBMJ)cSiih5zwuN2^2T4|rW^kkKl{-YI8%ZHKExCc z7GlJdX&7Cdj=h`KptfNzHZR+Pyid-;Pmf$ZwS~n+&oRvN*;q zZEo3*)kQhT%t#-wSwb1T<%_n9(Z+7Bse|=!?Ie)YuF9xBW@Q@*BP#7}%*jMnMuurm z!Q0DZO^Rcv?Rj+)k`F}MfDNm$C#!N&_VHn%DtijH@y;$}15>!iIG_15h_7}3QZJ!kJ45Vj_L|F;HHm(c= z+FH;UlHYrFHnQ243Nko@FQ5&HUSf+PsW&%Op!2h`er%KlQiJ;Q-!9ie&w5@L2x?q3u`d> z_!F>d=^E4>*n!n=u0v~XIYvz#g@RBgI(MwVg2(Q~Z~t&V9(e3=JpIyAtlH3uUaK=6 z&p}pR2}+7&Zgp2<`y=YvLJE4(v~e+>`{N&Q^W6{NkB>fyXJ1)~wdm4Qc|=_1AUiJy zxp~gk08-NOkei#WZwBiRg>3(f&4EbY!Q<0D36rLd!-(qf7=7BuaqZVnL&2tJ@WkCe z#7%#A5lc38qDulpYqk#`K71TCxSRb@!yP~z)VXs9Iswl%H+S}9$<_l{w51W3?+Yg<=doc1_Rz8FYa9S6~;dc0*x&^A5gE=@-u)`4LE5(N0rb6lJ$;jv$w zOLGPv`ketfe&q2%Veee?s*G!!Yr+K=i8K7v!?cvAh%=hP`@{vNzHvCHGooKMHhR>d z)S;C6(nk|y*!JX)K}K>Ab2MOE19ltRh9Xx^yAN9DI>)`}XxWK%>+*2!-~2QF;})RotD>h4C>-S;r#w|D?=10@S zNzBYd)yr$KX$YC7R2d)P+2Ke6R~*MDBI9S~!P^JQXN;MO8IvYs*v2RD@`jao^pzT% zI<6E2c^o^+iM;Ht=xFQDQ|H8t6^orJh4A>$empH5sX2uh_v%`#+H(L+Tqfe!N~D9f z_7=2c7ojL!bW)!kzhpgHWOBv~FW82Zssl|W(q2k#F~)A&fR(%I(ZH(;G&a(Sj@JEX z$gV(92H%io>pNs+ASHhUrk?syT>XRp!_Bwefje&dtprjx;Qw8FI%Za9>a$U5=O6>6 zb*@31OCLTKlSYg})}|-$`u5FOy7y9CIHwvV`QpJ!y#N(BVM5Xgb@b+Qick{Ti?us; zVOz5}qbeIhZ%aMuP>kHnbY!aS@_V!uU3F%?wz%>1jv3G758nS#hIM2s>no+O5>=y5 z#K*4tG5+`0x8bfkZpFfWKkmxl5U+O_5_R zm{*9ZNvGrD?QdZHwm0y^#wtvmGy~JdqytSGu;Rhn@UbUH;tMz3g4=#~3;z3im*eB} ztB}p*Yt#trI@Yv-{&v}&11s?I@BV0$6d+f~Ry z>ze+k{m~Yr^}mVK$WHBx3eN@rlTp~0i0`wbL1>%Sz4;O4eIR%2YlNR>-6^aYCE)tS2>0v zma+Ygj*bK`0h-=hkH#%)v1s$zm~;F{j2lsmqLMO{mzAMl@;uBvYbH*uUxrn6DM%YP z0~enDIG%j!Eo@l7A8is?EM2)03vOJDES?$9EkN$HnfS=@PvF_7lVomKiVU8ib_0+E zoe#aGi#Zx5B$J|RO2L8=7&*2QBf9=}iz8CQ3qD|=P z>cZYtZ({N5OR;L^c{sT;3%Oh?P9+ykCt8Ey1GoEf7;QKn(;lkde-LHS3I5 zr3P6dN*HkIZ7oFZR7{>T3A0*$h8LdMg2kuK#pL1wVzVQ=F413fOy5;m#|<(16sRc(r;dwOGkzT{`x%^sTT{|b>xrNK}rOc~B9N z&&fnVMHce-JCprahy0EO+#v0A+jolAvZ??Sna-d41Dd?0*_3uNlYn22qdyF$LPQU8c4oY&6141TmIpA#)=GFt% zBYzZO0HM!wP)gPU9qdF9K<7qnwvMb+;PVMgQ_eU8hM1;KzO{%4ZS(q6V^&0*uuv#u zuRI(Xe8`wzP+q-yHR|f>^cALUZEd<8iugeD#*G^>eE4t_6qwgr66|?beFN4l|2?*S zY7VA~v%+^1>-b1N_=e)Dkuxx5at~hG(uRV{6Y-gU`&UeR`5$ohv`PsizKna;cA)Z~ zzKBt&GB)C77FVB!tA6s2nEL8JCCPjaBPAe8e3XxkJIHvYqy>?kmnFfE%!4f(Bx1J} z6_uzQF%6F_-HUVQOhKX4u^JH^F&<+}nz8mP^Kkxmeu0PA_n|+Qj-32leSv_UT_*ym z;xOfkf5(6#0|moo;3MDpC;aQ)-{DIqjzMv8DMnoID7IBygfCq*8TsOXvrcAS{t$X{ zkd=`xydjLHSv8|Dsw#;6-#H7P_|o@q+mc>Hawp;3uYCvqUhp!0G=D1c3i2@GgkR&i z^pD^lE}4mvT#b0ln$j&5Rb%?OpTW0&G#Y!anvLP*Maau9KvChp34rWJrIq=}?MvifprF z>@rh54rFQ-=6vcJeC?tb7JcqilosWqV#1g3?bUPfuUDRman*SgL`JrZZ-(d*TTE4H zKUD%B&av1++tM?0ku5TO5rYwtAT%ovd0A=lyS05tN!KyX%TATOR1vBspO3HJel4p1 z_hUG1bSZN3WDJVFjGsNS3cG2uj6qhO1YxwW$jlX<1Q975%Azt9jU9~(e|8Bj zo_#9*^Qj%Eb06a4hLGl&&dMvq)Dteij+Z-d#mVC_aeSpIFCT~D$De>NZTt#OA6|x% zni_onEm_AklQ5pYZ&8q%CcmdF3ERyI!+W;MreN~i$ryLvl{l%Y7{&9? z!@qAU#YEI#nCy#E0-S|O_?vSiFloCTqpC|$GI9#exGob{Tz3ghn^}WAy#kqo{A{k7 zA`F{!KE86t7m~*3OZYF2PgXu6T^n)leEAI(6`_3iMfghOJGkJK@tDpBMFegc`|#nz z$I*bh47b~GX-C|(lXzN^dnotDqC2BQd`cAZT^dT(HlfL!F!qk?7D;+9v7Bv7!E~gVI<;l+km@?Kij<#Y@UExuuI+qUQ z8Cmx~g9C0=##4U~tPPYi^`w7s1`Fgd$Nvsd*Mjvl2#JQJP3O!?ox@jCP{e%);WHPU zh_S;f#d+vQu;VcVdS4TLEk?*|1N*5#m$5j}mhz3=3g#0s(m!$B;;AKw<$e<3ocSUu z4!(8L)!BEl3AN%(hzG=ZXPL^ej%@YNZcSpaL1>Uj9W0VMdPdZet{ow#i?U2pKZ62u zfA~N&AAw?wD$7Pnq!oMjHlwRw?3SN>PC<_Rj^$@B zj(BNh0WyQq=e`!y)ea?-fwD?z!$kld^tU&lrK=C|+-g+ji(_=Kh(Y~QymH@7IBVqz zSn#vYHHTTT2(Z z!kJ=ozTOfOk9Fd}&i!cZ3+b~7@n9D6Bv7a>&yyXT%u`6}G_)XED0;-nP1bX$e)0C3 z?&e19uWv;tU7YnYarO$+WK_D)ymvpEJNpokYVkk@vJ1;mU6rpp(SsmeE67;CHUbO6OM<^{Dg_U^-bjrN9_8_IK3Wb@TzzBWlJa7O98avU?aTn)5C96c% zRKEY#xse@i0Q&VvGFD3(E>62ne8S|A9d=@o+D?+Zxe=V(E_r zUTLB`(ut;~ZiE8aD67bqgN&@Nu;`Jw>Ild5MQ3qYd%2}$C>NW9U1D!=SpBLYY|a|dRnl5cN4m#IIDC7DvJ3gBkkN^@QOxfBX%F?MS4*M%1UyO zspAlr{1260GZw!Ku%E}@=J3OZEHeDR~YGHOF@PNzO-G|O!M9j#B*eQ zmgOPVz8{VIo6sqXfVZ}#*DDQVh0xs6C(TkW7iA+WQ7nN} zFy4#y{q5)pr=wtau^e;{H9qAiFHc9TwGs9EJMA+LQkY$an#v;N%l!KA;p4*!JzBgg z-$CH+P!lAxfI#9|VLDR;wWH!fkkHMV&YWwAIKE#&U7)=&bVg7G|vu zLd%aB95AS`&hDVPBEfPx*s3=KM2m{^D#@idV;OdzZ-j3W>$?&cS(o?z!i1=N)&WxV!?n;^=dSt7-#L zv^6&3s?UB2r_4Kr93Mx*F_@Dh;%M6VbM1I9`r*Tej}HON&f@+5p|mp0pLWtmF!g=* z9fV}!RRZ3(ynNdMEZDGLKSJhY2Oti*o=vt+yepG>#*Gx`PXhot@d8_}qslsTdbCXV z9=%#ubPNs-$kU8&G%(O|%OnQbCeUiEX9EZYTVsLKEl94H1Z_bA4D%XO6KD)nJ~~i5 zDh~hfiXu!KSB>I=JfsA9JJ1#c!n>th)+Fs1WV5y`U~QKcu-t83n(*ZLu%jkZ%4H>1 zGcnj^Nvp%|oO%^D>47;mYk_QT>8Poc@~nPK`>y1H74R|k@bdX%MkWcA z)r1+R!HA=F>BD&ZzF*`29$Jol!#{>^UwSGgl;y}8qE0I&&>$(%D0Mj-2J2NhL9)&K z&&@M&Q27z{Bth5*+r({Bd$#ycdiwhMP+U@ov7?5gs=QopGb2@24nxhTF&H;tJW5JR zbZxPL0WCw>J<#4@S(;-C)DGHZGJ|9Y*C(&-UOA^{P+iJ$Yk5P-3~FC7p#LBq^(h(d zp>1|D!Xr})OkFE%_=keiDHt?A$~SskxxLr3DeW4h(?Q6r1rf$8w&JrCZyMrAF4rD9!2Fipd z2WovTfc4COQflgpfOYVNm^Vd<`lj6Dz_Uav%0~1I)D@=FZS@a;6=YuZ%7NHqIU1CB zY(BW&V6cwLOK`yZ`_-t!S2-l8OTRy0@4r`$UU{KSOjE+xXVMnT)A4bnJST54C{F{$ zDG${l(6>u+vhKBAYq)Imb|0H}Rdr4i<6*Z>B?Y9+6}x#N%xy!OOtj(F(g4x)n34$& zjEu9xtQ*(Z(ZSU@S{fPyHV%#Ca+7AT;cm+sTuvN~OcD|@HlKuG3SYTdi5X{HhR)KG&Wdr=dXp^y$-a zZ)!t6*NnO6ywIq2P2T3o6gr;E_qlxxC3)3?(y^ z4p%(DGkvw|$P_DF`2cJkEAJhjWWKhkB|d!k@bUKXp$!lm2JKwMk>V~h5{=tO|NQkU z@Ui178UERlzYcJX9Ep7R@ZrOUkM|NE`T!wuaOHtkHuR;!kr;OF??Al-32EYn#H}a7 z2mkanrAi_#!dhF>jz^9cY&yjQItSH~yrxu_smu1gx(@>D=&eAe zKcvJPmiQdS;p$pwtF%Re0|rA!TklX{O}f7sX{pG`YKYB%r!4|J{&~Dpb#ZV6O zkpc*pSDrY=kp=|&cS~OS;W=Bc&bVwj_Qt_-Th`T@gU%vHW&EO%aKecvU(d|(ESx^C%q8!CI@4FV3M0 z07PIwM(f7)qfKQDeWvo3!T@N&@psg``twRS?NCO0Mq-Y0q+p@#ol4Ou*mG$haOuha6b3hH*S(zxv&(l|V>cgY49&zA1 z#AfpVxI*n!D+X^hos@Uwgv%#v<+w{W)+T+am!h!V;>3A3_uv{Qo}k0ehknh&!oskW zxa~)_yqb`Z(K_Z9BErZpWh;ta1_cf*XWRU^8b5Aj+L89j*Sap4khG7(K*K2?K79D_ z;ls!K03XT#ArTn3v|-DZXN=?M=nbL1wHLkpbdqfVpaMox{XsgLbiQ4g)xxqwInTf| z$9lG|f@Q)tXZJ0HM`zU5Rwth_dUe6+kklZ!Idd53TK&HoBz9wITLehgnHko-}b#p5)=Vt#!5ov0fnDfLNqU7qWf< z*|wJm3}j0l9dx}~U~Qljg9r@{Qu*A3T{EmNeEqtz$Wo8_YBB>5smpR94Ge^Mz3Gc=e#MGlcF?R2*eGi^kbh$4{WH z9UVyF4;?s=q&z7&P_~xax-K}Nv&eR&RIe^rS+<*KL-m_B5@0=+DM_03R8EqrZ}1h5 z!-4Iw9X^n(Un3^-DC!*%v`e%{Mb+4eJ8ut)h_lb&z?Hc`fnPojN^s!D!a4m~F70Zt zV8J9Ee}1@(7HM!Hy3+XiQrVK{>QaV88~A!t!UYXJeE9I;!-o$a?{|FY1B5{kFRwQo zMMG;3`a>b4@IDpGC)95$YW+s5>Q?g2I9VOddNN)s_5cndpvnBN*N! zw$gDIDQ7&Pc@M+o9giFKo#f!k9gp^F7gB`RkCafo3`vi$cx#Y2{dCwxo({V@@}38n zBaw(+HK60p+mT#Q;J{}1T!z+hJe8qgY+70oA-y_buL@AF3kuk;~BT!YvO-#=)~(Z4C_dnG6BofX-{wl za8McRnzTFf&%6d6bV#)wB56{S^(5*Fl+OT!NUE0v)>hY4>I9>_<>%N22MTF~;mS!9 zt1)%-Fl1$92(Jh6$Q~eEC#Lpl`w1laY~k`=zE_^M>UaowoOlD)k@8rd7||?qDf20g zxw&d!9w0UW!@#XSylse%zn;~1a#p`?1=|{vmbb}zW<_ds- z(SsK(Q|DaW?j%q%`JOV{uKus-xZcu4{k$PX+fHs@L0J^@;~^m`ZO8#;%l1l<%yy4P7nDqmfY&?O#CK7z&to?#>$K@i9Z;=#+3HbaZgQ6QHNb0G^U)^5{PUf zm=M0bV4!fi+?5DkflwLIL0tsvYJExToN=yMKv~OsJ5U{OgM9e#;lqayAAfByUQ9-2 z7P7MQHGQn`p$`xeu9Niyc|Upw1B57@L&H=VI?;5(2Wlw9{gVHLujQUHar}rxxz=@{ zoRy`V)Z;5f$x|6y_aNx^0_foCKlzXUQ!n)&MSTHlsI8GOf|34#+lq)oS34@WX2TKc z3}E8O3S2aA1}2TJL27!InBR$D?>eOPtr8o$j4&;t6Kx%O!;-CcESdI}6UjVnoN4l9 zEJ!TlcO0T^k`L(v!5luy@*4*FrXmRldCQQV*%wMU)zoQ0$3F3pv6QhMbu*u;4=6Ls zye74-UKNliLLYKwa9|6av(Bpwt_>GpydAhYM@v3@`0(MwhmXHL(C-KaQ<0rhU^&MI zAG!d+IcP*8MJG!C%r_9)B|zYoP;qex)xl?m&X#q!w7&2LJ##RqTzIyg;RvWhh;{YW zA}QDB4J5BJw(cNk9Xh?nF-<&-EP;W0Rw3aC4prZRZPHfWQlzhKwRMhEZzxb&$x}5Z zK^4CmoROA>>0_#J!AVmvXX+Rf$!CB_uqL(W_c4T+;aPv`=1S2Iq)~=^ z`OoRpZy#9Of~f~IM#b&K4odWFWq{Ho{uBSk@!lM zG)w80GK4ZoW6Lmq+DRY5)M+ylj?-TP&KXqam<}MfLL9xuj$SO>P>;sWehTvFCY?17 zyn;M|90E<5ID^WuduXP7lO5FYC%=}16ij2!}NlhG}Fp8mEfZ9@lx zB5JDy1$;{p>nT{lRepP*2G%qVv8MD4d|^R8W=|Z6b5ER%nG;4xaF8eMNk9_WhG6eP z1p3yAsI`Ip@Iw1#d4tksGpNiVF&;wJF*oBVq-8P0g87JM&p|x3MEQD~k$|@Zxo;vU z2~W48N3R<2A!E@&o|EU52l-C~*_?SB5!a5>W71qx<_ZCInc8a6AUJt$`P@UA1Xf2v zI2^{FJ$vxR8*kvvH{ZmnRjaUe?OLo^vqraGTDNW;Hf`F3*49=O78W9pbHOo5hVaNA zOe~<~L&$&7Vf*OdO&@ERwd2O~-Nw7u&XL9_c|5)1@8ZaP@=^0{850@9xr$l7j*l3}gvq3*}nkO;5b8QE=`Q z{Pc>yy%CpQ@mY0j2jh5W!8(sU_cjO?J)$w8PuG;n3rq5BGgHPYgAZ{Z z0<1^5ojZ5p)mL9dK|uj#&6H!0V^z?L`dg`etFE6*H25|`(Lp@#S z4YNO1hm28bW;U|2)Ah&wp+Yo-zTQ6c#Zr-(lPNnc>3>%Q!JG`FrOE{m5w zoL3MC*M4FvgGUExe|s-pTC)#5z5Ph#7k`y2um@aq0>zm$&cCFS55zJNlp1_nk=?4S zkdzI&a&RbUa9}D^jFZe;-t)x)C@IK6X+bW^3bIj}e0s~TFEScwq|H=AJ%|nC*y7st6eq@3n1}3v$|Uu{hYueij^{*ft0j|wNU|_fA z3IecpcQgL={$*%t??HMh55BJZc7%BEzUUyiqfw$4$~WVgsHN?hgQChyIj=nE`QyVK z&3OBYI;8wyR{({%S*R$?LAeA36-Buy%*#e*x;TPj{$MTk0BkY>rmTg^l>cn@?ZfEi z*~$EDaX`fhDUtxBq%a>@Sy_@#GY&J?R%AZ{eH#(%TaG~Q8VME{tctOA{1q||gTOLx zIpO7b$BRz5b?g&hId!T$iS30D&nQQz@`s3JPE#JQAVfvR`<5a8cr-W=KFhdH+*^q_ zWV~X)0D)JTD5vX&b+k5{jcM>e3wfo1gpgkmDn7ui!oF z&T)GGfCq0m;Bg?;$(J0RLko3{)wyT6q@_$piD^sjszRa``K;;mNcquSIpEpo7&1~* zP+pXSnPV!&c^QMt&zy#9&O08TI&-ERs3+l^X@DVoarWJJ3k-*{?n;6L z43UVa;O|6&BXRsSkdQKJbK>TcI(O2F+qo{3D&b^M*`~+CJ13T2SMagGg47lGagf>O~<$ilQDh%`8eg|BDB2r5|(XgMK~h$G&qXsSVVX` zl2yfZ8V!f_*$BS9iUCxj6-nqVSrJCSYPHZ5)K&| zmJ7wCEu&M)J$1BU-9TZgnFEzzyV8!<3yZxb zC_FSwKO%`fy0MY}x*JiqZ9SInYDQ1UJ|u7d=X!Eu5{-JsOknzL0$8;_Br+TuTTZY% zE;?8q5)uJf6sdYLfpcnv_zezEJA-r>yLJ8!F{k_{OkB3Sg)lYUtm(n4iXcITv8c)R}tQ zhCBP2?999uaBaG+xy1(;zA_twsGY16g*#nV2#4HD@0T+W{ z*wMcS6*eOr|VT(rKwt86Q4u+>2Pa1F_IP#QQcP(7PNdy>B4c zyApx$J{dDQMs}I7+Z;1TgiCwJ#9L0jw@jRYL)LL)K1g01`#>gQd8Z?uULk9a&KaE% zD*Uym6xW*qUBB!c$z_xEGv%9WTnaiZRq?G4zr_-3rm zy&7jstVCH}3ZfZ7bnn}WrX3w9Ir%({!7i+S?s;r&+k=IVK7mIcSc#^hQq&Aj$AOj4 z;o+P9fJa|hfY+9+MRVR{RF`BymZvn(gZkAk;)%QN#Qo2`f`zZVi6v_~kv*{n#o1lh z@%)3h|Go$D*ozDB(xT0%3*}?v=u%|MaD{v7vHFQ;v9)Ojmb|tQPu%kmo?6p@?%X^S zhc@E*n{LMg&o96$uQwo8BX*bM%8sT9+umG>-{sVq{&r^8erB|@v)jC9nRUo}(8D4$(54i26t!UW3 z2?zG=MO(oPj4YJ(v-2f9ApO4k(dV#m!BT8#2J%OZLTN@6eJ#7O@~P*rJ=TVGFTQ{$ z?|uMJz9wVSn}PC)ReDJ_ATE2PZxdd*{cb$?$dh>bdp){oz zJsY0Gt$%n3k39K;w6hYsLpjJFR)v!E2s-MwV%5_!rybroEt5G-lR14Bf4u1~JhI>w zyt!-%_H+U3Hl$(3sS_}!x=?rOW)S$h=|^|#PAtEr7A2oO4r43(vEjZ~u%;o3ys;VR z-nk9y-|R%ic_~Y-`_x7w&%qPdu>& zy)vie@$Fdl*nPO^-lt^kEW*l7El3$L78QA^2!sw`!wWBB)6R`pxn?OIzvBhGv3fmr z>|ct_-NP}wI8XM6v{A7CEi8C>30BkvFm+6+W%}^p!^d9_c)UN>w-_1E=2*cTQxWIo zX`VqMiIe1|zc|$CW4CFK{4X||xBrOa&ePB=7c#b5r(e=qjU7}rw^HA51yq%eiHH8dOjh&!Ad4vl_@| z5MphRfPldPp~1vo3SxFJmCr0NmJcAZZyUC)U5nirV=#7H7DAmn@Y;>v!LROp8EX&p zBCRL~>8X7NhRH3y-WrU4H~o&QZ4;`v@9VKZj=?x)%?x=|@g( z7;U>=!ISqa!0Osw^zoJ&E2)DPZO6V1i}CcWFJP;brASbpzF|A|^mLEa^2~hQ`c>Gy{{W)d*~o8OgIAt<29GS+i&hDy`+I7!;;w(iuWq~_&#tRS zcVRwyH$H{mJ@61-*wBP9*Kltw*1voY?tNJFbY~zxFAI&^w_(GY4d|5ic*Qc(+lxJG zmZ7e_6M>v;WY)imryhS9Pp_(znTesNb-T>z_i%%EPE&fYzxEBh{HHtd@Tw5fGPA`I z@5i#O9}7#Ov$!K;j@<@Jo2Bp%?MI4CK|n zh`aB22G6gmN1IsF)wmun{Kr@D>pw2S_UsCF9mmXP! z^-a15_Tj^a4dLGaub?YU1(T*rbI_wpMF?>k*#E)R|w3+HS5j^Co14V~Q)e7%0 z2clzzMEiD2KamHIrjA~`v7r{7ePQrwJr8;s05EC)qpg%Se9s}r@)MwL;T<+O&}~fq znM>?N1v!{EZ4@p%VFG4Ps6lZ-o>&kU$D&PQyj=+NZ$L1-4#DVJ1R|1-ZV{4gWD8Pa zJ1lKSFt$zjvW?0%velBvCeq%#Z266X&}Nek%Qn2pZe3o8VMndj2F73ag{9W?KeN!CNBTO6ubY7wG&^AJlbmwDjr zMDoAq17~JF1yY}BI{nxATPMR9UOsyM2=O2FGA^a>DV_-zFjG-wT)!g-cp zQTQpm+Q2IYq9+=O>J>FUSbR88@4ImYVe9L^!Am=9B*5E;x*Z#^=uZ#f*_FkZbonRn z(YaMfZQF)5Fa8dTEB_APz3wVp`N@+pDYG8S9(n)|)gOm%{KpUQZH%%yMOy7Tyybx zIC=JP6tujKyB}-BxOvl2n%0e7uRo6^v9od67q7v!m!69mMZ){Zzu@8W&*9rY{5r0@ z@MO#$xgW2*(2Tr_k(fO?4fUHBCch_R|uj^3!g;^MzUx(*!z6-DAehlCI;WzO4Pn?hA#}#1zZ~ha@ zN1TqS!^==0do*1yoa3JDSpUkS_|^Sm@x`0}0blsoc{umPQ7Ee^LrK*HOs~v9ED}f8 zw5#xMU;HR$RcFdRC62amG3H$OF?{@j^Ks^xW0Bvq70Su7t{CSvO9!1Nhh1ivU z63#wl3~~c05(-t|%uif`i_e{pvregoM16Q;YX;_=H5MtY+pzY+LAk4D*I}lO*M{_IkU=xuO5K^5|CyY6lA9cOmN_CXQ7iPq~UT>^TPE}`)nM|yqqkYI&~B-I%NuGPaKZiEO9WR-QtMv6(@WZQuvppfgX$oN2e#bjA{DnU?wY$S^2y!2)?)uO#xF zlkS28)+LXDh^}j?FD%(oxpCN8uD25jleas$D++%p#AMgduyO&OdHi8KAWr`?YfEtA z*S~--TsjxS#OOdQfQ;PZapC;A7+GGRX8~gSHelzrHtfwVL2hUVHf-32&09MW8MX^6 zckDsi$|YF4p;R2Z({Se85lEGOXO$MCa`qIA?x@4o%_obqcmigO<+mw-oM96&`Gm7@ zesmM|wuR9XPDN^@0%u=*3Z_pQCQfNFMva_^Gyd_LIOC(|;e=s1$jQz?>6i%^pB_V~ zrw6?<>hVxEMt|aBeEN&$U}|9|(o=JgJ>f*mJ0lmt+FI1^4eOkktC!j|;#snri-r-~ zvj(fTrXeja6RG0-Z`ia8+jey!GV%>9-`aq#F787;NXbLduu(W+Rs%LJS&cPoH)B_B z6)N)bQKFO0H&Zbf6rJ`>SbSCJm}%7rv>w3LHEXe{z7b9BVR6FS(IM+45>G*TU=%L6 z?joEpr3%HOqh#WEOrLTbvbws_+0%}$eOs`y>3p1W{1^-`Nt0&MQ8Io!rp!GDB@&SE zLMI=3A2)Rv`fB%J)4Fw7cc2~Z-Tf$Nm95wolix#T_H0~uuFPp!fu7Mp^DflZMiH2N zB2JiDf~@o)(hCbQ;e_)rtGpN)x-UC2^w|KrkB`N(P+oKiKJ%>$F}q3}_EZ_$(I?=< zc_pZ5tiz67eeydAB7fMKIQy(Q7+#c(be^pdR8OixL24MgREcy$>Hg zeE2vT9Paj~jzg<@w5wM%u&yUoSzyQ$kOO zBfbWKR0;UR=|O;$C6p;7j(I?ikh*mwd2u!nrSn5)RNOkRjJwby2WQ0Sya+FtF;Grf zmb0EX6H2@?5cJfiel8I^pX{?4Gdn&yHa1PLJRxJ@WE{`wB9w2PXK^qSWrySQVNDX% zkKHNSt5 zTnE<|=M5sWE=vA7fl97M zl3`Lw0Z$Di$#XR)r-YkNbpt^>_s1YxWAX)xUfbRMX1Y*Z~#4a1}IIY`j;lq zZ0+5$46tzfVww(w7xmc~omxh97t9I;R~vAn{rfz|%-}Ue|JYwRtTD6ZZlh=`Gi!}d zn1NVf77#7~;w*IC(5&6PTeI38Aj)Umvg+MVPMTCh(cw@2!Ibhp6?+{AR=p=}6iCOe zkchT4!s|+2b5-Yj{NaUx3r2;%&r7ieti*gIS86@K2|QhPwPMcl2w8gL8NM!?a9ly4 zApaS&l3fu`#JUE1dJtF^rlT*i;P`IqX=45;v5A1THZ!c81t zu>}zed(*G2b^6=!^egOP#q~MnCDz>(+4(HQ$S54S`d4fN=jp4&v5H$fbt$_m53+Tsqi%}VU4uZ{r&Xy-}4x%GVm@k3EpGrIhDO;=$xaJLlb{ZhL!{bFO;GVyvGl>n7mTMK!h^6Pf1(hkn3UJuZBIeBF1tLOFwV|3=3JRM&%Sq^~Kue6e-9K|_hjs1dZ%&kKi9gH2HOz# zgP)uH5UZ9o(c-ywb+ZPUgx)BUW1i88k1nJr+rL?7w;~^MU7Okk%R(Mg zCE43JFLkXK{9Ki?LHBrUZg{@JMjM6(&Wo zDc<>@Vn3MP6kp|Jbekel8X_D*A(-9rh(;b_TWC>+{#p-p7_(|=Z7GlL)V{!%MkH%7 zwxPu>;h_~j)CQp}UmjW^nP$1!!Q7PvKAC5+6%gAB_5N@Z)v4naSX91FmxxQAKJ|r6 zSDt-yos{=*w2}rV=Y+}5<%p`fnm*}d>=e(Mtf_L6K>B^JamZfdr;+jKQ!G1hhIJ05 zGMp_R)X6+=VC#S);{_x_2E&=vTz7YOgl2upTc>3Fe0=ElFk7}M5Ojv2!@55Ux-_a) zm_EaQ?jU4~1{BBbe*cwdW9UxwE#+LyI-TcrUEt^)-VP1}LoIMmPw#D92mFfR?0!EV_0!5~;3CQ1Xc`=sM=j%Q?fqfIEEvHZ$ynZ& z`RzYwl(i(WdiO}yiV3fZ&DghF%?PUMfSvl$jA5PS1?Q*7O>7#I9Z{t&NG~r!-kCz~b@#0aJtC080(y`xj3R;-wHQ292F4PzuGSqNCn|-cu03 zOzH*g;;i3afuPpsT*qcoHpl=!6{&&DnfDi=j$1>x)$5g#PtqaY3*(q$t4Od1$u@?7(m7ny72HEs;iTvXBbcY4bU zM@~&rWZ2z3L~2lTI24_nyo>@oISap7b1$dKnojXjhM4JJ+kZ}_^yVUt=z)o3wT7@n z%CL7o6`QArw=)|dVxSQuMe8(1sQzD#CRvB0(Qf$z;@f#hEa@-_Ht)h;#C*h8nk4(&E;JyxlyxnbK(zD?mz&a zcx!y#tog`VxgtDpMgr#+@-*CuI;>!JY%5XGcPC1Wl5Tc2F>gYK`!u45@gDlVOyqBs zsR7!qIwTAMM0ou8xeQyet4_?|wA)rnth19-jqkfB@a?|Y2^S1Z_JS!%6+OKQ!ynXR z_7e>_1r#_)rvmGQ-yYJtltxm`Y4%MFTk!@FfZ!s`L&v0Cob zG`H9_KhR_Bti+`bZ1kSE4f_s@DhKQ*|G{Lxzs*0L;dBLGt{Fx+e7Janr%&(viH5!E zW3TEttm;5WF?{uNZ#WnC-mObe&P=JY9L^Wehx6F*nM7HW5N-DXy|WERkaQcw>yd~-GH}Jn%&u+&E1sE7xJo)ewyoZ@RQ>x5DS;iw2*@89l04LYu5ci zJi~Rm@aYYD^*S&@Fv7a}nY{D4Z*!}1rWH3kGvY^DM4$-2IilO+D6W%%S*6>3u2BE# z#go^N2%Y3k;z#IpABi`frv5v$9&kE)%6W&XWzQ6pORaFA`5==!LEKT-&l>v^(Z3da z)sP|5x>Yh9*z|ru_kP&)4Kb`99Y|#|E*R-9x#+aJyTzt84PjJw@;}Qkkr&!_xADCu zo|}st2vecB)8Nt{{lDK%YPY*A4D)%|22}W~!3M(UtpoU5$?YltU5e=gj$0y|2T6*6aH@5l3-I7!JMBbfM-*=h9s>5t#kufvKkLUuFB8Pq4c{6bPwmVNo;_H?_DJ%B0(5 zbUah|*A-$ynKauL2NTn1p+Xy%-6B%(a!bNq7xJX3vbS^0DwVB{P~ySBJ=jKV_PHpZ zdd{vCT2e_w!I6v2oL2tvb-KxoeSvv3#NwEMgiAr8ygw+R*u;gdOKvK7u#%wG*Op1= zxV_MfyxisM0U*u z;Rm+32fjJZGbyFP}Cx_@=7ygji}RYFmv`+QWiiGuFId|_9)eLNhW94YOKcMXlzt_$G8VqO<>;ytx#d)_*nTu=Dtq-aNk}T>TaqfuO8RYdViDyu3C|I~+d3V<+O}3OypJ zksl-}18Y)u5ZDp*)4&}=@F9Vya;uODK%_mIApax8V`d=9|yFsOW)P56IdF<33GttNAXm$G{zkwOE5-nf+ zfgvO83OBv`ne4@E@%E?iyGi%24xhdECDtdXH2pl_JKTX+p zSxd-#6w7UH#sLC>;KSRrZWuE3iTTv9X1a#DIu&uO>y|n=^=L&&(@ukv{f<>`?WhMYLg-|g3hUt2avrb)O7p3|<^?Zhj{utYE~N2!)IEz$=|PGHn7Id~k-u@20P z-fGZ&GU;C90th=oFdr~TQc{}+&L=8Mx^!(JLH4)fQmC6&7GD`Ep8Gfivl&ihK z;Kt?6R_m(wuG+ZEq3s%$?RavW{yB|zE^LMm$2jlom)}R^qB}Iu#h-%}#$%jvS#YyX zKQ9eya%?I8A|_&J%xg!e$g>Ugzd~bZftn&OwDaM_Ko}YYcj)0eH_zl?wz*f=@?vsNa-ux#4;?|}4Lo>a>d$C0$?keBJ%1$*LH zYB`Wjm=*V6Ss&eXBFW$ZB|FUbAjVuKs#9_$ZQ`s@LJs>`_>xEk2AD-6Qe8&ewzsSE zl69FIc-8RS?=5RXt7F?|@)aJV^{r4a!(Kz!au&*+)gCAd9o{&0U9Ze_}uu4 zH1^X2Q>{n-?_`SM(0t-r$$WlfYbe5FkMH|(d|CyfN-?NZ6ly%e)8SPv>0>U?MJt-! z8-a6km=ZPiAfjI&i)0^c?!U6}7&}6p@r3Px!kIAsf!s{qb}CHp@fe5YZmmh-19rN}`(0;ASe0m*UD7KO2-HG?(o8qq#WRT8NBcfB2zZe)y&X zD19=e+rkEWB72weDDOg%%ucY4wkZWLjU3CjTI7ATs6^5exUzeeQkLBGEa07{H`n8~ z;jgXI%l)BpX!wyaYk#8l+svitC|wh#+E!3po=*p{qX-3QQG@NtrhnVWmjd(#=wXEo zr9l1J`@p?m@}A5g-?~E?IUzq!lo*4;KW1OwCo%P zY?flG^H~2o8W{%R)dSMVb>`ii7}|}vUU=QycE>Ma0m_tOKHsUbA`TRZWvjvASs@7E zRBN#Sz4a*}6xton#>I#~JmL@rjjGl%-Z3~Xn5&-&3oWQnGi$3HL;X%v7hRKNtY1yU zs3x__V9JGXlYuyEAh5w#HMUO_e=A;>!F_4t4B&gwp|<5+ZDcI9-JeyAsSH|RmD#5n zF&}lDeUN6eFAWZ}oE!QpgVU7e+#DheUOa0PxH=KW#rQ?zg%=GHnZ>-u7>}mQ1*Tm8 z;3o6CR=)O`fqSJ?&r5+h*ND9a?oa<7*m*k=5RB_b665IqeaK$mE2h6-2H)onWh+Y_ z-(mIyPA2Uktt0Ft+o2iSM6E2(7xIxl;lxK}sqs@PHMQq!5@+2wzDJi4i3wiUK@oOK zci3a}65nNuqCz8ib3s{Ww!3+s3E-?|nrgNM;UeUTYToRxGmZ0Jc6*UJ^RFAKi8MVT zo;rWa5c<6e^k|P>(hIUZOJ~urXjX*uM6mXR!*puzzUxTLM3M}A9q5P%D54)Yq zqkT@gv0&`A^VX`gbp|<}?Z){stD@c3(;BT__D|lagjWgUXE)wpVMu=b^C2Wyde*FC z{EvupJad%qz$R|K@3S-}<5TH%u(a$zM$e?VOoFbj=hlSR%i6N#^`1(k$&bRYw4=|l zTOiqcTdnU5a-M->nY8h5NceStaNFPL_ zy$^3*R7_42aXDO!czVrr`o?^M$}KrXd(y!5>s9jpOGdp7IV{C4^r>n{Ke;_GP&XZm z-g;Gb1HEePx+KENl4AH+6Yr)Z+seOL-nPzrk?!Vh1m(F`?&90F%|a7p_LNoG?L({k z%J+V7oLgns>tu`D;^Fsis_}@7@A1V`hwQPt?s)>Vr5g@sFusHDdYTGMSnT}&Ggq%f zATD84+k-yK13U;mY07Gh{Q$_rt@=pa8$8Mu?;y4}$$&Zd6RC z$D;gBS_lWRh%tw;|m66z7kjJ6YU$D)kegh$Y&2~KEy zbVBo*t-_TsNR^P?@$0x)_JLfBx3G4Xom@&RvR0XgK-q}}(LI$yR!;z58TJT<39o+B zT?1xhHFIx&9pV0{pX7JElRbn|5ky3e!W+mQ2u>X-efKhW!W`iqn-lu&c6g6tkO&Kos#FE<5*SAp^>9dwk5P zq-1v$^0mG939FIeVTX|^oI8So76+P#H~IlpL~?Bt!KtpM7w+)?-}1tu z{%?6{hIy4Iv?-=NP(npzy?0S3D^AWu$tR6|W1`XUkWYL!*EXD-E5g6kbI6&2iCCXJ1(_(ORE|1XG!PM*jhh>kOO$8087jT6$y=PD^t4X~I3oIDAK{ZBIk5DLm3sUE$1S`LzcUZj(Pk6?`TqlW!JZ7Z=u&PmKlx1d-E6DBB<%US)y;-*F(|?DwAfgd zQ{DtUYixU+?$&nWIZ8YZ{PElAUTy2vw58cVT$dWXOh3MSC?ByE(c8=voVdSH2xigCu z-^YaZp45oAUgl@R9ftsh9B2d@Cb3Y^?G&cx5cST~>g$HDc!?ObpP~kd&O!EQJ(@qf z_!$=Tb2>*mA}ESUO3w@(nW*`sW~F_ukL~<`Y1{$A28czO(72BE}KbZIG-Q9c8EH8F;}0m4R_`TmwQqEzpVKaPck?J2oNQt z;Cpx3nr}t z5a#Z0)AQ%hjrSOyW-!>1B#q|rKBe1>h8-&<(=^N_ZMIq$xYbrD;j#tR0Vhvf{oa65 z>7LHbFc%#a;Df7TY+ zvgVr!Z{%>9GkV;US|ge~(~xHIj-(cu+SoD4d6)9%#;7Z_QtW#?fzU0O@SQwD-DZ+C zH@E*k23u<<6$Z|`R-SU~5H9b9UYhUpLVRhU<)mAp!=|Oa)Q9v*ZK+E%e0O2O_h>>6w-AF%vp}yvUW{Zg; z)eS6}szM3?fQl8O+ov4!I+|?li4GD1Az>GhPlwxS_4H{5o$RyMxH@oad!NG&(Q6Xq#|+)6f+ zi!X78o%ulfH*a9sX0i&b+FW*eT1dtj;$5ie z(&kEd)rR1;P^r}3K%4>;%$ri$Uw)_p`&u|BHdWT5HpE$w1_itRAo)VHuzP*tIR@Ua z8nmtIVY)^v+)1;HsEwv2-?Ii$fVlzXVYmoDMV@HbvmIc+IoCwyGP7VNSblw9xMw|O zv=sQ#$CaU|DdfS}VUAEr@v?(XC>}8>(Xgkd4dfizZEyQMGgdoRZt2@nG<2BZ+?jR| zc$0V-cnr0O8V-;O(xvf3Uej?oca9>4xAFV@c-N{if-rF3hHk$eB+zQIS&nV+es-$R z|A(EKnF&@DiMuvIwTShYf{g0+{jA!hnto>6z8qaY*q9Prk}P>NwW44|&+~M39sGA- z+`wyL(XDks%kn-LNTFQ4%#AIqK{X5?t`Dc=)1l-O7`&GGDuCS_y0;+5%tNXY?XvX6 z*oOB&Nnl%4K8vpp5J4&r?59!yg(CkoI}0rmue^GiW=~cLA<1*P{JU7qDwnp{<1F$! zWl}TKGZ0cV6F_FC&i$!%(e$?|zxT%I3$J$C(Bv>?D0@h9mEhgOy&Py@xi~R8?1RPy zH;fquw%}|GF|w2n)WF&on@s+W$W1}j2H*2D5ROe4wZkR3Fj`0SUAAmk_@!j;U}6|m zXRJrLn81spV^;{!LF;`SHU=ITkf0 zWO{QxV8IpM`(NAiIun>R#1o~&7XB6T=DKs1UU`*85zrZJ5Y&6KDx=iM?ps0j>i<*v zg*d*0d^5m85t$I}8cy`x=jb?!Od`M=Ne~5I+j&M(Nmppc8x68LVr{}^ZVetyqte!WBi)G&K9CND8K zX8vmw2&r>o2XErTrzzr?I#k>zDd=%ABEr^wUaAHX=vseGxa@!)7?Mq-IFBLF2y(WF z>G94znE?dlq1}a$0~V-%AW9&hAxImc#`3kF7`dC&@)WKl3l`Wcsdh(8XI5+Bn)a{Aou8G}JEMj#wAN?&g(jPVfB18*U|qEHyG)7%sCVjZPD8DUR_Br4%5Geyak{MP$W03V2J6T|jf<8;S{I zzf3C5h*z-oiIE>`DmL$R+gI86phzSa5w_qo3BE;TdToG$JtX_fsTc?uO~TU2bA&Lp z%_>3?;i3R0ZD8J(>$lkaF7+kRJWiS1D0zeaNroUouTB7ZTNbU;&|R@*l#&G zF40G^+1K^{#tdkzh4m@=r!#st4l^n9&S5UfHHjac@>`0UOljwh@`j%FlTW3~LZE4m zGk;XV2Odvs5JoNWck$XZX)MTtTKDUtw30wm#oC_^g>_E^^Pji^2i8~dQ7*Z=-5Tv} z?GWoXy4*}l4?jZQ9lf8|A1^=$1dGOon%P-Z+xAOG=&E?+yh>Udq(%F!FU0u2_mSdj zC5}CY2>kGwJ6`g69K|7=T7xjyL^oQ$bE1FWZyJ+p@}@D)L3MYHVE4IIG#596CecRS=|4?*`}d-?p$A(33Tp4ZoaS#;zna%5(ZqKD;+OoaA?r4ol9o z>@T#=YE5+ggYvwCZ|f;Bw|;`{u)*Ur?nm=_`6;r&&6?-q9lmf)q&R;+GhdX;(X46! zu1XK7F+kAyLEalo{_@y~A`NP!n3zeBg`{BRg#0l0y-g{Dl0q8rgJPdENurKPGHLId zGy8yITlNgFBZx_|B{VM0qR*ftlj}PvZwuh{z=0MIWyfEye>Mb9wwfz(Xiw9aVKWm$xgk9~{WLyt-r<_ucy8G&acJ~@0wxdUGwkQpDxAdmlVCPuES!Yiy z+WxugaVzi8NbKgn{hBG=$t6_*$oBw+gPtYgkS1ka( zVU~T)OIEL_9|{zDpQb64$qXzDtoXTX%Ei;EDdCOld6hYLa`R{;G{meo@;mX?^W4VVbBu%;PZ+ax5o%&K2psoHpQiiQnU}%LG1q9k4b~uE z(%_iNs$hSOgR#-CgVB9x%2E5VrxDo`ltyD@A_I%x%+fu6$lUV;%RCrnM54oeCMM;H zEc_*;-iwHf#ZF|yaaTn@IaFRzJ>^bw#RhI+tH6;;S}6&LU)C3*xoG62 zM&oHNrKYD(C-Q@?Zszv8u?`Y~86A-(h9Fj-GrJ27N`vWU$h}sVE6d+K?u?}Li1-t=S;$oIx^I7EJk*--N#Uw!(4-Y^cko^;*UIPP}z{b{ZS z&c-|zc4#Dm#~k+5@Cr0Fhnapv7u&V4M*j4v1l6z+)`ah-7r2Qzkg#SM_Pk1i&mVh^ zS){uF==r+Qt+_$+%B4ncI~k0?uZsyT+p1_R#}4oNuOW8P53>HM+x;Ug3BNz2<7YOmsw|Za}@pj zHXh{=ES)p8dA9@3fe#h;q%&W-&mUUu(NP-zM^wFufx%p%=N4yH$B{b`WS+-`GvVIl z<~Nb(#De3D>20!%Kq&^g(;<;fWz%Y?AwSOrsmZq*`KJn{8l<+EL^bVE=e^+F(#koy zo^K?2RgA+RI0L2<+TNi*CXvJ%0n_ROxaw9jrXfitn5AWy6jYPvSARqkvG+)m;^M{8 z{Iv+aZb!jM3fQxf|4fK?{Eaoita&gHXT~vH$K3D4B3y9==w}~%a zF!u}t*bAn)pQ4zfQ+l!$GBG8%JZSY3ZXVF#V5OzHx1RWgTp@uGhI};Lrq~L-zpm~t=6?^qYvfOoPEEUY1^4-TdRU_c{t3sR$;->@ zO~(BXZtlF}*3xxnn#dF+EaaVl!3#aZ3=+%y>FdEXGueuY5kaxk^`_Kv8)CS5DM^sr3To`v`XLWcpjBa@(_wyy(`v zw)*wrq-gBS)jt39{g7O9eXQ4NuoXISz3e}sig0)o5(-?HjqbbqOTJgkX?(6mFr~qT zo}fe+-2PChb+dQ=G~o9^oWANgJy%08nq?5yNapxu0HTUEHs`pTxx)8mvBhVZ_-wTa ziT~pc7O=pLP9dpbD(}e0cbc*_A6f;P?CeCS^r$SUUiY`!?RN#TnAs zn2i`i&}K-gdsuZfULFV1KCe0A>Y@z}dR=xCJp!V++uEjX1|`o{38W^p(T6OGhQW@J z|GJbLF`F8Y-EL5LpmqHZbzZ8Q zC`fTZbHZuXANrIh`OIVo>$Z{x9#meslidV~4P^r0pVWtvsopK}2KDgr{~g%O$|f2);4BU=IK zkhY^5r;k9qFj!|)rD3#CT|KnrUmwbtJhE9SU-MGf!Yg?mdi0=FoeKdttQ!Xfb#++9 zLe$5pEfTC|Wb{B2RoI@d+6=)a^?RmlByq8wK2q80ae`@yM;GHsM@sb4n`V!?lEhdsZ_Yl*L8OJ_WLFoceS-g%A&~_akUM;SB2yd56lg65U z^pY7jScJ`83WQaz;-;^)&VD3+twE-Wzlcu$y-uwxM*<_7cW$)vRp=mGgfk`}QC!HZ z$Gr7u{6Y41&vYM;mgi4hu$nnl{xqCsBt4D^`YOr+M=P8xyBqd^=#T0*^iSto`|EN7 z`~J$$OTE30YpJ*6!p5Jm>$;W|Us}NdT)LmnH@l8|jkklx&A|!!EB_$Ag5$-4O6Rfm6TduBWrJADC|3xs#Rf-`K%LaW4D8h^`iB0;L!HkNv7m+04^x zd&4f6;sVBgyEwSP*Xh|Bn3&BssWbjh*r(?{x1E<$l0hXwA-qbrPhu8Zd#UP*W#NTy zE$>~uxPHfO*SorQz4y(Z+*SOA#E%~zjukd%Qnayu&f@UeVmP*X_rl{`Fs~($j>Npq ze*xYTR;Qm^Nw#R*KCrph+`suc+|xMVFUT2XQd>9RoO>;9rG35;@gc`AlR~t3OhekU z$W@Oe0&R5=ETC&XI~C2M9wsCRJ}z^ymKLYTiq86Gye|79GK+UdQPv{~sy>-M4y8W- zM2xtaiu<2ICJZX#sFXm!HZk|UyG;z@eBQ&XIn9o@JP+INV$_F#OY?N8Ts|RC2H&nV zthJ)$RqotuKmj0wo|gK9ohKOz$|-nbKU=C1Y9I8^tJBS`gX~YCHRU&2-zzt3)Yl=m zs|0?#-t%U^Z`rh)L6%t?0TT{CUL^Ecc0W!NKprF)t*0^-zkW%no$IL!^O?8^viz` zLht`(S?NIr_i`8i{+C>O4;iBnfnWejCz^2s%jlZ&nS2{FXgIKcqA`dV1jI&H|A4!h zyfQ}f;v zqr-V^)kz8mk%TYV3QsU1t^7aZ;m{|Cx>$H+d7^nGiXYWWCq#BkKOn~zu78G>@_Z@E zM9ke!Cd9>T0i;J-lA@N0)wnSQ2w0<`B0N-JdoqM;AocLeo+P*FGoWK0tui{VGuzH; zAMjk|d+eNnaE;)V2uo6VKI5djl7|uEJa*uQdE^A?%~>5AmcLcOMpvfW2iUioY{@u8 z6&4j+$I7(unh1yNH`tfc{l$1>VCs?LmX)hbAsS=0CRu zpB>Ms*Ow{VI}wUK4pyub+&CDDorszbp;K7M;m|kyhq#W!e2@9&lY(;-oiK|AJn+!% zaVmeDinD{A4>a;}@*%ude(x9;rhYH|`l?wys9TE2tuY5XWMAF)2hRxFjlL5my{qMPL3T9i*8bWoy7GyL*oxwW`Pg(P2D$Czh!4}Aq+gJ2bk$-OY*%Yr4|Tjh^OkXk zy`s(hGWk4VEHb^R6;IZ~1uE+%qhVruTVwChq*+AA&s2ZBuBZ+lEDv+l8^BBSvqS7wLvP8Foacum)+%GIbpQ;R6}g{2~LObbN< zk4*U-g>hOA@iQQcoOWug(yp`*q(9VXW}pz0rD|-!QnzqZdSIpxJm`lzfbg&HcYC1` zbKCic#%d=c9KrAxbjwue2|K?nu>`cdedfviz2Sn) z-BlW{a;A|)VRg|+W!GhHZ`3}=heZSPN7$}L&<>`qP;7W)h2GwsTb@v|e_|v;WXAP( zE_?f)Hi`79HSFFcwF9G_RQj_Ojfkp{^(A&=juGd&SQ@08KgyCK$WBi6cOT+-?q+5d z6r3i$%^Wh>yT+)C%l;QdlI>g;Jd(05-LKfoF^Py)LJGdwh`m&}Qf^F5T^=kS`|)zu z;YtSnEWV#GYj-=Y4N&IMt2$FF3*i%G^gs3r(z(o|XV}@|lIiCs|S1s`1jaCI2)%jNsaML8Gi+QFvcQWDf@8=!bW`FOqEc41RUYlAtC%rQ|@* z2Vv(+x685zJkv5(iFy=42}Ut_I{C9OPO&c{EX)2~kBP|i?-UHex4z!#M=N0*n-BfB zquD^Z|)>MSj9_D{BWlga*@+I6yLg4>7_TR@LCJoI>f>v z<&o?`R3pAUG%=h^w&&~hJuyKiT!qF5!SC~Ow&wESa)-fkvj6c?HyU`~9-kR=GOfmH z?!s-L)d77z9#vx4ML3=f_*O3&B_52684erE>}n~u*|Mh^a6B}kAm-`I%;xd+x5gFt zk?c0?%wD4WEdcH8fG35JV*-nJe5tt@dHw!ht(6vMSwwI(kTwa7iB4813yA{4DKdnG zA2@zDnyUsSl18sS4<>sKKb|Gm{#D>*z9{M~JpQlZ*2V1JUS$f&$Kc5&Pjuj4 z-+)he6`Kdka#3ME>g1NwV3lmGoD=$0^w)6D@H$LhblwndaSU?UkPeM15tUpKk&LXq z`SHR{@KO78Py>ha6}PKxBch{-#E9(AL+N(4 ztiF?Z+jsAGJH;;)VleNXy8POdkevOBbSKVz7#$55hR(!Cl;suifC+hL%eF~5O#oNf>P0a%VC2mkUd8<9&f!z63ar& zguYj8ekJT1It+t2705}OwUH5m)#|JUs?T*Cpb+W2&QHdn{t6~h4 zQz=+$SW+#epE5?JE-res!r(vZujn$ISi`%@4;h`wvjk1xYOG{UvogjeQPGH1$?s;Q zt!#sumIEbwoIlZRzWIjc>v%}v{t*6pwWU^m^=9uEW7I+<$ zAnINJU%fu8@|tYtIIcyK{*wJE8!AQMHXthSKxlfBQs2bT+#KKeBW+=@fhXtnM7OSOkvjvFLZ z-B*9u3JOQ;eO~Qs>@TKh?!V#(yN^X#8|cAHuo_Qxnf#6BvYfqU}o~4rl1h*vtkW`h$>jA>S9cWj2aZjTdSF-B9KH zV_al}5TM}WjLP~j&6OW|BVQf~S3^WkIf=GSs2Y53_;o>p3f4Yrzdx33uoJ4H1F{Av zjVLWWLOqE|GXigSFHFBhctX15G|nIIxWx-#}VcoHeq z6}A&xsj^{l{D*3bqx)2-KB6kA6WjgUusEq()ol11yRw;26V0hQBy61JC!Vl=4^UKm`a*}iGeN`oA$*|Zl6Mh*O{wo*_-6T(}H5`y*#8et@8Df$)4y-Gv2EK< z;~m>pV>Pzj*mkpHH@0ot&W_dCcymAN`~LogS=Y7ZGc)ILoU;VX76&K8; z)jTkZijzx_u12kMfY`q%i1B zV^#n&Eq;<7g!hC zIBRMStZL-XaJ>(0eKq5B4%K7fY;_ij9%>S44M%_b^|N^`>~ffA(~6eN^K>wj;H7AG zLK!FAmB7>H$-{&`!Ue?^(W3UNQGIU=3e{?PQv!S?R2iw6X9diP5L4SZzqU0U2@AqH z2E~gyS6$o)hl35exX+M@^{5+j^3<)#98L6Y?GB=Jqq_T328Stgr2Yn4T#$A5xHs?g*?Byz9Ou%W}jkZ z@G?LJM502XYR;CI1<6c3p$P#iLlWDTa_lhh^?xTP!lI%tj}sk zBq?MCWPqTzj0X}#gbu0bkuf>G+q7NiZ@h1aRQ&8fkzKYIm3`(GdmY*dgda3wU=*Ef zA#vMwq`vGp((Y*8(*}4vmTPUNM?`85N}a7l6@4}!t18;`C#o}p%Akn{MVAEw2T#m* z|JwVY-AZ7dWct+ApIt9}0)A6tcSJ55_#)yjRrJ)|;qAwABViM9frWTJmsXVaCkc9? zC^Bh>i^J>puf0GuXefwC&vFCV?9u+h!6~aNM^Pu5(NX2MSfCwd{S0ZC+SGdcbjy9B zr#ALcheBfTL0vallyq`G`xVh_|ME~a%ceeK_>)W=D+0#G?^AKcxC@Ho43;uT2*9e4>7K{$Z1?edSWx z3cJ5U8Rm$hR!8~_A8GIDsemb5bI{*2Q=nv8ZYc?|8M#W$8L{0^0U9@h z_D5pHLCA`(D`!=!jleHWh?(U&!s<^8Y?*EVz6t!pZc3(o&!e3OEI!sJ>?40Yns)%Abl@gt!JfN#m3b&qKJ;$HXb(HWcq8>7W=r)FFD>2A4txP-Y| zVp^-M{vwzUhrRqU2>(~0YISrp!o(jAc+ha%vKzw0Q*isA8uNE!8>?f< zoUKRZ4G)a6qOaoFQx`d=62I7-J6%75>*Mb>I&DZg);hD3ul1BGSj(&8Ow-ySYkqGL8w(s@h@w?3J7kxrNGB~$^(MWCU)$l^h- z+06!M>t^tNYGg@uBSAOD)u79B;{`eV*nA-zen!69%NY66v$JKc$$@$+7S|9iRfY$|&~Wo$eaGq@(yQV@Ki6iA$X zZUDQJ9#&a_`%;i(S5n?DM)!O1_`(p0A?^n?xm2E9W#qHDgp%8mSk&hm$*zwgoZ)O& zdBRgx;o!9)xDBgUid3AM4IbcmbM|hmBud=5*w06DsS6z{OjD^7fVUCGYV_}SN?mfX zI)vSQnDwfg3g;@E!v22En%G6zrlk~D^dr1Pj{b5&-iski#bY;HR6LR|>d>Fl7>z`X zeVB|6z{RvNm*8r?b|N)zNi|}EOBvQ-MPle{Z&c`4bP#tP*ZTDu>VGLFS0+ciki!3Eg*9Du(hke6 zmLKjrzP#)$EMsRic~J{~>hk}SMsen}RXOn#Ff{b7N{`zMu!iZw#Do6ar#y_$fAW?Im0FwHqdOM$3& zO^)*JXLh@j(bHeL@1POsKF$l5D?upA(-~RH`6_-a49baxqhwJAu6Ov~yw2ha7xS8s+EQmT zu$+9j9weyGkR}SiWzjtoIHudvcP48leaeWiYP$|BcZyw~lv=qT5;+e{k(1H!8p3VI z+&N{pAlWNQss%8O2{nt~6Z}|Ml<*;Z@X@j!D{MY&Vu`l=h>@zYM0aPr#MJY8cdz78avnv}4H?7zO3D4% z((YFYj}qkHus1_EFHurm4_%HSIf9_UaZRJyNR+9U%zvPpB+0yZNt7_LSJBlUJ@_3G zHr=5;v(dN0&Se(_(o6rLid#859|^C2k%usY=>?)(ybqK4^fp`DH6YHzFJBnrrZBVU zFhLo<(lu3UrN5AR&THiLinY$&_KIU|r|n#KC@O7Lrfl_enve)3IxhzLPE@E>nvzvt zwbDGFRkJ2WGzirXwDl4lkgDNPRQQM_tp2H>IyAd#-Smy~sqpkdVWuj!x5{5Z{v5u6 z)hzBE_+}tjI8;q^G?j9}J$fW<;<~@b3TIQ?zf)=g5vVG@zHzebW1q$P7C!(ZGd@|Jp<~-C|nt zU{4ji(gApUMrmP>OXgN%dy<>Z-)hKmKxcwy#|F)ZyrWd2;n0-uwdlUtYsa*EwIY;QvvVt_3 zV`kWs!Jf*=_h8z`np)=~G&!qa_Xv)~2GWG8-6d7h=DCK%U;1&Z>p)bI|= z+20CzO=UbXN{p^!f|UgbI&rxmY2TsM9}l&iFe>?cUvViBnQ1iCq`W)cb30iNPkn)l zlF8WNj-VTEkEU39=Q>eH=m}Ng;q+$hqF(5}$*H_RHfKlV?R~lohifo&NHa7dKnMeu& zEIgR#=DZ$pqMZv*IW<6RNLe6gryp97VP$(WAp0ZSkNP(~9S1q|>MD;^T4!z5X#a?* zL)?2TiezCk{3d@V%!$tE)0+eyn=^cT%FuQSrflGcK60QI#-*_RmkH&D^hy`Qw211V z|G({V7qrszj5o|H$i4OuJ{Kcy~2YYjWpYR6yF6y~N=c*;$RGiFn zbEpnY$b;FC!q^~?#UqVB9D~&EqJD;F9+&%?HY4tRzEo7UwsB~@#xYfKY~w2AXkyN%V@K_abddyD2h+qi?%&ZNu9Ol7*OT`dj`HmA zHtC`Ru@e?O9Uovk8ikgllasjRcwge}`UIJArM1 zQuvol)kripZi4J6yBEx&ymm&CP^3$O0YMXp$Byi6>96o|b@|w2E4uwo_=&f~3VE`gEp^&+p{>u^XRVYtHb3S@GJA^4OdMKp$utnFiPB5u zm?pzjRH?ekv59`h)l`s0qHFEf#q}=eqNh@onG$4Sy2Tkf^E}n)b+48BKP>r4$gpRf z2TG|#1_{C?{b^9?I(|WVFT=EtkO6^t)H9JHOU!OF!#vUJ&}HmG_*YK`*LMilQugBy zu@Ub3A>rF5&{x{Wq3!tXYx{*e8SbE9k;WX>4nkjQyg6l2iF+$riL*IZD}jXE5J(Wz1!%$*aDjwUG5Y*V1$yg0J2)$Oy!1lj>L6 z@IXgclObssSOw?{hnGY!lS6{W~PdYGY$Z2fHNNF(xd=L+?Tb50bbU38SZBSxZMN~ZxjPsnXCoSmw#{$ zD@Y9e{LeS>qpZ3)tb=?!79v_!kAwqLo{g5+eVI=#>X-iMfswg*6mIUFU zVeIiZr|+J>hC=U;3v!+=P-{m+Q8I%pQJxcnNjJsGlUN-SvltUma!-hYFIaXP)|hhE z$sD$TsL^`;&I&}J=Zk>TMRoXJ&$j|qMqKwMzuas-lYd)JCgE&UC`rJp=MvCF10{OP zYR8+j2)@hX$F1z}>D7Afz+_A&ao@@W4_7Zm6t{uP1Gz%nJ6LV4A_@K@RVBn~Pmdl4 z>D}M3EA1ga@AdotAN}?a?Dwc0M%$yA#g*YUb(7^b|1*`moZ&W=ma0u11xUr0j8Z6K z)a)uZnRB^E3kX=OG|$#11FI6~tzWzpaD%*usm*rOzy*ejTApPXTUT>?+w?aUwVmAk z99}*##TAAhCFdIAf`E*o%%LoV#9-A)`>NTq5CYqmHTY6X^8QKw1iZ`r_8RCCegW`; z_aTe5p&;L`VvdzAGROp8fs7!G2}QENy$ZW5gaDND0xQ6hWn!qIW$vS2Z(2Q8;3ku` z`RIz-utVpVc%;shqYyz~R8QN2J5uXZ^MSP?$@=#!H%6%fmnR-cy73pXBb%8f%4z+p z7+F-m1MQ|{qudc8(PawUit#4f%wJQh#oEmco=QRtI%~ad|NC>0 zi>5N_Vu8*pz*|Xb*#n5G2~^e{HI*f9mms63wiLG08Q>yw3OX;;NnskD_RYpEjF)v( z<-gN#G{sDCx4G4Vi;llSN;zZj9d7AOh1sP_-Q4k!9$qQjv;B?07xb@OZmn(Ncs=6L z@jQch<{F*pYhsVEYlQ&x%?h()IQT9T#LFov3oZdE*weKq5-zzU#IOuF_;k8w5On7sQEwN1>DsGB%Vt;g?nU!0 z60<-q-WR-%S-0=DhWzLr=^Tm4zQ0!O_pJnX4Jb4PAF% z1-WQ$>(J)PbOEeK^8Dg@=Axaa^PJr*{huU@-`LL-rRM&Mo~kn2OFK=|$LkXRzeW4{ zqME*gb#gm~A7hl&oBm_e{EC5CEoBtfixZ7!p^G1lZyFnCi{r$TM>|{SvyK)=Go5Yd z;F>`2b7v0{dT8_lBuOY;fQ?#X7eNzSFPB?xWAmPrKmxOgb;n}|yv$BvlzU$2lxK(> zyjJN-5r8k-UKyrU(Q}**Rj>=al2HI2L-KKE2*~?D`VV%#>NxM^eSrdT-hH9mkaiGK zNb;kNaLs`y1fK@UOtWU-Z!D5I(sjnM3^sM!b*=h{L_K$lB@H1Pb;oRxTg@;^RMU_g=V{z$f=|(du*Xo zz-puU;p{|GyK%2hMrn?9sxRm*)2(!Kf|C8^iv2)5?JxxBw+wY3FX;_+?)A#zE6DbL zo$~@d1hNPo#=|f!%hB^TgzmiMV7yvW*SEZ!bS8wnfo!L`qXuMJR|^~pnPt;1dl#%X zCDnu}Z9{n_Nz4i~{{+pIgzPoKn~I8VziT+ZhSN4rRWz zplg>!7jTjg?L7?z@%T>A8@f)ZoG zG2*}BtTy=iPb}*3_zj}yo>c_s7f{GuVv)zfrJ>KrISMfge~cS?j0bS4JBy0ZRDMQ4 z>dL^VtH=A#rTh68X_Mmc+-BRJ%Y0s8eYJg4t?dlfBI!*sds{U4X|^oMbVL6~#*VOk zP%V12Pg^58{R#kR=0#eDTRJjPltJ(nD5h>9Gx^$DIxi*}w9ytx5Eb})#dE5a3 zL7)%SiChwpND^s(zRdML$@Fd=dX@;n3t39(3QgtV{d<{fx3J8678*kb!rhXrXZHky zZ9bBtkLoQ7JplT;kG;|01qkM*P5x^TMY#L{skRj)RsP^DC*CZ#IMY`CL#M);}B&>VfQ&HI-98|(Ng^Wzv*@vyKdv@FKr z6PB`D>R8~-z?lm4q%)2QKV`zfs=IqgK&oA#-y97xDDQ{WK5F*Wn@yKwUFfO5UCUW zV8c>n4$G1SrUD)O5<5G>R<=Mhh_e}I*PGF=3ifN~`%X3mdt-oZM#^Fbr5z2^cM(7V z!L>0gQslHaz`DX=PAr5+r^;E}u`#RIQ4T0j(qFjwbnKBh*lHYZSu#+GyHo-Lj$X|1 zJE@gqda`_8^d`1->%q)(Ew;zD6VUm`NKIL2IZHEke{P6rzNx9e%c5HQNMUL-d#GnY zFNT*u>#-*QT&vLv^NZULtYY#b^|es)x3goSl1u;1<9wLg(6Eq75%69!8brdYoAzm( z>+2s%77>m1A&Pu+O;yBMSxm`HYwt&sH}kw&OP_fCfqk< z{U74a@x9k$&X>sqDJsZpn{cM-@o%ND;qWKg#mm!7U**B}#uK~GMW*0eUdjcsdoINXS!ZFlWwXlv*%?74IWKF>*C$_hH4_sE9Dk7F;E_r- zh_^7pq^FnG*r!}*PHNzFEOrE3G`BBIf5gW#`s-{EItq>KR*L^*a*|L1a?-K~1i=0n z0pZ%Ymyi5bHMdsULd$Cl2G(2O;Z`p$vNqSkDAonN(wg;^h#s#w=oEy-+Cub75rS=w zqnyVJ<=NwdIc6~X3Z)Y+WY@8-T7j#TS3n2~_w6mMW&h?qP>IvwTM9DO3iE2EOgytT zVW__td_hfPjWJUctJoLGy}}@IF6_#q#p2L}lA06M89a7%wgCFXLLPYyGU@%*gdU0`jspS-7-d7x3}j{D-Og76 zzQ$D06DUs7$S5!6X(!OS2R;dZVxEKC-yU9JaJ}L%q=II({)XA+lPvYg|Hn1(@Z~QTJ zO+=f@tIcTK0G~NcU;7sJ(2^VAC1+N7D95ExlvKc}O7ct+Jyqa(};m z1EI)O$L|O|v2I=Vv$BKE4Tpd}NmQj7x8_5tBR3pc$#*?k_@xSq!kfiaT?gUQ*dxT& z^)Y#dYn*}vO&kvJ3p?gW3t-QR-9f6 z^e`Jl^1plNq2aNa25`-R0bh6PWaL4Dt$D)U9#N>^!IZM8I~})E^SL6f%0hSdoELqk zM}A@EOAUEt?9oc;&F|6%paRFYw|a+O>LX+BoJQrCe~9Pd@Z7|WT29+|4aw01(at3W zL$UX>zkdQn?KT`f6fX|_=VOnP?$?*PpqQ%#fA?Imsl|>68FavJ1`xT73)D+KWON>@ zo~8+cKEhBU9!Uw1PTt5w8=&&>U}_q+>nZPLrV0!4nWH77GklpJ`zeZB{SWOEUyt44 zF1cFlNzC9J4=1WJ0)#Sb*v>oV0KJi&128Ficl=ey=ZZ3w{j8i!7Ba{V)=1`!E|Z zXglApFZ3(6b50=lU#*)=CG^Wys!}PIa*Cd;7`2bo{E5HSr>a=lA8^By?*Bj_H^KgW zeAd|T5~gHb*r}6orTrXsqqzx%I>(<*fk1QYWH$d1ZcW#n(5>tFhn*i~sHdhuDElxr zsbEMd_4=E6-=)jTesjm^LHjk^RIj@E^ib)XoMvG-r)~cqGx%$tCox^`C9UMb^S-mM zTn?nYop4sgrq+}gf&W8D%YFxKsZ^S8W?Avf#}E6SM9Ar#SaVKtlGkM|H&~e?{b=Sa zLHGjM=Xav|IIGPMDlC3y>}+jfahgt;B5EHn10Mh45mOy+Qv?@$k=yJnt!@YCNC94C zlc?K8$MEH@h@%`|D0fCHp=<`dk1nt}`-urgiC;Dt3a@>V4yOxN7-eR|SW{J9Q??%W zO^hQzf50y};#l$=joq#+oomLA=+R0YA7rcx1@YMlcvgRv5ARk}U!U+@zs!ICz8TT^ zd989$3bou>x$fhTSST503Ai>CYP*FNHk*v3#-exsvbLRLYv!PUl2)(0EK_7-$|vwC z{30RNv6>Zr^(dRRI>Keuo1fxj*T-=NjH>5e4RV z?3~$RD`!hggel(ym!b??hyu1;VIHayPu4?(N-+aUCn|XxRl@YMj%P0;^*JOiel#I~ zjpGtnw1zZMI{-8d)VU#JhuiXl_`LjfVu*#t@q)BIbO)TxNwaxGp4XrgKmax&2NqD@ zTMuAXick^lNaDi<$avxto}7W4s>(4wv4Pra_&1h3bCDGbFI{IIn$Q_4D^WrBI*-W6 zfk;JV6y#$avE=GHV!Hk^A*S+M8kgMO#>GbxFycr6;|?k3x=I4F01pANfgc+MFHg>8OD+vjlL7Rb(_q_&={ z*1*7TYsH<*cE>7Ce{w4j(>_4*(9fAajFvXDm{iTw1^CqM?~*jyj0HXY1YDK9*4SS1 zw4A>l8Fnz-Ubb*w1bh$M%qlU*At_+^l$-&B^_ZcH^@y_3FAXheVMM_~_P?ZODKk)OsLKoh7t#F_=Th>6;n$pkCQ z?33@^d{`apI~TT#IP~kNo$o6e>%mH6j!#;X3==ZU!VxXrW;Chb;@Pp^K5 z`%$6DwRuxTf9oNL&1}|y#l87Ibb<9G?w!7LIJ)b(Yhr0{5C-y*!omg!?ZeM9e;mn* z=>86l7Yg4am8yZnO2u3XadpoiTy@Ox{N!nF+v>>3(xZ^A3wGaHaB*F%)KPCP{CDy9 z^5a}D-Tkz&<>QMtFCxk6K$=4?C|Gf9FO-*l_!Ip@Vt548U_G{L+oedPXw_E*}UzU@$Ge;*_$|-~j zx>QNVCV6i>MZtHdhio6Xp~2=nzkhTcZ|6|JH$lN3N@@gQ)Qi~%z45CJ!OzHUCYgT7 zl4x<=etm`vE_`upKiuUU0IqMnI&x}>5i}>W4^g+LDbv!#M8E5_59|>V9h*3*ZY$Ba zW>s(Gro7Yw2UV=I$^}t{-yx@u|2Fc~2(#S)WKvWD7Ok%Pxghn+gA=z_2f7*hDV_eX zUdS}*QIX)U*_n06i4nA(MeE5V$N^SMx z&GElFxCaM1Op)2upkmGz-9gB#*Gg##lR*lD>g0K8+Ip53dCvt1yj{{^b`X8Iz8RY0 z@cJbL`^L7>p&+)Res=doXYj$UtzwO zz@>{H7@TAaEq^}bJBTh#S_9h?vMzp5dF-0=1PxpslUCng%d7E_g%3!3UcnsWmDH{1e|}7K_s<&#|oZ3!>7{N3G~PpY(Nh?af%7<`G^!{ z(keomkkMm|qqP~)>#e7`CH5#XVnRmdk22;bPWPcdr@b)OXsxK_KNXA~ugp08T$sk-FBjSeR=v^qRktGYkD3JZ^s^2STJ zXcPd}R#pz5?~kB9c;fm?67Et4KTG<_)rgHbcN!Eazwx zXd2Zn>1)F5_!i&Q?=FTUiZ>2$2r&Mn)`6MTf6XZL9P1IE-l;9^F6~ooVeZ1a!pLU_ zE1S$u&T$sqGyF~NEo|=0t%7H~Zpu7IB5kjmvy;M|1>SPY+Ab}(eENZM$w<5zj))K2 zwyu!{wM&6xzfXm5Vo`B=K8t=Z!zqh^i!vdqyfoe<^fkHAW49tq+uDjvZlpPWR!2In zDl+w5i`Jo58=Z$1i9X8Q{g$B@p^gbk?1Cgn^M|y0Z&nTcUDb%dcLWd;^+y`&zEa)r z7=pQrGqL?a%~?4ZSmGBnt*08N$neUfplI-WTk)Bw$>&k>X)a8$e?WK2zH!IAy#m!+K-d4>tX-Y zyr*Kt-KGK=lx>w*%(!>tuImlQr(?~ko>lay_%;0i+iLy@=zpE??n{XM;ru3!XWN27 z&Y@Ujvd*f^=yLN-&mK?h+e3fryMr>P1fa<4ypj<6k?!6Gzdt<$lUs}U9@uPnAG(-+ zp7R3TPqpq~_mIOEk@uz~mrYi$=p8>BFTDko`_2M_8m-}*x~`}JtR~cTRj+ha#PZJE zExH3=e`m-tF_JwvsfW~aBE2aIcZfm=)|+x8&< z9wkBb8*SE9R^tA1_z-P~Li_}u(gsAcJ@BTMo34N%?dZsJR2wI*DQjpC=!BQmO!BkZ zXN?{DPmd)*i|voG^+lceaDE%>BVo@{kFd4Bt2SmfU7ZhzU=21VE1aAsc0^}VqGsxl zFs%SJDieke4djsaI+vj1=+v6JxiW$PgK{t_S~FQ>3G*A0m)E*M&oZec?A%+a;VMHw zTl9Bk{Khy_3)@1gW8g=4-hr^adDxs3R^soZgjg%v(a~Ggj?uUqbs%o&8*NH#AZX|2 zcKG7gu`T}cP+4SgA^U|xF*!{uj}^pmmuXt${QjX>}TB(?FehwZ5EZ~NV%Cp#so z*0`TZtsy~CMBoJhKdxXXg`}}H!fnvTCKf+xS5!7(Jjz4#K*DB2CG>9tS~O0^G;BWV z`l+U|oh;(dx>M!NF7N|K4hsbv5$jS^^=pn5;RF9x+P9bD(A@Uv-sRRuQBrDLTZdWS zL$T8U0{XW`)yZ3hFIl;f$)olRobFxpf!wUVV#j8#X)&7vvo1f%9 zl`m9)yZ)qE|7{l^{}qFohp=kUye45-!kFZ;;H2Z9H?JT>%ov>a6%|D9TI(T2$AiGK zr{2X9P$6mN^__k8UBoG!!K za$qzN1=wl_H;gh7`2Cq7-R$$><}L2ZkyXRk)dT@==^-fn-7wXH1Xkd}{PS@lgaug*`v1hJ zk76M0Sv(4a=M~4|MS!fA>9;Ii=L1Y3^j0E?Hx@(R^Y~6xato!#xlsyd(%G;pU|M{) z6cW&*vHLrWP$$=kA*_6lCaGA|?y@<%)HjT2hbdwzoA+j}lwh>_aJn(Hb zyYf*RIk4jP%;CtuFMQuo2lbfJLxXtFbanW&gk{nqy}qU|-kytB#nWNu=dcV>75_O5 zrMwcoR3RP4fW0^q_TWSdc5dy&vJXhf!xD2yG|O>HR(ZDS_XnBaNpJoYo3 z;QF}lP9DjEXHrvcAYcLtHD5d+P(8>(8~$%~vZ?#tR6)-7h!Ir|EZZG9H02Ho)pr2U zW@De$>pC@ICx#g`oioL#cnEsd)`5a+@55l`6^Euk$|sMRyZPz)ym9!&2dJ*7|uWc+XSqqH6lz=o$OPzuN&xr=I zlSDQ^f9BL99|ZI0e_??xqe&cwy2iiI#E|TP3RvwpiWvn6w=FKB3I!&$l3sW}=3I~k79YglNRK?<0JmpP(i@6b z?fcz3t#`v$#(k>k33qf@R8zfkEs$D7&B;`~R_Bn2h6NTBHrZuW#WgBV9)61yJ0YEyav-5_pt47)xb^8_JaeyD&6yth#f;Zs5CG_i9{ zNXC#Gqsh(EaJ;nA%42EK?cz=vQGRDo6e<@%*!HWPiO9kyA42=iyoR{2jyM=+UX0vW z(Sq2G>T8C{j#IzBWr1eD`gud|L3*JL$aqEuY(28RaeV4;q+D?U7M_vcT28S&YMzw= zfs)s0EQk?zy8HV}c~!pjoJ<~IkH8OJq)q|4i7 zuqNtfg!B)(yADXi*_i3w-R|kW`9^Su(E*BceZH*7!!xP3eF%(_e_u8Pzfj4N>4Ecm zd=^j_PbmXl_=icNa`Uvh)s zxwzfLTD2PVQ)P8_L}rEvNh-wbxjqDnB5Lx44kQ?HZNQNY(Hg$H@iY8q&%>Ll_uaR4S)4g|x;;MSRv+HKFGL}EK`;3%F_m1#fY@~IZ`$%YwfkK% zcdr8pIKWK1vA~*niW zYHZ`h!^QOLX-}>B)JVU6sC*jw;Ns5l>vOKI=%c28Llv#?S1+RYsCa?|q7wHU;JsQQ zYqLuYi142^u(U^teOJBWBO3thd7>B8uB!#Mb1x8P$IA-XISwae!K*2W(YOoX<2dJf z*z=%totqew&~t>yjY0xzp}^(<)biStv#VHL)zj7}I5bW#8=uHWP!Lv>Z+DCDapT_| zh)wrs^dMVpvUF=E#cxbOr7$Xf@t0Ani!+#&8c9?its32G>-c2|rJpZ&Xd(Z({%ZQj zz%!(T4Xh)HbtY4oL|jIpvwB(fu$Lp%9p!34{8aXe1DGNRDN4_h+m~ z&xnWT2=h-6IbJQ-(bE`i*27jg0vvhP+{m{Z_in;0iv4KtqQ_^N2?Si)XF?lUby@*v zsRFbdUozfX!QiQU`WbBxo=wVQhL(|#1B39X4tNhhj#0q)k!L_(eqWT7fs5l#de;-1 zOKQBqNy=B4dGc0vHp3YYF|_uFkcC(&-GyyM643$z0x}ty^Qaix0#8s6USk$~unMke#L3iu)$j!cHRv){{0uJ60{1)ht2 zpl7*%>VNgXY5br#G5WqS;wafpqWmr+KO&;PB(b30oaZy`^mf3!J)}6K>X^d^nbBPm z$i@$g+58EGU7{aFyJ|3Cn?@L*ezX-keUKFzw_DJ{=TEgK86%-gtAv9m(rCx9*v6{% z*nuyPSv`JWOu;6d7iNI3J>)c{>B?Y2epJh^M%a97gFH=F_8^;({GEg{iLvyL*0YI+ zzi4G?Q?hVLSX(2bbf_q#{O?V``cUdN+Fi&dLbo-e9Gtx&z z@PyY^P6`F>-(zpS4BF6WBA3Fpov>pX$m#ZA>Kh9K7^Z9Waux7Lq5FA195}Wz=maW} z*bmK&R~F(xY1JP@+uhGN$u@f7-P`YQD*n$p8;{4L9(UJ+Pja(t6R$_`S`Ci;oL!?) zFNslCm3+iK1|JV3L>afRKu(4@Pt;xlvdcsrV+|~cEDs*0?HauDhh&oydH>8B=XH$= z`#*u?lKakEGGfLr5J3O45=ZeI$fvm?E|9Gp6^ci!#qQ?qS+ErSMy=ey9qq zJ2rifHXKQWi>SRfkKl6piz;7PyHx&#v#~*pKkTC#&e`w_y43}lsMgiaTqpKo%=AN?VPonPU%M!;$2t4xjLr|>&f9O!$2l3_eFuBLm ztl87y_5I2SC$M$BbFre)`Fr*@08G>WUh-)^>Jyom&ynJ0k1akWJ2X0yExEb01hsRF zCKP9j7RgqUx2MK4&7nR@wPOD`jqH~UIyD@v4jfle%r5VrK=Ff(WLnw?l^xhY>prLJ zfH?)4&Knl9DS9ip5|-;*nY_IX&BUy};~3=L;c{J-540ri-g1OOR2vm`%IRx$Z87^$ zVI@D+%V%`^Sx-N-K-y*mP2Tk=Mb0(je1{^;7}^24@~Pw;o&&o@q^Y8cv1&fL4za-! zGKxWdTbe#?Nphe!6sAAjYlzyVtU%zD09T&L&e1IEv8;>1u~X2dr+JPdZ(E8V19$cf@Rb{(Ck>#o;n?&SlUkJ{9V544TIT#$wtTA7>6%emNhEH zWd4r7H$z~Tx26~8TiRPSL(~z<^Ca8d>am-K>2X}j3|gA2-g&52HyodIz8Y3mv%BdI z@_u>4twvl41MU$@#cT&9x5zxiE31uArL*R8tu+K^)^cqKLsm~Fzp~M}9-uByTroAr z{naNt`Q!O)!_FaB^u9yZ76-#W9kSIY0Hf4>6&f5Zh8yMTa*uEZ<2u7!kiYtp{<5}3 zqiI>jJ3G*&y){}hg{KxGNyZiM&S}Tp!{e{G?NWhr=e}X^;_OqsQ}T2zP0#xJs&lmw z<{zASt?lDEV!-qJVTFP>$M)1z-3T5;yGf;8O0`w zl9nV0$Qx{xTAt^$pXx>Cn;N2(L>9@(XP}@&65h^pw5ZUHnhBsMeD)!KsOSo`e)zt-}d=sau0#douRIDA^{as_!8 zB=|(G|9qA);=4=~nMBm1m>zSe;^x||h59(lu)dAE-`fo$7Yy4{9$ zTbvWR&LoJbN`)-q=SK=f;EJcf`ymy*{!X=|*^n0kC8x6C2K2og#S!%4e%UuCXJ?#k z5)|wAkg9KVVmQzQrUxf?5SStmMUT$A=N6ZRbkgGT{Frd6XG_S|ks_x8AFWI& z^}XeI>v~foa9>bDxSV#AKaCS8f=nI+tI#!wSb9(>{B<|{d<2Yi?1wI(NrSTcD>q4C zdRR!tSBv2N=!n#C_+&U8#7aO%U^>wW&&{}pBK%UA%-6jr0++-EVWYAOGt&w*l)M%+sgvVDCk}A*8;{&`DbX;NQu681jQoQkMSEhK4gD<3`UqE0q}hs7-C?sR zbWI2ToRKd@z2&x?4sfY*l4$Z~kyA?F+(o)cCM##b#WOZ6hf+3E+8XOWTHM0gu;jE$ z)XRk#pDu9M;Nj`iF0GGoq4UngVQ<7mc5}RG@3LuL{;rE=Y5DD{PXax}kJ|aV2@{Ox zpkE6Yde(iOu{*b;iV=6JfOb@a8ry#NyN`}6lFV_+q1)yxb(U#C1KXaD9wxKbw&cLF z25fp70#9SqQ5nWoI{F)3^4QL;hIXaTME?u9rEfdE;%sRld}5H#3rJ0W;%&g?Rp3E zrK}c+95He$XDj;DU!Snm6bvG|bZ1#gG29vq^neXrv{yMj?jX9K zbSW>~ZCG@smkR!jqMq^^-^t8)Hb@tP8w=-h`TFdFRO{Xty7qCVSyL)lZs{4a)9x_v z#HB~Bt_hqoTyT@+Im_U24TS8ZCI0QPAI}{t8sc@9Qw#P5*$!M$+{kkb-^`pO=+0U= ztN)#?kuR`N!=lY^Eu=Np@zAtkia3CMiWk_tiIa>B8C1Pi`D5BtawBi(tCBG6qbA9} znK0U7lM-{U;aTZJMa)@sit*ejnA1@TFj}~z>l-H(p{af)n1&jDSb-?T}d^alD9$6cR;kUrKQVg6YMSP$DS zs2qFqHTWqhjH-*W6xKk9f0%uH$@fyl{e!&`gRhA9`>jE(u<&SSMez-(dvj2w7nDwM7Fj{&e^_){F`;pr=yhIWe}_C^w8FQd5!BlTZMKL!tIvL zP(qSK!4KumKlkRwde|y+^(?z@nb!x~faq<-)!-xlPw%()Nv|JJ@O=pk$+*?b>SyLV zyE*TI8-50KQ=R`G0Lwr$zxyuS`k|rdr>6{wP+k#o5-GdAm8c-Sn{`>v4!vhg-+N&n z4KCRp2kb8vQIEZQcVX@792_^f53c{Fs9kSUBdGj$HrF6-)&02TgpnvpNk&>m9>!ntMf`M477~;$oP>m=qcLPa zI#O&2O4ky{&;F~P2NX~YG5qJzV>thd&{)&NL1n4EgNiyQM~#GpcwT0t2ukUcG8mBC zBu3>=x|Ft_D4ih1OMz0zx)ialRR@Ke(l3RLP~7Psqzp+-^MZs zD!3Oy3U<4YJPJpt2yOGx#(`XjEA>y2nR-hIhWq*7UUDj!*Xt32bThS6~rk{N(RDo)&ree7k_3W=5p=!phr+n7)d>v}AhHxyX6Q*KBVjE*otifH(}P$@8Wb^ zit`441rPl2S^T#64&0OcM?8DY7Oa}G1nZJkqk%Hhhc9JbqU7Va^U?WOzIrWIuUv(d ztCnNs&pv{SsTik}jKkE+{|CQbw*(7bzZIzue;Zj@I^ot3Qyq zdE+d+@ccjVa>iBo*-t)-OQ%l6kSv@ybWH{;i z=Poy@e+H6uiB@!!9HOBh-5`r&gLiJ9ix+kW`!wzt&3`{I&cc0Ma8w#8@p5WA z@p8`+xD^GX;ZH`PSL!8K$x*8>TBR^0-DDTko$v~_m#fm5{7CD|X?y}X%2`<$Zwh;m zkIHQH{PXnkiiVBs>HSOAsL^ATUsn;gWFe#t>J%3t9sx10=6rBnNQ*g4(7 zARaq+?!=xwdoX&;Xe1;_71NzuUZkmrNtX6;FS?4jO3X}{hezU{!Qavz#Y;!Mjz1JW zfk#5W#Z#dtF$2@FjS65+h!-kWrafGO)KCEjaWXGYREnsw>fzC5^3+{css1f8L%NFm zZ-KItb29+t88|7HY<()4x{FQ4pNf|5)ax#HHszr=<4EDxTXNE=38Zqqh@%o+PbIgB zs%}dt2f3kSi%+Fo>#4MNQnhZuF4li9T{&qh>}iJtkuD=|YXIzcT2En9qJUkr&Xy ztPX5{`O8?Cb~z@D9f|>2nrxV-2_cXK=h(Q!c2q2X6^q|kh?lAcWBiFH;i?k{u{@;e zXh3uMQoOdJg>z0aGE&H+c_-E_cmp$6BxB+wXW_{H8TOh}LA*oZU0D9obi6Vr4M%_M zLYy+P5XtRr_RW+|P73y6%J>wtY+Hs|v*%-P$yiJ%&ID@9u=?en;4zMgvrd?d(FG}{ zJBz8_7F1KV35)-+4}EWldPv!#LulQ#0*hw7if2-$;-e=HMh>-l&HS#e0fKsm5;%u- zavZ(-7rc}*5|am%qBuPcP1_b=#;jRbkbXQaKWQkk+V*1I^m%BWa4JR(EP#8YA)2A` zrcvCq9gF_91!?Dw$B@L$SorKB%t6eh*VD_(L|vY>c6H^q>C+u{-^Wzh4y~ zZKATU9HRGqORzQ@#dLt&o2CzPvxqOYy1#qOQEdGSs{URo|%lRB_DemmV3EJ|34KO{Yh>ymzm zyOO?&#}XdK%=lNZGJYwlcmYkILR^AA$fHX`AqQ>_jeszf8!0-vi>*6vPLA(2BqvJ9 zltFFhNaxg%$ulX6={#oeT*ovi`E=USR&VRSNKE1^BqN&}|C6#E7$pi=H@rQC-r z(A-E@SAnJ$x^nIL9fG6M&cc~(RIGMy!m>4+sTYxEM%PSXW#nkZq&Sf6mC4_ zcHG+kOq|(10;3je#lmkjAY)xNau#(UdD;$ac)kRK)2_!irksnDF$|+;ZNvP}*CAtP zI&v4ZBV_@N>6Zp!SpE6<^s!grf~2ExJdVZ*;iJt^Ik~+Q=?|8n`uYZp$sB{eGqX_i zG9~%FMvTq+BEC8H7JMRQ6!Pw@MaQpB#%Hd*9p|shMfiqQ7&+z+e759jd?fxHTwGa% z%tzQ4S6+f&Ou8Kxt?i4(KR<&-JF`){xdsi}2O@V#7S3qB9-k<=38$AAp>@L+3{1Th zXC|M3(IGuJ9FO(87Ne=Pipq198Dq7bcOF`5TxYT7tQGwb*g&0=!mo4}Mkq2h6Kngw>n3VOv8dl9G2~-;5XV$7L$#ho-rFFqT`k1BL`)j2P8uNmu`kc!;q&6xfB2QjVW0$h3VSvYkN%`p`) zt`&_{Z{Tk~cm&hln2%-4=VI1Nf5-E48ZqFq+i>McgH5^ivyrB$aP?Bmdj2Uq@QY1I z=(`gOUU?0#&zwnPU=C)!wgpYatY2Xvit`fDRzC-i{q|LC-o6U6NHb^eFr51#mUme52b@^G4}^gV9};^ShI3IUV8Es%#WLZ%dR>P$Mj1^d+kmvd;EFSPdOW71{EUL zE;rp6l7Bl|8aH9q7gi$i`Y9MSssQa}tMS@1bFgd6D!eh{6}hK^=5=8VCRLB$w0Y&)j?_@9`yatW3#o{5*9UxfAh5>PU>7~%4b zc=L(Z(SGuI7}qD827E%O#HvZ-{L1pU#CIv2o}c8Mp`Hd zxikV&sgh`;ObYU8%sL}ScR6*RTq^{6LrhnXJoHexWdul}lLDtZ{CQTIR5J#&a=~80 zvecs)TWP3N&__iv$|+2)iLNh?4Yo^k}HoP7d@5ABCB{d19+R)BsZ`ysDSJ6gjH zsHeg?auf}dk~}nL48iHg^modJ#*gn}R9Kr^3o!chQ5ZQcgms%~P*Hi#oO}i@yY>W( zFQ&R3Zbb|8D;V7mgGZMlo5LZkpcF$!9)U4Ac_@g>Mqx)LG8+0~boLQAbLeD@43}cS z#v+VfIRYndJ_46!eF&FtI|b*aor!aXpMoQI4ZxTMQ*c)QYjIg7!$T+GBAkTt-#8bS zHr|Tc`+Xf>V4HoU<~*FVcp}E{ItJs)kH*M~lW}zN*>qD-Sf7IG+IG}*v{?JM#P2ji zLVZGgBf7u1{!>9CqY(M5dp!GjD*x-b4ChjYw!>i=IoqI#0?paqmDWjrye;PB^j=sHWw!(BEE(OT5BU3 z8Q31q#Ngx4!MS>Pw@|Bd4t|OXwY9KsBp_pG3gTMy);i76oIg4=H|C)Kgkk7kn2F5H zA{6EpqLA&gw~4w&3dhN*SL1@C2BRQdeKLwCuLqs&@kkwBf+0r?Mp1e)5`sw0ckL~W zNXYAlaTBLva9#qhvt4O>Lfe7j6EcwBzaL67;(2|clCG__g_CjWX{Y0yDSaq$=C64? zvlyi#N26b12GVTG?P6*^{i8TTgYwaT+)(uE*B7}-2`Efxz`lldB;*%k(9x9Du_G~d z$`BN1ry(gV1<4)pC~U1peO3`l293waekJHPjN>$s{g!fWBHzxo6y)?Dh!JD@A%kT} z%q>RWQDe|Am+7s3t=PSE78b6oM()WM;MhJXR__>M_*bDZb*K#l4HZ9nyx+T?Mu9g5 z4)~$8GsohNt3G=dF1zx>RN~yjq+V&3qA11A6d}$cRw~UV!HiErQ9jb z$NRg=kvqT&qf?%CSKqRcqUjVjAAv8s{qF%!E1H0AKLq9LExudG0rHK8m!J0W zTdZh;ut+@_9KHQV&eIr}Mt=|xpgD}CJw5>|35M9qL*hQI~JRe_f5AiTrSS`iI#i`Z} z{8jV!D(2!1%)|Q5wRk1Ggq7G~`N7r%N_dP%9ml!e<|5Vqy@W4$P-|1Qv>M>=@am{= zsukL3Lf?VEbexYV7>~Z_PlYMhHVCCqiOZrdn{oOQLOx^iS;Io)FkBD$Qs1R;n74_G z#u;UoC__}Iifd`76d0+S4UE$gz3n-6Qw9;NV9}>`P=63yz0?Z61-e81&y8!PAq~@t zHn1_-XY`MJ?FNS648MRqqf{o*Me}h+XIF;mcZ@e?E+6?c4l2saF?-G%G(0(vlg12C z_N|o4WtcwiO*|i-il1J21kO6`WF!Y4(u?#nUnUC88Q1c&e_B127m^WFdL7o-C8f z*&f$U6JQ_vRR#9axi4?)-CH$i3e(u^*o9?{f5MzjUY64P@anYH<7 zr|2wVh~eG9UkC2J`^UKDGhaD8zocvi!e{O@13_a#7ZnX76+E&fBN#|-`;b%agy{Qqe26m;r>gwQapSa1h*ZEG~%x^ z(D|~NGN>}B4wk38xLMD@piR*2N1u5L1pfVw@TyD zTiRY=b(hn`D0$May2|fgA*u(5byUuJ0Nfr%=eeM?f=$9aD!tlNZ6o=a-1w9HeZPsc zMUb!PMQ3s({ECGS^RhQ5dOGp(^a}S!(b@%!LE>ZEi4;cX`-jhy2`ruXiI?I;#{{k| z>6dXFxqz4iys@NVh>VBs1Yo~dNDK{CM9Q4p< z4#QO=zYF=@LuE5r_X02PcQLa5vrxZc-&wnMH9mXGrI_~Gnjpes0LGqr42EUYVepU< z`1W`HA98YXBK`MpfS0}CngBx#(nt1+FVS$bSwrAjz>$FrgKOu5X~G_ z<=BXASdGni1*@1~g-h2Bx$O6PWL;0PaJkf-3}exL*U80 z=2YrhZ4ZX)i{iRwJ6wd1<0Je(lq0JTe+4YJhm&gz?D`xDuC7>}tyx zV)$3!uLFm*fpFG1+;PRNzr>}%3W9Qwq9i3s7e8GDO`&ACDSU+d3bPAHpkxaQ6QVDE z78WRIqSa4lUN}-bjhaW1>28VRCuPwovQq36DaF%sjwr5-^ZBa0w#`PlC@)_Q7vvOL z#nUOyJ&f(5_0KLTiqk2NBDK43B$8q&xkT6PkU<&shC`T_WaPHi1ajATprA_*{)2W3 z6P>jbW$5X>^TwWv?ApM|%Z!9T=H7@9oE#-w$H&*y6n7$`tXqULV!TqXJNS`!!i6he zcOGf`fVc7$z2zq;Kk=ghqGTZ*JvE@$Wa>_*UOt!=b+@xOXk5HIsPxfrV@mLCx*tg3NYt0i^Y&or z-XhK0;O+X(+lvo!$~`~A514Brr@tu{O z9hpOWLv+7AST)`r$jkka-M_*uXtRH{K)Q+3(tz5Q1f->=Q652f0F9hlUJvy+bu)i@ z38zfma;o8LX*8^(TSXIM9(`4q&lJI&zaI)|(&q3YmtrP_zTKgZx@mlB4KI-JA%R4q znNG%v@=BxAdSe-OFvg9`oA5atW2IvVN5S2-}6EU8b=VQwi6;_Xz=HVsGz=b7)`kJR$m`8PRs0{kUHg#0%FUmotp`8# z5U}o)QZiJM>ZsuCza?V=PQ^r;0R{YJA{Twp$M)vS5GbOe-+# z1GZpmcn1~oJ-m`u+lK__(v;spGomMQIZiTZ2y6Dy+l^!}$OLia@MSqP(Ad>;Ju3As ztPVo^<8qvaGwAd#t9+wyD|11QIj9U`h#`jmE|}g){p0Z7Vl)nSTzT7_xcn+-Aoz(g zTDemtyuu~e>rAN}dgU#$y@!gHlr^Ib(krc;pl~@q5o%htcsp~nf|Nm{rQZyL9z1kT zPozA8;=LgvN~M)@==KyxlDKm7#NrhY0mDddxiZ`oNYYt)ruAEld^z54Fr$F=^Gdkt z?%(<&!@=F1S9`d&HF@%Aa#313Q?^ADDAtM-iCV!u^y}m*csco_wP%no10%}0VC9nH z&N#Pv#c~D4r;m@cHEDd`5{x3?=b?0#hILZ784pYoF+hCY{EKIOQ{s~?&rNY#u{v%o zei!!$o{j%=z)i}E8IF)dBI7>LZ1v(F~6=QfW@`7(?aa zSR6x>Kn8#w>C8qBifIJ&w+Em7dqxfp<>SiUHRgowXED4RIH~pqN<8Q;zCV9pK|z=( zD2Lu85yTpt&s{6tZvU+22;D)$LC-+cainUEZ7nuoCYEA4ULb|8yB>NhUoUfYV^CvK zEvRQ5^t_Na9{v?*3zWVwp>e*Ir31FP2;y`22Cl&Q7{Q;`JOrO#Y&;%r2*&UM`fUs` zyc6zswor0JjAQ%*oBw(wWTOf8f7?` zA{Hp~L7WwnrSY`>T+qRBbbcv*Mkjs>qhC(E?1IZYY_bf_U3icRSnVmO)M_b+vLiy*udJB6;Mx1#jBG5q&Ix`}j`_rXKTzrtl#-+<(#M0cl_Fom6dooU;NSCCD4qY|bg z1582lckUw!9i#m8=@dMLiQb(XU(zal1PoK0DUqTH@^?{PMvG{akN2B`NPl$xb{>Su zMQDONMdQlslu(zAc!?@Vtw5uZf~)=TUCOKRRucI|C+86zAHdNBN3rLL-Vv>%J5{*( z-WuKL+(j^8Dy~*WLI1tXq=@@B21#jFxazI8mS4`eFs+=Iudl1gOEf%M7@Zjoa>`H6 zC16^`b=Xno%1;mb`mzY(uLp;XN5I#YLr{5@ht92i=&Ya7DO~YNW6y*HG(L?_=Zyn} z3ueS}Xe5Lauqk0Ho=bcQUrzdLAi5H&>4lMR5xi5V4ctS-ZlAwa8}yi^zWA$+4-Nxy zi)|D-0{K(`3Qg@8LUTYvF@S_Eh>65U166hK=O*ib#<#_Rjxm}TO^k+N8ZyDr#*luD zvvCxJMIU#C%V;WWMs=u){#}?Bnu90t03$t0X!K|DqN=BQ;>=j^-!Bo1cZz%(9{MK4 z4qM5P9xx7%;rlcfPO_T?ZU%PcjvZqn1WV7tQz;7! z13%$*DO`bK$#5xy{*6OQr}S1J#T&JQ@zv4j^yiehZZtvq2pFmNs@tSacmu}gt+Qxj z!l(fgx{tFtIxIyEkglo2H8VQ;--UG?&D9a7+#!oRV~;sO_urJhIN zx$z9bBkj*~-*&c5iE-vkQG*mc3zSMV~3A%++Z59qrN zwY+BQnuk;Z>tD)X90DsAo2T~ppJG>hsh<@y43J9U5xnkbj! zMtljk;b_htg64_X{18J7|2^=!&7n3Bq>uQSLdR$)9oV~`#)3B(ywPA^QXX1_GsYcr zE=G+RZ;E7Oiw2b{+j}1#Z!u!!t6i6IQf0N=c_PN zx}|If=_8ImmBlIIj=xs|n8o`vljru(wfPk34z|^a z^pb(n>L_0J@g(_um{uhMW69zbu5pJf(PL2UxamLH#$ymlae}s?X z=%ln;z35l_O39WCtZJlFxbp^i1aQWYE?+@ADUOLGe>t5yCEUS3tS))#qjGXSTxC-} z?qg*#R-%-7!Wma|5s&_L^)>gAA7@a?=wL!y$5v4XUcDuwlanOC6($(ZpyDElp)rCDv_NXJd5U+<6#YFa#wj#rB3Uy{`0nT#V1* zGdLcnV+6)=+z-N1tfl#|0s3lm9`xmqG+R$_v+i3%RC+U-Rw9~tHh^5;zzet!ze73- zF%e^V!A@d~u5oUDiy?*>-v7|G{!o8O`H&h2!%A_+s3Xq8h>>HdU^!)66Q-0f9R*W3 zsf1~Ak|L&XQy8U$(K)|qIg!_9s^XCv@ShY{DR8Fj2g;vHtk0}VVHGc>QCg#;-z$8U zhta#e^2S?vijR)QOp0!oaiKCQy~|6Y2}eGtrTTa}DYGh*{7$Kq0pZ?$FfGoNBO;q1Oh=<yz5v6Z92tBvBS|;dm@eT7qLUKaM2{Poo%P zI4IJo+{-9e&TkDpT&%Z|XstjykQ=a`MnM_R#^NXVGCqyZ;x>E?AEj}iZ>j1{Lwbdw zf3+w};usMsW7n?>s;88e)vH${GcyxUKKUeu4jqceAAcPE`}fD(xpS>mHrbCYW-^Nz*B8PN5SljLMgClwZY^LMR1Nv`ISZxttqlhV0X<~53-IJ5K5}a-;_`>B{TuMe56Rb zdiyv#(%G4gfj<%+R;et~oKL6vcqlBo+(K9E!D0MJ9KA9U&0BDJcEw8uogM8?4h-{K ze=OdLC!X>;} z4h9(oy1;L>{lN_`5aaMod>9|1Qc%cWA9C$_vk==gD5Lt&!Qk6QaPkac+qP{eFE7W~ zv18HF(t@;dWMk{s@wjlT68qC}KL0t0v88g+?@f zLX{#X_%xo*pPS*JFrIp)QDK_oG+8SHeSg8Hi%uU=Dw&U0Hr)iSyV~w9xM1az0!yV; z8M!;|PVp3pQ#2`4p7^aTmWJ_)(*;3$TolKQEiWm0iuVSE;OnHLie_b$GU^EkDY?pD zP`JCx9YteloD<`&ly47?Gn3MZhw2e2AfYf~g?!J_7rSa`zb)}Qyt}Q`| z^W`%`fpWEah?$Hoh9@K>njxTc9qq0kXw^VGY&C=7Ru(xYD94YyBHNBkE-qa1R}GwD zAR|LYg?PKNxw0@nwJm9_{4xyqQ=IW5z4+J)2-By=rD8_X9Gsti7Gt$TI0Mx-#=2zH z8x*S#9qHME?O1MM6LAX8!bvzCr{Z`VX=@4HzlbV>#Qok4R0qlU*=L`%RfI2n=}TrD z#1KOa{~5?Q`1#L&j&Fba+vwM?Uu2B-2F_yk;}s|f(UrW7SNd8^!wk&9Z2SgKFmwxD z4we1^D5II66$L+^9~hma&%zGQMPqO>{)sy&E`uSn|Xl}WF7>y@a{ch(~aPJJ3n7i=++;wOIcOPRBek43*7D9Rav zTAJ!*N@JJusW_!Gg_q?JbjRP9&y~$7jY=bh)|W})QY1}zrW0S~p>VI@S~&SIl;KVR zRk+`}Vl;NQntnR%^SA9d3^yg!@?aeKD6JU^a-P4O6nD~?UuE&(2XYTXK>?p?oYq(lW?osCu;rD-x2cwgL$e zej*gCERL7jNzTeE7nPUZ5EUP%ZmLFgb#n6TYHP_*TxA&eRReP2k92`d6d#HYAuT=) zD-zb?)bvvs&zj;v1o_<9~1quEHf4hCv)W z?)9U}S+KszpJXC~S9kt(JeZSltvdStXnc4~PEJOjK7G)?f4?pn9spK<^5}Vt#(PI& zP1_Ccj?Y`u^oDms(;Mvvhvv|AUkIr=?Lt}C9 z;K4{rO0uv6AuQ56UZ88XhfwdF-F_8x5Tla|;kJ z9SQMMUWOnK56@dXRW6_OU~n|S7M&>h^aj5L$t&%mx9wL9W3jA-MB_5`t>k4ZqmXiB zprs{^zLmg6vUc@#wr2tYc`L8z^2jeb9lepMbG5(PN^((pN9PU7?tM*gajwpS&&Si5 zV;>@k8JmgmNvI0f;P%vS;n9TqP=c}86Itf(4PoTiia;3UymSlKbl!rSJFds5xDhCh zFSIb#y9-`kUC;xLy8EvOjkRszKv3DWWntvVkvRJ3qmhx3VRcabUViyy+arDR%{RwZ z5MqeoKL9^x>16>AJn#TM^O?_>q2R;cF1pVbT{Ff`&PGe|Ccc9^u@KK%SU-$I1$6?w z8d;RRBa9))#U?DlFL5tEgPXt^)AHGWHi{vJ7!G&%Ipwf_i_w^)&&8N=6C%oV~N5w9f9z;}|qjQ+gv?y|9UAcSc^ zr1Rpunxn81H+Fs&ziR&#KGA+HhIS4@W{9@5tES1I>(?C>6%|;tXc5ZF%FwrOUwi1W zw6xR|3px4yd2w;EtrUn>{WK?s=1Gc%B4>b>7TX^^WXKT8CyX}6Tl)k~D@c-^%b&-d z1^G8Z{Yvc=-G+xA>f<^dyslyORc$*Io#vY${ND!kMIO4zLSyeem(SaWn+N`tKJ(UX z5%&G_fO%*Rcq^Ji0hiCa?F(u%e{C8uVuX#)ciN81Ir`_MuRC*@7=fX<4j1DXoJ4J) z6^rpI`))dNkY+DQRqFi_vQ^N2=z~Y`2d2Ls`N#`m-cw=55JL>_5j3wH)^9NyQiwCg zPd%Ro!bB^qp9q}-<`hYH2iGazQt}0-Om?T2vTh0>p?En#asKYT?&d4pPr%W6ND*`o z8M|;*-;53M6pa}q?(VVf^xK`|Af3WR*WMny_L7E#?ocaC^u{ls5sco-Ma9c5=8`q@ z;LqLVcI6dZdZz1k}!#^N1pBae-f#2&JLFv(s(Qi74Sl*QE%)mGk_af^69s zk1l7y=9hx0yq%Haw&7U21aWRlnKurofE)kdfo6qE2K=+S@h6#BJBc>P$c#CLYm1r; zJmbZ49lc)=y=_U-HX*f5klw`#LBRvK6^icZy;CYP3eB;blO(<~9%Z3&d?)3X*c7*p zqbQ3b%=NRL&^Dod$e;nS0;hIfLc`z}xV7Ws7#beHm=IbzTkVyriF)25s)W(7`mk)e z+o;up$&)ABLyg*&Fkrv{GZf_Hk3N^NpfWFAx)dcPCCJNj7y8YcH(^hC75e8TV)d(k z!=ukk$7`?8#;lpMFl)|Cy#Cs1>}*Lz$?#%i^j@TY1Js{(V(C*0u%@gPsRIk&o3e!4 z&|0|yue`hl6`iRlEX<(s$M7C`g*&RS{?#Y(kH;Uwi|d-vnO=gy1)ARejj+D&3#LNW zVZ-aMV%gRjbQJVKo@U(t6vFKPb!+kZt1Gd!CLRTSvh4!!j&P8+&`=D8+R)Ol5wrig z2zye~kXe{%7Z(pBZL355%9rrRhi70zI2VP*xyazK?WIZIC2V#=sJRk*7d?kRJUSO; z>3vYdvZm75ekZx8E%i#&Wy_Xf`0(Mj;^)WuyM>!WyrB?c8zf>RhT%M%g)x|fe_#%c zgEdtD`?2>(C+Hn|_NfWwG$#7m6Hy16n_`F|hQlA4Qx3I(;56t%1>McRdwwIsbwxItL7BB^lW%QTM8 zl3JXO_JA_uG}Zd8C!*KgSlw|IY?XoGzCKK5aCgcbe7R)^NX(&-Y$=tE^`L@mWiS^g z;sGxgPQUKRi3g8f(Y849a|*WZ{yOE<=$Mz2VF%jU+*>l_RBkyd%iDBTSIL`x)zR~n zQ(mf&qg6e+%I##RkEC^?m4=kb(ZuQ`q-P?GFOLqAvWIA-lsj6_PjYsKqF8seqvaJq zeuevQBl!N|4F&mSh}hA)K>1f%Uw-G*zeLkTFQ~218A5fa8ZX5^%**UZ)Z6&lA52Bl zA-;(h*f5&9@FAQIoBj0UB# zwDi+JYpq&|SO4)k7H`r93?s1r{upj=Lgm`m@Z>YkVA`T>lr81g;rPl$@-b?$5BSq{ z)yE@97abqO90(TQRDrS$i}1qI9jI<_id{I|fUR#li`U**jjasG+R@sy39~-&EEeso zpn^;E!Z#ci9Y>gkmj&{l;(cD`dX$4_iudL0*{>|EcM1sV+}y;m7DX7HhocW71Uv7_ zUyxrbdWRZ*PEl!@8*-728*mj(gJ*C7eY#8*|`Lm*?<=0Q6fZ+0+K&ee{RrIQew++<<`4ERM5_+3;G z?hjG4zAb&*%dhs5L1%r3dD=OTz8?v$-OU?>xgnr7@iMU<65omC3GO+9mIJIDs5Y5& z`>-DOwEq#`XulnOQA)$0)!NeJ!C!Pa-wMiKkny852Xlgs;_utXBR4k}{rmPoLSizK z^ZVn{>u$sCU;Q?|`@Qet|9$8G;rl=N8g80ehQ}}a7Vdgt8MZVB{h9xaKY5C;j3=L$ z;PZ|OiG)QEMH8Wyi{i(>0P#r7Ohsyv9_ ztcvXH z;M=XO66K2@#<@>zKwWzRh@_W16p&Vc;$yGISH5uzE}K+} zJi8nOGyxAsukZjqJ>zsu5i)4R>pKamx1cnK63mh18CNo5W@!w?keP63Clo<6s?r)qXE-?6@wn zYM_gCPdH=6G>ij6dF%THyLa!#gb5SOuz4#;&bm9fc=2L;SXs{{2#Xdj!keqsVs!r; z?0EA@EXlkS=S&)e{B&nHCFbS$znp8B8Chky*PJ8!KC(mr1o( z?nQNDJ?iRfP_}6ccJ8e}<-S(LXQo^F5cXijbE~nhZ~#UgIRr&)i;k9R?A@{vTX&YB zY%j}D)xudO1?eeH9-;OoG*s-s`prABr>qQn_g14tif1ZYKy4dpM{{i%wy)cQ9ec}B zv3Cb5E4E?Yq81d68iujM3*CKHb%YS-rnUx@ty_Ur3tz&L$|B@vr=lPu4)t}-XsIbj zO>-S~Z`px8dmGT1Mq?(q9o5?@qpdrzoB3DPG@?B@2kD9GbLvwKsMsnQ?zH%-`c@z{ zoAJuD7qA?iO*N?5uo&|fEycWD$vC)BYMR|zZvlTnbB*Qku zXHkZxWVfPr_a0Q&RinD53OhINLPbp*5^~d!6skwrhRxW%bGONAUlX%S$v~P!+0lZQ zeLJyUb=yNZmQ|rKoP^|bJ!r3Tb)dDe5z!yH&>yFb5CMQ2+ifJTWvM!TN|-=Bl9XNM|njvLK&$vt~ftwYH6!M#jb7Guyq&v z49ikgkIqyXUyScXhLv?K=uB!y&Gu@vB_$$(*EGE+sJ3h;wr$$Zb|^!|zFM>FvZ=c-cZOYc3QO=3;hhI4QcM$@nm#3P0nVt9W+bIM`8#YkIJbq7~__64s*+MRA5 zrL1}7TZ+5FO-T(DO?&MmjRQg9F5cZG*PP|it%TdWD#9HZ|I1R zmz7pEe3%ax?})6J#>dIuC8sU}!iOEqMbl}uK>2vS-YHBpzHB{L7JNC?o^rl!Qn>Zz zCbc)CNvm+yjr30bmego{0N+3$zwhLU9Tnyw-U^Kl6MCK>2udILBIQg>bZsnuSG-fS zb*_Ht<0qj1VeCmH!}&ClCY^XP zCSLhN{Qkuy*i;*=oUNX7T7e|{YcceSFO%5G=tcC4NA2i!4k zDvo9PV^2L7KYZv_%-!B(a@2D*;kF%EJNtfoZ`?SHw>&1`3%`CD^Vc`Ht5W^jY>RFn z-^^<4S~nNZ{q~3W(xge0<2Zcm3-{vTxjR|gW;E6>!9y4R7SAr-ib~XC(`%35k3arC ze*4JZ@Y55H#}N~c#Q1UF!u|8tV~=$j&XqfsV#fWSB`=nfWjXcqZ{RntZNkn55m1JI zzZdtL41bAFPPzr(y6Z{IUOOFsxZ!@hvZ2hjJ2jTg!z+LKCT=7Twe7hd`wV{b)EaE7 z<~5>$efNb2@WWf!FDJ3@PQDJ``t5X-W#;0N%P+T=2ng@>T%b9KvpbdlOqvK2Elgi- z=PYRcXlNc2conc?3^BwIgU2B?5NxLB{C@GAof^9ri`QrHxyqb{D7 z&Mtfb&j9{nY6@PDNw%jVW*1-nO!3ns*o{vYosM2Plv6sduqa78%OT@HuRm3o@^(wd zj-gfyq%>>KvJfXDhfdp;qTx&Hl{6u`29|HI?>{J-LFYXcat|NpmG)@(`W(o4xO|-f z&=a0kG_|$}K{lLCdhWx)rtM8}RCHzmCtZnSzf^Uxm8e zb=daWZ8*2-QT*?3U&W3VV8Hkbv1RK%)Yj{*X;s*|tsEQwx&t{>Cd=42Y8q;>dhTO5 zvVSphb92zzz5}zq^Bh*zj=(3Y>#%wGBe>_{2l4fX=V9k=@rZYCtf7?S;~KDQ#VdH| zyFbJWM?a1yH|$2`h80--y}sD+=wI>R%d40pb8SpSbHRC-wY(Dh_U*yeSFS|-%o%un z>1H&sRW{9e5l{SaB?|sHAFK9MW5sJP!? z@#df4;n`d9z-K>%lLuE}^%Jk*^*y8TJn(zG(0L}lHJ3^w72v<$ zJ{A?Hxzx-ThWowh&R9g64p14ijv_&_{Jmiu)}1?@!7Tw zuim{CHI&Qm%W1Uz`~nQCU5A%`bthJydk6lxt`c=Mi}B6LWmt6oqnNjsa%@V(zQkkk z+n08tqPhaL^S*_?Yv*G68*5NaIqq6M8&Cb}VYJ-yBIa+a#I}|5@bOUz=-jXjb#dAf zR)-zSX5t_BK8K|H7huEg3RLcT1s9e-g_oY2jkS%9*!;!|Y>O4hf2+2LKqHakFJ}&Z zaMKLbjl2fmXJ6a5>ScW6h>iH#_x_HB`x?*~;#lReh1UdLP3UT{=$H3m?z((jvT`Ff zZJdWEzP<$i`}iDe*s#xJzGGh+N=~>P>+2d(w`&!q|6%~1{mXQ$+*L_qCd9dIYaqk( zabNkf`28K16EwH#$Ey@pU@iWHM;V$%6UuFS zjD{qwZALSbpU1l`zE#qSHj^l|Gw{#fujsKS6pv#w!X^vPEx-6rDcc zCBs0MF+DGlsIsyiwk3tEjNZ!X6y~JlWTWw~-E_|J_8#L+s3fj5s*dydxSsI51Yci4 zVZJUp$|=m#yp{9mqxpM8(|H5M=j9aZUWp5dFRcyqz##F>#b1bHGY{1$L<*2IM zh~=-Jjq$_sQB=r2(wc<{pZhqjyy_fG%+A1|VMB1-d7s9~+xKB#qh7?weoMKB<49Y- z2W1=9VcFix@#$+%z_6hu$SLT9;ip}M3&(}fx_vV?Q^(3IF2UGir=nPWNApO@01RlX zMq6byYH5({SiT*ba!$cnXN*Fh;%wxV_Q8}>FTk=S$%)#A(}A30PQ~e`os5zFijkL@i1^L(F?~rg^2UwC@O}xLA2N}eQiS}`^RaBn zYV2L`DxTRi4x=XwKtI;Mxj7G+IXTEkT8xG3%Fx`@f|lw^RP5c0^73+&SJk1RrCm#} zh|A1DPF5P?GFayP0;DG=B7wsz)RB(SpZf?dzw)d=hJz`?+i=ph>Oh9<$7sgDYfr}1 zV~)Ylf^1|bHKTduEc|uLR2((2FN$*FX#D0OFE@*IUyL``R3IrU2V+k>9(|INm7Y~r30F=dCxlRT(uJ0R`0@=oKx8s-$q+RK;8|dxZ%4W!MUd#gVE{f$Qd;m zBTqaQAIA$=zJ_LCLjn?uz3EONb*5s(^#r$L3M~7GNoE!WS?L&maf=dwrXcuDaEfOg2Vx78@Fb#t=gcF*rD_`VfIS zmQ8*#5OgV71;|E=ap{d@15>&dl?Fzm*NC7On9-g6&m`x<#iC}>6Atf&-r?L zCn(;_O?l{zIeL$`XdP6SuKL*4B3oT?Q2Matqc9%%-`&MmUvUPCIiv0ghRdRmFQD^? z_W!F8FUdn&$p%w#Y`Vi`&0Z~xHj=Nyc##l!u5D1B`p=) z&i~!e>r&sCH;)P_m6rHIR>QSv1QKCO73y|x!kb%$A~&TCp?%x1ykG>z4lG4U3JIiq zCuAZsuN0-7`_Ryl45XD{NS}XV?WQWMUOMl^1H89)Ej&A9QSH{sTA--kz^+=QAq=2u;Ts+uM=4<3dgxyf#V zV-uw3F;DV{?;!>c%?0jd0b1SE9HnC#vil9e$YCtI7`3&cy?QU2t5)H$zuki$fAQnE z;Ul-qJ0;o(^uZDoXoV4j>)R0dm-3|fsc%o*I5GRzNTm_QkpQih~6 z8M3X~3($9XUkvQ0cWMz-^xO9B!0rtT@$9|d!`E*67(Vi`FW@^r`6hn3q8|I|I*=4k zW1wO-e*fjq;FC9e95;UTZv6RgOHrK=LQ72*8Y(NWe8MOU&rfmB33P;!np=RJ+-!Ro z4J}P*tD=!OeL5cf$(Qiyn{LF%Z~i)dcITsbWGD0Az6%w#&1e}s6ocP(TQHEuN2q!v zCLT8ogZiXUIcK6!94@Hab#qAegf&aPdam=ksLfzg< zOnd%Wd()WU=hs68%`uuq_0!vk9>>!-8fRcG&4WCQrV*fR$os>YSB;##Mq&W^T9|mm z5JLP@S$aP~B;IQcXj*Ebni z9d#(%x(}7j`Vy;$#vzUOcqz|`G@ME>^0Y><`k0ZAdbPWeBJC#|g)tjI%Di8rNKPDXzcuE4cgayYZPb zhoCSs5zXntFzJLdaNcE%zw$%)$mjot2Y+=tK6(5Q-q0D_EARFU3c` z@;5y8!!O|45%t(H<1zg37Yk57FFsYQK5ro9!&ZbVpr_MpT}M(p2Ws`9DNki^DD*>Y3YM;%#`DB+J~;h)mL4N>ppQCzWvxU z`1wU+(XUTG6izw^SKWFWzVi9AF`{WYp8f5^czs7A#vgecGSbtH&7qpRd~eW=2)!I( zG2Xix`@WY?RRO)Y?gJ`Gt{d=4K^6iEHhKMhr2;5JNPaCVGgVd0mQN^w*80 z{7Vs6xC{m(Vju-w@QNsBPg^yRp&>fmo%af)DWQQA@H6~j!*RIr zhT}1;e<3mkjm7Cjv+<9aE3jcVO$4<`^$u)Xvj}sGkH*;SWaOk}Vc-#`Ag^u#UVXg+ zomu@bddwhX&BWf7SzerN|pP3}?-m zhNtFkMI(dsHSU&83$b8N8{&!wQ=!|1oo~*@oz3I%p^x5x>#w*D7ftSql7ddOggFNk z#G*qXrcqJ9jvy zTyP04yXGofbtU63X85o|XMRcs5?OKzQd49y1ai}O=}m?T^XD3B{6*@OmWrf-{V=Mm z38{lm!r7MvWmQ?uJO-l+8d1G&7Jj&O2+q3ZBlzf5*W$`!N1%U62U?_f=j9-+e-_3* zISX@E)w&HTiS<~&WGNQU-i8hqCY+m%w0^~yP?ms#i5K9?t6Y7rzWOR$bo^NK8C#0n z5};z{5-fV#ZK1Gsg!32Uk=NE@$1e3lrmWtCjZ0p_iwzgyI2wc5>2WlgoJ@=h1z^`0 ze=bOF%!8u|9TjV^V)i<09(*#czxHZeedQ%MV?>6@Oh&Au*BSlM1!7p7hK*LQ`<9|8 zr5#CG!!iC;)|Iln=9+78H>V)y=yP!K)wkmEGsYmacsgcnqQP2T z$#Lqgb$;x=Q*hKregbQ3FGg5G!{9sk5vE`w9>%>W!f2%PS7R#&5ovToI?bXAQVhmP zI2Wf|nCBZq3^BwYNc;3Nh>p=t^SO7TlheI4X*zP6HsvC(IUQ1fGbS8&fxYI`zokfX zj#nz>q{!$YWHSOtV+t9SP{m2vu{4Ce(TL6~gkB+)UlXio{d}fymDrZ$RdPaiNp+WB zwEm8?dxMTMDs(R8SNWPDA%jF^>6WKk<&ZxDdUYX^VIV`oPpOthM|Y~LKoF+%JQqKm z)44POy~0&~gYN7)qrwu&8C<%aE?Op@hd+NiPPD#VJg+Y2+DdiwuQ4^Ji>^=4;`#81 z5+Bew!z%DIE~4=3XS7k}6eC^kf^(N%%=zd2QFRmi@x6d}>(?3Af#Ps6lH#)QY}~^b zfPtvCd+WXBt>t}pmoyh8$O#qUvA75D+xXX!8R|qrC<%SyidiMrA^2%)fJ@m`r|Rlz z?Ao;pSy@^341l(OMP%QL(}UxiHf^%~?4w7IMt*+2@!Ga^8!D^oFt{)k8(#Y<~3TW}ICJpFh~DxvaUwF4_&TZOpJDr{M~2=m@}4bS|!8vQRi z4pSzLLP4kz2}}No$KPx~sBSA(FI$9#%a`EUXu z_6)V)3>L?Ax;%%a*RehHcGA z8&r&}+ze!Qtj6qzmtgJgJ=nK<4Hhq4hiz4zNb8%242=oS4g0BL>T_`os4825XCGRL zl+H3VrIjEnGah9$nAW%T!GOu#W%!R5J22(!F&I=Bhpn%^gbiWROqzfp`W!XKYtph7BtgVbSu1cyVDmCY^dDj+`ljR74w*xcHy=``c^__a)^`nEk7H*qugy^IlYK--I`w`zNN&Y((Le zAI6o(6(gf{D`tLi6_P(Z1tW)KqJGIdtlH9vk`qs``s;auroAih)IaMn{G>4$);9s= zyVhX#!mWsFtHRoOvoL$k8+c}3GLF0Hc#J7c#-3NFQHFi3ubK?0VAoe}!0hjCMBdHE zVECYZ$Pbrc`*SleW94o%?OTsGm#)O>O-)EDNJhe*7xDOG3-HpC?QEY#cx~ol)D1co z$BZA0_VV=@J9dnHN!isi=zDJizPD(e@IP%Ont?a)7yJ!0PcaLxqCduScFE%$)yk4< zZs|P_%|Lx3T;d z{L$l-OsBwVWx$L8hWk6$QsUjmwYn5{(OX&_O@WlsuWb%)dyt&*WRy1;l%Icvqnq$p zc+u!w;Yv#v{qZar28y%SvyxVRL4Mt7wfspZ=%{qs9_7!4Ac>X5g}9^QT`2-%LG(Hr z1!3tGW`7pnWsq2*S@$kw(D86`?1H1WJBqgL=WRL}U}mt1Ur-Knt{e*2%1X3xVBu2s z%>{BXT7^4aYHMdCc)B2-d>tQ#DbCV}hok4Iql zZfF|%@iJU%W3KlyXxU%y8?UD;C3StM8ZXB^iu>YT;NeP1gAYu2p6zJ2>pR#t|cJ9i$?ZP~KLj`{||kRe0t84;nevBBE8Uuhva!nw$6 ztwY)F?bx_!D|T$zh^GFh;rwf_#}y|HMZTVd4bw19Oh@sMLFk{>j>=6N@aE?A*wNM( z<4^q%t~qTaa+BFkoDSlW(vi}hf=Oo{iHTDtU~o<{k~t)jiicv*u#<4ck%Lj1ruCK% zDtlq1m(a8t+8>2fCiO04ZI#h;1tZ5YEHi;LNyr;C0E33~L1A`2N(T+b!20c2yLBTr z?%a*?+>>zaMW^AU(fLTE;+dS5j=pUhv1aWSY%Qxo@}x6y@-dTf^aSQRpcH)ziqU5% z4W*syuy*5i?B17-$>*O(nsFF6tUm^nWZ4A9j%2dZF;1&z@oC5^9feV($xlr{TT?R< zvJ22}^hoqcr^0PxEEj!84@F643o2JH!OERGuw_F9>N|2V_=w>sO)tivaYIp>RE?dh zS761C?bxz*AKEiZF?jqy6ePMn-L0R~sk4O=lk9=m;@#`8Zr4t9^qqp?eRGl0){fNu zWXL&-G8{2>0E#l%XBs;KIS&AJRnjCNDXjvD9p}4%eFPxx@I}nZ{CHf>?3gE zxfkN3;TgO%w_xC)K{h_Ez25>hC-A2^!T%aLvy@Y~GiWlKR z+v=$AwfM`?fiM_3*o+sbAufE3db=`RENJPN8&)ohkQH&`rq}TNfrJU5dS_A6_X} zWH6C>1Hi8kSUlsrGA}4z;d*{RD-((mjopn8;!Oq&Q{K){>2MDpQxVp=Xp}||L#rH~ zzn{=`-mBBf1drmcbE8#$^!rz)x_CwK+#Mou7N%p6J~}LtH=P+XTK;#!(ZBZ&%-gkv zyEwV>Ia!!d!R%exTsf?rWgzfqP%(qFKFp=G-H^hcL}hDJ zXd7-$`T|}JJ&A#sh;67-YXwvXMhb^d0srrS9#Guo0vYmsd>v=tL|)uWF#vsnaEHpu zO3a-%7aKNiKvSdp7K0w-^|?t7Y7g~y-I3HAi;g(r2wQRReP-IUX;`{+DL(z_Pus)g z>fekAI1p;91BsJ7#K-arY-7Sp^J}A1A1Z~2=NL@wHt>5&5Uh?UxZ;x^rf7R6`)AeWl`gOSHp5NjN zU-$z0_U&u&UXFsJb|9y~=b$yoP1uT^oIxJNbGQdT3}Qeve>iBW(=cc>y0?Pf#x{VL z>kU|puj2pV8~75_ySJ|O%r}M@VtD_+&nfrb{bStnnXmjWgQRfC)zax**m8|@QYgI9 z(9>Y>)0THOEBKkg`@MU|2Ey4BaK|N|{24B}f(8N=ZxvW~pxp#draZU3=v2rBGYqKE zYl1fAlJRyo*K~O7ym#~5vae);MH>?l96ja_eExHJDN0UlJ#rfXN-nk zeYM)czpO*h?y=bwKb8R;3QZ>Yz^4?m16uDHVF>(jm!pXj42h%1878%;F7NSJ7& z&!cD@&z@mjw80r&?=%dMClbD2UctGc+esHqHynT_LK_{=Fb3|=hv!BX6&H|3pl~tj z8Ma>@0run5jiF1>GkxUT@HS`yo?Ur)T7~;)7rw8$8mm{WvJb2IEk+uB`lOF z3^BZa;pdve+CVsq2Et{Z{5dYW>INhwCz$~tsNilpi_eO=Q`wcGuP}?(g_z++!*I8% zAVSetgvBYHDfA4tyNW@WpPXF|ENtK2$Tkuri&)Yb%xqp}>ha2cs|=r{iRtKyx9RLo1C`U6Orks0}68 zXP9tHufpm9Xg6p!~iT5i8`seQ^N8+N>TUxPoA&xFkW=#ooG_I=T6_iCQ7;>Jk z!sNH3aqbE@!s?P1zTo~$pAmX`}KzW!YC^fKI?`}`dr9?8dOJ-zXj-?{GbbgGX( z|5u&KCh&_lkGAR)oo5hc&u9cRkz)|2quSRUm6m*cU4wAZMQD88qa6P^0UriniO?D9 zL{=yhCw3l-@tA_YhvuR&v=V)2C?s=uw1WN9ceb}cBgduQ4U^4_e=*Z1AqT6m5R0i4 zJdTI)^YG8`7#1*BZ69byHR?F%l4zZGS6X$ECs8*@c6zv3+Zl?Bi_y@a=Mm!Vs5t*c zY#HHAO-&|$z4hpWOrwXwHMi&vufhb;9nNKr(HuTBdS0upq26ekjK+Q4zNNW^#%79b zR~tTfI1-ZFb#XV%flb(gwZYep&&U7bZo2326jk|!G!+^+uM9yJN;v)#P{HeZi(SLt z9#WY`HzBfk+=&%94_D)UngxYyh2ExQ6>_J{lKz=)s zU>UIznpEXfp`LeBr16_V%ytL7o`lVNEEAu2X%Gy3S*q73)1R!hOS=0QFUQ>q&}jf-z(m655H5P#C$PY$WKTQayh9n>&9lR<2n^`G#=s@9ssP z(mwdjZ+>H6bJglXRaKR}{phvVUbD8p@4ov`Qd07Pr1|~te{atm+;!Jo$jQmU(@#Hb z&w(7yWscGO=V@Mj?Ny_>=f2+>&2N8m4+?V&@$$1Tp|+|PTQ_gR%-3E=MrI~ndi7;A zP3pvwv^Oz5JRQFa{RN-JP52`o!0UL0V_q*W=tIT6kS?DW+f?l1te_Qxx3`VRfwL(3 zl3O(mjCyRKE61JqJ-&%AVl;-6!d*jco`@la82)P@-RbZ)5DIa|_+!t<*zuE0VU(ih zmA)>8k^UeoI^NwSr?b1#I(G`AFOB?CEHxo_SA?BnYmVnm33hRwcNcBI^SwZjmkR6i z^>wg(WfVx!wlJM5-qBgvbc{-)qt3h4)s*e7Fr%^X?sbgB1w6g;VUcvvPBekv@ptDw zFUj5Fd&t`Hl;4G^?9pYmbZn1EJp&r0ljDhV?-Q`(b_{b|74mm#=kYizd>%SODR?9F z0*!-m^yg2bt?N@(Zw;+H$XL)DkQ(UfIhK?7%SS2AhEm3~V>X`0Kk+mk!$Ww)wj#{r zZy|PIHz{SdBybjJwO6Xfx5c9Y{7nORx3vQSu1h@9LU z+xDP4=z|6gvg5#k1MMi9f`S55jQaKK_g_sjc<^9kXJ;FYj#Bsz_cF(5{=GDA?9hBK zE<%1mKJs((F{IyMlw=iS#Gnz#U|i0?Tr_93B2*NIz5Ocj=zwXMHsp2OKjm&bnDrMt z9`^`d2t9{YSi;$31YJK~So1jEJIxr-%>}(KS*ww~Ua@fT~xTYnCKU^PIM z^6>ON%%ArRHz+JPkES<&RNQ|8Dy<#@HLx76{B#z?bNv|RT?E1QDRV)buZ5?Iez-L9 zT!XK3R9rM9lit#IlP96GNSOG^Z>Le06ti?(u#5_$QLv6G0)J)%_%J#b=khh`AkF(7 zR#*O{nAh{tK09tMo{gJ^U&sH%;A&8!p9ADlYcMB%`6Tj?m+12XWQp6NJgbK4k6d^9Z0Y^}(LUXvAn@H2-NDn@e3c zW*l8On8&)aF&fwBdG!o;U}tC#HiWlubnWHUwgx+}6K{l;V_Nu;ZnOyJA(JM77T@(< zf}~I!8pG{K;8Du_+g}^#9XTBN*>u~nkG%Y=lZW6=d==-=Fc^e^ykNVBkc9)x?lHs= z!+#0-ekRhh=Xrn#mm{b`1S z1GUvVffRuxDkT{lu6hSq+*s-wQT|*;{DGi132A#?yWP|8z%H8FtFQs<>?;IY zQH^qJra`d8Rt9t}?Lsz{^Bj&kh1QdYwg|TK?9hy9nHeEogyU#*B=N!RB8n+i(Lv&aS?+Q-hyf}w>c@FEs9*-)j7fX{?VPm}BY5pKq<0YdFVIT)j zG6$6I_JKx2o9#c|zt!Fyq#$UElfJ)@#vv^ANZTCta-IlN*>Q8j{>Y;Fa6TqrJVsy~ zT`>yDB@rnsX(oq!Hvh}LUA&$8#0-lVdc#}wop;i2#7SeZhS$sn{#wl_XrcMMiz@e8 zEXEo%|O&|1?-1zxBr(1s0|w5qStVIL7e7h4m8aE1kT6 z#~~>p#YWN&+qGOqMPxeez(X9Z3q={AgeF5FM{0;_OtamIJXA`Dpg}EVLU$vzJt={H z_jBReu%uOo8kVXFTP#g?jK&!>8^&M|hM+$OzcX*LIQ;W%m$e?LE@HU*7}Pt3>e{`& z`>Q%J<>&p6Uunxq0<_J!Ve`h_A+^y)re9KJFt~8$q!hfQNM7PYp zEC09z8VT`T+jX=Bp@qLyR9RldEUGN)@i)xmDApZJAr1X7n94%PRu=SzBdH~B6u)<+ zmXe|88T2Tn9)i^BhR(J9LOZYb->&3QjA1PA5UMXZ$YtrXXfkL6QxW>ummZ2~QuN_O zq3J@KnBvIS{j^_NTbiQpgdPm4f0qmnt`^0VruQDMB@WytqvO>cZ?{d<U@c?zVYM0J+KSWLDp?Yh@xJVf?%U>Vg&jQZE1W0RUW3q`XNfO6E@=h)d-! zolXYDdxI{sJyhwM8uWYWI7L_(ZA)2^v0K zh*n3VFZfbq_SlmG4Oov&cn&k@UZ>$OGobKDLt$VzXfslssT{i7`raE19?^G0wPi`l zkj`Cg+|ivoI<>uwp?a28cYC!V(~%D{iOc4m^mQhv5hU?VWCp~_tNdAPwxa; zZmUwO9m4~nh!+`sPE1eLxK{_Om%CZSk0f{0Q#?|_H6}C`bXzBSti6{|4_D7j=Saw) zPyJmVEvqr(CK@?75+~3gI2mX0SVH4Clb6!So5hHpWp<+}h8SXqp*vy*!oLA#6j0fh z)Ak|%jDg-tB;m{1hsNj>XSItm7$h})xJ~gNG<0uiD&6|>HGPzn3sPT@JcG-1D6Ib2 zPFeL#`|kvEHUmNJMZdk0RPNBXUtD4i;*$>kEdr7-smEw*iMD*SV4uxr zT9wdz_I9A@NY8R))0of$)#)Y=twm@vlitlFQ$qh`Ot@7E`BLmCpEELabgLF_^};zB zISyTYq)T!0zV82{&x9`e?*4-zy4AY;?&$yTPqBZD57T}6Mk?=8;`PLdjt%_p?(EC& zRQzZsN^OhNQJZl(tbaB0%A@`L`VK%H4clsR-$AEq&)Y#J+eMqwQux#7{?r5Ftk1d} z{85Ib@5j;g`S(LDrgl?b&`4E3*6M)PwsgLi*X5ST>qi~V#3h)3ktjePjK^pkg^BE` zSxn`&*hNFN6#uu|H)4n(h7UI0Uk1W8A4Nh!ycPOCje{xcUZ~*?s$Zt?v%Cz`sz4`Q z^jCxJf)IT9*l1NZx~`9fF^*RUZy+2FbwAYTDNA2N7fR`wvfbg7e=`th0Ptc*0rRTo zT-b;e#=a@~kc!}!-qNp;k_tF81X565SLOCoWC`k8nnN$;34U5#1?xO zdoAaI?fkur`FIL{XRPJ~5512)%kF4OiIFm+-mIGHzHT#pQo@|-b$GzWTHv%Qp)w~1 zM=6jxss$wXa9c54?QQ=JrWG<6LD;@f7g?k1? z=82$sN-2ITsE*o(BYNEt*FAaFzsYK>^EPvOR;7wzYE^d~(DgwIyZrApRDWF>^eRqm zr_ly6-{0K)sh^t_oYCs;@^{_o_wVm=|Nrw)d1bE1h}GDUi7B``$iV8bwr~cl`kKc? zd<>`H1RQ}PTlvU^UM1WQr9pgmxRLH=CFL1I3^By;PVl}n5E2vP(W!m;J(NlVvyQ$9 z^i-&OP16JKhTaR&=Vz+`;=@1h@1(LSzu!V61Hq?LnBx4KjG|W)Br?Cn=)VuHzLbI; zb*iOv2PyY52!ej5W2f6rAiwSf(%P~x!Cefg7Ko1Q;wZ~F%3Q{R1-yr_GAj%9OZg4a zdHS$J4d$0V6mjVTgY$QW=&|C_Q<0E@rL7wcoCma}V*@s0HkM!kmSZ}Wk;AHhvO5xN z^Nuz{B$9(>54~ztO14wpddvH8fs=rfg#K&f`J=lJ?VSA4@aek#cb#>e_wILay;wgd zA!np`C0BBjUq}5kMqJ<07!fDG8lo`G)dz!UG!1)0Lg}5M;lg#U`_M9;^x(HMq;&38 z^Dgz={ahNy*&Urv|D*j~XZ~F13KQg)3{-C&opWLC=V-d8I{Y9R>Hfc436Oy!8EX}; z6=imv-T$lQ`j&Aq#^YET1jk?kreZSmZ4qsH%jB=;*UNjCfoqW%Vu&GzcMGqh9^MAR zC>jV~3=D+#dW(^ia~|F*55;>LFGR1@d!s<-I(D@4GRLDHG}fwtpg2FTYl1i9A&3)H z1{n;ZOJJRi{=XQy{D;gS3RVi#zo`6&I)nbkurU3)KPa^!p2k6(i~}Y< zlh%9KPokh)>_ccLlAGWQ|8$=BOaxoj~#myb-7mTTD>w-d7sB z-u}{wom6mE(`?XZpDL*GRHKsTTWCBiCS~{S5E|~;=+A+j#+>3glgMCj+dbTBgUi?F z-&Kwe4qVel|F>2-fZrdx(+g5e-wIyF9^U7}T)abcTSUh@M05FIK+^SX;S41m-HMb} z1l;R>^#F4l%FVd$ITnP8_z=cmsEvs{ngH%g$Z*| zh8SXar|^30`(g#*imN|@gn0L+m1u?86hf!j@Xzu$C`=Xf@M(Nl&vOr*dG3nyPH=bi zyVC0D{oXk6Ve)r$IC?4n&Hx~<&LBS}^WI>ak)XU>K3YA9`!6*RBvW@ZC0~lYRs_QA zUt#q#_OT9U6oeQSr>#Tmd!3AveBzAWZ#z;SlufqX(jpmN;8E7Qs z9FMr{$-(*Cf#j~f7M#8fFh$^#Xb+xHO8yQS4ZFiK7OK$_(mwJkEXO)5#2U=N98&3H zYCTa*r%g1v)2jW`?mo3wzElElNXWUn=_*-t>0*fCUx#{}W@@*3;#L6EFXb21-=v_c z|GDjFdUKJkhkAQZrAT^U5-y}Ma0Ev2H-s0rO!n~%ngn^!t9px35YY7w-^=~jd#f=R zLkuy*a3~;MOSVgmV%DwIPk2>!e@1Zvg z>CU}9Bfxk)R4n*3mN)%+y<{}co@KI!k(HKy|NMZXad}0TAudEdG!O*O$CpXli{wQ2 z-vXIK4<=B9wj3>YYP`n>6$+jW_-xC89l*K z=T5F&Veb)q*?Q)qQ`OrC|0{k2PbjBQ?uB$G1YvI%ooKDvfo_ zHN2jBcpC`gXdrz0PFzj{At^Dz9_AIIx8z8%meYi)3Yl6EDB00;(TchJo;YEjWKGsBcm^-@OGZpZy8`@6WGc#-?`k z&1}Ki&}sO>mu|x6K5`QJvdiwjso@=fZPL=#iso=4GLosnALRACZnF}NX=@|RI(67e zBSEVWdL?TWe|p)a-hZ=;=NtHc5seAZcVMJ*QpxA!p+|M40>+cOdtg;756+12``f)V zHF90+$>&?K%lGeT*%%Itt{(2xW`AyTz8$^4%K(tmvlHHF23LR6!`XV1RXh9C!JpTd zh!d&&4@DmoAdme?uei;kUmxo$#sG%vLw$M^m2y`OdUB(;Z9#(TTf7eN=Mn9XA%+-Y zI9wpTO}gj%VvEsbSAN*;>e~bxD9)x-Q}H(AK-+ZqQ@qXv(a7l`VcXin5?EUPI`sCN zh*EClHpO2={&l2^l5TFC$zR)j#7}VX-OHkMI{JJ)ot2Mt-YHH;pMP|`ho|#=-j7h- zOtw1O-F2t*hqM(aFbZTSprgqd2vYDFFC{asL#qYsd!!4~K#=ku3hRy@X|zfp!$8}N zl#%_H3mPne?HG||5dL2U)+tPxUsfM3Uxqhk&cg2-j>pe08;hK@#Nc@v z@pKU9cgURzT@5Pizsv|34OH;hSM)XJvQW8w_-ZQ+2z?e#s}XPg4tz~JnsTJvxlgpo zoRHJxqR0{Pmx>lac)NuVt28R5iPNfm#DB96N8qJEXcKq-DjQYQ=7ak0* z{ti~}pz>;W&Et}@ZmG0U#_raRlaVvp;wjT4UI-*#m(KG2*c5rN`47lsqOvO1~)wrtQXQ|vE}uVy+X$56}9gKzO2!5c&B|n zh8SXq;XeiGZ_+~#?-hhGxZ~>2-GxhOAjAjCvfk?Bm1_@ExM>8mcen>t{oZ{~*K_Z` zP2UWca;`i5?n7iw$?r7dL4-0gSl9$!&H`oK6n@*zq&QCbK^_Vh?5#tdjxM^K3iqoI zK3<3p^U%4^^Zf{`v#l1;U{Zgfg5PPY2K8=rphJd2BXxZm05TM0BxuDzeytiPuCvyR zg0NN!Byl|rEF+GxAyMEYAMXTfFdkg{z3-qZsZUw)`A>E321U??X<%htgiz*5F8F{j zhG^J6AJ6^i7JOy>M{(!P7vQ9$h9FBLP-w44eO)VRDW7|Bj zZQE&_Mops=`^2`*#&%<)vC-JJZ6{yuz3=zS^9MY8@0nRMYu4IT0?huY;b#Aln{c>) zz{R5en6$oDvgi(3oM;yx(PhOz|Ixos$G>e>? z*feSD!_}pWh|8rzr~kPi-U^7?Onm6~-85YZ#NMjF42cpADXV4@Yo1Fa($0cpkdK)f z#|_X*tHukH9kOIZT@o~`Z1|MO?DiLW+{QPqzgLHAau9-~5_{h`0?wkX(h=O%@h}*e zZ^&%Oy?NEw64QzkcUu##U+^W6qiH7G)E_7Z6pe$NlsbqS3IB3N%~~oV&z}4!<9twL z_$BOwH|15LSb8eQXVLI7+rKd7NSAQC>d%C;%%Db`?6tn^s_6MDzvM$HfPK3(v{9Zs z;c!x722Y{(2^ERC0Q@``o<3qahafkF{7*RlM2bVE7QCzBLY>I=<7ax`n*=TY;3nbK zPNC8?uXd7ut;uwr5FQBLaZVXsFS4_m4G9o=hfR3Wj2M*fNdcd56jUbM1`3tro~|N1 zq^m$L57cMjSiCgm=kgl{Fh^?Mz1Jg%N%NZwundgAv9YKVPJ2Lz4Eifk^Vt!G9lS#_ zf6e0!7uKV|AJXhGdfDI`6o#`Yb59L6>*gWMD1!J1WXgpOHL$J6;yTD^;=q!T`s>G( znJiV_c_qfeZV+qb(|V{|nt0#x_-ZN=a!!VXtnW3h3(C!u-RO7NCZuTImq;qOAqBgf zQ8W}@34Gqhk7?dEvYt-T#N%@)3KpU%_jl_`r3ZfhNPTzXh4y-qh@zXQ^T*rZ1k7$! zi2b;5({=o=?=*KY__7?kotLs`q$K#`dI~r5efk#E>u1^iJjHx9>s!&+HbIu@Jm;3_ zc7F)^C?vxyR5zTbpEP(GbF67^!#E#-VA)A!2hE4Zbo)h71pOSXxf#G)!T?B_{6f;` zU_mkQrZVUqq29?yQ_#AZnoaF2f^Q7p1xu2;&)%1Z0NE6lEm;=1glwY>FPH>fl9)OUFz&bprUFFbI4@o-B(*R<4zy8ejp zc<7u?jp{F7-i=kg6})4$)pl^u$dghw%SIKJOa2RIPS)k_=ouW2lnVVp|Kg7l)4SCf z2^aU5X7Bi#%+r%ZIQ!DR9Ty@DjkN6JF18j2ys!L-i&xn;XVBB{xku?b$$InEA{cg9h*o>rJ_PvdbuR~Go*hx^C z^6otH2<9KBpjCy-xbrIzvo)!pEqFiWI|l_uiNSYOSWm5xmI?Jj?j{mOCLE%q$F>l< zM0vShs1_14!Vsz>&yD|ZH1}to6BE8rzggPYuCF)J^1Z?P@Bf;nX% zQln~ccmiaD|E`ggfe3D;HX>?Ma)GV{l`hAzPu-e6CD=P7mPyDct3GEKeN;DE?Qy(B zk2xLE(!g#`Lbw~?5x5fQC59Era$DV^= zO{zUM&w9`lczOdDm|+9cFK`w5b+*FtoE*@RHYIO|DV37G0=j z*R7E9T`Z@i((M>#v)@j?N_vF%5O@+tb*A0=Ew(E&>{fAH?B@y(;zdS8%)q3P&M{QW ze%lzRr^b@O_nCIh)0B~E<(>7r?P>t8owbOhBXz=0jon5Z)2+@0$Ll90+upL)zqNbU zIXhK{&^tl(AwZEHYz8-ET&L|HEn5MsxTV@d;QS=k?Bb zy&0hGO(XT+$+9=(Ajs_4g!p_|R2|r+mh}Ri`Au_q?QrX6*ifsoqZi9ZYk0lEnTS%O z)6+Rq|2Co*^_7~>cCWM>BH-7{tEg6R!h0tu(xacBArX~YF%M1HaE47XOX#@3Cs?@{ zsois_7hx9o+6tlbZZyT|o1M}`jZTV-TEg#GJs9kE-Y>I&jVM*4LSWP>52EKyl3MMKj7=!~faYu-yn*q*th>^}J&ya7xHGPO z44%WJj+3RPPQ>`51CNp+CMOAC94=u}{~h0nfMi@h%g#di3Cv06T7Lv0KhVBRD@yy8 z)`uAWaKZ{ZT^n*LRNI_^803KOh0|e-18Rnqyr*`vWQXp$AyU>b%Hj;UWryx0q(w>3 zw2_<00I$8z?;gqndGDhOdtfOakaTigwLX`dkurWW_Eqy!ZQYv1idjTlQ2i{Np4$Bg zO;`Twim>5ThWsw?dfzLJc(c z_U@N z1F?vG?b+qNe7!r<&X@k0V;?NW4z&VW!4|V!8KP0rBPZX#JqA~Imk4>1GYJFXV~#Wf zgX^2}*nuomv5HdTP2*biEkxqB0?2)GAqHnlaH(I*2Xad#C-~4?XOY$2jYEa`*3*$s z^Y8pD*N&fovHI?OG3f%(vOlwXqkbUC;IbkE;W^IDnWj>$#N|(s8M11z8T&$kb3tSr zHriqC?3%f|cjfl$l_@(71z)>T({$|*Ui2Zz*#Wz+O~BQ_+3S;0xR!?l0?=_PZEDgq z0Kzf0TjjWbwKgBwgt^3CS3jtl*b#n^DyqBXfEBmSoh4>c7@@?3D0H{H&To^m060?i zba#9Ryg5PrLuIzLrnC`Ot{Osee(Q{z>4YW3`vGiW^1^3A%nFa}J=~g^D&r|>gWN_5 z1-%_9?fA-Bw7ho^@)M^9{gm>CamDn-%{ddm(X6DCT&wQm$ve_m`^|<1LA)Bm>&pwR zPjs)~RlX;uJL`hXwB|!NG1-E7sF@j6zQdgF;0wiMffr25>};@^1-!a;6pk57h#5?R zGSPYoo#y$w2k+%|G=f`=B;iHDw2#9Y=rhp(XrTQI6?;QaU$v3AS0YsO*Q0usPiOVLwx9)$A^ewITRb)PFbcb zuV&`O8UOw|9yll}Q6Drodtu;ueK+X8(=RW;9~C=BA1_xuLv#82H#Qw<AgX7{eN@iecYK%?O)ftZkG&Z_H}ip;nH@0k8+z)^$;1k@ zyB_h6ttpwYn|}7Uq5kFw&;1jr%!+2niZjA>%7Si?D`WTRZ1xvbYJA`(%c|CA($;!4 zkAMt+^cPUEQ#lm6S?t+LNo+*cY$tO}v8SdG^-d!bY*(?nzt@u}&0nPOToRpj*I$Lkr@Z~=Vt|2iEX|Dau;Cur+Z`xmIa#LOGfY#F)l_|X-pZzS@ zj8;JM3}snPL526B!n5)#MHNw5?c` zLr(dPm4vS@jQw~0;VoBnBe;U!SAQ=d$-@ALYln<1PuRYeq@|r&8<=pk%!O+0KS5#K9@7-c;i@ep5aR7ggS40JunE7YXXzB3 z&~&Z~Z$rX+&+m&FTJY#pe;;YK%z=Arw^jy+fW^W;4u%h~3*%wPQ4?NB1<+@$1UbW< z-WNuj5(YKupyI-i;=>zO;$IP-V+m}E4_Ki<4qJVFD*Ez(isE1u!EgFdj6Yo3MoI5+< zLroVfytr;H+SfbsWe4rvDziQ7dY#pmklP)LKlME_b$_luGMF+|OJp_hiUJp&&kjOp87g(R_@v4!J_Q`M)-; zKQ9AZvVc`X3!{M>wI z^0^xey;>4)#AQ)qJ$SG@R+H+du+Is-V@KDP@Od7U@?igRGK?ZiLY3lC$lg8+t%kYS zf_+Ov=8=@>J!3Db4CWQLOgzMpNDGY{KqPg3wiuR4vLA>|fRQ~)ZN@@cUD#&sdI$U1 zUDY3IzW6}8@U(>C%QOs^mB-Wfs<8uZR*2qEEX%`2WJbxYKtoSup85S67WiqJ_A_ax~ zIHA2%PdH?~{M%}w&>n9Q$(Z9#2qY;Ihr0OO!JaRqxC2Sopk8Ewm}a}R`!Hipu*vM= zZW(oxk!vMPLH<|N65Qt!J+UyKf~cmcTdOxhwzK?#>btr_BSzHMxrdBglPvQl!LqW{T13J^r`^=`#Rn!!ZJD4mk;>cf*0;-86r zSo{df=;ZS&`t)Wd_C2Q*@VH#Oo@Zu~I)EL)ohAFkeL(xfec!g)p#224Cz@3bSf~OD-f^Iwgh7p3c8iO;S+f)30Dhx73RTh^Ij^&I8kzE%E!IA9U zh9@64hZyvMSp6K5L{K&_J+IDFFv`3um(*f0cSAu0ElL`1h%2?CXk3c4lfWG0u1@=i zj~H=nX>8B{z;%wiKI+f?@#Z9xEk$9M&v8@PrH%NAQ~IS@O$x0+3f|xdi-#&^Agci> zh6Y!JnFxE8GRhhbq11q`O8TI(K~L_&YMQV5F3Zjk>q-WTpKqUUKOv{niIi^L%AJY!nJj; z`Df~qNMf_6W9j+Dqg@#Urh#2dHby8K#*V7aGDNyv%Dwthxkk@#F{|^pXxkcqWh}hb zv3k9?Zr3XSWTJzgMI|EiTiunO`W-R1>KHKXg2UFD%I9kg!=NI)IXkWeH!zXIxX!rC7-!c8T@91{0Il9}2m6swhkrXJrz~WKA2AlhBiKf4rC%wj*#+}nd0y)CVRCkSD)xGZ zS-4VRAC5<0U(n@2-voN_N2|3%Kf58VJJ`_bHYM`n{U=*{p7Y8n4mn|E)?KbO)T_{X7R;vEF4v56I%^u`tQ93d1Zoh;R24H z<(?0IGVj{Fn$wi}45bK#GSw_(tzho-`#Mwx_U(FJmeBS_ECeP~fgy`&Q3872b)VObawh!~^4 zS33x8cfVOkjYe)#ZIy|iJgM3W99a7+4S#ziwx{ZWz%WA?48pY+cK}aO2l1kr!L+E; z;HlI@0L9?*Etlisz$Z}c)6mwV)4;M&qc9+CGZavFNFFJWGZkdMJ?38Nohh^tm=O;~ z$Hgh-#*3-l-zX~Y?9mMVtMBsrd~Eg|DEavT;mSxC!cGa;$2+$7b{5pbqw6hu#@@pk zAK-2FhL5-V6=t%}E2H>sRGY{!eI-{nIo zS09Wi<-X*no#bpmE#;W_5Kl2$Kah`Ro{Zsx(QPE2&_HgHmhY5dIO#xgb|Jk#E8Lf( z=ZW3*wlcuueQk|dVoGv*@;QjY?H13qE8z9vx=3=rIXQqgU{S-Hu8@zR@6yV$)&S<3wI}A`01Z#q>Bns5 z1(Q-qBjVl`q|1XbJKI)sUZrL~o#GoMok3VLAqaNC*77U~u4cq^kmJkSY46GUuX#;z7oi&$ROf}#J>4pptkMQ|H28~?+Bi^;7HrjOEWr#M*9?IS%=ndVvOmA|W( zJWw9g)WB|0rYffjV}hlHz2s+?EsVnb_N3iD&tyVTxIQSPF*=^jg>dL|UHqXL`uXDxfh?pLY7v-9*6 z=>6j6Dm-FuU65zm*J^=BIfwouhJVg2hUZ}JDdA>*ah@-sK)4v?wNp;Om#mD+SeX}`s39SWc*zQWuymJi5kBbHwAs9k@lY; zY@pH5Y>Oekkf7!Es<4GG>8M->&4vNJ<% ze=xZTkZQq4#9O3rF;KE|t;H@N*UHO_>rqj>pPQfJ_m@HvVWla2r|+%EN93v0CByS; z?tmaVw}m7^H&wyAIZHS^fUabsusWDiUn0v?s3HBO6+FW2w{d`)xxXw^3q7sR?^ip= zVZ3)e3#|Rp7M+W%(gC15vd1y?kJH_6U7m|rIRd~FG#lGT;-imeZ{uv)h4i@Lef9Zu z2nJA2Mcyd*>XaEENB80z9uSS(zK3P>fn^LpNz;JQvfsqZ^>Q7=-&ja5cB6ioMZEP| z^GHKaZ4!mZKLQgTHh*nKT=*MC$z{dDfs{t*`Wq6Q=8vU&#qFD&$dWRn8!FU!md}Pl zw$5*J7wtrSWT`SOd3F9*w*aUR-|zcB5^e;%F58&b1L><$6;`|yvR<-_dzvJ^x z&jA04(8%BlbOdi(9?#DV9X6OzuHVE;1R00YHH&gYnIX=A@_SNw{a&iTVwv|3fJ}@# zjZJej{$JpuV@DAW9ZEI+8|xadJIzmmKA-R|7?#GUn~j1uSF4ng9TTC9T@uxNXeM7U znIQ`^Eczg2TX|&u9P?<+65SQWKW(x5e1szxFGlgOxjy) z_k46eu(vkpQP?5tKcyR}ALNAVae7S!+veipCGsnFwAJM#7E-b3r%&3GR$mL}V|YEn z;7<>9Sh{yvSwb`vVQFq4GuXRhcx)4gtlFL|{1XvmU)E6W%_?;JZ`A(m{=nnunf|8+ z`<6^ua#BPy0fn2`$x=bM9Vz}cJjeryV7^L;cnBu?oqzsP$PGo3WYiAhcK8&fCX!_0 zRCG1@XVf~V`#uoaZ2kKZCt9i(j9b;Vb`|9~Rk&CarC~v2C~uUtQ)|y15RG#(`cnN? zO!WBr3C5XU6o7`ShDi(DuAHFL)K?(SffKj{F`W1VHSWHV0sJGJPmB|J!&Epf_qvoM z(e5S-M()|26@=Q7#pDUMhwe&|i+AC4W_Yt>MpXDkoA0|~9|ixu@Phfm?mqe{mn{~M z+tx{1&?s z8eu4fWSFFw@iiVy{6lTJBw?JuMoNT0rZh@zS|g%EcXmU$&0Wc%yLmF5KsMCHAx_n6 zfXs#2KSIrSgU2Ol(n4NGovoqf*(=F5fp23L5blS|c@?e#It>bZT(cfegYaP&9rp|4 zHzPE!9_VS$!Zi>|j&~x*#~$#NxceY&TqF^Vhd>V`%_6)5Wb+ze2Yr*^waPU`jOu_^ zzqwZno2w(MCxgJJMRk>g{ZewIB1HwxM6cN8Mk&J2RUatf`ACbRLFvs7H;Re~sVok5 z;BwaATo?{7Ll*qCNbU6w$RS^+A{$g_RtdYdONCQ*d1>^gJ!>$#ClF*hSN$tAV?NQp z+Nv-p;kw@CQ(~Bqbpx<+@`R|h-PK@q*_Cpg>*HpbK9`|!eb)&@+c0#bh`B59QfQi0 zV2Ek(^%PE@CUTwF<_z=Kr6=pwH({3QU_7k$0f>_!Z>kv<$G`gG z-ZGh?{s++i7uE9!k$qt%5|4V-i86Bn3cq?dx$t7_a{3*)*56iiYZ4U>icq@shwNS& zw|zCGrL%zbvhLYx)xBst04(j)&hM*a@aloSr{k*5Yz7unxH&y&L8SH)*AO!X+L;@B zH!0C)oW2IunCtdT*tk1N`vVeu^?DeAA%Rh#!cY)J9F4>qAFn;Vu;qw+K9NeJS6Dra z%d{bp7~(%8iM*oi3V*izIRxG*Q_L2CsM^cWh=1+(FsX6mt8^C%oOUjmfDd`$_F`dl zRPT_TM0dvhf14}P9M#cPZijyR&_sCecp7m zyuAFJTk)ma#Aim`|M5}Q{L&^?`5WOF{;OjLghP8TPYmqO5XE+@_P*9akRN9XtDCgC z_$(9@z9@K;Z4Zjbka}bJPB#@5x?Rd4yM(wY1MwMNsUueSmSE1p(2BxNgedL0>xx~W zkpX`x;kQy#=}VeM5LfUfR`&vnpMv9FL^5zi00ZpUksgLf(T76|JJIJ{=(OnGl`5Nx zAn={9@ZZy~%raZ1mW8u;TnRDh%igzn+T|RJf1uE10QAL#xV%vs`D&97zEdBs_${TW z7V_x6yswInFzqXR|6ghWc`36v)wp^rkAT9Nm7WQPu3=8Q-QYfKMSuCFi2iQ`7?K(`V!wNH!K*My(Rk<%LULzf>~1WoV=#(@Te&c) zv5+r$$w|UD0@=x;Y~2btzGHxZ_BJY zim3K#Ltw?=CRe$dD+AyuJ}qMn+x^|m$&ZHppt$9;ZRo!xE z&i;WEe# z(ZlVBGo-susy4i6w?#kP1L~-s*-TN*&8el{@gFg<62SUm6|s{H;cgadUZo+RIJF~! z#`n)fjYI;vnd8g3{{N!@eB;@Oii#?|4v9Ec&lTcgVe!k$Bjw3bT(TB$+5>z?JrOyk|uO*u{hL zAg581K@&_C=|3csn&&E~)=>(#3iL62qzAHt$9y2ryjA8R? za*k_3%OL11cVncEN|r=hUP(#Vlt}Hkc;_+b0~s94m1&n0E;rw<;!qR5M76iE`8MQc zyn-Fre#qymmx!yZHD0)v zgrMp}g5CwYvb3$v;3M(XUl?fKsV6`*sB#=%`Fc^2C4!UBeam^SX4kO-<@Y#$a;)5& zupcYSvrx<<_&jwx495RT15a@hRAoMtl&+{#Q;_2tl0Ix*6mLe~GX9G998VQw56QO( zTpG%sV=YZy(zXLJ5$&oA$)Dk4p@S)yaI?AkyGGcqYz}cv#Od6E| z6Pl|(TLaNuU)=)8{OrRF+v|K&u>R6zge(Kp2!Yhb4(K~^BUC)B0LqIKg}3l;Y(xn{ zq_8Ts0vhsBK_qku-LsK0$j}mxIN4(ZyZ0g}I!hDExpUb=6ztHfdyTSh^gf-EuXb)wt zgRMZAvD6U0>+o-uu7j|nn_A*XQ!H)RJXM^QIz^_XCJ}>ht5LcYY0W#}|FW8u;V|={ z%~@A&0Cev!I-jZj8H<+7vAVG+6)%n}MTmFb6Y6GQ17GOs-ezD@Fv`-t`GXivrbYIJ zRg!$k2~C{1v3>^?WHlKFQC~o7qj3uf^S%RwCJN zmQKQ-8vU9dMhyB1jKk;Aj~!+uTrxe}p|3Vwmc)G~hIL<7GGuz#U*-PJ440Pt2QtT> zhaFQn@*DE~YOa7T2t@GlW>`RFl=q#%s+x^Hx1gY)+x`4vjn$&<9N`~H?_YxH>G;z# zD-jPd$WG4A16#{sz51c&jq6vd?~sy!T$pc4r5;zR>{Y!ibzqkbb5@ew__6tU+Du;s+8ajKZy%5Dg3$^aeIPZ zndbyyYL*ys;maHwxviXOvT6@CuR&wNwp0#Ij@%wSQI~A*~4=>U<6fvLyh&HyX+1LKjZ!RgZxKZ zJi)EWq|-))I`(=z5>)-E$dR5kVDuxSyFw!pG3@Q8*&;Iult%7L{uba7G=}ZYXe&0@ zYCLnqJZDY0y9F9TC+-^`{-;djv3z%&%37d158%GT+ka6ssSvFmD?7PtF@$%YzMeSd zM|S&ZXten%dhl+8no(6y3_7WMRUSQ;@TbZJ_&l?0#i|PlgSo5mWTF&jc?00Sz1A0; zi<;Zm{J3y;cW)a91yLM?86`V;YZZa={eeDqcGWAP$~rn8|2&FWJ2RIul5n;>HGQ{j zb-nv+*z9%Y490@gU{l@hp_SPFao<>upb!MV%>ZD2VMD_h3H4b;Ag{yv)I@Eh*$Thrr<$}_oaG)@v%Q8gVZC^}-8InDb4Bjg^ zO;kMCL`?gKZt`NBVwu=N{gYo=I>yp-nTYqI92b+hH`SevBKZ;n`sA>?(kWkYgO2;c zLIP0+7n2vYV6rNzkLHOdCPo51$m#3McuWIC+@s?+mB?0BR%#xW4{O|SvFA~0tlbC! z8QGRF9{RZ}^kacsZ&}9bs|%|&Z^CbcIdPw%8FjkmpUyQ|r<(0kU;9)`PAa~GuVDr( zkbl=hS{)A!25$DX>YT#KkN^ZMYM}^wSv?M6v?V+{ZoX5i$r}qo+C0}cE({q-!YlzK z`z-e=*E43)ODM<9pCVhSpW&3SmeAY!7d@QZ8zF@fiLg0MF42R^rDf}wTsZsj9!dHFV)>k zKXbEHu1_AT(4Mzr*ILSFE}*BB3!wMYQ;5<}i;%z|FAGi$uZ5jvu!L|wT*${qUF_B?4J>r%gVnu_5 z2QMeVAGG)7UwMJRH3^lYcZ6qitcy#eyRWn+gM|rYnL-QVWJXf_tIcVNq!I)UflG)h z!O@6&JRw0bpkXr{3bqORMuh`EOVN%}w9*HQB=5l=*z%~(5404R*V z;}V3FtjC%=ByiBGC`u*9smA?*=7-R2!@p}NDDg$@jN>}E`pJsz311fhA2(R_1impdBY|oo>3yDU9e1ZWK7;_=g*)(pQjh&cE!mM`IY{lk4HChLW%C#qQS^8r-I<% zV9Vc$)Q4V2kpAB8G~e{?=-XiWV5Mo<=Ozhd#>YinnlLmv85TM|3;ci|;S#7D<+@66 zOrM%~J5KE{HA~x^uaGdVbdQ+}I|PDt(wsGsc^#@JK&)?kBlTX{=OGuy?HqS@G>={z zOQGFYh?HUjN|jP?W!ebqGy!=sA;cka0omAKv&7gA>~s)Mh&Jw=19 z{hT@%My-jyS&ZFy;RbCU`bM9KbI!>Aj%qgBb)~DZ`EC+bBnoIyVHQx|EWT%46Ia!W zW4_1i3H)L)+4r&VRupLlewGTuV;Ju8i!vx z;J$kk4N;LY)B{<3opb4Z4&|x*`d)@$*t!ly4H*caZQhjKw$-9>Yg;kt?yGwj)Ws{< zkPvBg{XYYEy&|W!74I9dH4g>==mwch(#*$i9Wi2JTMvRa`cG@oDFyjP#DB`mhn&;; z-ls#qg-5pO=avvxf9x2oISmZ7?A0l4-_SGn%s}b)C}q1L{OBZ!X(Wi)4eSF^!p>2< zgQLM90L7V4Q%76#l5V2~f)hN^%wZL@Q+_i)$W7z)ao_6#1U@o@MxsYDlee4`h=pYR z*lrm5whR=a=x>rdua!I-|A|E9-O+>h?5ggk9GeQf#fV8%3Ll7!Xv4zAN}`u_}v|{_12tGK_LAaJjv_URUzQ`mDD?6MCG5xw@N;-Hw;$ zHh644%w<`L?Kqdp;x(*4C@}w+)%w&x(&3kGwETgZmIAgsyWr<<*qR+D(FzB{DsU9C z3LrZKG=CU~@B+6i?0MK!cy4(q(i#7B+;)F!QUS8O^7x%6za!56B9R~!q(<`XdOdWz zo!3nM8;`?fk^i>|pVMwFP}u@HdtC!5R)2+iY|kyJ87-VdKp-f7Z@*>N>hWteK$ywl zmXO%@O6ct+6zF!!Uw(D(nLTu%(W&T>5k@JnzoH-g>-00|^VTgn4l+xG_&W72<0M7j za$Ncvl2;(Js}ywu&5pY5{mhl~FABcSTmsIq(z`7;bYR->1a{TJU$APs;~p6;FI+Ne zVE2)-u#~AUnEvMl;A*NsX{YGWH>jH7vRmo%@X*amiF?fpFmx3|6Bx@I#U?W>uK0lK z_0Ig~2Cj4L1`oH$?3as?;jo%9uK%B*>v!SGA^G|D(UGHq_N-f65ojwg*zlM1Ru@O?Y!)}OWo!EO-aW0ZtKx;`g!Ty&Fx(1E^-J(*csHn z(}E5e0Bl!XQb=d3w0WB~gFYG@4=}A)JxZ=qEYf|WHTi|<0jn3|H!S2R<31!w6RH=#T4$@uv{0 z$RN!ap~j-DnhWOdG13t!aL`!H#c*<#EkmeKxf!8_^ykRR_y@!N)+dErOZun(Yx}Ux zSwj1q12M&zWUv&dNZnedLFZejyK~Ti|9ks2h&bf03-gBCfzp!w$^FyCXDgg$wl};6 zgHF_de1E1VBa?0iYGge}SB12h2eF2(3ly0r!SwWeXzmg%h^){DqY{~P?av^v`{gj9 zlOh$k(5CDqL_@=iQ+SAJI6r_xLR%|iBk^rluEb#{XF&z7<_e)FhzXgk@D6${)CO&>i;)z%j)aWMhAHOOPeFeDCTj0Gfm8c zNXs&=IB2iWpH2|`9ae=9=5)wNqa3V-#LtjW$=o{vF4*zF;P}Ld!}^c7FH50LwuhOh z=C#p8ddN*gkye{I7 zR{VU(Di3u&~Zh8L9Y`Y0f)IS_%JgH zi;`;21(~dnPK2JkkH%Z6h;u>Dsqxy15fHjQSGiU5+Oq!Cq1CTTzdl*BC@|PEpnF=C zV~krJ4)-yLA5m`DpgA7;NIqrH%8!&n_6MjqR#$7fJ%UqU^g;H+4^yZpH?knl;8xu7 z3>K3W75I+>cl7beZ?yT%p*k!`z>wx4vu#l*uK1afho1EV%7hia!Fn2H9kDBdPzD$A zCpjd(1xeHsucIM@rjgsOMT$NpE}+g(Pn|X@JfJ@|H~Oo|I%U5J)|LBj8RA(XE`~Z> zKC+N+kK4cNWR9%kMIEK^oOMeN!lo?Vr&=G-dMM)a10PZcZScB^6w1s&M#bTDVpUv? zszm4@DG(&qg7lj03;tLwKakG67GAE2)kpfnc$g(2vxcA0p3*7LaO~FYZdxvAY&1SG z8S!$g8klR04KIHiH~2dWwf%ga=V}l;s;UK#zJzy6{XwT4F5Ba*+Cuc#454lV4`87N zXPf}gefe>Pv-bH&ef6)N(|&a}?(3*%;e75mZN9Sh2iAqB)*4rP)Sx*UTfJkPAwcwX zgK_Elgue8os&BTd1tnH+6KU+9wU#H>_Qh*9PKhxtK zCn&WVJ+LN(EYkR#!-monnNngQcxs}eW5{^vQA%<^R2930@|Mm9fF^4pzYgugotvUG znYC9lYbE{ghD z-$C;u5I?ZQkorM=o|JD_052@7hC=R>=HAA|gsgfvs%Mm2*^YJ~Y5g{U#*OmIEsJH@_fCYj|reSD-Cpq!Q7~pz# zQz*>&bhAHu0hK{=Ryox)c;I)~MapJSiSa=Tp=#BTKt3+X;0Z z((1IgV4I}v(Wd)%w)*#+zqs{|9KoDhmlCJHOIUd>H8MFE(cTFb4K)=gzx3k6V7gvu znozXj1%+`m^aYy)p5)ga7elWfsTYmbAB2K3@o0vXl6%z1WN<^OJ#iM^cNU*+17ml# z%@zvWa{;e(uTu+nVk+)@A^gZje+7ODPDQ1Be4t)@&bzoF+$yK9gbGf+!EJWFPO5HH zZ`~7}GdunJ1j>kz&JeJDav)Oyx~GE!6y5o`u2*TSTv;C4fL?Jl3pSF2q@bT_qN zlNWd03Gu-Jx?f_`qIdJ>U(!*``7U#Tm0h0@#80aQZgMEpKYKyTiKsV7`R~zzHB~w> z`A+eg3W(D`pTS+Y)3!1j)mIei8V+Hl0&JbEJ;C0eQ%Fke5Rf?sj~u z%~Lw}_$0%@l5YtGDUb>KVm`aGNcr5*3c~>tT;rn~PnF5N?dg2OT0Jf1FLtTGwFb$O+eI8uIeEx zn192+oVl2E<3hTP(?0iI5V7~$4li*)`4?5NXZWhdV}S?x2dz-TU7-Xc;vibI zc|BD6&7{5!1UXVpd=iak&xWbE%x6mQ-p!1^wSx z*r;@igJa2=%zY}zS==uF?&U8Ma3=582ZqX70R_Yf!UzS-nkUKQ?w-hMCgJ?$NPFYH zuec zoOTSQqeqRi9i!#XR(;t}l>s#u6z~vgHY0R0zNL1e$&Uw44*rPRt%}(iKFJlW;ZPwp z+|CK_rMs*3r!g>UIc%n$Iw%!Fw=3HAwlZw*8F)b({;Pkkox%Fmm5`>)-F3;W_8xz( zUJ{viD^2N5GadO98D*tI3jdDp1u@$2{oeawG#Q8G_&Ym%Ao8HklCzJ$G^^zrBu>$b zgHGC_X4+%NFtiOQW7qe_@MzB(uFwkB)*jGm9}ODP=M8J}$vI$Ni+pH1w7+x~9s~eZ z{Wsj@YaN~${@rv2<$O9oaBVQZyY z->iCcX;0P5QbZ9EWnyP8CDnc)%^Wfh%F<&S={d1~JoFPRd6nXP(W{Na(c26>xbg>X zYmIvZFiW%x^&@f%iixwQCBEJ}Lq)c2@6?0yQ(wsY5iDhIrfSSUy=SeBF7jqxtRX37 zkYuYT!YT0+r_YBe?mmKIZ<+idN&Pn5+jSmJZJ7qe_oPCf>-vxCu0iIFs9djYxy-un zm~TydPS6svw&vp1p1Adz)q}^5vj$b#p`O|6fd@T?QJ{YYpLFrT@zK2jgnO|UL-l`G zCEa(PWO2r`nDr{SVE(aHkuF76br4*?RQ*V0=Y~*Ju}^OjitzNg<8D{w4+vn#$ulyg zBYTIbJ-*)DqDJBF)vftvmhA#>iflL7CY{}zn2~`RM}~VM9K@*ff$qDEF7;Aj!gD*v zc4y~}`slSA>t?Eyad&|R2~BXlU?&_4_%tEsvwqfc*dW9#UYgom34d51{-@=QuZRsL zR00(A`IvJdJehx>Y&!Rb_I=w1TwVR_pyBZpk|Tt99r z)pLU)cz7IT4?GfVfck#`0zv)0PyKca+y%3-@T3)3Z5u&g)Q=wIp;#0wme1N_D4*^< zZ{qd(`ItL91+J0(c=`uxh1j)$l5LXG_H|TZ>*M#}&0ae!X)`ffl-Yv(5|k}G84F5< ztZ*nZjl$co2`@kTDjHJ@F@5D?q&MC#d3*ue8U{s#8P0CJ^3bpFv-KY2%v_FBmM_GN z{ulAU!|U+k{%#D5el#TY@bb5A$B%!x9@Qxl$I3-W)5F;=;lPxM-0Wh^NZ*U6x3^%> zr_b~;YbtMMSgbbDMfjq|kG_3U_ixNb>C7}CTkY8JlgF@rS3SDaLu@~F*!ASyc)m%V zO)kgmk^+Q}V+GF_3@9)9gKmQrN`SY$pwHG-b%SMlWizsKLJT&P&G3MW?-!m;n~`0b+`vA4~G=x_`6ZQ6ks zYWhXaq6iGMV#fnN$Jg(ba`ySu>}+rK2JGCt7p;ALXxX<3PyKE$!gDyID&tpz7Xy(X z28Foy?0W^z|NW2HFf;>;R?fqWtTw#%+o!Na`aw@r#zsv*K9SI*<2Zq`MkSlG1{6FF zZ}98ef(Pi37-IH%u-hex#a#_}8$dAb`yOCrHp1GP*jBw@r55aq7NMJO_$ zlOoPgj0sa_nCdId^2_+S`I!FH5+aFT+nd0*5IVtNf(c$r6kO``Q9|W2DrF<2AUZZ8 zhO-F6q70HGaJi9O>&Kc#IiaJzmdvF^>|OO40e!|mawvX9q?vEIQ^ZFZih`bZW?z*7 z%a=wkQ|@nwoA+i^IlfPDzI!Byk%$eJ+#F;%S*yxH{Z-Jb57untFT4hSy5|Ng%W@#u zmV#-guY_w~6`E?>RR^ikB(fFNG)84}B%~ctiIl;`-?s|QlKYb2&-u_Rxth^FCw`@gKZv-Zbw0lbtQl_7aYi_$8 zH{W;`7CO4H|LGQ_thfYMU4Juf|MH!<@zTX8HCy0xWuolt6-eB=1AqR-FYsUg{eNXJ zehcYoqHsyO{l3 z;(hy2-#e&|q2LP&vo$J;fCVY}XX8_M+=1IZ^J(02*Oi#R?S8zmzY!gNGi>%TQ3t2+ zv;EI_eV_Ol<_s(An<<+N_H_=}UF=haF&vP-R%EE~)LZd|J3oUvKXWJU_@`^JyuBLr zhgva|ITOoIKOdK#HXqKFm*D#Aufth$Qjuy)KqzMwF1hh@_~I=$;?{q;16Q4!gZ3wP zqIGCgqDV*CY0HtUm9e@Gk2VY+1%Lbd-|^>r z@55j3tA^vVw_x?GbfjA4X^W7+qzWuO?ONRW`5STBnPo_6+kZTyn04nZxcRf<@7B9;!=>lo-1!oumHjryCK)$f zqZmp(1s7d&3qF0vr8s?_C`R^DEV=A+_?O#n!EIl-12^AxIvh{zKy#l5LlC8wvyo{F zvHa}ICGOATGdJCc+w)(nzwBmQdCp?Y&Y*Ne5gC$vq%Fqv-rw@R8n`}s>Tx9d&3vAGhhK`B4cH_WLEkeD`R6ag^0O|&1*e~kU3;a+C|a=oO9jHxK+~i`7d3M)sY75k-7*;IQ{k8@r=k%>UERk$Fdi% zy|@F7lE|ox{T4@s^fQaG=DM2>hcniQz1yX|>iOVH#-V|J^mcb^t290WOla?tq{z?! z`bA0a>JDStf(1wm_|V?mh5`Ca6q$Dh;1`*{@M@9yPhW;JrURWXugB9nig4bS{t359 zU4Qz{+i=It%MsbI4qFbkBXPzmR1_v7*w`f{DDphmjr~Js;$OAAdEm-CK zBVOKHhj!_pIdrlOd=f#e@VG&AY^A6h>-!0kf{=6~RLa#GdMQm30~(H0YSv&x``W45 zoHRboMSCjlN{N?yb*c~vhE5C&QlLnNTpMJ8za$(a0IWC?3zZhRiOBN?vEb%pHMOnp zk04RuYzOsZW9ESNTpGael_LESKqChCZY4@e65 zC1gbms6MiaNe1| zXW68EB-=!$5*={n&cQ{W58>d8FX7pz)?-tj$Yfd;@&?-AKC~AP2VID?Z^dgbJdd^O z_M)!89$VVm(A(t~qMnG%g-dYi>iNi$;0RO7bgaBQ7rxz_u>O&Cc)7X-eQ70_E?G#j zrXhR5d03QGk3-dON>XHqwwSf{@G${fUDRa8iZz$w`#<_$+;Ht0EIRZiDtm|E(aU5etMK2Q=+75$}$v58uen(Jqmw6#<{rclrq@4z|~|Gc|H}V&b7ll*pI%( zX0+9GBfRh1+HoUqKn-29Ot$6@G84s8Qt<|u` zq*dh2!psFLaB9OF*xN7VK^L_cJrR+v9XPOSGv0XZ6>K~>gyi$?!dJg|0hXmF!zOh) z7EZ#+q7crRnGY9(4D`U;+JyZxFUJjMRv?$>eF{>_7h~a~3d|OQ*xAt!Ppc?$S!=L* zVLsBG?4MIGbLk4KkY|!5fl8L5CfFP&;rw%#q9~oq6{)xaxn)9tqW##sR?7RuSMln> zUf8$w!5@~fRh~=;IWYIEl~}Q~oLj|_no^FH7oUYsU3)QBlw`ssnRnzApdc$1_CX&! zCLyXtb8zXcec18r^LTFU^Vs6I!JeFnT#3(|`!34o{LkWRUpN;_vNMrVycDONo`pbT zBN`gS`#=Z!o2B07UWOH=7C6j&@yAhF5F?{wV`ik!K3$ahb5N0CgH6V;g1HN^FgIId zaTr719ubjFG@W`Wt~p~S((Mw0jBP1%PR2;y?IbvsePm!Ss`qch>#w|sP5V0$Uile(^(&X+l#(3Svln93 znZ-zJYsCIKDG^@}Jk8ZORCX1Xmn9>G!V%W;WJd=xkiqs3dNEF zW0pZF^5U0q#14GM^Yp`OhRa{hB#46wmv(HiNuoS)NfX21><7bCq`(O0BWgSfDo;YJ zND!oeIfZYEj0#BziV29lbVdo(Hbi;i`{YF9=u%d#k?vUOrM*TJjM;>7zXn-goMe0a zWu;PcrOWUHo49?u7Pg$K13+0%b-;@|gyD^ty z;c^q)1MO(2=aVu>S~B2FtwuwaC|6-gyM&-bPUOJj@k(0^q9i9n#48=CbJpP2FJF#n zZR_x-uU&+1-TNqB+UbFZA~+_0-g*^J{`M#M-*5h3eEa)%3p%BM|7PKwA^ltd&G zS?Sz|#PBV!7Mz63@4O!8RWpdmc9s4t0-trIFs2vRjo_ix{&NjMsQ?E^_i?sd$P#J5q?|aNi@_&}tJmO|YbkD#apQ4jUVc`1v%G zW~58|2e~w>2@CK?aJbzvDLLBbq8BQ_goU#X-_ld$0kf@a72<)eP5uf|_AL8e~ zxEH^?_dEEnFI|WwX*Q8o$%iUiX`ks%aJjY$dUyn(fnL0pC26;a?9)!t#igLy(p9++ zj37AZ!M^ewq+4ZdqaVpo0{0_{86Hm;$Eg{}%^)-wh-~Qj9 z;unA3fE@^mbRDiI#$)79rAw~Wffd@F{M8&y(FjJ9GElhqLVWtmXCrO<{rJs)Ux@$j zchBO@{cdo7El(PIx8=j+CR(yFYt>0ec6Xqwtr|^@O{i;(p!`!OV}_l}(_{>1nXulC zx-%f*t0i#+E1U7jkIF+}2tltKZ)AzAC$a9uo@FfKAmu}aX9UOl$>H!)l@&cXkd|74 z#cK{|?UYk^$}I@%{M&Ksm%fW%-195k^Nat7?|l7AoSdJcJ`9C~G)!A`5{fLnXsW3e z($|XGeeEc`@>I-DOM#8L1>=@DxFlMWaUFV^jFcEq6TAE_&OqN3@#m+X*JTL*DJZMsKoWQoG_8_QDF#0|N5kzhZ9)Hs>l{q>Z(q;|Boo*xt ztW^>Lf-3sTB!>`DEb6uW>D43*&%CB||A1Y;p1HcYhuGD?jfW5{SJR z#nREu@^8R1Yj>im%`diWFH*lWqh9z$neq&W5O8;)wXqWeBO>qev?SlN1_P?3ogK?fA9x9vtu*v zOnn^B{pA_F(Jq5}N)aq)T#nEG=m9*r{w2Kh{IhuC@u%?nuU>|eOYOP>L8BLh$n@B- zkPG`lob~x1;j#Ty_}&#(9Q@&r@Z^C2eA0}aG5{=ERDnjd7M}wv+b6^Lm_X8Mw%X9! z(txm3fIT%0(-)nC9ozPztIsVS`p{5y00ZU!grD5~2R!h^Q+VRZ$MD!gzr)YJeitsR z+=IO`n01ayznADnbA2nCTC@#?d}$E$)S$L8fb`s4WTf(qaz9!c+K%vZh<@^Nk)Gxd zaU7Fwfit|)kE)NhX-eu)=OJu-_GzrMFT$$Ti?JY5ja?7_4i`O9h|fGC_Aft&zy0V7 z`1H92aFRzFkm_W3W;5Sxjv%n_as2S#H^O_?*YLoOO?dXfd+>v=oP+7UM3^NW*1jpp zGA@U8HHYA*rMQv2@I{SA1~r*h_3ca+wQU%6^$n=$3+NIg54`?C_^rumb8M0=5jIaR`n(~jHGu>=BuZvST^o9&I1Wc)q)2*Byi-+;o zk@N7=EpOtvryjuXzIh`~mlES#yyjC&jOx|}M$$A_?QYyohr8Fq1m~joh`n!kl z=yMxz&CuO={Gpezy<7EW@2-5bkVXHqAY;iHI5Tw&BlYXBcK0D{Z!X3uv$McSN|it{ zVP;0MEzIAY39BFx!->Xl|6oKMo7ZIP(R$mqKilyOdcne0zMlXj<}4w z37l!E(oWC9&TV_7oqEKE?viVh)RWXF^JSI%Su9+CEhbsQrf#y2$x&> zJ|URykW>q0OvuDwFM7guk+~$;l2TDrIum8ZW7u0+kKTcFEL~iLl+x+2OP{;zrDxHU zmW{l!X-EtEFdR&Rec^5R{~mr4k3Rk+PTq7C9(+#5*P&$C(#o*xn!E6g-#v+S&u_qn zb!+kW`+tw`-@F_%Gli0{h_%#x;y}4NZlErty|L#KA)W!wx0c$*V5O{!5>67pw<7e% zwUPX#ee4n>7Wae?@5nU=irBpghC6145VVr36kwEeo6=g~h0UmD(?m6H!34-b_KfZ!WuCw%dFd!Z4z=8F6 zbIU$#t!u%dSAK*4y6ax7tM@B1AdLa$*^99>+=%8~`>?A=LMtr6@-zPx3)lYv55G}| z>Ne@1y>9gFc>!;1sKm~sWtcb11j|S_+&dq_-!^xndn8GefHXK$(~)c!O+GIlIkU@f z)7Ce!`M>~%Lp*Ja?cNT%45mra&9JQ+Z92+)h!Qe-@Nukty$1XHq-|SLU~{A)wTSId z+}R`(ZCG^b3S2PFg`he^eGEgR+Kiv}qCi{9sM@U*POSMT!SryGCf~-kwY1~plUAu? zWRaYTv^h(0;hWE6OHCUZ>Z@^Zr<7&+JS<<5hwSWZ=xO@|u4tArp zYgCBF2sXa76>o0bgN~j7c-rbv`TXDUm;RgN*=Z=x9B^{bEL$>EtOnIVcm zc>#)NWFqIW=kVkU)oASz^4Z;unipTgZXsxm1u00gTjAs~H7-FoxDA_ZVeKeIC70S; zT_vHEz4TmUme0YNPdj!?NnYtF#5rgA>G1RQKvvVsqKxaM@KoC5#NiTeA~8M3vM(nJLd`Z&fFN;Y_e&;A4m+$e2CY zgwE}c;&0of48x-2v#qCRz@9ARQuq2^%7Ncq{_(p=Ib|qbbsGNF^$33Z_qR~j*aL5WC+c2% z8c+9SNZBsHe10TY0#Gxpd^|QBmJe+WJ6AeVXD`JCZ#;+1wLNH)WF|^Es}mWGx7F%7 zbs_zY_G_}uz|5J_etW-(C)V|#{`~WBdWjP*)n3Gt^jB6HyZs&^F5V&4RJ7PK9>S())?=r40p=8CA+u;U=9}xV zb=^)x({nJbJOxSpm8gH~89cntj}egAW*|8~UF2Tsy<|E{%Uwu+V-NP!4NLUeQT*m4 z2OKtzaeBHwp*XGtfiJOxqEu5cC(C9*a7Qp7_$f@1C%4RoJf9E_yR>fWMt$lgjEJE#?5f}9Ek-D8w&k1 zoY4@MG--B>m*IXCVBWMQFP&flPb=c-MbfCpq+GaZS;U#gyK%N4$~^~Coe5FCd7+Vl z=A*=TCtxU0%5{SMVb3x;PTpV}H}BC%nJS}Szi(*uWlEii#h>~&-22cCSi13YTs}7+ zWwR?VZ(0U2{&z3x67sMzPYCje7i}+l!Iyzr2P^HtJR7S{D?`p$C-&EgW@azK%u{d2 zH@>wRjo-Kurxur?eEv)nt^6Z)6km=ne`XElifARs;5M2tgdJZ#3v=>a$aKxcWiL&` z?9-QHb!h=+thyYZ|IKQ6ZeNBOc`0z_q$4HetN6_;)##IWdAu>-CMF31SGf=p8?o8Z z_1IT%)~sX{I*PFBo4esV<0@QQVMnrhfoMi<;Zodo&NSqg&d2KWF2MP7O{jfs8!D@- zQCHuDzTO@T4GoR=0UU4%$~pT8qn|JgUsfD8lkeZJ(c<8-fVC~6d`BJl+?T(Ii!Qi8 zrHSM&HDe(zxY>-_`ewZKv?w4+E|g54hEgipl6I8`@o93FV)3bGqP<0wwQjex|599e zat2bme~;5v&O>_f8MySWFfRJsRXBrh#-!bbBE`7;^vp?qBDhfeoK8QKLrLdY)wB42 z*PMd+6|*rtFCB|czYss^IS04D^mBamf+Z+rQnSlZv~)Q>zxOVDsxTAjiFPtfIEOIq#HY#RjAoJ26;?JAB$XBPWb2xc2+ zuvy1^hWVhJ@sDvWiWuLZQx3#Vd(~t|*36Z-`rrN;m;Uh!xT&HD(<-K6))%&6sNzE0 zv}T47=nUkSpN%{3Jr5)Qejb*V=fIWr&sf`LM)oz!kv%4I%!KwmzT(z-xQ9e4fmYIZUGs<8atHQ4S2<9)I2bWD7 zr#ahVE~~&&{|ore1@myrPuAkCHc6VKO(|tksN=yYJF7ZTD4LLh;-zQc#(%#V)4%yC ztSQUI>?JEP>pvS&y81kve{v~=I!Rij50dfx$Z#yGf6}E|ptsXol7y^vpt~o8L@I;Q zCnZTCYQD5_G#1=XFs-x@scFE5T0d4Tore^Mwr7Cjb3)l1EQ#*MZ?9g08^8HSywoB( zj+BR$M0~u=7_QWXC{tDoXZtBXD{%FHd}#{#xd1nuGfNxoDI46MHbppQwpWW?hIS8X zZ#oyJm*yj@AP4*Q?Nj|DVf33HCYa`g;3(F9{ZgD%F(0$$&cK`tA49{+&*95=or5`& zwj?F<(l)tt%qVY59u}N`8Sc8J0DC@jDpoI?h0OVv;fg1-aQhW!V9Bg3B=K!^`g9=( z1voq1i=@T#kz;it*_JB=)sCU;^HD5r(@7ldP6XY%@cT1op(HIG*-Nj*=R#k@xvR=C zuc!=5F1Zc=a_cCbxu6V1S!qZ~orOgw{}gM5Jo?ywd<13pVSz<%6uWV47`9p(YMzuq zN;B7 zBuqX_H$n~0x{{%k3Gq)iUKs%pbPI3i(iIiVey(E=iBj3o-H-Z1)#z+*Lq}(qYVT~vTA!oM4r)eIzLjD7X4x_ly| zjXvqhD?f$hC!LP8^fZ(f=fW!ehZ=yH=8zk`yZ?&+`l|zHpI?Sq^F&EbEktpq_5x%a zV_^jPn$hU9AU&-Y)sMZ5w|2O2%732*NB0m^vrkG#(cDtxIxR4TE3x5s&tdzX6rB8x zqxg|Dj107)og2pk(r2oOqN)$D3L%(Lk^!f50V-2cKS5s)IvZNhGa~gZeSG2^T#55_{37bU-W5|TGSp`VtvJ72- z$K^2V0(|wR8HjW=qN#U8ebL)U8#h*F7Z#%=--fWK6D>77l|<}Wch+o7FE13?7Wq@f z8^*A=1I-6J!7UzY$%QQorDfT$40fWkvmd^&DAf)-><&r)5F|~xa9M-suW=)i#-m$P zVbkjhfetioz8~LsavJ{W%WJS8!-F2L8LsSNw$YrYRaM!?7_hx(~IY%k4unqX>n?qHu@%(ce9Y z#DZzaa!Nl&0w?Kh=?HM$9`f>1L^%NdE;lvfEYDFa2*B#aCh6Qz8I`R2Y? z!jV4a=;5$uGur82@b$l@;L6Wjgp-N`@C=Afl39Xc)!!Wjt*_wW-~Arn_g{c}|KobB z$`gG@IY>ET2tD;J(r0-PNy$e3v~r<_9=O{l)u~<=!wEvpiql2udVBfd>_%uR*)YP9 zIxQ+mM#R^R)|w9KpS3=|yu2Lg>FMx#y=tuCx%*S0wY630KzSlR#|<(*gonN8Z>>R_ zCycO=V7^3)MmX+B8B4yMQfDE*7rim%W95tj`!!P#gI(=tZs>t@Ns=GwR~)&Lr+j2O z&Du-k#3+V(Mb4!!8p|rfv`mL+L!$`vH=&`=B>kAke|9nwNB!{jcA%-njS-P;j$NGj zn^l^FOb6eNg)rFNispKWiz`fIureizyv!~^UYdk?xWjtiU_JEq_QLP?qqMa2nDtJh zP5$=YAL8@>@*iIpEAF15VOJ;$q%xdTg z{DxsA9ZN;2PE(+5s@6VsrM*qj?B5NT7WpG%%P^v084|-DBt!;8R{N1KD#Re%Eot|u z@`;+A(qTwdSVXZ()b}7La7IP0C4Q0tk_0xSDG7oaro_C5w8rsHkh&y6NaCB$x5u#% z1cLJMUgSz)q!zC}@GCsNGZz>C=YL>Lv9!UXMMXJ0hIo$A+k1fYTf;SY;z!@cD`S`8 z+RxpD(C z+2Xq-##OL%BJ@7wh;H-KN(@DD3cOwV z4Yy;;t%8$N7ui&>|{Q(j`_Xpf`-dq$<;&I0nA|Q;Hic&(f1H1q9J^c3d5>(vv zS$yf#bmirv#>Aq2x8);*UB_b$Q&J_k3>9ZdF?^`@z0ylf8ICn?d#?sOJi{-EU1U^008Pasi{=s zj>HE-5D4jLl)iNYvWmC`Dm&@(B%sMDF_z}hsKY*V`@@j-D$i@79v^Vr_{0)~bLZiE*L~?8 zTzSn+aw{=N;Zd-toU?!l3M7dD2Xt*i8iQs*Yovj{>dn3Wwx3Y@3M3pBf+7|2%dnYB z7K%X@SeVAOQMt5Z8hFEaN5#<2Eb+2x6{%q1iXFqEp}S!Wg78jYny8d?babGnrw1-q z3d+jL;N+JJr)&go4~C~UCr6}C!voT>3ON{ciy43^+$Hux5~5rjX~7t$4>@~~C_Pw` zT&wt)W`6rX%1zyoAn=~mDdd1tp30AujUowh{T|X8$FV?aAgM@-zd*k~I*yef7*KLD z8I)uGikosZ?#D5Vo`XBl&=rAW?ir}ak>v61%@IMdJ?NJTQ}~$>_S?B@ZWG(WvBk;s zw(r@5Mt?doXD`E?Z1JE!_+Hx9hXJErj!d8QL&1JDZQFrE{w4%AhLFDl_1m|hKl>ES zD$hfXo#9XR7XuZ~RPIx!i;3bgQD1j8wy%EydwTVK9AmXOu+M=7m)?cT&s~6-nS4MG zL!O%${1jme#>;!EG`*wUkzpQLf5%cjD#3^Z{b<>;S1!GPd*v*=g(KV;A9*rqeh-%%F>8aEXI9Lk&cOBO)NWw*yoQEIOcz1 z3Bq~v@x816>26$c&CN(6A&>-fSr1PJqQX8Z70Ueq%m}}X%(v@Ig*tLnDxR@YFt`Ls zeg7b)f>;2thHe^rV+a~apmz$5q4d*&;qh7#3-M2;XoRi&3FwDm60DHPCN>>M1H)=; zY*YeG!Ctm(Db7CYY@}yo=sw;ZRC@T8 z6Th5gEHC2h0jrPK+CA4Ks_8SSPHrGqB*K_cP=4b0U?6pwR4fFcP`^Jq-Yr3hLxa(N z-wlqXU4KyFzAHpKQT6fxv<#$U{x!=%nt6m|9E+bgPB>7!NDu})_hZu|597_&5sYv~ zSH`Qdvu?tj;oP&&z~xKddA9gOz_Ad7wzf7k7JVQD;calVel%8h`=o(+>+9?Lgc5`W z_}*2Y{~4~h_GWE)kR+Ib$I2x0V~o6~a>_G}nJKlQSPjDBH%Z$e&O$K;X8s!Mi5Z?M zFma+iNe3qq_$;kSGPJYYHAP>%tBep_P9P6x&kOh%(_*BL;W2#9cJSA@r#pWQLrfM< z+OwfmRaWAewa=igt{!Kdc_uEoLnN-S4iGu?Br3O9RELAV*2sS+p!RY&dyHt zf|aMN8T&Zn_+UWYk_3S|Kv7ZAG3x+^zIwa~!g19=*q5n<~CUR|jy_lf#t$k&g z8yKS))9u+2T4GK;BDgk;o0Vx|r;?1#hH6GY?zK3z&B}&9#?3gm@4-;&wU5$p#zN93 zad4J`=^>bA#>+-R7~!ip^xoRAV?0wT{JNbw+EwLo;ta^U1=FeGk-SCKSCmO&m_ODl zjkrmg$2e1C(m9-3K13%iEewNTzO}UQJ|<1PRfaPz5_a4iXTx&Ujb0aV#POcM_WMrV z$+7r}h{d?UnPpoI$wy3wPtnYi|){KS^bnFqCht5UBWyva5c%M?pG8y+b4n zMVxMiA|6|S{J5H?YiW#$Akok^n~0*%j#c6_hz4y9cQ#&?7M&O{JepW?z?lwidZZl* z3zdEP;ZcfQ8%7is7OK;jjQIJ>laZ>ctMTk}&!M5A0cV_c8ZNr{Vq|7zjpyUtAj&cr z8$m+YgR!t1iCkJV+9&rtNEj0%WH6d&MbzSyTH@wpeR&b9PVGC8{OJ1%ID4STk=$#W zl#?WXQU+1+t4=TCGg@Ba_#hzluVxU6_4}iPGYEXE<8(U5WjKyFV*A3Q;aL2{aiW6b zoqib$_TT#D#~l;LL5@rMx5K&n_~h+aW)P^by4`N2194p9;Vbd6>G*EFq#GsW;f-flY{Z#s*{cR$o`zjn2a$2+ZtZ zQlZ%?MPC&J!(@Q^CS!rNWJZFO@Qh_bd`2T1VlVf`IpvH?%>;fsbv2R}M0kSH zfaJShBM6~hBu4lt%YG?7$rm>yn;k+F>>5GfhbUMM+-pGPU)8acA*)f!OdRzkMqS1WhhvZ(2TH2(;AP98RjvQs0w9}FpuS%0a zP;`QzmLGA65RYCJ|FmmvZowE@qo`Zrl$@KT_{}aM2sR-IQZ;IWGOJ1>T>K}w6C-vL2!a?P5-R`l zPgS!b6mfho5E5&ieoO>`+4^`B1Vns74BS$U z{bKrrFboPo=#az-K@bH$$`7O|lE4`Rsg^`m%VdR8%1!M}U|LBKq)HW`V$~W1!7y4m z$8o$N@|sj81ffK~KRPIjO-)VMx^?TgY{wBt9C5@E$MFXBn~I7G%$qk)DW`FKJYnbx zC-x~uJm&O^KgZSA-KvyrrKF2q%H=;yJe8kua@4FtJ#D&;)o-TIO6yqK;0=fH&?BQm|7Q!qx<1`GPr@tV-uq$vDPB0UqCFeO@r2Z`xm-xXH2pq~ zIO2#SjyU3oVGIR5cGiFh3=N^Zy+eI`j2ncj4_2eLwpJq^)fFbd;BuV?+o6 z)6BFpADmt2?C3zhgw0Qfb6U?bdCi#=0XHE>!hU$%ZD?((LtASj+U<<3!&Q` zgnxKc%2q1HVujgC-WFS(QgI|g^3UfVMN69xhwA!JS<{QE>P{T0>6EhVMRThg-F-s9 zhA1l$I2}fva2b~&Cvo%M48dO^2&POVB&KOr#{h%m#Supwal{eF2L+DzaeVy2dfd5f z6P{iF(#vv75?~mTfvE@qmAqI*?+6@Uf{=?fbC;cuc?%Y)x9TJYG)f`oTWkr{P|W$u zBt^pFM~DGu52zIJO?+2pCk|8|z}9VBv2WjAbaizKVF-v@L@DWA-Qs?r5-lywD(uvh z6s4#edl)!lP*YQlb?erNGJH^-Jfs~>Y7;_1QlQNs&@X@aArLMf+OcChh68@_TY#*r zY(+A5?b?Nd2W!-q?f9mjhD$(57=n4_o4FOL3sTfxEeyE(kdzRTa*SZm zA3}4R9}Uf3Au%JOeA-}jx?r(cRK=+?tPs?YP3yBBcoBc zy+*yq2xVDVv+$HlP%(e8+)5z204g#dFvx)+lxo(1#6bQTewsyze*KL%uzSyL zHTy7g=1eSDumJNa=3~y>Iha0ux;ouuWMmjUJw51myA>IsLe5_dqBcYN7;-S$j!+S1z%eVMDjs`K*GRqxXftQ ztXU{4D^tXSM^bXRjv@$kb;@5b6hwPlJ9_*2keQjG{Lh{}8wL6KDt^y^8~uH~2!ujN zPtOp=JXNKgGXjxF7_BXJ*tYpq)E}xrx+@8@$}=&oCal{cv9C5^PEchS@f~J)pCvcKL zZ7i05#w-C7O(onQ2Lu&!&KMYL@2N!5o%dW)#Ld2Tn;i=mF2pIPoPx!RmtfZHStuqUon3!X3v^~ zyu2c0q&tzHYscK#8JIgW3(58*v~_rK;6Nu@8og4k61U`IXjsa!Z4i|Qd!#H)IAvuK zPCL06^X6ouv^Y&jfD088#_Cl?Sh2KNg*)IGLR~{Qyk5U{ijv3>zup`-@73u0Zsc12 zDA|Z3jyU3oBaS%YIMH!j34&6AM8D>#K~%I20zl=PcJx5yT#PVqjF;)q(lSwrqaR}ifwL1lJ&7bE+38fX7$gw9kA)&65^hmZF;=f$jipPM2(c+e zc6OFJYdAAAOGrn#kc$d9><;)m9`tl~W6y%zXWCFaJq5)jDKHD~s&DMa{;E#+M@A+71S#V&1mt>fCa8y`)mT~E%guk4x;PbpU_B{|P?4!W&L-30C z{GxNLy#d3H1cI{!E*B4Z(!!@3)4(N3YEOjCuEOEI3Z|Xz{7NC0S#ghpD>V(-x%qH9 zoO-#ENaii zu7I>u8?rJTnjZ-}M1sJwN+4;Ao8w`Q6;Y|<(a;Ejqm&ojQb%+wtTx<-q<)V*#19CP zmQf+(!B7ND&6p7N(V(<3C129sf};rYG&0@$2?M50NO&;BwCZ*z0;Fw5MuQj$h9K2@ z;+5NRfyhQ=RK3V~?=s9VLI{ooF)9`K(UlYXPm%eNVd=l6y)r)^aAMdugr)t5_5S~( zg`R(D=WO#Q2DCJV*tVsNj>HL&<`cF5i6f3Fa9jz3q2$xVD)pU#}Z&ovLHv?GeyDYpy3@1qqm1gsq#Ax;`wm2hto@il@9tny_u~^LRQSm zisi#2V@VKH0Gegoyl2B=RDW39M~CtQ1iB7k$E(lbg?$}L=^%_JM>_Un+bb{QwY_cX zyt0oBoDu1*!sZQY@$8mbbOr-(w^n1@hP`MX6@_WE9s6F`hN@O+llmhk4BWNY`^s88 z`Px1-OX80HTHwQiUb}%VwC&h{$JcJefj&`w-$7hHZcy0?k6@%}E1rL99bT*M!T?t> z9y9a;3HdNs^Cq5t@_B4-8h}q#;73td(pUG?V*4`>;K7FTJ~EuW{+1LY+nF|5ZQqa+mL^aP_qFre8@#8h@MP~qs;I<&C$8y%#WaAcvdY$j$DWFXlb z!mzIgtp~f{kAxA9_|aM2ieBG{HV97@r3yFJ==ORVkF+;1*BuRa ziPiVlRJ7C<3{r-IGX(wP=54lg{hv2@uU1}_sS~CiR8R8%$Zq)ENRn;eAC%= z02_DJpsst!ctnTs?BOup4q7^5{cC12Cc97YF{RriJKbnbQ`ni3kd#`0vRN}wlI4U| zz4w^tZ``j!tUd1pi56HgiZN?;ISNy(u;}fE9%93wnSd$WkMQ%hX)&PLg}rTPtlo>g z{tV2RISaG%T;RD5%6&o@%KKqVaGS!NV0-UBi0yl-u)o#ERM8Tn!-MFpZ$R(RD5R@b zc1H{29pjjQSihQy#nf(LgofQ{tLlJO~K z#keb@JH`>m2ZZBF5J-pl=2|Jly7VdqpL-6dEQ`H~D?*?f zL)m87ROoubIi1>^{NAlx~ykbfY;$Sz7_u`JV*P3+ z7L(mHXZ}h$gyl&y*D=|j7~N$YQ@V!{cGqKjy&EH8B^2T&={=S<7;B$ofjKcrbOI?S zu{#pebRA9#5K; zm8E73*x(JNUMc+&wsAZuzhl6S#N}mW$dc!X_VzY$t5^OQ4h_E;%rKZH#!18Q7!FTD z;xG3O@Z=)yZ=f5W=SSHXPfJUS+HlO%iyTg;mNx-^NkX_Zh#y1ahtj5rznQaUsdUAH zd1kl_bKkyw>YEDOtH3z9>6u|PG&aKH?n7Zg2Bw$fsgsIK(Ge-oA<;Vn5`ctavIt4C zVkBfjV~ZcP&D_{+#q?5nrc~SaP~S9wn!0{uXF4!vRyMNI9phxe0MkAajG(#IgM&4F za3z~DZ*~^4vy-KxHN+!s-kXU*QjXM@CYwivJQ9^=W|7tv8SBD<%3~(Y! zq)pY=bi$utg(Ecyqn-{l>^q1$?!)Qmfj==-+K>$Vl=*~F_V|)G z6g}P2CPZ3bS#doUvTPj)3D(Ay$$9aM3(clTq&oDQdy8=FupM*aQhX=^}N&>?Nrf~15o zga#yEEq(At%+ju{NDTYo>+3{a{}>$RFa{+|cfgCTjyBX*wqYdZ4TC~dP1bycnKgcBuC$!Z{F99$zm+$CXD zRbp?m2LYc)>PFI+k_J9HYt>`hzD&_x3#tPXliRi|FERRmLg;* zgn(D%uyP3Li>4vlX@xmq2)#}9sI96+Lu(7V21YPu%Ye(OE3?s{)Pt0bDj!LIYaiSm z9|E3wR2^(YWA_kDAumSFE?BG%k%6GJcPXcR)kkTA0SvS^p{}w9b&}8Ct`4c=koZeN z@ytAAxop}S(D8A4sx*(n+b%jsjfBzCik9|1sh=dc(j4L@BQ{T!5jN%}*|M!)oX zwlrzigF@n~rQI}0f7RZD!AKIUGLBoNZMYlvVs}*o8hZ}s%SsuMHq$L~o+$NB=RFA|vD018@_0UjTho%mx_k`GbkK-R5)a6e2 z52ejpaUm+^FA^nKd#g`nSdjxsJg*rt6@0FBS0@>fJjlcJL)1&BM}okUim24*WM_}R z@h2E2!I^??QG%$r^Lq&V;26J|z|(?AL`WK_^fN9h-~4_8m32N(VnBOC!RP)39V z1c8eG`ymMQOEZ}uFnv5S)i*e(($d@8C3#6haX~iHMPW!}Jx6qcz_%+T2%=OC4UI`> z>yr-DFCB^vb7p3vw9uu>^$3EHVHbkH3eeKc%3v1WnIOdR{vh>rECfNos!b4iwtht|e6c%&I7r==jp>PO4o zz1X$GgXHIPE(@<-}8N~LAbTC8tNLB6!1OlK5> z4SVp`^RHu1AO)qf@{ueGj=S;&tZ%X+Co6)UxAvjdYev@0RE&wdP9O+7dxanrO+gSM z81c1X-*eAlPq!$qJ$>lw2uSf{BH1Cz$c~M8{mm9p2K&+1FG^#NDD|nCNOhSI9<0NG zt(&oFYdd_w0l51_krRb*$38#Og-GRO1km`_E>zY9k+z^1E{V-FI)ve-&3JfkNYb2% z+|)rFdTTeTYD36en2&`12JCruJ@&c%=DwKC_0A&a9{B+p8R+1rS14_6{s zUVto7|vq`UaQSQf* z(~w=1362t~i3mXmbRNXPL!xwc1w=PMkM|)?lkYLGsp0tT1AqUO-vE}v6sA`b%8TO;IRupaNyM`@Zv^I33TL^_| zOiXGqvNDA<4cB46)a#ql-u+T`-Q#UA4XI8OhI$TQ_gmYrW3Pl49E95~vdQ`lB%^$8 z;ZX@fbCnQ;#nbdO*I?Vmx3IUmP3m$8J?)b2jsc81Q6^l^PtQcOX%}`@i;VYrr0j$cyG5r-%SE1b82yd=vA0%8vq$n27L#6#?DP=2ckU8G z97OuUVmLwrLg07cjn{Udwa+UA){FLr7W4$7un2+AN>0L1UjufnTZerE0rU#F@9pb} zsrNjo_lYli;`qk|^~w|aI|yoEVyB}o6EcXp78D zRx9$R&w@<|M_^c#QVgQkGYY>i5$Oq{hz3P*8S$g7*^9#bETpC-iyyX|NpZX**eA#! zihw9d>6o+X0$g*)B{*ZY3nK@su%|8oWtU!qn{K}yH(hff$_I9%x~>U5elI%r?MHQs z8MCgu9@pP=6Rx@Z0?c;?V2Xwi(etEUModl<^DXX1w&_PrWU918FdFuw%bSZOXJ3LF z?zj-EiW1ScQCfsuSZMg2T(~;Nq7OF(4cdIUkrKXjgMTmWF@if5g!EiVz zeaZmZ`pvM6jvy)G!=SWJuMq$4t`KHS%Yn_7B>DHFz1xA31!v;g&wL7JFQ0)NNnoN$ z`Yfvp*>g_AxvLk5qO%;U&b=C+I%5H5rij8;e-OL(`jC6>r*OTb>z3=Uz`}$&)K?!u zE4L~r`7yu@%Y9Nm>b4HTF>Mtt;4?Q|g44<(Xxy|Njou*)dD^jW(?NI&R^t4dZ^f;* z-iGt$ry{U-BdYpFFv@*22}6=6sjriyzCL|1PMaf2oGF4K{}@Isu~+G7vgkR z8@9brg@N2cvQwDmOW=JSVzO{Xsm5Vzhfybyy14-dh<27 z`n-9_bC@vZt;YdTKJBy5!4;CG+it!L=Lz|A$ymT#nfTUU)#m^jw{69aRtrkb6}h?j z7Ll8aux54$2RH3Tosg4|vWYhTa=s5On>Jz} zW?qLj->AS6pj z+SX1uPQD0N-f|mmyX^+7boHX`z+S0q?d95dU&L7}ArSj3eG|(0{N*J`O_cWD(}>+0 z8xWm;CN8^8>gU!Qab{^4?!DV_$RqiYVA#)apH)OiWYwnq=t{1@Sq$g4+i>a0B`{UK zfvQdqy!|cM`^rY_Pndy~m*0q6ZoU~eUUMGKK5aP`EjtSroID#j6{q36ORmBNON)@3 z*oTJQ(%ySqstw+3w82(sgF>*}fdMpc--|k54i;Q>J#H3RyYj+wFwf~mnEkdcpm`Ip>?8*jWBw_LLZCl`9K`_27mb`K%w??lz>Z(x_-@N*Mxy5Vx1 ze^LpO%~k{*GjY~s*WwOI->o;CiP;vB$I2%7lXEa_@tL?#@|8XJG@O5_X&w-xAb(JfAx*HRr<9XE|`P#{z`1$)qsBHL+U+3;@g~vX=k2)xZb@@ zICQXAX?k(Q@j>9Y5(Mt8(oXNu6n=Id%IMdGq2TkL%0JsG6?cOB3DmQq-BMwvJD;L^ zSe~KMPd6(0yykj+elvm3Bnvsz(pet5lZwGV^gX^-g7NzH{t z8SsrnM4^iyNd{e4vIQAgPFSqki9|>Ck+e9PIsBu=Ave)j_qciY#=zwJw}bA_ngVBj zIp(7ST`3DOtuzlsd?h~I2T$)1BAFFfv8V_RyR;dr9qBU`p(0D<%jboAOmEhcMU3*N zUrqomldMS0Ekv=W6aAh+^bd5Sf7AkVaREw9Zgh3|5a4oGNkHC)K5v6(kI_p|g7kK6@rIEk5-1 zdN42`Mda*9d#@XQF29iwRE+#%cfp>Sg}lxdbPP(Hb+@BCF-J&)1Fm5&dV2??pYou` zU5vuqBnTH1Jw6dd6|+!~mjkC+5=P(T@5MkzJDL*mke3{U&m-m4 zE9!^>nPe903lGA0WgF3DqPK+@5LUjHycSp~?mNZlrqBu6kZ(2vd* z$(zVpVs;+# zN*y7cWQJK(w5YcOZ9+2VEu5u3M9Kczo?DFKnX@r%v{MMKj5j=3BEhKlY^itF?G!_> z_~BkXMRpUl@754pYGg^y$NaNbpgb!b4q>_3rPEN7osQ^`)LFm{UwboZBYDV831h_9 zkM3?sThcK6fnId?X`9^-gXy;+Map?NrkqXL`N$6iFxp;+>XB?@rz9XUEMawxB0MJf zh;~c+;E91!7?Q?>h$!UU^{5}PO1I^JT}WGZkJPtBmtgNhdrKFF8f#GJ&cZBJKK!_- zjCFar$SW^Hfs`R!Hkj-dg4G9qM+>^$RyguYP+sa1y+fK|N(zeS zR3J+l*wmvrA!(L!OOSj-yq#$8b79)tS(sU#F0v!#o1Tw?S@SR}p-1?>AO5xmG9?FM3u4m{ZJ(>eiPLaKKV8BWkAwk z3J)UC--F)h46Il>9hn&p3Km?YvoWJI8|gzmY9=8vmI$kBs(KeW^Gi8PaN~VZ9B~{+ zOwl{Nckr#8c8sZ}h^RMpVo7C~8<44#Q+Zb#i^Yw0Bn#?PBC#`O2@Enp|D*adeCtU! zf}4}+*4xvgmIv{zdwza_*sH}1O5rDA;H(14f!i&Ey7X3zgGv(ZNI0ybgll0%#tFn^ zsJK-=GzFb$RB!Zkx7gnai19Po7>K<#z_b??m!P1qP!tX6l-pa?2~Fd=x<0&elXf6D zijIzcQKSZu;<8|RNh;E%lVN(N%8SByK$DFQJ~sa7RQ}@Ty_t85Bv@=&m@djj7L`bm z3l&OW2!W9hLMf?8vl*L$r6G$_rPf=ET*vNFj}&EnKZZSh@VYXQB5lSdp{Q^s2lkHObD{txq=~HBgb3400+Do&h5FHY za4TMV{6YNXPk+K+9(){c)X4xC6~#5+g+C#_uTdFo((RGy4qLdqx_ z62j5E8?Qa}5FYsRpK$*JkKm>Kop492NSZKvK=5AroM;L%vRp{EOS~#DkrjI?QtTrb z^!gDV9zw|1fSs>Ai^m?gANSpNKc0GdD{2D{rD#zlPmub`h^;UFh%t%c!xs|TK*HHe zQS!u-IZ0R1q%Yzz%?a!`<#s%UauKzaVE)Ogu(W6p+y3@DJoLm`ynaXs%ZMn&X|r+4 znx)7euEY!X-HV4eY{H(l5Q2IjDjcRm2(eelmRXcT7Z;{02T{B&(zhq@MG|MMwP%t< zZpYIqGLvYwsHH1#s_|f2cLNfTbhO-O<-!McyxqCUW8bq6>1EnWQB={~W}CqPfL@)P4J!6f~H2#s3(Dc}n)MIc$e z9Ct^3@OD<>&1WCQgMaxm{`98@@chmubcJn_8Y3V>fMwiGpEI$XpWlex?fjO2$l7Q? z6xbSU+3+MD{>z{6r$0Y{wQuf2(=gZPGZZ~M`H7AO5guyA-i;gZ$`(?EJi%&UGSoD*g2PnHI$o?@MfJgR<9 z3ubE2UCJveq}`JseVK&8U3*&G5~j$GMMxhB(3tcEqjn+BLI%eDP^MY#qkj0LtY3TP zQT*i(_u>A(KabaUwqj7)p{joIs%7VJzQ)1w3rU&zeefhpU*NE6dkMrJXOXD8By!&v z9}|-xbv1Rp>v0iUQN|I+al`Q^2ps4|unk$|eT2QEG)fWy3bnG64uEfA)Ej>_h;Y5X zHZ#Bhg~xqzj{)}u1cm}a6e4Q*5TBu2b#=AcW5BTag<^hLIZb}4@Kb4UIvr|FKS>2Y zJjQ(uZV8JYC8M2j`Vq-PM@KunUXPY;b{;WcdL7c6+wIcPNgDZqp25LEMNo)w|1rPn zYEn3{;4=(sD%kDXX6u=fACvT~KA#_rt?i;<46DwA|A?@RlmmT1w6ys!=ntYW&xLuj zGU2ovvjX~O-x0>vF zTC}ydW3)I=6iX@_GQi3+ZzJY{w{v7V^-KOrdq^;+qhRK8oO#(bxbB70ulB31q~nS` zA&6y|V97*j#mP92%b9Mt9yi{6Gj6{1)3|PR8S+yOw_Qy&Nrc^&j>1w0yaS@ZcMgj} zo`TGhd{H7sFd%(ZyC~x3Y57Qzu$5ApK&4xrH6f5!{XB~ zz~$F*8O61@@zy(W`?Z(goVgjW3LzU4C49WT^f=UC$qN-z1KLL|SqHkE@hiURe>?~Q z<=f;cLizIZaN}pL!-}aJ7^Hrcq0s=E0I)j*3$*!Hu833a8Bk zx?fv|ZB4@nsIFemhmir}mtdJjC4YfIc%+|}o?0JSInIR;PLy#^yl9VbtTV1B*7;-@ z^*&zz3M^l?1LKw#V#JeLw#DOebLQfd^FM{Fua`D-<8`>{w$I}BOIKrAsZ)C<7NU4s zvu0!I*?KwWdeHFdOW4&RBq6~LXT}VyIOh^vc|B$AI@~B>-Eq|#oK%*q`X$xM_+J!r zlf4l0PdW#eUMqgDmw0cz1GnCA4K7@q3zvg+A$?F-BZ?|hYP{zS^T13>9{9tnsoLO8 zY=d{;`qkygOBFpLFa$q|x6#(69|+2L?xB9cG^voLK#YTFSP0c{0DigF#&UU9WGBp( z5R@IZ*F-6ENw+p{s26#lAN|#v@YIHOSeKlIEAF@z*I#)yRxc`mi`5}s2o)sjM!P)> zWg&mK57Y03TNUla$QSW-Ou@?9N!jSsNq9N09#PR-dc%(ZH zpv)>|-)Q9o1y~vy8y`Dlb(ASdfC#@ab3nIHFetwoQDCP|C4ASeU3lSz7qEHDX4KXm zQX7R295{fDn>Jy~mMv)O=un%5=ggU-2m)sk2+j~>W@e$he1=-j-`m@Z9ox6#<(FQ< z-o1O#)YPO1!_J*M@%-}}uyNx?^z`(qbWH}+!*IFznH!k9y1OKdJ?QG{Qt>Fn=2tLI z8U(!J{bXYx_L}9#kEdm3WnupO3RFnG28FoPh=S45TnCT0AAylD2E3z^{yyy6$CF&V z$jeQ^vL(eRo|Yx$sqOVJLRI0b8~s<^>qfJnqk?87&nL=2lEC*Fy1%%2|K>e_9sOY? zMhBON6sE(`dl0*-x@8~{yRk5Q%?EIB*eL^g7V=FNA<7Yi0p9ZF#yhkj{xq)5GFA>6eeRqZyoQc{tTlZzDV7(z|8X!Ir`w>VRtO_T@^$9`lw zbnr&iy+mNhkIMyzltr3%0G?@pHA0s2@RZ5ZcRmhgK z=0)JHJA{Mv16tUk^tl@=anM|X{Iq1GCrTMmfuEEzbth$;5Dg>2U5T0&4+bpR$S<0O z>5_M6kS9$EA&ngtCKm(i$Sj08zYH@{x^eJ81KPWca_&S&OA}gBxf~@4c2STgK0f(A z7MdH!#3ONJ2`5l7l(Ej5osKMjKL*07$S%<3R^+27Cmks^{q?f}E)DA1ivz7AG3A^J zv$P*KXYF#bkrR}#f=;C7>ar%LI6o6Ekz>`K*trM+GG*r=E76aDKLLrUhy9imM#hnCkl{%i%*&MU@^g^s^kbl* z4b2_W{skkVwAV?0;1gwAO_WawrdcX9k@=gB>Dhj?9;`z{t55_!+WJEjAe5eJ@eZmwaeG#7!?)nIb^$H!2iCl_@ZFoFi z>aRf3Fy=^uvrx)vtRB1ewPDb&y>uLDuR~*xA43@>nC6hA@}-Azi3wLh>?Na#V^R*y zJMr?fuVZh=&`0_ay*NHuV2@!)9e-mDdnUusAI;mJVw8n73r@NS^A|2vinV%k$G3Um zu$nQT0?vk#B&0ws_Yu&IGYSOVYwK!-2sA3CoL?K}8~^qW8StA$sjsWY!Gi};Q&S^K ze~&up=%iJvuwumuQQ)&x*de}66vH+A4u@0C01OU#)v>4T?d_u2ccZnnRR~9|GJSo$ zim1?pLZfOnqP)C({1hV&j10qKVK#vdAth~XqGDk>0r^AMM6(z{Ywn-fsqVSJwCSxi;hB+EIi1HMp4E_Gt5FH(cucI1uqeUo{ zfhyA}ahU9|rwFkg?LhS#m1u6OMP+3b_SgB5JbMuq&k`leYJnv&h|r*r;BAM{+#t%+ z!A5ujgJ_NBVPTd zP?&0wj=+P~eH|FGWuS0oDk41{qI8Clv$8~;V$`y=8;Rw`$j_a8iqRNGhdt=1Zp5f4 zV)%2M+Whl9>uudImBrJOZ*7+jkvAi{$B0eJgy@ zj|>f`VEW8LM2tMxVP82X^nnz8%$Q4P>C~w3V1wC`yXm0hf@k9*JlF-UFzu zuf(36_2~2^Ah}o+#-OA_6t7TheM#89u2yu4GVGW!8~OZp!`LW>I;&7Sl!@H@JmfKB zVITUtI?>eU#LW3Qut&XU+}eYr8AZr<`Ovm^2VU7!g{Hba*mJNQz0TQKwQw485}L7l z%T8?GUWvxqz1ZF0Lt@batelq%N2CvpJKb>3pDuMSBqmj4s;eHATdUF3R)@X&52Cgw z38l-IVO~)>Y|<8bYwOS-O-5#E39{Lhj|DO8=|EKjP&6YKS>_(>-?ANVZf05}zS=$v zXI5a<0!fP~_Y+@wiIOqFYIGUUqGm6;Mjzr?w3$9~i`h~M3{ zXzmKZQJgJfWD3$m#(Jv`3W<_FP1@A1J&ovzBqP5p1J*GQTDI&H!dMS?QZ|y)bCH*o zh)7=}_Kded$&YG-LUvLzkY)+OFa6*CeTUG*Jq}GB@S82tAEaZ}oT*PS8j>_O?UOVw zl`&rWl&th9ytM~WwX+J1t+m*_SNcnT3TCcYqSdQS$}JV*=MXCQRO;!jN9#}$GN)$( z?KNnstwB|dw9~F$(J`WMrb^$*)8i5&qKovSY3n{T8Tk^@6KH8i|BxN|3(Jt@l)lF9 zMZ>23Xl$&-q1tNfIUwyhdzOsrvrynnL`eFm_DOw|s`sWocoVWPyW9$Y(_Xy#N((G= zD%1&eRz*gqlC3yCsi59?LLYM~{p^~G6&GOcyoHijlTy@axU_+%262fHi2)U4k^vej zvs}|}*m2pA@f`$XW`J+*xtUA6sU<{I-e=FAg=Nc@V$q_-$ji-DL?axLyo(=xYavk- zVW-2Ply1%@WMyRvp~zGUJHsG>C@9Fs{Q2`xTwJW4r^3%KGshlt%JlJ<_DlztEv2|p z)Q8<@pPw&^d1{KP9NIB#zOk7-OB#2fC?JyOSkNC0%Z0>)etA4=VPR1WnTV>5X(^&G zrKeiq5M{wC%6d}5sH7*XR)jc{Z73?u!K~Rum{yuCX>h1POjV}*8s(asZO5z`Stu*b zlup_zX;wZaKwGC9MP`}}vu9>uMj79rnk9Wl`u)d&mUq5+NU+!86HjAS7hDe4)1=fUnw5v4f~(<|m;T44c- zGhM1JnGzjHW4g0M0Z2#`UTVESQrI7iVn~wDL%ENWUok7te7|ra~wEWtI>;hbd9Y zTjI?-TwjzGlgSKcI*&q?zQxRCT4F1Ts8iCKo58d4C1VUf(JAtpC4CW(R84}#kPYcK zEeU4z?GBriZ)%nh;o0*sPe_T~VMn4o>#$j+9$m;Nn1PwIXJclLO~w+b|I`ds7cQHW zFXbXN4Jpzd66Lw%^c+z-=V8gLJW-YtRe7^+QnRECC0!0R>S^WeOwAN!U1VD1ODGPU zR*`k--_vqSF@1Ig<`g*9#^-V9jfU+y(U~seN)ED;Es`cF3z5eRDLXDlwKzqw%qm9t zthty!Jww$y6*jY7n_1H8ohh3FjKg9V`LT%dD0L!jFEdlxqAd}2k--VF%CU|g*^@fR z(BIkowJ#K16%XrN=7IN`j<56Q!IjdO4S4<{T;KEFq+3sW-}n zl!=w;kamzPZ7N-4G%Gs=)&z^nb5=oy)V~m9$Dyq@;*nA+1!xg$%ipBrHiI zWy~sLBEQR!lAVVF&TdFpcAMNwKVxM(&&)%XjI(KJS{qEBvJDEUmHsU)UF;=o7HLnJ zIRz-IsKB&>Toh1lB^~TTRaW&s36f^Vc$)d`m2^q7|0Eduhj8;-FIN}?LosAAcX?AX57PpsHZahz*Aah%_&R&J7;`0?+=zvDR9B`&cax7e{|MY2Q{ zQWQyvMIyy6b`l_1P>2pJ+7{h*(GABLg3yBj@X91ukz!|@Ip z26+x=R-!u!1)7pPMn)3o){ci@+<4b|(6kzmbd9xRAbJ+Do(2r`)FawkuU#fMP|2SW zf-kE8X+o;f{8{o&0l7;qBp$_nzgFe+wKYKMc=E!FRs#Wqk58fAx7e)se7HF%GezvF{^?NLkU4 zEEt&6y=DaJghGBuhD^tGkPmBuEKw#ICNXABJ3l50*jGS0(9buEc1YZ|!vF}o6# zmzQfzJG<@7nl)3q6tNY+iVe0-a9ULEt1yx0vF0-%&*nG;`cYO^rmY1u*4(p|fC7Q! zoMGlO>8BkRL3p=3PhrAV11{oLQBjUiLLBfq{o!>Z8btkzf1`l{#k!?Xu|h|mXFo=A zJKrh9S(#X?#oD@pEac|}k)6XXR2;)$h&+ibxh!j`=mCXNC=`_U&P1-b9qL-7j*J^? zbeoY8P`7z`e1Fykp6g~Z8RLpI{D%C?R`w|dnDy*6HVn|1Pi+OFJx^%Efn+n0wiu*1 z5D~@}9QqTF8xhQb^^qvM)|nr#!^Aauyoqx(y^q9zTYH{vY4$i_LvH&`*O^IW`p%5ggbZ@R^k)Wi=o2I{lz8dasxsi*m5}lWv**#*K)B7=`(uPWQ+zZyFGXiG{>#YA_#V z6@|#ju+vxSmFpfR8rZ!j3q>=gAU~5cPZ2I3Iyg8uI9wbPDiFwlNW24n&Z1&k4Y<-V z3A!Oq2{-INCu)Lyktqn`@wi^+y@n(w6=HIZ*DcwndxDFW@E#H}>xU(5JkMi_4*Psd z>e;eDaiT;{?&B1voKlrwO9Mp$!@+y59!OZY3X6o9!IIFKXi`%utMSS>J;x-8)keCO zY~yizEt$TTA^KXAO0mTgVkG>W8cqd*To@w%a?v;$ZWZ7)Li3V{1CA5XLFMv~Y0@u$ zv?g0_RPmcip(=Ti(*e>mhY5p5XG##kq6N5T)l$rznq&IkI~ZsL`QT5VhULF;J8qm_ zr2RqV2f@D%4h{|u4j06P3WWYBh87=VivY!e5_h>~$T|CI3tdwqAv3k-B;&l!ntc)~ zC0km<%UO_Eqit$sY1~)$LcZuP$v@rk99s>vHdprfT(6j*-x(4%URQ`ev1kmZPo2_P zkvKq^gOI08nW6&Wii0ng4DHimT1k`v*s@-COk8mTr~+Qe3F`kn0p4-r12T7&zT2S4*bf6fC?>_gr70p}rm` zYpQYh@Ih?dx)pD|bwI>HE*33Xq~jDQCg|@KMdE#jiKU$2{?LL>0!KPWfr%JSv8(w( zj0AJZjv@X%!HJo)hC%#co1qI9vj_ zsJ$>;{5Uu`I5>CA1FpT$*B24uHmHM~Ii7&xfbQ!>80_A&8{4+Mj!m03 zV%@rzMI5}P04G88C0qEMZrZ z^KpuU#7akLiM*vX`T}Mx<}3bXcOm8{y)Kuncu+AQPUy;X;WEecgU{jt(}{VAZf!W! z%~1Gwx5Fiai{1;v#gBu7gM-63F`)uMA)F{x2s?$r5Ttg+@mEmsmsY=wOCUAnuv(Az8TEbqkkQw2uT5HxsSd|G>dzV9Y{$v z@yzqQPDoajylTfGn65-R(3#3Y@0M`MF2#q*?_!DPIXE~tI5;>sT$10fC2SfVerc0CTn*q?KHkkfXbXa0X`27LQnmH3o zmo3BcWy`U6@nT&Vjl$$ggW+UQdwRNcWym9k_M)@B4gIkmgo1-eOXVVITvmPnDLy|2 z(np60mZg2R5(qqKRLV7s%ID1aL=AQBW8{ zZ(0JFw|I{ZTIMt49u*19!*nBlnlT1+#>{Qp@%i*q_Y>gtl(ZuF{Nr0F&B4LJ!NI}7 z;bI_XndpVm$l@mq^8)425eO@vm+(O8pQe$i__u}^3 zZWnQ|1XHG%Rs-wyN`i3{iS(hSrUr)&?MJw~Ro;h0RE*4%HpnDPh_6JFnwoT8CzR%1 z7ymR4#D;4386}eKxL$$gGZJ|D$MGuiSKVn0F&~N%JU76bTjB&~FD{O6$Y^2A` zQ#8iCxl_)|GnvnrN7ZLOUv~7Ix-f3!M)lXh!NI}7!NK8Lz=X0E1GWCk}vB{yB!Ik=74A0 zqCisU_nU#yB#HXW#6Hh+d4DcqMsP7V`bY5ID++mMhOxV+TW3}3>5br)TW-hFr3*2= zyi~$&;>{3GZWDV#hPgWwdY(3yt{X7zH2IhTJ;yY*E^vJZy+k*1lJU#~BLKLHw@>n{ z=~_l%OF_zO6b2Ng%zq|tQ6!lAn0M)x&(IbM0iVG%(pCpC%~N6;p5YX7aBy&NaBy(A zsxhGgfqX~_nKD)ighcJEzz*=V1dK35-lt@X3!iaI5=KI1L_k!@JzEZVo}z$e$e9?Y z{1iXwp4aWdY?jPfVQ?*hgRsNlE)hey$S*9{cvEi6_>*_h{_L_<@=4M;C`OT>ZrFk% zZfN38ohazTWHfG=$5@kZT2Z`Rf4pM?7*BS_EXkyrf7l?v?r4lRx@BvY3e<#XNKG|) ziTBcfUSqzbcP7uVOP3KFCOu3VXr8mjVrH?rE8jxp;Nalk;Naje7ECOARz7BGOSQIJ zjI9amIz-ZD$vs5@&ymC#Az)enxWF0(Mqh8A-Wv*qv~_`mjjaVr&ICN>b&@aMm!6TK z?nv6K4U_0=1QJ#*>K5+oKzDbS#HEnYXpat7W<*gyagcUzZv;JkQ56!xjO9i{P#GV6 zeKEAQ_n^708{w`9VsW`nCqi&1n=$V&A22^rgOaTKe3H)+aiOas%Xyt%RFnYM*gz`PO>$J*Tf42-7q}7PsIU4A%64O zv?0;p;Nalk;NakJ4PZi93n$oNcOMcil5{2f!knTpvzjr9k|pm-%EYZ9T&8;mXDFgO zk~2^ zsINbT<42F+=+VO>s^+7!OzV57$JXyOdOpucv4=ZkbQnVvv@` zyu=m*o@0v^{WNQPuzQ?NsVi>Tg@}HM+|WGD1*w=X=?^ie_ZyMSYZ_(;2L}fS2M331 z029huSUbyc13q1sfQwOarR2oSLUN8oiu@@WW#9int^Fr?V@>dI>w;PIj4LtooZgTC z@27En1H1Sck0%QOoi@*Ii- zCH=;4-b+zB$kq)xW|%k*htvJiZ#gS&92^`R92^`Ru6|5-wI+#?61BL910h=!23o_< z+FKP2tl1@*GVZN7Ak>|ZDXo_!c@vUH!NKzs4k{i3el;sDCJRU((e;bTjH&yFGB6sD&8kmOFuTbx!`av8lm zomE&HZMd#+cbDMq?(R?=N^vjlQrz9OxE2bu#oax)LyNn+OR%u>uWPM6hjTVF$@l7W zKdBy*Hr8ShK=BPFu(m*hivhmif=-EYdQ1e~^vlGNmK>uGX0mVc$;;s#;%8c*MXHBk z|NnnfixiVNq)wMaoj<&fAN6PCt{p$n>QnT-47dZ^Vk9pI1$LDw-u^CK_hSa)K~vq( zUbjSTdErw(Q~U0IL3ByeK>n@~yS8&lUM|s!BPw<4)lhN>M6NRKBq*cv1#Q1xj^yC_ z*F9<8@>tPgae}`5Clg{S{1F^xT=fF~L*$E$L@1p7i-!TptnyQgK*POo^0|X=g4J-!QV)j^ETu-7#D=1H5@x8p8$x1Y2p3FA|@vQKpm9f z!CFbsCL%f~{D|(vl>$OK@`&r%5Yr|^<%Q&aaGRIWWGrV+6u-aPatvdz4tBA2lks(od~wW!-1p&c zRlTIGiVCOeZXJ)P`=*AP8D~36=xqs$c+lF^R9su@qA2R1SD>2BmB`pbwB(fri--t$ z(=5VzHQ&6w8G2GL4ZY|R4+xaRktG(wfcFr|QrbXqb+zh*LRJv2iwf>A+l2q{lU`&V zp{K+gY8mmOmDy8uebdjxcKDrsc+mV_(JQ_9J?QH6T&`s?okPX;>rYxBbP?r|?~pv! zMxuZgJ*nDfUGt08Z;WhXL$4H_gf@SkEGD9C>K&EntiSA29iu8oJnS9Ea$*23Miibdzi$5gawYQ2B62U38;gKv(wbjC{FKAh$<{3$4A_^d47IAUHqPhfeSy( z#!^W%gZDQwGP1*DN$bKLjPu8D75AU8Y1%W@bY?%4Gybr_+qoCQ%K56U&q9jF zGXnta<_4C^V!%XF{vBeNB4*_5#y_Uh23_&Cw1EvS&*)Md@86?iC~>Rz$aV+Im^5u@ zQBU-^lcc%cJe8z8MRW#Gw5v_rMF|^+Wm3+GB6Lr;Zr|5<)yvC&D)HU{5dSg&L-&9q1Ou1X-Bt_0jDu>FDonY5q&oq z06>rOrn=&i^QB49h;R1y{=utveH?ZiQf8KlOtdoUFc-^04*j?X#O&#WosQb3>Q^x#BE)KhvZa11MhOO{)Kq0%ftQZnQpXh3(*o&l7(AkK_6A zapc+2_gHWT<*zcPs(P%=l!OaIDkLEZ|*`6fJcj-088WCdlBL(YV|e_Hx{ zJ7_>_s;kA7<%D9+w)aPoI@>u5x(0EoAMH8MZ97rVzp7Z}G)z|`Y3DxA}IaP^%gA`i+jEStMSbUIc&`zUP&+6hog;LPORa?QgZUVJ&Ds-j4}2`zUTh zkdi;UjmZ67zKDO){Oq~`zo>F%W{-mXKZ#UyB}7Vsgt5diYE2KwJYTIIT$Y@lI4mnE zp}wg7En&npO!L}qV|7F$!9lo^0}b~kt#<%Z3onbee-N2cR8#}^?`@l*5*y$lh2#9F zuS}8bQRX~7+UG1}?IP}>-QRbzrlJh3CCiI+A}|oL zXC+vvDT&l;msmV&CO{ttUto~&$8=iG(x@tN$yWtB4W$OJkpA-jrv~swIHB9FZhEWs z<~m)~#7CcV5Y}_8B`@v@tvhRd0#b}UikuMg^X2DfmiYPZXm9%au=l7ivb@0JrVSC&31KDG9o;N3vM=I08~C80$8 z$C0{3{7k^%0;p8tMdWQ^Y01pRhGKU$izO9t1bQ6qVP77a$R>Da0}Dg4Vs z_qmMD)BH!M&caG553fDo;)UJgu&H`BVI{=NhoprAj zrh}NK%aQ5SI0*MLV&oPxF}wUpg^vr%5XbM~!p4nbt1eChM>t5#5L6+$-wU(V#`o%Z z<24bVjj+u(4G3}{ex2G8NZ1l(;_#bB(GS4yT@HX@Gv=xmC0P-0n?c1xniD<`HW%9z zoeyz-UUJ=6tqL}mI4!|LI=%0Z`xN(m=w@NL^-$?;+d*RJPC=W~=_FCF;rt70QDJOJ zN21Sz521m-{uhSbdu}NfWWEv4(&inus*eQ$w+@c-c*N`TuOmPdxV*WXFx_}N*GcZ3 zZ_Ukue)mYHr}oVV!HTrBTOP5AGY9JfuTNK5*8n*i!79F467sX8{)XU(%{IS?&`*-@{*o1O=}->KuWMfCSE2=%KG*ciasPy}I%uXT@vC zB!ZNy_c{m##vU$+@~>$jE?3_dlsuEunOTo>G`R4Xcuun{n$3}BiK@D`7pg1V>r$T~ zOP?7;@u;m=5XJTa#Rr!7n=2{!BFo>cyqnNX{!?66IuL$uFjpX&TZ}P(lFzO3WXMNR zhEf1RR8dk63Y#48^z=@`{I7q01^68VCnGe9M%&YW``(Ztw|SN2HJ5RfIduILKa5f? zyR@ZLMxNPUBOJw`I(~{Zd>(!YN3uf1DX^&3%@(w* z{B}`TakFss#!`6MLwxnR%y4s}9sr>D2$$$%`1RZjK$V&ef-2!g7wJNN! zh8o5z9~e!4>0gq5JV(TLn7(10z3iVRHn?eR+$?~F0%A+EVQLLgA_+)%vqVKIw48wJ z51L!AP=DB95rBL`nlhWKwzld?U-RjvQsYbnSfP;@NNzsF^ zH;@GlDC~Mz-Tlk? z*YJ<-H2$<2hsCa_CGR5HN?G2G6zre$8LE&wacm+Ev!YlstXk1BdHiN#3jtFkj$*C| zs@Mdd?1cl>{O^v(Zr)4jP0bR0j+^8S z7PJ6`L63lC^pT)X-bO5%lFgKOtjJ6bahxJpHBn+Ow)x*~(RwY6WEXW##j=@Gs266M zLph(cGM*4OW&`X<^I2+k9ISX2jOyTUjdHnFC@Nfoj+8?|w%XyM16n5;9 zEbnIb1>MJdgp%B}nJ7ajM=@Su&Uar&^!+M0$vgOT=DJ;hyuaw9SE4_?^K@>Ej{>1% z*7YlH;rphu1h#??1ARa?5DE>O zZdh+Q^*E$WoeMSL_ncWVJh$eBR~ztLd$UpW0gwP)K3&%a-;ek_(G>L^eY``2Z^xM~ zK4^ir@BVugro&r7;N)wO;2Q?epm#8_dXIi0ZZ)4^-2)+LJh&%mx_N7Ospm!A$Ik_K zwN%pkfmH9KbSBSb*Pndk2z+}6x*@HIFneSX`Uf*%PQ?1l(j3A8>3>-|H2X(3!RccC z1DI|%B#`Mk;Vv~_c6a@JFwNn;NFzF%taoMS2tFjd-uQT9>iMA98W9kG(hoRJ-5Mzh zeCVw!?;ysWkGdN#XSnuHexn0laR^wNzS;p+o>2qNx+w-fUbZW)D~f#Kf}b9aAQnLw z5i6MI!YVS{ld+LFI-Lj88R3h!ajA?53k#_Q8D&7O?-|I!lw24)?oo45BX=rbq^KZx ze$g(`ec77d{<%{Ho|Zspr_qzyY1;5E!qS*PFfrlF?<|ksOe%xCbnn8Kk^p;e0=f%4 zDB5#Cl}fAh-vj!zASYj}Z2eR{N1}n5(CK@5UDZR?0M1tTB7Va7lkgpET=%L*<}nW+ z%%Z772NQ}np)dfqw(FYP%NeX2a9HTR zU!fhM1dz*h^_wwxJ4WnG0dE#rp5apT`x6|T-a*P306RLUJDFxa7^U(<9hO<*dIWUj zWazftu5NAz@)dp6;`8gwoBi_69Q4Q$>9a)`9II;RWp?%0JED+@PwlYE=5yT&7U+2b zS}MLS>s}XJeK3GeHySm_NhD=Vg)##{6Tdc_;n(a@y3bPf2HDX`EU!*pm8~{YPeINUfzRLio{_nzlg<* zko%)OZTNGbprG)ECw<4}V9M@KV#a3l#yiXHzGWiCN;=aldnA5H;Rv{$$gRl@zs&tOyPqG zqv^L`Y7HK}r)8gqNhd*{Kn(R>PjBDH`=*D_!$X1K_0~to44ZJcOYlu^-Ogtgi0pN; z=b3);PnBdQQt9`%fQU~hu7fpxP0@z4Znn6E;77E##aD{H0&iAH6BB6bbw3Dw;f{Y2 z^JhPWi}c{;KhR^AK=EGa)`-hTGNP-4K9YXF(uWXa3eq+}1W=Lb6CnJ!Go%>)v*tXo zUV_8g6)1FR)Pwh4K{_{`x&3(uJ!k3|4U>{wDKz*JFqzE-%d_yNI5DPRZbI<363NKS zF6AXJxzzq!uYpKlvLF%=bn4NVB5uW;=_r`Es0fG6q|Jy0kRPU;|9QUnr$dv{suuV@ znU_VEArhJ0`@n1PvKLdXxH4}Vr_l2(NZ#WDe|WHO7W(s~fW<|@PgO*?!(h($nD6b= zcsZu;c=-v7^YB#sxTX(C^-aNt&e>2HKe8QqjKPYr8X(#B%$W4Ii3_g0;^|w2k|}jM zAZ_36rasTP1Nmv)12dCVKTdT43KEx;8Ek?~keZ3505eZ| ziXGKoFdqI@usRS=sP*y{Z~3RTIbjHsAvgX zVkS4wfMtE;9_lsZ!7R9MHr)R1Encr5;SVO ziW15XN`2=1uNk(wh?`B{X}{oE?KDcP$80?8X7bd=zGep;A-q}&uOL@;A->WayGTS# zNxU+MnxsVAO_2AM7JfFbSzE8JdCcoccUU&0oEjI3^Tq7I{_vz4J zIXYd~68-s+vF<_DYT`}n5d{JJYA{9sG&9z3eR!8`h|+v&j2ROM_|f?D_qw+N6hSOM z43T@YlXNsbaIT65?uO}#hA+7f)r2M-q#cFymJ~O492TQC;tkytdeb+25|>UY-jwq1 z+OlkZ*3C$~X1?MM2fm2xgA0h?=R$`_)M(y7&$B~&`!s#m$9k|A(X!@d;z*u@LkEJ1 zOiKcsMSz7VMuH5?_?U1o(YsQr3qGMhDI=DIP>s~?y5wc5aZQgSfnK`1G*Y#a_1^H$ zMr^#pf^K;M`t>C=qAXbHM>-6uNIS|}Ec`NTS&;$TtyT<)*WucFIv+&wR$tVhn~mUM zUGNM|_C`S*uPXbP>9Z7wscC;>N(Jlw`^hc@=n%C2af4}LzQ^Cy;wzE#?}`2vW#hlW zzL7y4z^t+%XzRE623Sw|rMQ{&+OMWUTP^?!6 z_O?I(Uy+(qttZMf;EYLhi<^)l(2Az;eXRBR-^aT+>)B0sDLk1x)ZQ9JSg#|rvq>Gg zh}V}Nhbpze+VAk=0yqZF-1)x%i z@W#G$r$vwoRybN*K?$dk&NqaVT@6!!_XKVzB>Yi0-e3Iny4}P~UPmx@HsbGw_=KVb z%U{pnbiX&JC@v`O`}z5KZgb+d(=8tj+%qN1mm)2#QFguNLol~ZfZKd|4AdZggO;*+jV()>G8Jx9uUOp1#ax#K6Ai}kqB@h zLs4g9FUclh}ndQ@Wl5?a2T3Uw1GxUFXh1FTMagj*39h?{8 zu&tM!^r-s^5bX5>?~jY?37_Y${GSLmVmq%4Bg+=nX7#?|@fF-=q`60ZylIJNb2)3N zHIa=xl3iTS7{zs7b|ZSTc0ez@UDzU}eW8D|d8YipQ7EsPD?P(ywL-*_l?NNGf6Tq6 zKI|@C0|kouUtkjloGfCL_2(#@WnXu6>mDU}rt?LkHvC^w1SEd1-*~(g$7(ahH0Mho zx>F~P(OYS+HrcgxpC0TqFj--3@Y!g1cOanSXSBJvunEI1)SI0Yv^{Nh*1I1Bw)sCB zsSs-RGyMGIXQFOrU73aK+&ygDBJa%`XZ~er9tPQRvTVT`f2Y5Ug<@!zZsI#@B0TLH z85x%0#lpu|LRZb%$!X!}{@!z^FEpI_i}iGVtbU_46%UVgKwX5ExM)c( zP2h#Ci$vsM6t1mPm5hTjq}@J%V?&L#E1d?be+^I9qm_eq%aulX5x zH8J(Q4r8Pu)&S>~h-A8@^v_F`XesJSjuh2+%WI+>3NMPjnsX*FS00-q2+dxPo)r}veEy461IzD9pM+eXI01A_MydBRh z#R6L}0kh8}xFRv18%0DWC0rb;oy@MC+ebM>c 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 literal 0 HcmV?d00001 diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst index 598bf3ca9bcc04..2a0e7b4b06f586 100644 --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -307,6 +307,46 @@ settings and replace any that have been removed or modified. "Uninstall" will remove Python entirely, with the exception of the :ref:`launcher`, which has its own entry in Programs and Features. +.. _install-freethreaded-windows: + +Installing Free-threaded Binaries +--------------------------------- + +.. versionadded:: 3.13 (Experimental) + +.. note:: + + Everything described in this section is considered experimental, + and should be expected to change in future releases. + +To install pre-built binaries with free-threading enabled (see :pep:`703`), you +should select "Customize installation". The second page of options includes the +"Download free-threaded binaries" checkbox. + +.. image:: win_install_freethreaded.png + +Selecting this option will download and install additional binaries to the same +location as the main Python install. The main executable is called +``python3.13t.exe``, and other binaries either receive a ``t`` suffix or a full +ABI suffix. Python source files and bundled third-party dependencies are shared +with the main install. + +The free-threaded version is registered as a regular Python install with the +tag ``3.13t`` (with a ``-32`` or ``-arm64`` suffix as normal for those +platforms). This allows tools to discover it, and for the :ref:`launcher` to +support ``py.exe -3.13t``. Note that the launcher will interpret ``py.exe -3`` +(or a ``python3`` shebang) as "the latest 3.x install", which will prefer the +free-threaded binaries over the regular ones, while ``py.exe -3.13`` will not. +If you use the short style of option, you may prefer to not install the +free-threaded binaries at this time. + +To specify the install option at the command line, use +``Include_freethreaded=1``. See :ref:`install-layout-option` for instructions on +pre-emptively downloading the additional binaries for offline install. The +options to include debug symbols and binaries also apply to the free-threaded +builds. + +Free-threaded binaries are also available :ref:`on nuget.org `. .. _windows-store: @@ -450,9 +490,29 @@ automatically use the headers and import libraries in your build. The package information pages on nuget.org are `www.nuget.org/packages/python `_ -for the 64-bit version and `www.nuget.org/packages/pythonx86 -`_ for the 32-bit version. +for the 64-bit version, `www.nuget.org/packages/pythonx86 +`_ for the 32-bit version, and +`www.nuget.org/packages/pythonarm64 +`_ for the ARM64 version + +Free-threaded packages +---------------------- + +.. versionadded:: 3.13 (Experimental) + +.. note:: + Everything described in this section is considered experimental, + and should be expected to change in future releases. + +Packages containing free-threaded binaries are named +`python-freethreaded `_ +for the 64-bit version, `pythonx86-freethreaded +`_ for the 32-bit +version, and `pythonarm64-freethreaded +`_ for the ARM64 +version. These packages contain both the ``python3.13t.exe`` and +``python.exe`` entry points, both of which run free threaded. .. _windows-embeddable: From 12557154c8afe618c54fb4b82180bd6ce32d4545 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Fri, 5 Jan 2024 14:09:19 +0000 Subject: [PATCH 18/19] Update variable in build script --- .github/workflows/reusable-windows.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/reusable-windows.yml b/.github/workflows/reusable-windows.yml index 452cb98144832d..c0209e0e1c92e9 100644 --- a/.github/workflows/reusable-windows.yml +++ b/.github/workflows/reusable-windows.yml @@ -20,7 +20,7 @@ jobs: - name: Display build info run: .\python.bat -m test.pythoninfo - name: Tests - run: .\PCbuild\rt.bat -p Win32 -d -q --fast-ci ${{ inputs.free-threaded && '--disable-gil' || '' }} + run: .\PCbuild\rt.bat -p Win32 -d -q --fast-ci ${{ inputs.free-threading && '--disable-gil' || '' }} build_win_amd64: name: 'build and test (x64)' @@ -37,7 +37,7 @@ jobs: - name: Display build info run: .\python.bat -m test.pythoninfo - name: Tests - run: .\PCbuild\rt.bat -p x64 -d -q --fast-ci ${{ inputs.free-threaded && '--disable-gil' || '' }} + run: .\PCbuild\rt.bat -p x64 -d -q --fast-ci ${{ inputs.free-threading && '--disable-gil' || '' }} build_win_arm64: name: 'build (arm64)' From 8d54a59aedc4d0b0a09c632360cba9338dd0b18d Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Wed, 17 Jan 2024 20:18:30 +0000 Subject: [PATCH 19/19] Add experimental label to installer --- Tools/msi/bundle/Default.wxl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tools/msi/bundle/Default.wxl b/Tools/msi/bundle/Default.wxl index 4091ce531afcd2..1540f050159a54 100644 --- a/Tools/msi/bundle/Default.wxl +++ b/Tools/msi/bundle/Default.wxl @@ -91,7 +91,7 @@ Select Customize to review current options. &Precompile standard library Download debugging &symbols Download debu&g binaries (requires VS 2017 or later) - Download &free-threaded binaries + Download &free-threaded binaries (experimental) [ActionLikeInstallation] Progress [ActionLikeInstalling]: