From c3c21b4139558913897c57849116a23fc62d7db6 Mon Sep 17 00:00:00 2001 From: ianhelle Date: Mon, 27 Apr 2026 09:26:37 -0700 Subject: [PATCH 1/5] Fix tar-slip/zip-slip path traversal in archive extraction Add safe archive extraction utilities that validate member paths before extraction to prevent path traversal attacks (tar-slip/zip-slip). - Add msticpy/common/archive_utils.py with validate_archive_member_path(), safe_tar_extract(), and safe_zip_extract() functions - Reject absolute paths, parent directory references (..), and resolved paths that escape the destination directory - Reject symlinks/hardlinks pointing outside the destination (defense-in-depth) - Patch geoip.py _extract_to_folder() to use safe_tar_extract() - Patch mordor_driver.py _extract_zip_file_to_df() to use safe_zip_extract() - Patch sentinel_query_reader.py download to use safe_zip_extract() - Add 14 unit tests covering valid paths, traversal rejection, symlink validation, and both tar/zip variants --- msticpy/common/archive_utils.py | 183 ++++++++++++++++++ msticpy/context/geoip.py | 3 +- msticpy/data/drivers/mordor_driver.py | 3 +- msticpy/data/drivers/sentinel_query_reader.py | 3 +- tests/common/test_archive_utils.py | 170 ++++++++++++++++ 5 files changed, 359 insertions(+), 3 deletions(-) create mode 100644 msticpy/common/archive_utils.py create mode 100644 tests/common/test_archive_utils.py diff --git a/msticpy/common/archive_utils.py b/msticpy/common/archive_utils.py new file mode 100644 index 00000000..6afa4088 --- /dev/null +++ b/msticpy/common/archive_utils.py @@ -0,0 +1,183 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +"""Safe archive extraction utilities to prevent path traversal attacks.""" + +from __future__ import annotations + +import logging +import tarfile +import zipfile +from pathlib import Path + +from .exceptions import MsticpyUserError + +logger: logging.Logger = logging.getLogger(__name__) + + +def validate_archive_member_path( + member_name: str, + dest_dir: str | Path, +) -> Path: + """ + Validate that an archive member path does not escape dest_dir. + + Checks for absolute paths, parent directory references, and + resolved path containment within the destination directory. + + Parameters + ---------- + member_name : str + The archive member name/path to validate. + dest_dir : str or Path + The intended extraction destination directory. + + Returns + ------- + Path + The resolved target path within dest_dir. + + Raises + ------ + MsticpyUserError + If the member path would escape the destination directory. + + """ + member_path = Path(member_name) + if member_path.is_absolute() or member_name.startswith("/"): + raise MsticpyUserError( + f"Archive member has an absolute path '{member_name}'.", + "This may indicate a malicious archive (path traversal attack).", + title="Unsafe archive member path", + ) + if ".." in member_path.parts: + raise MsticpyUserError( + f"Archive member contains parent directory reference: '{member_name}'.", + "This may indicate a malicious archive (path traversal attack).", + title="Unsafe archive member path", + ) + dest = Path(dest_dir).resolve() + target = (dest / member_name).resolve() + if not (target == dest or str(target).startswith(str(dest) + "\\")): + # Also check with forward slash for cross-platform safety + if not str(target).startswith(str(dest) + "/"): + raise MsticpyUserError( + f"Archive member path escapes the destination directory: '{member_name}'.", + f"Resolved path '{target}' is outside '{dest}'.", + "This may indicate a malicious archive (path traversal attack).", + title="Unsafe archive member path", + ) + logger.debug("Validated archive member path: %s", member_name) + return target + + +def safe_tar_extract( + tar: tarfile.TarFile, + member: tarfile.TarInfo, + dest_dir: str | Path, +) -> None: + """ + Safely extract a single tar archive member after path validation. + + Validates that the member path does not escape dest_dir and + rejects symlinks or hardlinks that could be used for traversal. + + Parameters + ---------- + tar : tarfile.TarFile + The open tar archive. + member : tarfile.TarInfo + The tar member to extract. + dest_dir : str or Path + The destination directory for extraction. + + Raises + ------ + MsticpyUserError + If the member path is unsafe or the member is a + symlink/hardlink pointing outside dest_dir. + + """ + if member.issym() or member.islnk(): + _validate_tar_link(member, dest_dir) + validate_archive_member_path(member.name, dest_dir) + tar.extract(member, dest_dir) + + +def safe_zip_extract( + zip_file: zipfile.ZipFile, + file_name: str, + dest_dir: str | Path, +) -> None: + """ + Safely extract a single zip archive member after path validation. + + Validates that the member path does not escape dest_dir. + + Parameters + ---------- + zip_file : zipfile.ZipFile + The open zip archive. + file_name : str + The name of the file to extract. + dest_dir : str or Path + The destination directory for extraction. + + Raises + ------ + MsticpyUserError + If the member path would escape the destination directory. + + """ + validate_archive_member_path(file_name, dest_dir) + zip_file.extract(file_name, path=dest_dir) + + +def _validate_tar_link( + member: tarfile.TarInfo, + dest_dir: str | Path, +) -> None: + """ + Validate that a symlink or hardlink target is within dest_dir. + + Parameters + ---------- + member : tarfile.TarInfo + The tar member (symlink or hardlink) to validate. + dest_dir : str or Path + The destination directory for extraction. + + Raises + ------ + MsticpyUserError + If the link target escapes the destination directory. + + """ + dest = Path(dest_dir).resolve() + link_target = member.linkname + if Path(link_target).is_absolute(): + raise MsticpyUserError( + "Archive contains a link with an absolute" + f" target: '{member.name}'" + f" -> '{link_target}'.", + "This may indicate a malicious archive (path traversal attack).", + title="Unsafe archive link target", + ) + # Resolve link target relative to the member's directory + member_dir = (dest / member.name).resolve().parent + resolved_link = (member_dir / link_target).resolve() + if not ( + resolved_link == dest + or str(resolved_link).startswith(str(dest) + "\\") + or str(resolved_link).startswith(str(dest) + "/") + ): + raise MsticpyUserError( + "Archive contains a link that escapes the" + f" destination: '{member.name}'" + f" -> '{link_target}'.", + f"Resolved link target '{resolved_link}' is outside '{dest}'.", + "This may indicate a malicious archive (path traversal attack).", + title="Unsafe archive link target", + ) diff --git a/msticpy/context/geoip.py b/msticpy/context/geoip.py index 1f91eb49..59741ef5 100644 --- a/msticpy/context/geoip.py +++ b/msticpy/context/geoip.py @@ -47,6 +47,7 @@ from typing_extensions import Self from .._version import VERSION +from ..common.archive_utils import safe_tar_extract from ..common.exceptions import MsticpyUserConfigError from ..common.pkg_config import current_config_path, get_http_timeout from ..common.provider_settings import ProviderSettings, get_provider_settings @@ -809,7 +810,7 @@ def _extract_to_folder(self: Self, db_archive_path: Path) -> None: # Skip the dirs to extract only file objects continue self._pr_debug(f"extracting {member} to {self._db_folder}") - tar_archive.extract(member, self._db_folder) + safe_tar_extract(tar_archive, member, self._db_folder) # The files are extracted to a subfolder (with a date in the name) # We want to move these into the main folder above this. targetname: str = Path(member.name).name diff --git a/msticpy/data/drivers/mordor_driver.py b/msticpy/data/drivers/mordor_driver.py index 596fe7a1..545c89fb 100644 --- a/msticpy/data/drivers/mordor_driver.py +++ b/msticpy/data/drivers/mordor_driver.py @@ -24,6 +24,7 @@ from tqdm.auto import tqdm from ..._version import VERSION +from ...common.archive_utils import safe_zip_extract from ...common.exceptions import MsticpyUserError from ...common.pkg_config import get_config from ...common.utility import mp_ua_header @@ -785,7 +786,7 @@ def _extract_zip_file_to_df( file_path = Path(save_folder).joinpath(file_name) if not use_cached or not file_path.is_file(): - zip_file.extract(file_name, path=save_folder) + safe_zip_extract(zip_file, file_name, save_folder) out_df = pd.DataFrame() if file_path.suffix.lower() == ".json": diff --git a/msticpy/data/drivers/sentinel_query_reader.py b/msticpy/data/drivers/sentinel_query_reader.py index 7f5ab0d6..fd8d2778 100644 --- a/msticpy/data/drivers/sentinel_query_reader.py +++ b/msticpy/data/drivers/sentinel_query_reader.py @@ -22,6 +22,7 @@ from tqdm.notebook import tqdm from ..._version import VERSION +from ...common.archive_utils import safe_zip_extract __version__ = VERSION __author__ = "Jannie Li" @@ -138,7 +139,7 @@ def get_sentinel_queries_from_github( "Azure-Sentinel-master/Hunting Queries/", ) ): - archive.extract(file, path=outputdir) # type: ignore + safe_zip_extract(archive, file, outputdir) # type: ignore print("Downloaded and Extracted Files successfully") return True diff --git a/tests/common/test_archive_utils.py b/tests/common/test_archive_utils.py new file mode 100644 index 00000000..754f1a6e --- /dev/null +++ b/tests/common/test_archive_utils.py @@ -0,0 +1,170 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +"""Tests for archive_utils safe extraction utilities.""" + +from __future__ import annotations + +import io +import tarfile +import zipfile +from pathlib import Path + +import pytest + +from msticpy.common.archive_utils import ( + safe_tar_extract, + safe_zip_extract, + validate_archive_member_path, +) +from msticpy.common.exceptions import MsticpyUserError + + +class TestValidateArchiveMemberPath: + """Tests for validate_archive_member_path.""" + + def test_valid_relative_path(self, tmp_path: Path) -> None: + """Validate a simple relative path succeeds.""" + result = validate_archive_member_path("subdir/file.txt", tmp_path) + assert result == (tmp_path / "subdir" / "file.txt").resolve() + + def test_valid_simple_filename(self, tmp_path: Path) -> None: + """Validate a plain filename succeeds.""" + result = validate_archive_member_path("file.txt", tmp_path) + assert result == (tmp_path / "file.txt").resolve() + + def test_rejects_absolute_path(self, tmp_path: Path) -> None: + """Reject an absolute path member.""" + with pytest.raises(MsticpyUserError, match="absolute path"): + validate_archive_member_path("/etc/passwd", tmp_path) + + def test_rejects_parent_traversal(self, tmp_path: Path) -> None: + """Reject a path with parent directory traversal.""" + with pytest.raises(MsticpyUserError, match="parent directory"): + validate_archive_member_path("../../etc/passwd", tmp_path) + + def test_rejects_hidden_traversal(self, tmp_path: Path) -> None: + """Reject a path with embedded parent references.""" + with pytest.raises(MsticpyUserError, match="parent directory"): + validate_archive_member_path("subdir/../../etc/passwd", tmp_path) + + def test_rejects_path_escaping_dest(self, tmp_path: Path) -> None: + """Reject a path that resolves outside dest_dir.""" + with pytest.raises(MsticpyUserError): + validate_archive_member_path("subdir/../../../escape", tmp_path) + + +def _create_tar_gz_bytes( + members: dict[str, bytes], + symlinks: dict[str, str] | None = None, +) -> bytes: + """Create an in-memory tar.gz archive.""" + buf = io.BytesIO() + with tarfile.open(fileobj=buf, mode="w:gz") as tar: + for name, data in members.items(): + info = tarfile.TarInfo(name=name) + info.size = len(data) + tar.addfile(info, io.BytesIO(data)) + for link_name, target in (symlinks or {}).items(): + info = tarfile.TarInfo(name=link_name) + info.type = tarfile.SYMTYPE + info.linkname = target + tar.addfile(info) + buf.seek(0) + return buf.read() + + +def _create_zip_bytes(members: dict[str, bytes]) -> bytes: + """Create an in-memory zip archive.""" + buf = io.BytesIO() + with zipfile.ZipFile(buf, "w") as zf: + for name, data in members.items(): + zf.writestr(name, data) + buf.seek(0) + return buf.read() + + +class TestSafeTarExtract: + """Tests for safe_tar_extract.""" + + def test_extract_valid_member(self, tmp_path: Path) -> None: + """Extract a valid tar member to the destination.""" + archive_bytes = _create_tar_gz_bytes({"subdir/data.txt": b"hello"}) + with tarfile.open(fileobj=io.BytesIO(archive_bytes), mode="r:gz") as tar: + for member in tar.getmembers(): + safe_tar_extract(tar, member, tmp_path) + extracted = tmp_path / "subdir" / "data.txt" + assert extracted.is_file() + assert extracted.read_bytes() == b"hello" + + def test_rejects_traversal_member(self, tmp_path: Path) -> None: + """Reject tar member with path traversal.""" + archive_bytes = _create_tar_gz_bytes({"../../evil.txt": b"pwned"}) + with tarfile.open(fileobj=io.BytesIO(archive_bytes), mode="r:gz") as tar: + for member in tar.getmembers(): + with pytest.raises(MsticpyUserError): + safe_tar_extract(tar, member, tmp_path) + + def test_rejects_symlink_escaping_dest(self, tmp_path: Path) -> None: + """Reject tar symlink pointing outside dest_dir.""" + archive_bytes = _create_tar_gz_bytes( + members={}, + symlinks={"escape_link": "../../../etc/passwd"}, + ) + with tarfile.open(fileobj=io.BytesIO(archive_bytes), mode="r:gz") as tar: + for member in tar.getmembers(): + with pytest.raises(MsticpyUserError): + safe_tar_extract(tar, member, tmp_path) + + def test_allows_symlink_within_dest(self, tmp_path: Path) -> None: + """Allow tar symlink pointing within dest_dir.""" + archive_bytes = _create_tar_gz_bytes( + members={"subdir/data.txt": b"hello"}, + symlinks={"subdir/link.txt": "data.txt"}, + ) + with tarfile.open(fileobj=io.BytesIO(archive_bytes), mode="r:gz") as tar: + for member in tar.getmembers(): + safe_tar_extract(tar, member, tmp_path) + + def test_rejects_absolute_symlink(self, tmp_path: Path) -> None: + """Reject tar symlink with absolute target.""" + archive_bytes = _create_tar_gz_bytes( + members={}, + symlinks={"abs_link": "/etc/shadow"}, + ) + with tarfile.open(fileobj=io.BytesIO(archive_bytes), mode="r:gz") as tar: + for member in tar.getmembers(): + with pytest.raises(MsticpyUserError): + safe_tar_extract(tar, member, tmp_path) + + +class TestSafeZipExtract: + """Tests for safe_zip_extract.""" + + def test_extract_valid_member(self, tmp_path: Path) -> None: + """Extract a valid zip member to the destination.""" + archive_bytes = _create_zip_bytes({"subdir/data.txt": b"hello"}) + with zipfile.ZipFile(io.BytesIO(archive_bytes)) as zf: + for name in zf.namelist(): + safe_zip_extract(zf, name, tmp_path) + extracted = tmp_path / "subdir" / "data.txt" + assert extracted.is_file() + assert extracted.read_bytes() == b"hello" + + def test_rejects_traversal_member(self, tmp_path: Path) -> None: + """Reject zip member with path traversal.""" + archive_bytes = _create_zip_bytes({"../../evil.txt": b"pwned"}) + with zipfile.ZipFile(io.BytesIO(archive_bytes)) as zf: + for name in zf.namelist(): + with pytest.raises(MsticpyUserError): + safe_zip_extract(zf, name, tmp_path) + + def test_rejects_absolute_member(self, tmp_path: Path) -> None: + """Reject zip member with absolute path.""" + archive_bytes = _create_zip_bytes({"/tmp/evil.txt": b"pwned"}) + with zipfile.ZipFile(io.BytesIO(archive_bytes)) as zf: + for name in zf.namelist(): + with pytest.raises(MsticpyUserError): + safe_zip_extract(zf, name, tmp_path) From 165ea3c7b9f5648b3ad3b5f626be37c15a98dad6 Mon Sep 17 00:00:00 2001 From: ianhelle Date: Mon, 27 Apr 2026 10:45:09 -0700 Subject: [PATCH 2/5] Re-save pickle test data to fix NumPy 2.4 align deprecation warning Re-serialized all 22 .pkl files with current pandas/numpy versions. Old pickles stored dtype align=0 (int), NumPy 2.4+ expects align=False (bool), causing VisibleDeprecationWarning in 5 test files. The one file that could not be re-saved (tests/testdata/ip_entities.pkl) references a removed module (msticpy.nbtools.entityschema) and is not used by any current tests. --- docs/notebooks/data/ip_entities.pkl | Bin 1115 -> 875 bytes docs/notebooks/data/linux_proc_test.pkl | Bin 401379 -> 401351 bytes docs/notebooks/data/procs_with_cluster.pkl | Bin 11584892 -> 11584777 bytes docs/notebooks/data/sent_incidents.pkl | Bin 7797 -> 7616 bytes docs/notebooks/data/win_proc_test.pkl | Bin 403432 -> 403529 bytes tests/testdata/azmondata/query_response.pkl | Bin 15812 -> 15839 bytes tests/testdata/linux_proc_test.pkl | Bin 401379 -> 401351 bytes tests/testdata/localdata/aad_logons.pkl | Bin 266894 -> 266720 bytes tests/testdata/localdata/alerts_list.pkl | Bin 52905 -> 52908 bytes tests/testdata/localdata/all_events_df.pkl | Bin 75110 -> 60305 bytes tests/testdata/localdata/az_net_comms_df.pkl | Bin 8606 -> 8683 bytes tests/testdata/localdata/az_whois.df.pkl | Bin 9172 -> 9209 bytes tests/testdata/localdata/failed_logons.pkl | Bin 2614 -> 2715 bytes tests/testdata/localdata/host_logons.pkl | Bin 8335 -> 8427 bytes tests/testdata/localdata/process_tree.pkl | Bin 8354 -> 8442 bytes .../testdata/localdata/processes_on_host.pkl | Bin 11304 -> 11404 bytes tests/testdata/mde_proc_pub.pkl | Bin 279720 -> 279754 bytes tests/testdata/mordor/mitre_tact_cache.pkl | Bin 9145 -> 9179 bytes tests/testdata/mordor/mitre_tech_cache.pkl | Bin 730454 -> 730491 bytes tests/testdata/sent_incidents.pkl | Bin 8308 -> 7537 bytes tests/testdata/ti_results.df.pkl | Bin 106650 -> 106414 bytes tests/testdata/win_proc_test.pkl | Bin 403432 -> 403529 bytes 22 files changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/notebooks/data/ip_entities.pkl b/docs/notebooks/data/ip_entities.pkl index 1caafb1ad08a0b6bb39c68717886e2e048f784eb..a387b453fc45818b8b37cc14a49ed64d376df8ae 100644 GIT binary patch literal 875 zcmd6kO-sWt7{|qJx>+`5h%cx(L{Tqgt1sxyS#b`=F58ZC#x^#AE-7tx*g?>HUwYw?+3BbvXG;eqy;OwHIMNMcPswzRTS!pOl-&MhgoAm< zjXSjp=JC0BjArs46Mo+WIwdDt4JD&e9d)6UZ80jaU1$g-FtDb=jgm7aa_J5C8AVDa zO)C1(+d!;v?jvT=z~Ydr#+gG!53a7fTt00+gBgGa^il2P^zGtxSWA=xrs^_+O!>rw|Z3#+yw%L7GLWQKZ?WU@AF zCy9|>GWAL8u@Pz|X`+q)=0X!>?t6NY|B{=`e~(NS;-F-)66GUH^$`$R9b>FVh-Bjj UST=g^;=jVmMOcUXf6s;WcN&d1djJ3c literal 1115 zcmaiy+fvg|6oxBjf`B4;01s7Bi-$0x(813rBi_Q)DD;X4@(mSD4PGN(+~LTxnLxn5yiu1~p|#Na{Ge zMukOjbsyK*1XKO90j?Xk!6qXFUQa^BO{O|bH>)g+^p=m?IrdMC%Y`V$JFJg|A>@3_ zf&6H3RD@!$!=o88f^H zuw|f_GHfRdB_A(ChA{DzVR1f!c$Glx_;}q0QSJ!w<~YRLju7uofG`474D6;5dojfO R7~(?!V&G#6@u^v*`XAUBMA!fT diff --git a/docs/notebooks/data/linux_proc_test.pkl b/docs/notebooks/data/linux_proc_test.pkl index 293033f96d0327ce58b777aac02ec628dc45ae89..aa13fa96525f1190eef64c0a3eb083bd83467891 100644 GIT binary patch delta 3523 zcmeHKPi)&%827W^a~ri|Eks@S*K|}_R&AkZv_ddOyB37zEvN_~vC?^t3j(AaD#`&NAyEx9sh9Dd)2viY#R=uo z7wOr4-}n8#@Ao~&`n~1F?r#>m(HyGGJy$|cBB)GHI;Cfi%|^YhtZFCKTuiadL@s99 zuI|{XmBZdnC2wagq6{za2b1#ZE#i{M=em#eTtGTytD2eA01|vld3kQCt29O zwJ`=U9mQ-B?#?1A0~aWvwTB(A{tW&A4kke#2-7U(tU7P2}+9M8g z432t8Njdrj9QQ;;Q#C`!GuVT9+jMD8JBM@m%Q)dr9uTDgnP;d*oA+o?T`V9*Z*|Ai zu-8U$GSi8CDy2KLkm&r-HI9zzr^6%HUSI{J)(Hs4o_IWd>H!_WBy%oK$SA1Q10&dF zc}Ao2QHDT=zi>c2e4K%p{|QpWhRovY)iNAzrd(Q@uYUK(PoSDv`siYBMdUz$Y>dgU z)}kPYIX@m4Xi`xUdj^=pCdh+EFKe_BskgcPVVhrJ1(tV%gZ{B`&^c=vP5sR_H@&gV zzquQ*z5h-9`)$Af&27K6{r)$11DgH)fAjzR{E|)$RPKi=p*1bx-#E+9kR#)~_aIbx zq`vso-~3x-ffsHf(jOAS!0(R;wm&f}{NOA1c|=ZVLf;L5h#7*rj(}gudjoK1M_Xhs z$E9l%>50QTJehbI-bNk&S`R#!@uk*=%RKZ8XW{EDm5!hkvQmQgXbod<5RvTj@Clv_ zW#H#R=USSL3C{`4`d3Rs(a^Xm_}`y^zq4=|HU?i6$lOV|3L0Cl^5lb$ zVOVI0?(#kbZuR@G!&VSs>}&b1^67|ApFY{UiOxE)z@c%{(|qIgV$g@Ji2S$(g&M)) zmR8oGL##tzh!5$skh^za`-h>*FUvInN;f+LcqbU7GAIFuhhYuN>G;A03rwTg|ur*yP z7-qQ_{M?-$r$OlnI?)3|TA^2#a7gmcNn%&E$Ui0RH^!&}t|v^-QI~lB5>??koBTzp vq@VVX>bg#joi9WsWvP?F?Jm`_GH>UUWIk(|8a)vymYUG%QS3@CpNRbfWt|}f delta 3665 zcmeHK&u<$=6yDjLaqYBeVrZLyQEej#PTOn}V$wDakS3&(vq>5eRDn=%H}STUwEj{5 zsHjBbLffE7gGlkXBb6XP94a9sDn&5r0UQEquN;ta;R0Mx;KD!9FuM+oi@muRsRyzv z?Rw|E?|a{SGnU@FTWtQV*o-d0g7o?|)b2o$sGiZU9qodxZ_@y~bq}@e!#fEI$D_uZ zG*4$~fI!oQ=3fD=PJ-guSn?vx=fD%q`>s;Fm!N3oV$u+IF}-;5u5# z;dhY+aR;LmvL!CBhjkGFQjMVfLC3WF=raM>`4ZHCk+@wi@`>}WF%QT>Yk>3^Z zwV%k-CH~T~LO?Ga9UUE77nk+Wqzs*$@9*Tuo)9HP{D6S zn6n~`lt+MgDBl5|T3Q7|-u_Ay61qyL)8!}y4^>sQxb%^KV9{@i`FDaEEK!B$`=!~u zulT{z}7Lm6%;6jDKFFM0StAHa>7{csMfn>fpf1L5efA-?`c;YGTO! z2RYOtU_1YZy8+w#U(4yO9lL%0x6l8>tib>M|L?Iaz7gPmy#(TnjU5MTJn}OLMc8K{ zdDc|`8|?!3^~z+OE&L*9U4`BMEV}n9*8yLCURnGC)boiorRfm-vq6%W`wis|TV7Qz z^W=|8P~pD2%5jB<_QSAqr|OZUnbL#5-vTc<8_QNKo4LFq^RXDbg6xdRW3UgfSO}iH z?uFSMg?>vDUuc2f$zQ(+@6_7?Px+wF!9VfCgzVms@t~j;nF;F}Z+s8#QCN=-n|Wgd zUa7MqY>dLoh$Xw>A9fxK@4zmls_{eF4D+Z`T}eh}!s>LP_EaK~p)=}6VV2Lpp8!yq zDAUKDiX1kxu^g&X4{w?L_ok|0SXJ^WsLm)hOqA^#TV8&v6Ml~P*r$-(V3!_2H(dqo zhf-I~-34?Tu)Z6LlaIWBel6y#wz?iSh-slp|E>YizMFk2Zq>_racmDj8-M_A!=3n9 z9K_wm7RcP@tf0aBP!&IikKmrIfMvK{_i<0-7W@nj-~;#|K7`wG2kyd$@zHV~W0n#} zhuRrbJIx76B~TYr4aIfDF?lXAbv8{!Q!Wg|aX~+qH7(=B89S4T2xFS&!+!6uwVz*o2+6ftdvmFdzFe1pE&|&f7rD+y&$m p3*AGyYDO`#Y4IX3B4#^ET;>3HI;F=9@jDVTGP*SpPSEV6`Zo}YWoiHb diff --git a/docs/notebooks/data/procs_with_cluster.pkl b/docs/notebooks/data/procs_with_cluster.pkl index bf9f6376c0b2fdd40f9dc0aa524f1f62dc6ee1a3..902dbb1353a68c510d6938b39ca8ca80e0593916 100644 GIT binary patch delta 7143 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 delta 7468 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 diff --git a/docs/notebooks/data/sent_incidents.pkl b/docs/notebooks/data/sent_incidents.pkl index 1da4477eca43d342764dce0b6ae705e193d10511..92a6f84cef6b62f6dbe405c510ef317a5f4e7bb6 100644 GIT binary patch delta 381 zcmexrbHJLlfpzLu*@>*_x;N(T4D&6=ti0zK?Nn~I7OD}n008Cs_}GbT*|$!mBsdW(UyW(ZB@ zXVhf8H`zga*W`Jks+%j=*08bqWB}o2P2Rb@jFTrHm(pOII{AZ?Gmvc}4PwUv$;p%3 z!0h$X20-=$F#9f#Ge>D+YRQzO48F-hvU`L@y~SFmWJm(tHU;9YwkZ<}^lUctuzKdD zq*eeORXatahb1MkBymcHYKA(nDJ&HfNVw9pD zS`p@8c+Z0ee}Ud|6DgtpKoC#Tt4FoxrE@*` z&eHI1&vZ(iZg};Y=R4KSrgT=LTGDqkRW?_vta{7!V5WGe1qRx0#wj;4WsK4jV=ODS zSsC*j@Lk5O+u@ErWrb~&+q>^3u;3U_1{ri?B<&e+BtrK}R|XOcSp7RUWVw!Y8meUD(-R_IkC1JEUk-(Fes zbTDK-jkToE7hwbVM?gZWiQ8iaS8)xqGT`MubKw8H!N0sQoX0q9F|7~l8iPl<(QVv87?o2=WRRjH(u#7z(3;1&@?bQou5XPwd6*>V1$ONm`l zgMnQ3&CaRl(9IHJTjm;6P!JV#>SEmzDzJkG3D@4tY8k!5%s2CWzdzr{_txHr-+Ty@ zw<)K!Kz36kn;q8+eW&K^7L8NWoRMG^nKu%$YKpqbDF(6|SWDGpVNwxUUdaiQsEF*t z{}gk&&gF4s8_R0>nZMtfUWgtF_;x@%*ba4u$Y?>7~K@!m{vPnyoO)R7u$gma= z?|zEWksb#6aH-yI3M?gpZg42-vViP*%#+LVRwg6r*hsuI7%6{F4n&GSlKbZZ2eNOw z=75k|Q>oO*Ha@|F37LpzKw#DeL&)@n&NGl97~mszrKPCU;kPKoYCM2x_|xE}J@huX zh4u&(yTE}mFPtfrFY{4Yb~mT#;`-(abf`)r=#9A#GT^8;KMvA_w*cxakc6`t`gTOkH|q# z=Y)3(z4i^_5b!o2$!@vbugHo!2C1k!_MI%1x~cv;hu&rEc}?E%aI(7Pt>2@b0K$12 zt8nzk>d|JlRR-o283P1D*%tPpmej1yq`tO?iS zh1feU>3X>X3<7Fm8>5ODn4l((_2Z}nJIHy=?7r-z+fUmRXPUaN_Ar75z27nxN!Uc@(O(XjZ$Z?TS0{Qv*} delta 836 zcmaKq?@Lor7{~89_eYyChxTidHMjONbGo!x1U2-9=*izppdaUM(}IEL#W~#j{XEZkzRz=By>)E7 zaR|4CBEKYbNaDz-GOa9~=oEr;BtXA1Kd#bw@MqBV$1+HY_;Y=(R>;J=6d6T(m zlE`;Qouv=a9;b_a)TXjmQn~W1s?xWFeYx~W>BEnIT$8Lt3x_y!8J`il=_$p3D%cqE zq1N}-BDX1pKcXkd=ta2yx3##d`j@_Q^Izz_=lC>DuizUrzKY%S(K=qG^$~u>xR3e$ zzpTX_n>2dJUtAM}C^DiBp%ED)SQutH+SD6f3TyPmr1+E$9}t&mOS9;v^;Xes*s%DF zfph+HnVjKT6t8<{Rc2H*n`{F+8yz&%y2h;aWy=tN<0cQ0m^RNwu}uuB#(-bhHehyZ zruMB{yx@Z%9EMgn0&Nh2cIbdG9EDEkf@A;Rug(x%>Ij9qLgC7@Q?hD?K%FinQj?d) zGlcnKo^5WqYI&t4fPf^>Xv`GE4G{^a@K;iz@ZvQ}ar5i>FMUZ>tIb D--8o( delta 33 lcmca#eWaSVfo1AWTLv)bk)Ax?R&=9MwJlQy!{lAIssO-O3WWdw diff --git a/tests/testdata/linux_proc_test.pkl b/tests/testdata/linux_proc_test.pkl index 293033f96d0327ce58b777aac02ec628dc45ae89..aa13fa96525f1190eef64c0a3eb083bd83467891 100644 GIT binary patch delta 3523 zcmeHKPi)&%827W^a~ri|Eks@S*K|}_R&AkZv_ddOyB37zEvN_~vC?^t3j(AaD#`&NAyEx9sh9Dd)2viY#R=uo z7wOr4-}n8#@Ao~&`n~1F?r#>m(HyGGJy$|cBB)GHI;Cfi%|^YhtZFCKTuiadL@s99 zuI|{XmBZdnC2wagq6{za2b1#ZE#i{M=em#eTtGTytD2eA01|vld3kQCt29O zwJ`=U9mQ-B?#?1A0~aWvwTB(A{tW&A4kke#2-7U(tU7P2}+9M8g z432t8Njdrj9QQ;;Q#C`!GuVT9+jMD8JBM@m%Q)dr9uTDgnP;d*oA+o?T`V9*Z*|Ai zu-8U$GSi8CDy2KLkm&r-HI9zzr^6%HUSI{J)(Hs4o_IWd>H!_WBy%oK$SA1Q10&dF zc}Ao2QHDT=zi>c2e4K%p{|QpWhRovY)iNAzrd(Q@uYUK(PoSDv`siYBMdUz$Y>dgU z)}kPYIX@m4Xi`xUdj^=pCdh+EFKe_BskgcPVVhrJ1(tV%gZ{B`&^c=vP5sR_H@&gV zzquQ*z5h-9`)$Af&27K6{r)$11DgH)fAjzR{E|)$RPKi=p*1bx-#E+9kR#)~_aIbx zq`vso-~3x-ffsHf(jOAS!0(R;wm&f}{NOA1c|=ZVLf;L5h#7*rj(}gudjoK1M_Xhs z$E9l%>50QTJehbI-bNk&S`R#!@uk*=%RKZ8XW{EDm5!hkvQmQgXbod<5RvTj@Clv_ zW#H#R=USSL3C{`4`d3Rs(a^Xm_}`y^zq4=|HU?i6$lOV|3L0Cl^5lb$ zVOVI0?(#kbZuR@G!&VSs>}&b1^67|ApFY{UiOxE)z@c%{(|qIgV$g@Ji2S$(g&M)) zmR8oGL##tzh!5$skh^za`-h>*FUvInN;f+LcqbU7GAIFuhhYuN>G;A03rwTg|ur*yP z7-qQ_{M?-$r$OlnI?)3|TA^2#a7gmcNn%&E$Ui0RH^!&}t|v^-QI~lB5>??koBTzp vq@VVX>bg#joi9WsWvP?F?Jm`_GH>UUWIk(|8a)vymYUG%QS3@CpNRbfWt|}f delta 3665 zcmeHK&u<$=6yDjLaqYBeVrZLyQEej#PTOn}V$wDakS3&(vq>5eRDn=%H}STUwEj{5 zsHjBbLffE7gGlkXBb6XP94a9sDn&5r0UQEquN;ta;R0Mx;KD!9FuM+oi@muRsRyzv z?Rw|E?|a{SGnU@FTWtQV*o-d0g7o?|)b2o$sGiZU9qodxZ_@y~bq}@e!#fEI$D_uZ zG*4$~fI!oQ=3fD=PJ-guSn?vx=fD%q`>s;Fm!N3oV$u+IF}-;5u5# z;dhY+aR;LmvL!CBhjkGFQjMVfLC3WF=raM>`4ZHCk+@wi@`>}WF%QT>Yk>3^Z zwV%k-CH~T~LO?Ga9UUE77nk+Wqzs*$@9*Tuo)9HP{D6S zn6n~`lt+MgDBl5|T3Q7|-u_Ay61qyL)8!}y4^>sQxb%^KV9{@i`FDaEEK!B$`=!~u zulT{z}7Lm6%;6jDKFFM0StAHa>7{csMfn>fpf1L5efA-?`c;YGTO! z2RYOtU_1YZy8+w#U(4yO9lL%0x6l8>tib>M|L?Iaz7gPmy#(TnjU5MTJn}OLMc8K{ zdDc|`8|?!3^~z+OE&L*9U4`BMEV}n9*8yLCURnGC)boiorRfm-vq6%W`wis|TV7Qz z^W=|8P~pD2%5jB<_QSAqr|OZUnbL#5-vTc<8_QNKo4LFq^RXDbg6xdRW3UgfSO}iH z?uFSMg?>vDUuc2f$zQ(+@6_7?Px+wF!9VfCgzVms@t~j;nF;F}Z+s8#QCN=-n|Wgd zUa7MqY>dLoh$Xw>A9fxK@4zmls_{eF4D+Z`T}eh}!s>LP_EaK~p)=}6VV2Lpp8!yq zDAUKDiX1kxu^g&X4{w?L_ok|0SXJ^WsLm)hOqA^#TV8&v6Ml~P*r$-(V3!_2H(dqo zhf-I~-34?Tu)Z6LlaIWBel6y#wz?iSh-slp|E>YizMFk2Zq>_racmDj8-M_A!=3n9 z9K_wm7RcP@tf0aBP!&IikKmrIfMvK{_i<0-7W@nj-~;#|K7`wG2kyd$@zHV~W0n#} zhuRrbJIx76B~TYr4aIfDF?lXAbv8{!Q!Wg|aX~+qH7(=B89S4T2xFS&!+!6uwVz*o2+6ftdvmFdzFe1pE&|&f7rD+y&$m p3*AGyYDO`#Y4IX3B4#^ET;>3HI;F=9@jDVTGP*SpPSEV6`Zo}YWoiHb diff --git a/tests/testdata/localdata/aad_logons.pkl b/tests/testdata/localdata/aad_logons.pkl index 705833739ff5bcae44cdbd9657fa820712846fab..b3dcaa00a08270d2afa6b1956dffb4d8b462cb13 100644 GIT binary patch literal 266720 zcmeIb3A`j{S?}L{CVL1;2nkz+Lx>WTI;rZa?ye3BnM^{MOlFdsNdQ3zRn=89T{&~k zaF&okB0;Y#+Im$Ql^*(L+V+W)r-U2$HQksb zv+2e6W*h4#;_WO;H`pQH{$lRE)9J!L_ERi&WuN56#?5ScE_VU#c3l=)hUz1dsd z{HEDmv+EA+n|5C}J96a6ZJ&dG{Kuir)+|2MJ@n!?&ZgZ1vn|+ddO^HBS>2kfK}^ow zT%9EBFo<X!%f=9p%sx`+5B0=@o_OL>n8?DR{-z_uhN*)B`*5Idb!Uw&kWMxi1|v zKUd>Ch*zzQqpfsnaw3J-UjiBAzw?*D3vPSHdH;CM5w7`!>C)j)cjlaF_e;y2fqWlW z0^`sl_-||WM(9yIy%MG7#5Qz|%R@1OTebei zufP7oY`tpL>$H!@fA#mX<3D`eu}{B>>Bwc}NBjHd&knIK<@3hg!3Ws-8xOwkr+F)v z_3`9-)ejZthraXhkKO;9tlzTz>yP;Fhj>49*ZZz#t&ack-@S^jm)jp+|ICMe47RKG zM!8+Z^C9W;;qC9a^!DF?{Z#wj?Qee_=-v3zaO8164Eta8!I!i4 z#?O5F+b)Fmq1PSzw~N_wX}enA`G@s?U4weSsNJx_~yy{hAum)Ac25x)PY-*G!{uld@8yk7t2Js)KC+WDq?zl+y{ zYG3wmpW@5czU@j@Pn|cu^eb7t>h|}p{tT2p;hZ&_lxh~>s6~> zr+oaxFHQOJKf3?ptX?~6S@}@@{^L2%=6;kfwf*Nm8W()4WpzBYpX!H-^VT!o#Ok%9 z+P`@JHM~w$tK$FkFZf?P4{H4lm%o+OYe%(eyNajs`I&#YkkxBPwV(Z+8LQXMH~#rM zSiS029e3s7kkx5NweS0?6Rci4|MlxW%<5IISKH-!HrF%Yp9|1UUp+fAJ@4KmN{*-S zE?|1j_S$3%U_ z`Bvqn6u(DhT;Pr5!?(Tfo`<1*)up$-61RLk)KBNCV|P8Q+VXzze((?fHhU%8{?1Q* z@^0O#_2pI_2kozp|IjZSeCmzm{naw;&$p{qt+%ymzqZwRDa7y58W;XXI@@_Ozi;l1 zG&?U5Z@Hhs&Prgy{?bFwFP?(13HyhaAO!8dHUf{b2=D?G;f zcgJDa>yQ0eyIUKOwnEym&`u8RY}s<51!en|pnZ?jzG-aV9-qzU3m5Ev?e<2xy#HqS zb7=c(8;7SE!}cTA_A})6^Y%yS9~3S-IytuHOxBj8 zWNUK&Wb4#y+OBFN(bhye6xvCloeOt?3j4ejcQ$Q*K9(bJ5qp<$aP9W>V{mtecA(25A;47enAJcP3t~>0(O>IO=cuBhpDY6TNX?o6)^)9dvR7-eCy9+6@3x#QVZ4$&m8u^LS53|e(Qa5$te(XBqUK+Vx zlB9kJXAswp`)TH8q38Hs2)l*wTR6_(N8t6NC>{>SUPRxGC>m#8FL1q)6Z^fs6GTDe zgdVsYB)zcb2Lo@=W8R3n?QRza{U{j3Ue5`7(a;IJQRa-|c<98vaT+Fxm!zW+cx4o@&=I8(a0HjQR<9Fem_eFkrxm8^ze?NvG2#dp5u=KsF3jp3JC-q zH;jY+FdAm?%|-grdPxwuei%9I_0J>SqJDpSa9h3TcabLkL6S!FB6N8abnJ96JMV3^ne#>Bt?!Zr*U* z8>D^6Bpegs=KD_MMV>PrhvQM0c>Pfp(07Z+F$j$#XPge8fBvZNglQZ)Nt}9a7!8BW z16Y%jMLQZXAW1JC^}<00-g*#_Xf$xbKHR6k_4-K|gsB^)EN+?W1;fyfVUHLB;=}d+ zaT0ruJM2TLjj|*Q*lv-Zc|QDb#_&qWLNtcIUJVD1AEZIg8;-nz$9D6=v6m&FHx7ra zdLg`U9|SfDKpFWdj2e$+p%?i*DCWo+x)B^L&Y<4B0CE?5aMP)5;H5p51-Iw>Ndn0l zr;wt+?G2m=zLwx*UhEH}EJ{3H5VfO`opy6g#H*teK79zqY;z>+){-lD^7;#D294tM+Lrea0pu)+hC^o<#ZVz`6a$@I=*%dH zyxu4px-J_F#3CmSnQ=7EM!p-vkYU&5MNo8M=0#2lz)N5XgE@k|C4dPeO$P(0G6*0H znQ#pATLQxihEg2Bo`aabbD$lKm<6IJaX3@amh>~2fnvuUWH7RZ0Ip~RCFP}Y0(A8= zcf<-QrtOvvhwyc&a0u~av*ieebL2x}vq9*NM=<^R12~nwHXaXp1AiRA8?!WksRmdN z@5X>8{r+$;==3K#5#s9z?>DQP*Q0;%!a|x3!@$fCC!_gX3-GF zmJ{|e7&6|l=ZpsM4q+65w=~IyVZ?_FZ8xGfB4vm}CiccKyZVvi27Q>ghT#C-91J~Y zkOrCGgF!D?Pu#5^4MuSS0}~Pp6*6FNHAXOzWP@Hmb={s92khP80EP_k2;NGK$FQ3h zL+Zyv*NF$?*o8MTev+~`X2jiy72?IixR*sEC-n#LhL*86^uxdzKmqj!?kI74tlq-d zje&a+R0s^>Ab^1#_Mj|B0lX*gL9n8fbpgVa^@9O>3(D?mtzOFg)W^R>I{jV5~8{Fjf~Rq6|xZ6w-Al)tpw z)?9SZGGXoo`KrWW&)LVDeFer3B#-}#{p&go903;i*u-Ff%_z_w6K zrxzT!`-S&xrW^1X%LOlk2lgz#czvz-E84;QtMO&$+?<|RhsW(4PLD-v%QvmRCS}hS zDlN*LiVbq~xC7C~`s!pYUA{eq&#};!bN7!=Ou%UIrOic2uT-Mcw$$6bxk&BIZtYjf z>24kNOdqEk%<|`+1Eab9vFBqjUApHeJQrrSf82D-{6YCT(*`cSvvm*ucBY+H^K5$g zYwurQyKys3k_S$%tWDN(_|uMIUCmLhOt!LZhQZ>I_^YN>8>^4oZf)}ZX8JgB`^`Jo zH@2cxc-QdxT72pqSq9HOT=ob31@4vr08S?|)vqNPBkgp_ z9lRd5CtKjxi zB4f?5PN$>QuO;<#ZyaKwfbN3j+KG6fdAZt9_14N-t$yi(I9PD^N@Go@$C}ywOm41@ z_33O~Fz}}%bvmzwYr)}Sa5wZFKV}!U!BwzuVdD_4+#13)#C{TwGoM|J(e73X2)nEs z{`JJggKh@b#V2q%4__3UTy~wh{1q;rg@4X2?N%omx=E5ma79l)h~bJZxI)(n;c6qe zV0Ji4f^jk&4%xLt;RtTk?PaiAI)ID$#vxq#ocUuXP2kE#uh$=qBX;p9HT7_X7rdkg z*CT=+T)_-iNDopt8e9~c^m|d7gbN&v=xujWC{u)AGI zb`@jwrKbDuTiMHXp&1+keB-)y+uN~b=Pu?7DrFTzGq}SZAd`%C& zVBx@b0DA7-UT{Ode?zaoG74S4?+(Ajb#HLpYo2R7&f#?H`1+U~fq$q9pM;;fGuqsI z&HBc;@)b9yThU~dy-x48xeZ_JO~)xa+SbN)Y8GV1?@C|2J=sW4KzG;??%bH1h&E0w z?=ST58s_)GOD=lFtc}G^EUX2?H=ItShBvtV8~k9!A9=p-hL8HHX#>J1ik;GV=>?6a z6c>tPaD(Trgdu!=YgnFA@W{`i)y>MGzq!4-wKIDhe&PP*jh*RWc@s=;W|MTh9G_ZF zR-?&@Ww>h{%zVpR>-VK=da{|H4NH^CVUU>|SYI1Y*mN1K?uW@~b8{ye)dR`8^)!O$ z`8Nc;8+zW#0KTsa-)Aq4ut#GMPbV6|4X(%Lo6zgQm#_P6G`t(U-b&wtFTBk$`!QJ? z5RIPShc__2v!OQ5Z#?`6U4dH^4E?i# z%I#Z}ozuh9r|Vhu?)9{%P;bSDyX=hGGaLS19)RMG+`iks*X-uLr8s19idPD#0IE!sQiS7)PvuD~k-DtSp%Fyq_eRj`= zzxkf_NNJ-XE-`B7jlu<2XW<|A+s{RJEBE&`kMYZabTs}&NbQX@3_O@(IZp(J2qGr6(^_Ifd-|kCKvG0n(LzdzDATMIKWxI1D z-DKY&Q{OYYKU&@9--WvyzI?WGCC{`yj`#whEj~M6LENoK@gu(3l)jtSPecpkkEd3B z0rJdO0PokX25GNFYOnd(Lq)XLLbE6Ra8rBD*&ZsQJ!EAkRl7B#?bdO2oRxmtL($tq zR!TwI)hz6xZtfu~I}zV&ruLej-73bt)~}rk;J@u5dwa+V56xL!0lU??QaPCx_fTG2 zE2fVbc9Pb{#~PofZcf&Yt)?%GlCAZP;{ASR{KKc|F6==)&{IyZdxSLfQfahu9^01-Xo+^dDxwf8b8e6q2n(929LYkCeo(F$Fg*U*n=|yYnTi^s9E;WW5l1|{qweWq9UN*>L zXB>qg+}0m%G9D+%(D8=7U^p0z`lCTS+lEf&KXG2C^NLyiQ_vjh+u^juI#I;nwhQ<#d14 z_s2cBtNXlWS87i89nPXzlw;{DaIe{oN1g4HNMH3?>W6;h_J^#`aS}nFqtJ=te&)DI zIv5YqVUlHitZ&Mph=cM}FmoY$HWyET-9nsPUJ_alY#^I4o(O@ z#;0N7f?IF8shosT5aQm*>kmh8D|mmzZlNEi&L~I|C-sI|#Io-vg&xY@w!yOiKOQxK6b6##&9EBoVP1ly4 zW&Qx!<)VJ6yFt>A`f21k{qZPc&mVw?1w>HE}875!@=0~ zJSUBqNjDChkUfP0=8~x2i!(pU!ucXnp)yTemwkD(Ho1TE__A|g|1!&@Okt%BKlc1I z@)IW+`d}lCVg4F>BWEy#XJCYJ56V24ZKsbVI9+}|htm_G0XSVLmYyV*o(#=AoSw?o z7T|O>TeAS1ux3|ksvKi!Gn}-(t}&rchm+7Z4g?+tpv~sEEbT~CibrDY5M5+69 zI7t%~aI#lE0Zul9bT~DN5(Q4&nuQ8-;v&Nd7m=DIOcR#@PW3igIL)0obD3*Q+nt3?=3R_!%)5qAF1>l4=yHZo-7)zVsr1kYk z75a2I34J4+cpQ|c9Gk&#vRRP4 zz)4PAWH{j>Qj>&f;xfRg-bM?jIXGQ?0f*BwpaD27i=}JC(zBqMhtn6bwFNjmo2^*@ zPFS-mHC2wWv>8rXUyoFwPluDxH^Pa>L3zrt84M?z1v;D>SwL{IIv~RdC&8F_3@0t8 zr)Uv#I-IcFk}2oioR^y!PFlZ|b2^-`zOlO&IBDfl&*^Y#l2Q)JD&S8zw&YT{A2HPo>ITV))pxBDYj+-N@2~e)Kodf z(q>9&eLYfzKAloR-$*GQ2jwZpW-z5}7U*zlWC6j+>VOO2Shw zOQxK6b6##{IBES-&gpQ%`o`{B;G~sHJ*UH|QL2k@(k4pXr^88_sDP8b@(FOV8KlFh zQIsff;?^v1k`oshPPmBFBw?Dk3~;Kq(ZXpCPS3uO!|98m0XTh$SaQVD3N-U@a@pDf zoO*1{0&v2bU8$*ZjHS(R()xO&3Vk}9guW3@JPyiJj?G{=*(}iE)W`yYlhpwkPB;n1 z#A7&VIXy*-nA72e<(5o2@8-PR%y82BrJU2@g!PTxwZKU$mwHZzQ=?QD;iOHJx=)9b zG*JO3d*u`0WHU&IQ==$R;KZ$2;3Ow5GMsP`sY${#aT(xLZ{rNXX=&jvJas>BUwC>5 zzyfDZUjq%m=|795H;Sb;#e9AjxSoV30ksY0I)C!ueI z6OV)Plw&g(PBsg4I5o0>;AC|`h7(SLG4U8qT24>VBIa~BVYww!&bv7;H#3~Hektd4 zIAMKbcP((z%B7yu;nXPAML1~_rS8+=Bu!MniC4bLjHrB>5(1oT2I+8W6eS9rxHSu$ zK%YGeTc%Ibg& zD4Yai;xVAKoSvpd%;|u_a!aP1cXM8DWdN)$kGYZgGsiHi&hE#)EKBfo(yb@S&zW4dWY z{$*?fLzNykFJNmHxM78`l5^QkLAE1g=WbY`HT8rcH0d|2z?xmDsj7_kSW27msP)Tz zCf~54F8s=q2){Ig@o2L^$73T42#;0=WIW;|7!!~2sO3sIr{fXJsq!x5TvoXmk6OQ! zb2=WezOlO&JZj}q&*^xSsjeWCeasWcqz#rrLno6oXt)QDm==t~fkGy3%|a$QXOPK+ z^QR0I>PHS!1DWb=v}95@Hu(m?hlNbv1e<_N-^};O-^!M{`3xE(ncmJe6v*^#Y|R2> z5>|39+bPI)gzOxdw5A@bLX%D=tl5>Cs>*nerL>t$T3-)E*=I7D>cX!)iSSD^m`pYc zbTT!vfXHNZKqeDTf-&)!Oj@p#b2^!@oGR}^&SjOG$)xp5Ij55e>l?dkA(K`v^_)&7 znd%BM*~dJAOxj>6G;}gagC;U@XU5?`ArrS|A(Nal$YjF#Q-%ulBZsMhO!YR-5SjM! zE%yE#I07H&{UtQ;f!<$;#e9AjxS7qq?} z2tuF!fu7Jeo-pz_C{H;ygSlX{K<7du3y2F=2V^ebBp4HqxuE6r>?mSR=K_{nGUdFR z^KvtDLF<=tPUiyFH+I*;1+84_Ih_lQQeF6vB-bWN-KT#>B284l$zJ&cIN1!+;nXNf z6gY8f7C6a?iwq}RL~4>SOz)!R5jaN2_(=)K@#>uJ+XunA6^4)8tlTi8-Je<3u+ z)20`(4TaOD+t``~PMd_4oXd6!vK=8iciN;i^@Jfb>8DLtvnw@KmGK@+X)_+RzMd;& zpUJ09jlz%dXtO}aV3Ec>t{{_r%oE6@4VFSfCzCX2I&I?4)DRW3ksO;8GI47bGRZlEOeUN^ zWvEa;(wBiu^)}8BnfCH&)3*Uf;I!%6p@Gw;?+{DhC6>M$n)%bF?_p~Tr%mr-YZf?d z!kS&Fsd9{^&0Ns>dLRgW`e~EUH=Z`}I4Dm!HiNlfvq0xUBMXQNRtID*;3OCmkGY`b z^z0~NPUixaTQcRmoAYurb3yBua!%(0);D(7!Ue5d>N%YYjZ$4aZPF%6-KU>6NfQ-t zvR6I!}K2kC6+%l{cqR==Scs=_sIW+Ep_tGLSsB*`ZuY|R2^Ou|ae zWjiL>xicoMspkrzNk3!4nyRa+z;KVvWYqe4nvi`apD{HGKPIEi0-cPFEFdyk9gxY0 zlVD6dCZm=s<(y8&S~&}uY|3;pH41f+Oxi@L;})N?u>WvVO4WFPYcGHHXQ(9p>w4H_m@F)bK}1BFc7nuSbq z&LEQs=T8|b)Q=pd1~S##I74LG%OB{y3pfHF=zT9VaDMcCV(Gt&r5}K1{sX=Du(gE` z^nQq~S>OXbtl5>CD#uvb%muBl2ZGS2f1oGyjUVXoI4Dm!HiNlfvq0xUBMXQNRtID* z;3OCmkGY`b^z0~NPUixaTQcRmoAYurb3yBua!%(0);D(7!Ue5d>N%YYjZ$5BE1GK) zrS8+;iAoa{aI#lE0Zul9bT~DN5(Q4&ngvdB;v&Nd7m=DIOcR#@PW3igIL+O&=sy4~ z0H@DE190kG!k3nyfu()W%){wiwzdGL^VymO;Dj~1Qd8v^OPk@O_4P;<`gAx6eIuNB z9F(UVo566hS)jwIkp%=Ns{=Bea1xA($8geedWse?r^5-$EtzuO73F4zlh!ZgoDL_f zZ|trGPFlItb2^+FrMd_wZKBkDI-I153OLy-p8zMDK{}ioMTr6@Zp{KGIdPHUgo{W` z5~hjE0H=BzX9!NG|CwIpL)y#Vy`?{){T`r-xn|>)7e-T zb>&G!U7Epcv{|6Dv5^JDMymrd8*vhfWu`ieo)NF*G$BOH>1@PuOQxK6MY);TsP#)Z zr?V038@p>^qgF2UoX$p>>Iy9J!KZ>EicUs@fF*6P6dF2~q(RdMdfb_DI8d;}ty!=n z=L|BIaQ>7b)0|+&B0h*+@nUf2X!`VqcI{$p%uU;g9J zl(6)EwrU4UA7G0MU`aU04Qd^sHisoHSiq9dq+e39xlFb4gON}fbELk0pv4oRQEHl+%ge5JfCub3JI+n29k}2n1QEp}|Y5h{p z=~%-0#_n3Mq?JoOr(;Q`x&ljl@Ts7PqLa}eU`ZP+g@%qLY0!iv?#wtGC|KgwELf6r z1{q5@f69<)&M;u9-o_ci(q8^M)A^6*AKqOA4N&M}v2=-8dOS4qALU)f))u(%1h!^@ zkMgi)S8A#pV`(!Nw7wn)LZ8kBp>O;skH6Sro8lbpE7aKc5TCJEETWq?z?jWYzN)Bh;1P^-IfdETpl zCzi9N1UA9td1Jmup0TBFeheDp<#`jffuTx|oBPVa=}8R8_`%ETzqO)cWN8Vh zYPnL*>3GC)s=Nz1msM`Yqt-9woQ_AVZ|trGk6O9Zb2=Vnsw>E3AM*qKTXk-C#!Rmm_1)Kz9;xQMroSq#;%;{Xfa!aP1cXM8DW-e&`QqJjI!1~7STDYK< zOFgG^p;4*}Z$)!$qSSr*X_GWj0VjLq6X0YsNQYCSC{f_Vty$nCCoVFaa1p6V!ZdLi z;8bs;h11;Sc~7{M!|6(B08Uqlr6-G}r$93gr>C*C1vq^HTeAS1ux3|ksvKi!Gn}-( z9;rf~4kw{+gcFa0@|0sU7)~||bT~D#fZ$|xK!y`ef-&(JPFhY+(IVz_IAOUZQ_j0N zFE=xsw0}7Kr;`gEw;7*r~BEO z1>l4=yHZo-7)zVsr1kYk75a2I34J4+cpQ|c9Gk&#vRRP4z)4PAWH{j>Qj>&f;xfRg-bM?jIXHb3zyfgk1!w?H|5Gge zl34m>Xy)Pct88rnP9JA$7Jw7h>`G0QV=Qfklh)TGRp`^j2FXfyLC#-Mmt_4n7xzuwy zoEoLN2q$f#)O|Xfq=^bR*(;v_C!0Y!oEk-m0w-?G0w+0fk>P}kNKF!^iOT?|dKJ@RLSQ@xFrOz?%K`vD&oGCcsBfJLYH9{KCo(!TsbXi8sbdOcgU^M$52u*C(w z&{XGOsoW*6hlzDmL<%OKCG3 zwZ5LHWS_}wtP8*LBnm*9!ECfyptG@&1;j?H12P+N5{ebCI*h(srR7RFr?atE&ca5U zGM$Yw)D>9b#cv#Q1T1NTrE;WWsZlLZu*9uduq4MU8A~{SYJ8Z+tN}~)Hd-tJmOc&; zv0&*FunDmA>wJ&=x7gCY{I{VgVd;}>)ee?E%@!BHQk{dPf`hJbV8RmjQNWV0LdTM@ zk{deS5wdew(wcgT5}I@@Va=}Wsw#0Fb17}clGfMrfb26FOLgH_oE(ZfF*6PRE~5kHL3*) zmbf(wmgJZvV+rR^jSth9HDIaUMvEoD(sh?xvGm2T2|maB623>i!j?Mu_0SkU$Me{R z0u+3Fn@mMi6)4ux7d3lwb1bSN|mb@6jNZK70i^w066i3&2=2R?yJ zHiL9BHHs32Ox&7SQ@xFrOhBeL06r`yOkV?=fK30H?~%WWEp_rY zLt`Y<*Rc%+GELc<1;`|<Tm9vn^rc5VOqfi&gq)n7cj!q_NqJm8J zflnZl%^;mjjiN*$6Srm|lbkrnWWq&MHE|foRBxjt6OifCfDa3qeh)SQnSP(|k$;9Q zb@D%g#z>|=VH*l$`ZKm>0Wt|IIhXC2War4FHT5hdH0fl*nyRacOt{BpGHHE1O~^iz z$>qbO0x#I0G#Bqt6snQ#$RO&kU?)!W!TG8t~CVSj|+UcM8A{{+UV zd;kqlXegFOV(A8G<}VrlQnr=>Nlz5dXKNO?WE^XDrKW-dmNvsd>+6v!^y!z33w`5t zi98O8VdXt`3(>2SbuOQxK6b6#%dOUAW+Dd+S{ z#<9M!yB0WUTR@en)^P}6u<&-`Y+G`oW4mceT!InD>Uz8s)hZEK}cGm(Ytz7Ck9Zro>U4)Z1QR+S&PSQjLoa~iPfRoK2 z9Zrp+M1d2xW`UEOxX5tAMWiMP)5K+fQ@xEd1gF!#yQ|^aH2XbX=@+N{8Bhht^cTCD#2LVOeU?bhpEt~lS$|s$;9KJJmuI7 zCX>wqolK1^ATn7UkjaFTU`#wFla|x-vxqsJOjvHol=E)R%gszCtzXJHolIEY*j)>m zv~sEEbTTzcb&*WkM5+69GD#B^Wa5>tG9xNqri4Hyn?X968byghCT`6_COL7D$%KnY zO%kSw%Rr`j8)t}2d-*fH=U>6$v>zIP(@kROX0db&H1lw}m8~tn=^$IP0GzO9S8A#p zV`(#-w7wpxLZ1#Np>Ko}kAw1*V>1{|HVbq(HL`%6HbCL@fc28PEXMy=5#n= zxg}H1yE!j6Gn}-3Dd%)JVSQtFEpXDxrJmE_)F{Ayk)aQb$!^qpeqyP%ne z(>vMP0-XLETeAS1ux3|ksvKi!Gn}-(9;rf~4kw{+gcFa0@|0sU7)~||bT~D#fZ$|x zK!y`ef-&(JPFhY+(IVz_IAOUZQ_j0NFE=xsw0yaw->2MPIMmX^} zC{H;ygW+VeK!;N!3kXhD2V^+mBp4Hq;iTpC6fI&-hZB}tGUdFR^Kvu8N$Zz#PKOiL zH+I(oC#_uSIUP=oQeA|THc{$69Zu3j1)S`aPk@unARSJPqC|lcw`PHpoVdtv!bPMe z3Dd-7fK$DV7EW_;I`~8mr`w?cI2{&CcZj7sp_zx%U2JUuPIt343&06$cBQ7uF_t#N zN$cy8D)i}a68c6s@i-_?IW~jgWV1krQzHuqPF4qGIN>B16OZAf<@6LSVorw>mRmCA zyqoiKGs8*imvT;r6V^9&*8(T4TOLJ#(nJNE?3GV|lg%IrL$Z*0%q$UZ|#ASd}y^R)5b8z}^02VlN`oEw7IDM~J`hKzW-=Ud@(+{$> z1vvc=wq^l1Va=}8R5`}dW;khmJyL}}9Zo{u2qzu~2SjO#_n3+q?JoOr^BgHs*7;aCQ99> z!%3Q`fRnxQ32?F*q{FFElqhiG)+}(66BijyxQNswVVbxMaH_Y_!f6gp{|;aQIQ{?7 z0GvK2mbzE+r6p+Q;dBmLTY%GfY|R32!kS&Fsd9{^&2ZBCdZY?{I-G>Q5l%b~%2STb zU^v+<(Bag`0)ms(0U1s>3C6@@IB7XOMT?lz;e_RuOgZo7yxh!i()y*G)8T~mjor1t zNh_CnPKQ&YR2Si-O_aJ%hm$l>0VjLq6X0YsNQYCSC{f_Vty$nCCoVFaa1p6V!ZdLi z;8btp48dv7UPpd6PzA{J5@>)-FBMBK6H70LW}Zy1U~3Cxx|gk4fJ|7kD>YSuv9y^? zT3-)Sp-(51&^MBa$3c0@u^CJzn*}2`9mrcuXcOr{`x8b2^!@+>$Bh z-JF-3nM_*0lyf?nu)eXo7BXq&QqSpRYLx0CnY4*g_vvJkCMw9pD_>#m8zyfgkVQ2tO?-ffwDwci> znt3?AkF71h=_lBl1>l4=yHZo-7)zVsr1kYk75a2I34J4+cpQ|c9Gk&#vRRP4z)4PAWH{j>Qj>&f;xfRg-p201=@EaN z;M=b1bUWCgXCp zxWHpF>KrT;9CU>P!&i}W?t=kSk6vMg{!L_IB{y`uBV_09?x!{Nv?Vm@clX1ZUD;Jt z>pbRC+6-x}U+y#c?tXRQSDr)xNHZAHHVbq}H?n{rZFN9~G)_XX;#G&yV=}Z{Dd%)Z z*UDKSX;Y>{Qii&MPrUezNhk108!VM0ollKwfx;(l&B7-+X32cQ`BR}XjadVq>TNuV z`1HtO>0W?{1xpcZ0xZRRk33~d`|=E$5|)m$RXbS9+2R6Ns&lYZaL^SFOjzPR3Rn_W z=vWd~azn>ELUs;IT2oI^LX(aqtl5=aRVB`2E~U*_()xNHkbNd&sV@A=lPCab24l%) zfsUm{77&)K4#-%-Nhnsl>M+8RmMi6)j-^^T3zlrkbS%kGS73=3zcJ|qENO$Ka-?Ia zQ7urg#I0GdB*!cnOE`ZjRHiX&z*4=97E5p^@}B^RSg`byunDmAQ+$v7Lu_eZ{xi^& zu=HWJY6nXnVT%i3sm{St!9iCzFky-NC}2rgp<_u{$qgOv2-!I-X-z#v2~9edux3|w zRh2l8xs*0zN$cx*K=zr8rMmDdPoe;%8H^>H1v-`*SwL8_Iv`^SC!tvJs>29NTCS9H zI+kkXELgHB)3GE&U4bQD{Kljcu%r!^%8`zxMzuh}61Qf-k{q*SEaCjAP?^T80Za8Z zS}XyUE`O30OIN@qz|s@>9{H2l(!Tu3(3G(BRJLjdOINeS1+Y}-V5#7sD;$`x#C;U7 zB&^V}B&_6yj(3FY9G0}Eo}z>%9ZOiVE4!*noX1>Bo3W(z^*kW^OvX}O_?0J70MZP` zlFb4gON}fbELk0pv4oRQta#O7ge5Ik$~hfNwQ?3L*_7#6lA*4^5-)z^m?L0G8!VM0 z9ZQXBfr2G&&4ML4X31E>`BUS=G-eH0s<+W%39ys{L@Z}ZtFQ^Mbb{}ZpJYq>@>fGs z!qO&NwS%Q?wzvS6>KrT;9CU>P6PCD-0+xgoI+lc$+|cokke$Pl*3?s!(4=DtYj$N< zRf+SMOKCHfw7#APWS_}cstdpJBnm*9!C10cpkt|#1%xH512UFy5{ebCI*hQS!tf{)H3Jmwy3gaCy>czkWQvXQKFEETeFZ!P8?)1 z;UcP#SYyvVpgYS`F!~nZOg3dYnHq(WNH*83YoYy3z_7^ zK_(L}qN<6*K&E;dEt!B!+kg+tIn!%k6OicvzDNF*Y^jsK4jLnwzKU%qkm(_|W&tt@ zD>;|#m}KY3q&4*{B{b<|!kVh9icGl2W-@7gJx$0ylgZR5{FqEO3v@CyvVh2BbwDN) zPJ%Jg#P1v2&6 zngz%ttmIs_W0IXClh)L;l+dJ;32UmZDl*|7o5`g0^)w;-OeRyK@MALBEYQi+$O0mh z)d87II0?qYV=`&EQqJjQs+F^l$)-#vQ=?E9$)rt`N{&t@X`+Hm_JL0zlg%KVOpT&M zArrS|A(Naq$YjDrR5fuJ$W(8mB@>Y8A;5>_oaw7!6Oid^_#XKi*-|He6EsFLy@hQk zkm>8$ngz%ttmIs_W0IXClh)L;l+dJ;32UmZDl*|7o5`g0^)w;-OeRyK@MALBEYQi+ z$O0mh)d87II0?qYV=`&EQqJjQs+F^l$)-#vQ=?E9$)rt`N{&t@X`+Hm_JL0zlg%KV zOpT&MArrS|A(Naq$YjDrR5fuJ$W(8mB@>Y8Q-BW(nSK{G0gHZ*?~(r@TiTa@2Aa|( z*4Go2>@%5-b>UZ@L;*-Mn2k0IbT&4!fY@ktKxQLOLb2jihtVbD zTCS9HIvZ={ENrwX)7dCPU4bQD{Kljcu%r!^%8`zxMzuh}61Qf-k{q*SEaCjAP?^T8 z0Za8ZS}XyUdQY`tDS%CI!qn$`>>L!d zrk)^#CLIb`Q*~7p81Atd3R+)}LfL0B6dHveL&0W&4uwV*5EQHq$WXvZFeVrc8%Iqfi%5n6!yf$Og4jbGBt`4g-qOuEyvnM|fe;m2gMS)h}tkp)C1s{=Bba1xA( z$7IrSrJU2rR4Zp8lTDdUrbeMIl1ZB=l^mT+(nJNB>;s=bCYwPznHoijLMCp_LMAzJ zkjaFLsA}Rckg49r?vd%T1FP%XW2lv*X|laB**Z0grj2epenqmrHlA!v*4H+VMq883 zY?6*=hxSb`9#1w;u12ShL?_Z&@sl+B?ZxTE`lrAU3!eTLY&x`*{{`P8|0}lC&Hox2 zBcA@2Z7AUB@7bCK@Fc9{T((n??FiX9JZVimRS8Wxp0H+DYAQVO9!qI6p0vK6D`cO^ zcxn`Wj3=7~I-VL?KzOn`Ama%q!I*fACoNaXIUP?}PL+2d=d#L;xAf1oektelJNjdN zV|Oih)XJrv)A1-%T|p-Mm?w})8!Ux}P9|y4FsX`ZK@Cwc8_BUrArrS|A(Nal$YjF# zQ-%ulBYhdjRBvPV$kd2J`wnLj5R3*R;{dTki9SNU>}gggy#O`=hHm70)m2qsxW{HFX?;BkWuM7VY7~A9 zC7T60lp0w;P_jB8LkTCrn0O2&Emz7p9ZI!w7AV-1=}>4C>f$+*Hc=`$`rA-xqJm8J zflnZl%^;mjjiN*$6Srm|lbkrnWWq&MHE|foRBxjt6MUNYcEE?_bm`k*6Oid0e2@G) z*it9|PH2o|`fj$NK&J0uYZf4ru#$7xj!AZoOj=XVQbLnXCakHts>pOg4jbGBt`4g-qOsa!zMst(=98Hf1^+WvDB##EaiJ<_K8Q2215g$5NwOpkRqx zvtUV%Su&Pz{?zy|jadVh>TR@G0xZ4gYAcp*gH3S4bcpYfA7M+K{0?Z0Crtl|Z74wD zC|k3@36rprbJ>nbb`Ahe9I@ z2ntpQWGLVy7!!|An6z9e=X5C4%2}XbQ>H_qQK*Y2Oxi@L;s=bCYwPz znHoijLMCp_LMAzJkjaFLsA}Rckg48AOC})G_W(XDCrs~xO+co1^F8wKV@sX<`=K$C z=?B<`0-4^!)+|6KVI}9X9h2-FnY5;!rGzG(OjuKORgnqz*i0s^ucrywXEK=@g&&j2 zW`RzoMivm6tPaRz!bvbD9+OGSm2yreQ>~nZOg3dYnHq(WNH*83YoYy3z_7^K_(L}qN<6*K&E;dEt!B!{|5N5km)~Q6I_$`|M5NY&KGb_ zb)hkmX&>8AAk(>Q%>rZ+R&p-eDadwmE;~mit*K`zp-Cqb*6d16MJC>3DQzZ`*4NX7 z>@%56b>UZ@MEIo{OeUKJI++?-KxDEyAd?9v!I*eVCM{RWIh{=K1~S##XvqX*Ituu( zkm(-S1ZPPv=6mE{&X)G&FN3D^N2ae}t9Jg#^h&n4z#p0F94r+abcF-cADOt10vm-D z`X8BumE6$rj*y*Wqt?{(q|l_Z5o>m3S5=Agm`iCh8@0ZksAQkXY^)2v@+1mCn!#+e zS)jAAkp;v?s{=9{aT1CZuR4tW$fV^;Ij6I+R?fmkn=+k^GSn4V;>B+qa|A4DgQaq$ zW2sRsP_V?US+FF>EE!8Ue`Hp??HTbR0W8%ySSmQ^3I`@EaUTUN2`h9g2`jmw;~gP8hb674rzoLG#}d}; z%C4#s=P{SkW-MuaJrBq}ld)76e&tCNfHZ@#WV1lWQX>lpOI8PDEa4;+D_(UNVM)uC za!$umt(*l*Hf1`NWT-2!#EaiJ<_K8Q2215g$5NwOpkRqxvtUV%Su&Pz{?zy|jadVh z>TR@G0xX^TbSsw5hfRQ`3-})S#cXL`{y1n#Sb98LwS%S0*x~|Ms&lYZaL^SFOjzPR z3Rn_W=vWd~azn>ELUs;IT2oI^LX(aqtl5=aRVB`2E~U*_()xNHkbNd&sV@A=lPCab z24l%)fsUm{77&)K4#-%-Nhnsl>M+8RmMi6)j-^^T3zlrkbS%kGS73=3zj4eFu%r!^ z%8`zxMzuh}61Qf-k{q*SEaCjA@nIUX1}xRvXt4xXdL=-_a<=p;*aUxGiufM+m@Rel z6dL27myWRw1t?6|ng#y6B&_6Iwo{Pp2-!I(XiYsq2u(T^ux3|kssiIZmeOV@Xnj2j zWuM7Vs0+XHB*HJvU?|uu(4o-C0)m3o0T~K73C6_ZKQC#yQqJj6sFkxo!KO@yLZeU@ z|GcD4luC~N=Ot;Pf=u>-Pau=cAe~H&qC_DRw`L)eoH)p2!bPM8scGUckg48AOC})G z`vD&oGJOCx0gHZ;?~#9yEp_q_L1QG-!)!x=Oh3!kEI=kE8rYra!`BiMGlRpU>BblDUHWbM8G`3~|G6^d=m+hEj=g6cr^(-Yc z>14v1s;i1jxW{HPX?;CS$Uc+F)F}LzOg0O2GBvV*$YgauCKFDAG4Ys8TCS9HI+<$a zEM&4N)5+8*)I~CB6Qz=)lS!JWAd`LI6UbyUNGDUHC{f77ty#zLDBs)hYt*K`z zp-Cqb)>K_pWWqf*lS%9AX+rjyOr}QR$7Hfupp&VQ1wLDBs)hY zt*K`zp-Cqb)>K_pWWqf*lS%9AX+rjyOr}QR$7Hfupp&VQ1w~nZOg3dYnHq(WNH*83YoYy3z_7^ zK_(L}qN<6*K&E;dEt!B!TQL1v&YA9KGjlh84c{Ywt(d335*j0!9%LH|WO_YYvjCZd zm7L3VOtN!i(wcgf5}I@}VNKOlMJC*1Gnur$o+f0U$z*C2eoQ8t1v;4;SwLj6Iv|q? zC&8F_OeQT?$~m1(wQ?3R*_7#IY82`snY4*g$6kwzMdvzpUGru6n;!5n*}2`9mrcuXcOSIRk^Oto?rGTD^rWNH-ZBAK*_QpwTDBu!M1$v*H2WU?8glc`aZ zC}iT+EM$@s2boN`h^i(I1DWb=v}6J@y&mvkIcItUYyvWUHQyuuTDH{5-w2J7OmAiz z3S{~^wq^k`2`f35?U-ce$fPy(EG0DQWWt)NtBOpx$7V8VeLYRcK9kARDEydAHVbqz zHL`%nWOYC$6HbCL@t90nu9R~+nQG-MWU?vK$TN7~~1vUyR^ji}NE4iWL9U(i%My;vmNufz+ zBi8K7t|~V2m`iCh8@0ZksAQkXY^)2v@+1mCn!#+eS)jAAkp;v?s{=9{aT1CZuR4rw zO{C>YIj6I+R?fmkn=+k^GSn4V;>B+qa|A4DgQaq$W2sRsP_V?US+FF>EE!8Ue`7&~;#G$cmb6?c=X5O9%2}{vQ>J4{hPnbvy!ee{j({a? zuvCt8EH$bH3YNGv3zp=VC1VNaPmK@Lm^EOj-bRZhz|z+NL@Z}ZQ`iKb<9!3)BmXA0 z)XBdY8sq19Z)F<_PSRK?qGc6tJf1swyztV>1-Az8;0L z&txbx3O|N|%>o??jVvH2SRIg|fRkWMJpLR{%aw9YheEBK1qwE0Iusg(y7)PsHc=`$ z`saAkLLDBs)hYt*K`zp-Cqb)>K_pWWqf* zlS%9AX+rjyOr}QR$7Hfupp&VQ1wuvI%B<=x5_7x*Zz&cRZ_L0331eU!(26xb-N&_Bu( zR&qnfJ3@AjjapOBlR}fuMy%PDT~%!4F_+S2Hfnu6QOQ1&*;p5TB+qa|A4DgQaq$W2sRs zP_V?UnX&Y?3p(8n`nbc8(5OQ_mDalTHV$sk*8P4ENYf2d%G% zqwF)84voT(>0q-!r$ZwPhz?cN3QQK*Y&PTEAN z;s>GD4Rh#q8desf+%jyjHp~r9Aq-#BC47=3}mXeK_pXQy4`CF`h;cY z)TL-~X9r9Tw6|r4#rCEgq;SN-!p^G~|E+MK!otq63ad|h!E)T4)$MOHV|{&I(Mu+4Jtc_V)8trguXN`7pY=P2pvweHezNKp4Iks<*+mnj+ z+^Ic9Y)`A(PY>D;N!kyV+RxA0&m7y2R@+aI+fUuwKQ27Ne?ysGo4I{=I7-J(7WP~x z==+`%#l3+OjKa9@N0}eGkcDf#o;OY+*LB>H54*Wp>Wt#S$cf{`OMO4_`-|*G6!k}$ zKS+|H6OH}U34Awk;%pc?aWWcYapLn68dZS)80F^;MgrI`*sFy}g zJnXwk)OUOFBD)bqNBuYqMuF$JgV=+dg3E9;jvRL!43co1$z)aS7PzS=cT1zFH%OwM zlSUr&Gzth*h&lzz_-qQp;l7t*ntx*@C&GG0E(z=_i+aNqJAPnOy za(ewfq&^KH^}P&IKj;T>FBtShSypuc^|Uwa^`q4FoPH7x!5|btI3D=mEesPsgDT@) z2>p1F##!L>vp$S~D9fOeUg`{jv6r}k=MVXA-msU%u^Tv^3qcJsujfFarcSTd55rzO zgsS92hPK;qJoX{faE!hO6_UiR6ZQKUcp_2^KQ7`PLz9-_=gRwGpV<(GKcC;XM!mJ-Sy`(=*!!VM`irk<#NTZR{ z_eW6VqqOIQ5sbod)Q_S#9m=Eidtoy41~BTg1j5^o22SV>hA;{A(*7_^q&F`L2Y%>} zoDAkU*sTYX!^njf^q|vmF!X!e+b~Lo&?5*#$cD3*u<;*xP7Lu0!Xb|c1jO~j!8jUt zppwCCIRJxEFX=f0Z{TNs;7f1B-9}-rm-6Gb zjaa=NZ7jHhpf`$AC~_}>ku`u(5qoS38;pBiFZ7f*T9H$SjGOjH*(h;Xal$}>`i>an zhG7sS0SqSbmH^&CM1FtNhgmI%ognDL^pRu`MnChiapXyed&HyBvOp9i4re0Ts>Z?~ zNdd^U;}q}aGIzZMusZ~1#Xdkh?Zr+6Q`-m_D+w5lfQaK1SU+T07yu~4F+_U=$r)rY zu}Wsqc|;$cOzCv)%#wU_J+MNPu9pA_QMg(fKXpR=N=Sj7y;z6&8X7(6Ws7fBcZ` zIDr45?e}KWxfQiXgd_Ocmgg+ZOO$(YiRX@1 z!VuyTu8c+yh6N?(UVpmBE9;k!*De?H^%#rCTt(Lw;A1R6XE+{59+7|iLgQq8du?mu z)EyglrN<`gYqROnJx5^{J(jK?SYO{5Pu8NXbaTdby>NAX?bu{%dz{X0efXY#zU|>o zr#ro16)t%e>u$XHbMJa5d?RpsdhX^Hyb7*)KDfF%SzDiM&Zg%ildV(mx7$0Tjr*4G zn!pv$@;32FrgH~zW*nSz7!Z%x-X zj!hz6famYuT8-AWqDQaxnU8$y;MRxF_ylw&%m0z={7tvizyG-Ls)N7qPuPrEji>o8tsO`0IBLgHJC0`4#m?^9d83^-+Igd$H`;kad?;r76zs7!Pm(@+ zc!WM`eXPa0?QhHAmccE9TL!lb##bD*Txhw_a-rqI9^}G9gC)o$%K#!I(-L0>E2F0`2L z68i?Z5|rW)ilve8!J`tuE9DAqNd%%7vcrm>-T;oW#584OhTJq;yU*kM$)939>$VhT z-|OE8w>D!xec@ARG85>41C|GPOdoq81W?MbwS4)UHTIpqY1_0R*ySo{KNW)^_Ne-J zP&@*Qc`p4{TIAi@S+~b!T1aH@;ZGIKZgFVx8`Eaxr9ZOH7Yg^0v?>q>%Hf?t+2IQ%CWEl$-+~0KhmIspK(HcDQ z^o}*SIS|YQSEG$bk4GEno$C{bByn@)p`Tt%#QtP!a(}vf^JF7Uw$?XJ&8C+go+KOV zo9o%u@~s=u$>ZeQ)gGBv1N@!VwDw?66Cq;ZJ9-@MU$p#^14oZKto+~svf>!?J(*uq ztJB~mmDZ+DIeOozlj(A{zOj7M_9mozb5kd_YFh)R^WM*pwOa30B`cCy6`G1|;>Fe7 zuHIT@tumRXH;8LqJ)hdSHT7|;?s!F1r&oy4cVKk_GrXMhXQva5#Sd6pQ?%)ZN~XE+ zPAj7)f?ruX^GB@hQtb|vf_1MJp6m9ipPD}pN2rW_b!H5Jt20cQMCP(7UUcnn1b3|u z19r=DcnU_4jfe1C;KS|a6E6$1f$w_oxpKQ(IUsO1dG@d8u%C_#PXKV>X&dkx`p52= zFaG(vx*Jhc?FJScc$P(-H`{K+3K1RE0XeOs$=W0yvY)}jTYR`ncnCLZXE))GoXCS4 z+V|l%xZO0|i9hPgw_N3X*j!3wmA0DQb}7)i*%vP)?3wK; zF(7I;^E6Q`cVa54caw)CMv%B$sX)!0Su`K22x^Y@$n3_3M&qe*v9v7~Cn(k_kCNf(a<3~bN4Gmi=i1;DyCQDfL z)Fw(wRx$soAH+JgDNBRuXuG>xjkju1b9Z;w;OFOPr0hPF=%7(33w9sZr8zsv+0HD#>V=_fpxgg{-Mt1-dO=p0N8PM+b8escBYqP(PS0= z5^`4>ZL)jppL@sFari`<-&jmkH+K47CiGHTD>{lf{tv?rq>^S z;r``~^wrz&Cj$QWoK1MV!Dco|$IJ1lEE>|BqBX%*~sRlu&!zwxB;B1>M$J zTW4*Z&7VNFy+n<27$J_l+6?bAfJ)d8?y#MA|`&%1>w5@}UU5vrk9A1Ad zJl!<9zQ5uwU#G4;KXUi7=dQTVTZR>b;Cagr41(t@?>~8RHGN4MADV1k4^ORM@dwM- z9eUB-hi`xG^6KQibotgaxo`bB%Lk5cte;4)54{z4C2#}wu=Q~HXp}`86ZNuN#>eD# zc<}lVzTe%tfLQIRSe&Y^i$}B?&ZKr*iF>LN;eHKmM%s)3YKqL*8+8FL+PUg69)Uem ziF;t4Y-1tb^|E(zZ7kYYh?Ar}O0IUkkngM7k=l;bcBEE+M$?Xwc8s)Rq#YyF&ve`Q zqMa|=`J$aK+WBJfzlXJRXFGScb7wnuQs>US@%Qs~)@o<1cGhZVE$Xb*&KK=`(asm` ze9_Jq?HS_fTs_)yq~(Z(BNrUF`-S&xrW(G6z(XFww$|vd}0Ddi!W_1 zN_wRdrM9Ks?#)GNXLf79Qcid4uxI)>*G5SajNn;oPC9}cQLb z`*35{pf_+v<6!KBkq7aBdlp7P3~@`NIEu%k9&Aj85VzEKMt*+;ar4|kztOkKGYG921Ho9Qq@t7li%6u;<49klk#Vc(iyN4|@ZMTdz0l zJAv1WA+nk4q*2dHdTBiN*aH=>-QAuNk9HR1^o;bBnA5Xhx81Ff_Gry!OJdy4f_iJa zP~yVw284*V-4$(*_K4=R4R0IX%J-I6CR^Dy`-I`f%`{0KIJvSmS<9o@^zzr#2H|kKvPxlCLXHu#Yif(puB&sq5^0k{^VW9N6~1Y%?vJrCKoU_xbAn>1rFg z{RppGBr<2mzK?J~A4P}1GBFRzM^P7AtBOXnNL(AlyFc0kR+o7K2B+OYXj0&NIMqV$)TMsTQ0PqY~K>J?~&R!jqTgxN8kCv+unG2hySCV z)Le9QatuDf?EOSA{v z#eB8FoTXc{`1s?md;7y(foAnnE$)*m&XMi8vOQ0>=gam2*s$IJFo z*Uvea*cG*}B>JoouRGK|^n6%& z!gT45aQ2ori*@^sUv=cjk=s58|M-tXFM#@b3)8>g?sP3$+d2r-519&lDj7-(p%HDbR*hgv*$&3rJH;Qw(li(oMh|a5sXKo6X5kSz5L>IV-r@hOS$27 z$JRGaiI;A#Zry$ABepL0*0)cB5w(2h#`^t}F+9?8dcnbQy0$gh0wd?%p5C9X!m8WX z6MnSW^osqfTj>T^NtvUAvOkZ9yL{g~**v)#oe~{97gjLoEB9~1BP8K);`RFRlTRtG zKb&qIUmtJ6W%ux!XB4-AGX}WH+A-U!@7j5c>9Ocpj8!5~6&G3UIA4=lp^!`bb3ZD?{gPRA}AX-tf zHMt))FR_SRc<|2sYacwR|nS)!=2hEaHRqC5nNxy6xD$r&lYaEA7a6Z4YpohTygJ< z;cMbouywo=_8&X80e|-A^?jvY3#A9i5#<2=W9wOnpu<MGQRuDP8;d&1FlgGKI6 zI8rh>8LhHNJ+Zt}l-7AV{&%wnlOEjM+)g*drc2QpF?ue91aIs=1|5VLv)>C&&SPts z)aC3KEiMjr@&5fc?~L|y#PQC99>Hj2LjnfG);2u4c6#CM>ublv?~Fs!bJo}xKeGKs zm|ya%U>eGw3_oB7%AX1?!_*JM^K{ui*>n`16m}FI)by>UZ8Z(6>2kj~Oy{6%ZY1w{8wtpnsKbGx3$o5}kJM4;IMzZ}f z*}hD+uaxbpWE;u$-Ln0D*}hk{KO);7mFWb4Z|kZoVK1KAE` zdxvaaDce}KiEP(ods4QWvVBmtQ`vrtY~Lx{cgyw%W&0l4{)lXUT(%F(mUD7~Ik{5g zWC!a1(2Etg^91T$jDwU7hUq!?Zk+yx6@)%DkG-aFnt2@^O>EcdQPaS9JHe)Hybyz+klhcBHZ literal 266894 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 S1M;+7<0G6-_-?1`jQxMh(x2J@ literal 75110 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 Ds5D2r diff --git a/tests/testdata/localdata/az_net_comms_df.pkl b/tests/testdata/localdata/az_net_comms_df.pkl index c4cd03260ae2d400ec2be8a88d30895433cb01c1..2b893e8eb8ba8657e8eb74f96139238c61180f7a 100644 GIT binary patch delta 1271 zcmc&!%Wl&^6txpO2!$32qCkVCCZ&(Cz_fx&zyc{G3segu5U{nz&ZOhSaU4HHQ>mB* zZ3-F*f`=|6KB1CP1wX+zuxG^=lo_W{S|Neh&{^EMW8ZV`LuY1K{ZSQOi66fYgk@3C z+UxG%?#&SA9bngiCu^3ed$MW!(6xc(5qw??Y{xWO7SwdBW3)&_@Wm6sz;!{7MoOCI z^fo5pYOTWl+y_Pr))`DXf*Bnb$|ICq2R`)8J8eh_rfSKd4HFzitj%VA3TmG`Ay~A7 zw$r0~-S0V&v85i~CU175eEP=V^R-o!!)Is%EFt}=aNDHH>x4ne3a<#t%nm{MBh2Wl zfC_Obt)|Ocq>M$a;leIaaYi$Mfgsr;SO{#>r+I9TctM}&(MoZ4RY@^4%Hj)2L2}Xy zb)jn-1ZOEtr>zH#26Sl|<-L7@qbuIe#KJw6zrkuA)`JVPO z_>^1vU4@rvJQZ}J!SS8Y;(3097n>g_DjKF_vH6vG-%?kF9V+Q)vsAi;Md16c$L?rG hYgk}CaW4VO>b&r@df-^5L0=Nh0y?Bm*sd4o@-KI-U0nbG delta 1258 zcmc(e&2G~`5XZCehf1Q9BJoukHCPoify6kpKnqbN$e{(RMoP;KROQ2EFliDR8>K)o z2vHQYmud%&JOkhhH+TUqyao>ey9qRrQi`}xA7;GT`Ta*@&;NV=U0!}BzhT?5p(-nt zqFdaaosv_}G06&v%u$F^<$A4Rw~*l`CaEkckS&qa5LIg4T4Mv*Qxcyz{u1E`RVwaA z!{((ld~*iPkV#%)0h6Xg$rB7dCt4&7F_zQxFwC*KHeuYsBpilgW{BgX-CAPG=I9o} zI1MlMYsi%3F!(?$>FOY&{zg{&5eW*GW!?C}pH47CE|%KY-pj#bC6MF%FsL-#QPP5u z=!=-2CZUkCf5G3E?vyN}lM$2qo%k<-l3Tyn9;FMZ-f_=2s(|Y@n%K>3 zBq3#s<(sp-E$)v!ICY1cf(vjFF2M}sc47V9nhx*4r{D~ng*0S9hjU;+7S6*o%)({3 z(l2IjB2^7NJFRECW-qqvCPIX&rE0x=zlnSRJ|I;e7OS4PS)@a2ch^^{b*bD$HmM{m zkKa2V`7eXpP9V~NyTwS{+xPx%)V#r}k*vYLR8MvF52}1t=L_%G&NtZC@dptB*~g} z6q7mF?8wn@@~D`Vzrcff^5Q}LBTPJc(l^^SWaB|kc9Xuh(|O($~95Bg5)4a%a;%k^yR}v357U7EDk4r zutJ?YAebw=C9?{?;8aaS*}9f*k*E7~Gt0A>xkLOEn`ykgGNlgSZs>*PhB!V}BQuOl znt=?@^2t4-4o2bXP>^DUxVJ;Hm=lW@+9Co@h>E1Bi0lx|x@FCQlx3UPZk@>ZlZ-R-%^v)TtBiS+Ykm%QG=U!<4 ztHG@5I3`?4>iid}75^}`48LxVSt0rot*QeCu7KCEi+~eIvK@atZTk1pM({rUg&C~F zLDY!8+jL&j)&1j<4CDFVMuxoR4n8x#FgL%xAmmpkuZ}!gC4i|#FfC}*MQI}|+_N;h zHoMejLm*Zv&+V2x+s>aF+q(HrGVPDbv`!jZ*Esz(6xlc&xcsMPlMoN`4;9qkg1ZM(0#V~1ja|HfImvM> mn-0c=STv-K@b!XZ7?sDiSa3}kh%m`TLy{4ELiTM}&iw`@*UIhy delta 1582 zcmc&!%}*0S6yKq{8`1_Vi6X^nDSptZU0bP@B1W+Xf@{}Aj2A=5wq1R#r8M1LLt}9D z0H$$5ATx3{#>6XTk0xH#yBaSh{tuo!>1-FUq~&Vo@Lp!#`~BX>Q#-o;+|XMROVzvetAdiWVnPZ=)*^=YNep+Qhu?fNkxZM(uy6o<&2ct=@E}4| zapc1Udxfitxys12IT~rF=jFg^GeEXA01sLF9a20~?ErBHaK9Dcfoz9-u5a=7W5MQw zP8w~M`I}5(`=D?3fOQRVT&a7)>PmEs?$FYdQ@PcY|5acf45Lb2MSc#wweC5YbU|!? zdzbz|)KuLtb&ARR;A`?Kn6l@NeMbYEtQjk`wC<`kS8WnGbP}zRYG??plNX^tn(nc0 zyX{qbDRyq;M`+M$&SW3>*`nz*`#hWdaKo9~(=ZAVh-xkK4Ey86UECO4gcMwYahU9Y zwK@g$?}AUk88{2)AO;eghd3nQ0wf^~6L1->w9;wI6pL{wk(3hd&Q#f+qu|A2uDqCk zs8dz~D-ny2)UxSV?&98s2eo;DS#?TAg^*%0d+94{CKO8F9M!fioTAzmVaK(TiIcK7 j5o5jj$6DEk)v5MoBeO)%aNX-5G*f4ayg3o}m^tY${xhrS diff --git a/tests/testdata/localdata/failed_logons.pkl b/tests/testdata/localdata/failed_logons.pkl index b85c5ce2bb71f06bbe5be550bc47ad9d5f8cb893..9be34fa97053088c99ed3f8fe360338bbb2b1deb 100644 GIT binary patch delta 723 zcmZWn&1(}u6wiJnO-PHS#)zR1sKKU}twjV4h#$>Cy1Ih59%Pu^%yyRSZnpb@=1{Dl zO@ukP&e)5W;=j-$9=&+=fAKHSH@ht&&N8!aX5R1P@#bsm^A-KD`sqWi->m8=*o*VQ zt=Fs_;c$c#1Nokv7+#o?IK+M;*d>&Ok>`wkf^2`{j0G3$@;}Kqj`0*SR}qS)ul}Z6 z!-w+b5q8F8Bw?%PFlQ1IqeK}aoRZYL8xSB^8Wx*?6gWWabZftKYbKrxRt>Wtn!P7{y{%Qel@~nX)ZXsdNwa9dl6v zF0|l#~3Vwf?_;3v!{fLj9t&-P4}pD9RT; zS2vX({F{1x_XyaSj-Y>nHK6a2=!*7%gflEjIY#w?nRQ#2+ka_BK~PY&P^nHy!-99@dnS%7WA>lc)4B`CCl!X7Fa5?8vONc@c*XBO~wR_ni8SR+Htq zlnr91Xk>_FhXIx>-U zFlYDyf!BW^02AH}B~y|*ogF66VsexLGBM2&0Nbp%IgZ(cnYA|q2q#Zxo5DG(huO-? za7xCk$p&oZle5`H>r+7v=gr`+1yX{T<}d-hqu2>jqmf~e3bM+|ue1&5J)-oeXBZRE zQx6L&0k}n~8EP4t8Cn_I89Eud8G0G|83q}K8Acf<8KxO#8Rp0arq)jBVKdM(G|@Ah z0`x!+OJYT8@std%9=4>M{N(K7DL{vV#M#Ocb4o!no;@77=|%BC$>J$J97&~_Avq

dZKj5s`5;;{-4!rM!8NM3aD`7|{*#LrkZ0!{i?J WMlN7jm8O;!1F6YwT#C%4NqPX;wctPi diff --git a/tests/testdata/localdata/host_logons.pkl b/tests/testdata/localdata/host_logons.pkl index 9a4a2f4245fc2bc2336257f41059943ec84119c3..32bebedde0590a8e841c8be33db5ef19826fc212 100644 GIT binary patch delta 982 zcmcgrO-vI(6z-H=+E^4q8w{mTtOTmj)do$_!~?>?u(2k_3m4bf?UdPeyDj?@>4AU; z0h2LOW+Wat8WW>QJ$N$dMdQJPiFbSV#LehIXLcdRc;VzsGW*`l``-KBd^=BOzs*YP z^3!fhx+qIpZOLg}on9kD4QQ93t7w*~yNYRh$g!d2GSaX4cEdEP7SeR9Zd4g%B>7h` zbR5{^kr_>EG*|wF7w2ci$#rN{QAxlu2QZ`VASFa8CFmi~yi!9v!SVUPsi6SJ5ewPg zeW|#~ZZjg=ey!2u-;&pCAdxM4bA~h036oFIXodc#FJqfpbi}NcS|Iv!ywn*iT?!cZu}*n z-S|}d@v$EEnvIUm{^CYya`h8a``3=i7_(Rbws3ZPDw_IOW FegnoRa0vha delta 941 zcmaFu*zd^Fz%sREB8veVYkW##N#aCHV;0TEDH@YA_Fh!<4M~j0_9|KxCZi;WwPjBda)BT2=^%g*BmW2YC%YoLniZ zG`UMw5Qv5938;mclnM;gR8Xw)X7B?ON`@e22r~iWTCo$PMkB)lq&~ySue1#q_xSYG z!!@aA7!#>U0Io+hLoGuyLn}i&LnlKwLoY)=!yv;j!zjZf!!*Mz!yMVX)Y>UMYzBIU zCVGaDl%80TT0A8~jjM+(DJMTUyLbxFzox2+N zH->LF9D7t&%Rjy&-kc<73pe6V8{4ePOCUfJ!l9mfEq0J8B($X?J+GH1g4Iqj*{;Is zi`Bvd)H)I^uHv3g4}`&s*di9A;z)2Ma_ta!+&~1;RG7(&Mq^XYOEg>Im9!x()dC^) zZAV{$L{)CZEdM*@Z)+k3iB9tum zVcpcr60qcD>#Ql&v8!1bq*s>Oo}_-PqV>gIsf?0&>GNVT{Mx0)czr$ zl389;`yXWVC4WVkK;`7+rOUUtO2W_&8SNMy@o33J*20_-;OFP(^&bepgf~OUl%!540mjYQ%)*Q^Kn|u!LSV}k zH#4&GOVpP$GB9Kf98ph{?WsV2q=EvHH-jG-HyMJMo?-$9uVN=ijYftUNPUKlUuhdK zxbf?$hiX#Kupm;C5Zofw47Ci+46O|944n+!4808f41)~A45JL=43iAg4D$@j3@ctXn&=rq5?EqIYO%(Y46Yuwq@4WZ?BXdv*8_dm!&a7lCBwUiBR9P$ z9w=EnWwJQ4yk{v;I%^Iv#xkO^=7J(_0gwPDCKYc%Pzpjwr+}p~LkZ;gxK8H@laI(w WHV%6!*DyDpXLQL`A786-ouE3Z@8<00{|b22=|pG12LCb}l(5j^p}6)I$Xw z+7#&)%SYyp>|xH#AAvfsG4?MA@9ahhal`rf?)|=={p|za)jsQA4>N5`*KofRX3rme z;!6SXTO=~D=h~6s`Y{cC;zfd2apDKA)AJ~{y@Ascx!~9TX(nMvQs`X4I7s*Zwp-0t z^5!*hdbA~BD;F?l5K^N=87&gi*nQTgKyam5y!2^-1H{g1aVnuWznCG*yXa3w*IKWE5GTq@n8wz5q0X zzMZt&Gz1%s(GMj**CzQ?yV@!AUFo^hpJU6GW$jF16`QHV!UnJ4l%s7COPLqoe9lA? zFcW5LY+c4+I5OGh^^vu0zouaql4+)QiijadZ> zQ;L+tLy_&>*SkNFqGYGFyZ@^!LO%?!(3l0-9j~L8NbjBjDsQWX-kr*7q~6w!fjQUi r-FnP*631aA2U@{xk93Oi2JyVX#|XEQz;hk=?ARkVh5zj&N^Ii~6u|zc delta 657 zcmaix&r2Io5XblJk0dG~Rs0oDQA>3$#wc!9l7rPA zv;^Ko-t;PX>!p;k_nzw?gP^D0G91cR^vWz_u{(})aV8fAK{n_b8IMM$$3iI@5Ys?ZI6hQR6QS6o8XAckl}PZ5Tw z_^Fwq`7cxQ4&7hmH<@ci$bY2x7?I#(CX@Ma%a4B{yP?4SSOqk(_+;AF3MR%m4rY diff --git a/tests/testdata/mde_proc_pub.pkl b/tests/testdata/mde_proc_pub.pkl index 59c6258072645bcae0627baca0881fee9f33cf79..69bbf79f0c5710d26dd2e6def07d18d3e9105a3b 100644 GIT binary patch delta 142 zcmZ3{DR`<=a04?Vi#*#$md)&pRqPN}D@P9-geA&92f}LJD%!qPlo5!Twr>?>wtvlW z&Y1xWwtp01;bfeiAj&ceLKysH)|no~$C5O??gz8j_Pfk1QdWXGJxu-?>wtvmB z#+d;Owtp01;bfeiAj&ceLKysH)|no~$C5O??gz8j_Pfk1QdW#JwoBQu7_c#FPxp3V GsRsa3U?rab diff --git a/tests/testdata/mordor/mitre_tact_cache.pkl b/tests/testdata/mordor/mitre_tact_cache.pkl index 250c9f9740dcdc620bdd33e9d7d81bccaa9efc49..5e3fe53c7193c6ac139f2a65c9180e2013a5833a 100644 GIT binary patch delta 65 zcmdn#e%qa;fpzMIjVu*P$`U9HamM delta 31 lcmccZzSEthfpzM-jVu*PjM9_mEBOP-_e$-I<&(>mQvkcJ3rzq3 diff --git a/tests/testdata/mordor/mitre_tech_cache.pkl b/tests/testdata/mordor/mitre_tech_cache.pkl index 0c1510c1b7155b283513a7680d9eba68c08a1ee2..dab1511af63f39c1bf66148567d00635e2ebac6a 100644 GIT binary patch delta 137 zcmcb1O6T_}orV_17N!>F7M2#)7Pc1l7LFFqEnG`Qxi}aY89*Syd%B_wv+(o_YuPxr zpBCj3`>ZU{!{l!|{ hcL)#X)V=&*^BAU25am|bzEhOjl%MhI^!F;<=>VL(F0=pu delta 100 zcmex;O6S@sorV_17N!>F7M2#)7Pc1l7LFFqEnG`QxtJLk89*Syd%B_wv+(o_YuPxr zpBCj3`^+dkorRM-f+<6Kdm<-y2+#C=qTC9cQ|I!7)iZ3rC(3Qg&-ih=h$?qF0MU^f AF8}}l diff --git a/tests/testdata/sent_incidents.pkl b/tests/testdata/sent_incidents.pkl index 3e4c70c3b65a47e7695948b302af8f8f30c89824..590e31981e4cfc71ad49714ebb93526c93330a22 100644 GIT binary patch delta 2151 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 AH2?qr diff --git a/tests/testdata/ti_results.df.pkl b/tests/testdata/ti_results.df.pkl index 2a0a6720b41254577f257a6eb6f0457b67660521..ee91338bfd70f310b0499a1b82531e86e51a740a 100644 GIT binary patch literal 106414 zcmeFa34mPLS>LODG%aaX&teT5<-9^Bm_e?AR&+qLNLo?hY)zb@7#N>pZLUu_TiZ!I6**ytwhjbN>_upVp#t4X^v=pTP{q}_-H{bMU> zyR{zn(llvv(8-UzO*MVrzWwF@@f{!848I=q539?ukGt156S={GP#@fQ`Kt$)1}D!R z?C<|$gY)OlKlA(iPi@Zb>kh)R`_I1Zs|Nl3rw3gQ>mLn!jkRuLgJ(P3S!+acnX`w_ z9yz;Tu5$K(Z0pDBcb)v$Z{^LpUAvEFL%45pzt#P>I&P3(XRGsO{eDotuYaK7mHYSe zx9s2g8>M&aZ#_GA_Skq=_8%yLV7*7*2kmxn9cZnzlc=@P>9%`OmrH77#_=VMEan+5&qhmI`u9veSk+hc$Lgo28d(3r`lIzz@>Bis`V;jh>raionLbz@ z&_CE~uMO&F>u39i8k<+GLH%6)T>n_79vHT>QV%+H-n;eK&i_0Z^Y+y*$U*$$EdFJG zFW1lW{nR)8cgk42!#wp4<4OLT7*xI)4(q$d4xH=*jvNlJHg;siAan5eFqgZezi*&E zo*DJcbZ^z4$@&kBZuh_b!3$TO8`Q6i|Kr<>h^vEFTJ1soz4iC@=ib|B_c~Wv-GHus z-}t}&k>{RlwUK4@=f?l_k2N;ZR(oARchEmnZ>%yFcU%kF8;yJE}#C%-}cOU@oZ>NAUV)OEh_923j+ z+9ghDt@98`?Qt&EZiGF#YwdEQn{;Z=UOHD(GmzY-cJkc&S02B-!k3Sodp9#u>D>96 zy4)b?AL8v-cX*!LB>lN|!rYW>MA>cCm*qC?udhBo=)dB|1oao>(m}nYcI7+ha)*=s z`%b_AvCB`Kp1*SDRPC`KuAR9^S9ykJX!DvouNk!`>187fHfo`1xn2^5^M>mu^Hvah z^PXez(Kfv#F+3-ZgF%1(@|9;-o^EX<*Ed_;&dOu$UN-?AQL=Km)sx+si#56WqUJ1` z+MsWrxp2Bun^)gCrl$L*&!Z*V5-LOSia4kj|%( z?)rg~hMpb|`k#II^3ycs*~_)!5o>2!v_I=F8Z*{1ZFKoKN^H|Ml6lvP=sc6ZyvTOv zW8c$#M6naN{-FOka`{o0ag$EBQ=|KaH_$n1_~?51(KXLAQicq<&qLU{Ht(laG>^oN z1I-I`BeBb;x}&za%o3p$>GP?p`SVt4+4GDuk8Y=a5ZFc#+MGJsw)#Zd?0JKEW7M`1 zava*`1W7c{1jDe{emEccdN^;#c4%l8b5}s$4o}rekCo`Y8zp`)AEzMC3KDBRa2TK< z@hvy-Q`d{aS=weYYwr96`fNur$U9xjQc&3Ws9El)&uh%`+g(fd=XHbk6{SNERL@_( z+FENhgO87zvS{#jZ3khlqIvVuQ(MDaj>$%P`(t>1bIaCPG$n7%7VWhbb$6!rTJt)6 zvr}7il%gGv+3~rpd5!*iYjqD>i{6Y4mSNhdF&Z!2j>pXKP#S}<<8^p#cRYs9*}&?Btn83t@pG*by!INYuL4ZX|N<pdlQAGeGY_N5uYz2DlD=&_PuUHX#%+nO|VXVTV`St=^`X(3?SH zL)ryHAR5MD45>9vIuf>n4>nNvj;tpyHKNvZi??dQ=*GjgjJ2S+b7LcJNP~xW&YM=zcJ1XMIp^UGZSm ztsLFB+`Qpn4BI&zz8oi0!&fwFsy~lL!Ft$IgI;d%)Z-1ixd7+bBdOL8kyXH=7{p;S z^D!Lu{n$elO)NUS=+IINN8K^(g5d+ry%2mbc%k0uR-r_-FMHX?I)Ch4KADSyv3Gt< zvT%eF0oz?;bjfMya3MpdK zE{g8D>$3}6SDih2A9nNC82h)cz9MjEHqH6NgR4mkrKz24_PRN#S)vq=Z3dlA<7%=Z z40HdE^}(XZ@bho4VoXrX}>|*iFU{F%3K|+aF@UnN1xs-c;St&B=?5AE6n>)DdGX z(S6;9Tb*d^!>1p+GGD7WaH6wxXwB{0$Pw<;5%-mbMCS-c__6W3$(K{jx_@{c%{KVI zV*&C?CVpr`&nhtrNY8pa^uFTRpZySG+3&;t}GIZCbO?PhM1zb_zKK1CGn;-x8 zb6@ac|8UZ7ixcK@uhXA9-|9m7_BP^$K{GtCZ=c%qzu;2xVlTnl02>@O;yBq@sGV9{ zYh6p?8b7qJ*Ki&twe{e7tsY!WY9X$UTJll^d7j9XBDs=m@O!*ZT6XMe(hgg=R@OVK zgZ=}s>p>j1lTN4B*r>(0^E(M1loNcjiMK^OFmW4V4tkE+SeaXaDz2A zl?#pUkHEEbS{wXzZ}wN|cg~lWMRlxPw)quVfB$iI=bK-twqK>TU#)(qICy_k4*t+U z9nDS-@4x9%vWhP)SgV~;;ULUT@(p~&^+8iE)qm{5MpA2~wQfDBr68zw>CB~0E!f!L zwTJ+GP&>JiTzfbCHjgE4x%FUk6AGy~=gh^0!Dm`CW8Wa78XaU*?zugZ2I~#@wexBy z&h8rx|Hox$vZI>c#NX3L%m|Q^{X2ykqkRayodYQj2W!bo0n)L5_*%Wi49{Oj3pX$V z=wv;phxMo)C&DOny5h_wM&j9xk%zcHm${MUT~fhGhldX3aZhajh&oW@TCaa3RRAuHK!`s%=* z2#9k3?;NL+4?uq*7g5))U0YCNq9Rog@`;jBladRqC>yW-d~u=--$K@_-Byb*FbQ>; zK5uMvOR9NE58v9gzk3iIm~h9JKyXre>w)1|uc+=+*y(_ytVfr>>OGzQ@eE)c<>cmv zV6!2i73VH0mY2yG6itl&J)K@C!kA#7BEI2`!#IKd@#H0u_{A@W`uF6v#)^7D8*17l z_@cA24r7@%l6Y{Vf1Co4h0wx@l`n@7EEhtF0OoG8ZV?A@LgL zn?D75nAPv=2JKa*`Z&85E&(;!A5rY8`ty+7N+y}RuR=7VGPH)zv9JG7S9$MO>cnmE zd=i7Pp@KDT06u~@dfhrNKOce^MWhoT`$4pTxc{&no4y}ufoH{mqlZ?QTAH5tywr1y zgb>?BV?^vlr1?vhL)4U`X}Fl)+)mcyu+eM0 zBCR5{8uoy9mw<(K*F?1fEm)j!U)v!)8nZZ!8FL`WU>HQRL&wGU2@M_ITP;_vK!5ns*! z21I55Gwhdt^T<$8FMreF=1=h5+2{L*&Rir)?Cf*><4-o$lBWp}n_qt1Ci=41{8^6Z zAH0@?gXYi4pK$B)el~xe56^v!O%?*w;1xls9>xLXuV0OpBBaqmPz-^Xvrs$Jt#NRi ztO1@jKZMt733}sN?PRx30L!(2E3K_1t4X|e9W90vueJyaBk2mOc1q0#EeUvm6H?R|Ch zf6RNQxdfKp@qFrOM7c;qCu?&?T}%7gm&Fl1hMykw)8bM76Bp!-B;nY@}7|iY?*$MP$rxi6&{gRDU z2uq?OIS_lIzR|#np(`_`Pc=GjanGc5i_Rme3E3mcpBuG~*gDeAc8^Z0g?Jb-g;Iu` z-|73p*vJ~s``uIbj@s9i3S8^9Tg_nOk=nI-BdXK;^Z@ObUuDSDh2&JOM1UJdYzFOa zBkHXMZHz1C;f{o&Ez|^KDu%2k5n~JsKtQ@k#|E{YdbXPG)Yg(N!ceuBh*ji1hptPT zl@hDQUWRNz#9ICo!@FR^eF|)z{Ydi{*kS$rl6<|SpEKHD43eFyjLt6$Du+J|j7 z(FitmJTLW(K+__}ja>WxHeS&Nq*a`GL`d)O^s zKGD3FJq@{^-HqlO0r&z=1*i<(rbRMd|44nTcu?FD~4icQ&Y(?=F-D^r(CLWf99`z z|9$&<&C}{B)PyjDa=D8T=R(WW3uUod%dCi_9VwbB77%GX6323S=ZdZwXP}C z^Xp61`~X;bwW^v|Kci}*`oAhv%|9k0>n2pqphN-OUnxAQr1TlN+w5|$nR5Idi)(q{ zXMXIH#}LjW2;oi)t_B@fjyKnHwi+WSfntO(C zroox#_onWeM=xv_UT{;_&B7Lv*=e85xO}Gm$pibQnIADM3+4y20*Yi7=I8BOGC%jt z!2G;C1M_p2U0ZK#kdCo6_4C~bi(5D!zdQr=laOo{2dR;S0eJ%C1bDXNq%%-IUphV? zXD_p13H4)ZOQg!VhWlxte)2pTUs)_-v|#mQ?U;f3Q3$&=)AjW8vO_I6S}|5N6o z!#Zh+)^?On_I3>^@0|1bAx{3#p!vh>mVfm?r};^_n4(#mKdP>qvpD}oK78TDc5+qm zA%;adL=TRm2$&|z38p}ZKBl9Z|SpE54Ja&KgSj$TXoaJHVI;mr>9yNk+-Cq8b-Gjkcrd$6o+xSUsUJ(lAQD5<}b4o z138DAam6sjK-NrBMr~yv{|ZN7WdCZm`!#mwo4+m}_BDTl-S#K{R(9ZTv!nByzr&su z{4Tp2&HtVK_Iugx_t}YAz5fu`JiZCN0{he2#9aeBz;`#Ahvb)6W?dgq7s}w|nWiv^ z&7*SJ3_8s@{;q({L;H7t&F7Bgb_i<<)h2!_@i9WlCF`3oz!^3k%&~E@{;l1?!29c90X1iHNqdI3cG=AV~cR=HdDhu*7^uD}8ZMyALd{t5>;@bJ7d#%-e zA#f@jX*fX|`*EjhGz2DQKUpeC!& zW&Tfn--;~D49GiYOs8eumydzkA#v!6?k-ubfEtmo8&FrDTn6%N)O{@fnRRQcH696;N;j&59pz?yZJAhT4Tn5;i56%p*KVXxpf4gDx9XrG3IMI(I zA9r(4W?S2cWqvh-P%2@B=w^Z8R^jF=CUIkra3juV@p#Orj5*@F9)hkoxr`hCRfwCD z{kw-g*~?F#qJYQX>_Mg2pZ(R|_Imy2KaN}VdQH@{QI12N=A3ErMLwcbfyK z!Pze7%r?RO_U*PBzh@RnbqlcNJ9?T>2Lp6a2qMC6^eWB9ubjk|RtOtZC_~?+q^dZ% zgstV@e$|?dFIAb18MD_^Y{L_0F1}Z21}WB2ggF=HqKa=Iyh0f~st}5jUdW`)c7x!W zWLT{s7f=I5@Czs*$QekG!U>uGT3%Bc7I3 z>YUkR)#B~es(xS=S+yn5UIDl)A7jrVh9t1VRDr8fR(*9PxN?fi%wj-h)~Ygajh|cw z*W#;CtIC+sCvP`y{@Dz;G4#FG#uF4LpVD-mWm{1MH|m;kgkC*O6TCc$8+SCvS+J_R z(#G|Qlgqey@>PqQJBM?eii^w`_0k*%Ev*>w(d_ht^?y?Uv-ewx<-_0U{ z_S`v>SX!VbM5ZUcW2A1JdZ|e%vI=bdi3x1!L+6aKpgFs=;Hpk8Ve9ORGh1+fuxO;S zAHB_}`LS70v-kRrrrVLOM+hcA3>?o&QrE1cxBuh>YP5oVG+jK%yF^XZ$z{}h^wo-* z?=MiZ{j7CzXjA<}{Xf+IWBn)V|Ec~{^`EZ)=lXxC|JSNHYuvSa+;q2|v%X#CtbeeF za~2+7%R!-aLp$;bT5w{o5+VIbgs3^ou$CwXOda3d%~{!mH-2&%A>ThULgrqD)|S3& z?dQMOf2RJk_5V@-x%&UC|9t&Z^c3L|)%vg1e|-j2+1sG%I|WtW zwP&abiKKBcOe4c_jEIt(wr)~suVS|PnlV%nU1na9KznLOAna&N;nBHQ%xSpFv)Zw+$#HzID|5P>7j3s6`N;upU(#B3MBkk~O z8)=`|Ez+7tW!UeO&75qG$>z9hPRQmi+1xFgdt`I3Z0?iI{jzz3Y#xx!gR*%@HV@0@ zjk0+Yn;9_aZmC?IZ2n`p&iAV8>;)$M#Ih{cg}!uc!-8<4K0cLEE2Q7oj$x9pTovqM zTT7#xdWAYQPRZLPDP*T##lr1vo2|Sa)y|cek`1iKg*WO*|Yt7FRB)mm7 zZd#pq8#|5Q;lG%JVEo1O6>B1Y`XlmV!D)SA{Alo{#d;7u-bpw z*_;)Qpu$EG>P|q+FcxO{=MD{LT3bNs$i|%wsV0kqY=zXDi+GP+&j}4Pifk=TbT83k z!kUe^YC`;I8J3b(o<+8plIWq$9`P;(LaI+L!}7alhUL-b28EZ~jnxqFjQ$i>CV zZsyBs5u4g&RH%$=NwybK?nj4G z?vx)jPA+5c z`)9}Ct6kH}43eh83GY8|ZNL^dA zb;C6sY!UL%DvggnH-SmrQf|yezxVZnNhK1GW)t&=58Z}|`IEzm zd0DV`UN#p-0Njq`!;P@#LecT#Fw}@?j4ac0O%pFgRGFIg=O+Q^78A3%;Our{Ca7_! zOcp1X0r=I2UKa}C;S6^#-45K16v96ukh>(C%QNE6-kMy#Io2f#%`^x@Q-cbOHQOYY zl%x@-YBK%{len`>&|w9IT}{S%#mQyded%i#cS_LZ^X!@XZ-by4@hr~@*4`_d_st48 zYtIFpra4%?#BggSt_z0}1a?p<=>Fm);D~V=8NRy(T*b*{z@5AQbs^~PXkO1O5LHU$ z!DF`-e(x9LeLyx}G=krOt#dC=SoW6w*qcl`VL@aTiDm&}M-N=vb`nn`V5L&g`#&e) zhv%$-pF4XvKxP1o+imjXGW_0l?6nQQ1DUaLATu@&lpP(*Z@A^g#-~Qc#`6NdFOkj4 z2!q>_Fk8n@-82SSRy>p_sW^;mQ<61PKddx>|I!2oiRA@Gw!LKO3x+qd>p#O_)yZWH ze%9;E*vRMLFTU@#3c*0I7s@6Y0dQMm!`^diHwYrlWMO!h6k)?MsZng|)#USEo&+G) zZovXNn9I9T`m~CZ%K%)t@3k%jmG1YRu{rqT58PJxC4#(EHmftj&nYh%u@~huqQKK* z@?{+AhntRL1&JB33{sWN@ePykBfBbtp9Kj$a{^y3|0+%{!|z8Pcx}TkcYfp?%ljX? z4Y(WGx($I`Q#LQmin~3xbps~~LjtB)p~5kle-VF9QaSJbUz4~inX8sKO=c_OlH;!8 zfDo!rL@AF^dOy9w6 z{JMW){|fNQ7zX6ejk+0A01(ETdKv`^H>8)tc4`!>#iA@I(2y{13{>K6$bz6 zBnDMfAK5eG(h-DJ0Q{y(0OrO1&>nYZb0`3gpIipu*S&V<;9U1p z4vw|kL9UDd_vM1MkI3dLW(C~dJ2*6x>XKnXg%XKpVd-&S(<}2G|JoSfOcp;W$Q5&e z)!%mmxayP3fP3-vL9X191rq$=gFDQ#dmCB$l>)i1lFe7oin}e#58SL%!%q?;!q6~1 z;^?XPXGekSR@TJ%>yx-Ed}AarID`c5LePP`ij&K@`_Ttq>$a|n;;VG58MoZA_VXjh z+6{rKz0MqKSq{?}+gG8o}P5lFiqS0Jy!jcPju$T8AH-T4375w)lpZ zIF-><|92$-Glk9Gowip1aQx&l0RQf5ck)%*UOwyo-6OYQ)*VrNe@3wOb+Y;BjDU0Z z9&j1~RG}aFae{&C+wwoN(xve?CICkn)ZCS}t9s93-QtKjT;` z^ErO+me0B+j^*nGejk&~pB-Uv+gaD!b9b&6M?@`?xy#ZTICF{XGgGHBmF@qT#Gr~k zwsj_6)*_m@!b*<8ij&J2JTQAb*4G5bGMAYiNAI`|LU0s2|K|mJe?c~XaRk6^XI*d4 ziDu7peS{!ERFS49iIX@QY)ci#@;4^|SaMZZ?k?3nsg72}^c5$U0eIgXuU{c}{dNk$ zza;Sc%d+`~5e5%#7gy@-`9w_Wj}^JGPU?nk;`kt~*E1_MzrQtsK?%#VmMldyTi&h` zh)fC?OrKoF;D=skrbn&`{`A4yAOuIe-!}^O{)%iqJ_6wOLhx1qP`5%SPPBxY!~qj= zZ1|PD-zO>om{||hpxPb(k^yl1&q}y3+tOu(}XHkA(+g3$BSOK-OG3eiY>ay-o zDzY!>f=J(S`Qi<-BxQYTPtzw3Ul4-o5>0fzQ!WG#nP?qWHr0s9Z@}K z(|TFz`)IsATKAjPZ$}SpvS9L)mrk)7ZTVYc&_5u3G1pEudtJ2%r(C9L&Gmba%Bqp& zcBz$F_H0@8d|gplarBvQpS$Dv-e}OWl`W4v*_M?V2hEexlDr${)F9?vQykHgbuq`* zTyOrIh>ia#o1d4>r)2XBviU{X{E}>bnN2eD66*is;Fe3M@0(acy|n0c6|T=SC}mtf z_S3cR`-|W7U$?{c_dM6-h|9k<>LRt)d;h?*z;Z`i_c|G_x5h7pXe~lNamhM2iQlm+ z>=k~WywQI{~PG7ok`NES|=1*U^ba8(9^7;8wm**clcj5HeZKUg66yMf8)_q{j zBi*+q0NOwBK0s0k+4o3UsHMflErjgEg|@?KcHP-!?H_ckmglQSDc0)hrp>D1Y3%5Z z7pHcrC4r$wu4Tue=Of z*$>X%(Z6RsSi2Uqla(}BZ>%*`m-de}IxFj~xRExJcyObCqPKaK9_|!p?dzW?eqHG% zFLhB9Y@WMQd1aZE(K%=b46S#WB^2`?^7UH9?|gS8V6EJuxO`2SNYHYP;3j zl;-yjNee{Vxch3b)}9c=ymd#`TG0!tKMtwE zZ2ms-xPJ%b-R>o3i|M_l=ZJ$*G3pa&zoq>k-Wo|VkIkgXS3*uh=s@F9z(;T z*#eppNL0VhWvhK>TJ|ejxRS*wy>gYl{K`^oKk!m3@G_<5I8Df&M^JjB`F)}+9=7G| zL9hSd^q^(4{nT=)A~wRcM#N~z+}`{~t|R-8vtNG8{^nnm{d@N}zlr_XA87tH**((y z>#|$wHNTmC_Wn2jhWyEVB(Hz-Z_0;vl-~MB#$S0Q1Wp^ZGZ#C9<|pK0LGxSK@tz%# z_pJH<%6EsFe<%CyTiM-cew%!^ule`b$!j}C{CzuL4qw$1>Js0|SnuFWVc z-SRgaZ2lYeG~(Z}yV3mj*>69V?S7n{jO2e{k2N%g;O0;A<&EZllAmq|T$?|w?l%U~ z=6{j9PXV&|-}t%;jPp4d_vK*xi7_z35N->`9j2fRgmD4FqazT`-6RO_-dhlw9;+aP zww1b(LGgJ@ONmUV0^$Bi5Q<(Q3)NZR&|Sc^SCq_*Agn&Q3_|<03_>Aj!T?=oIMs*( z)%??f+*htmDlxfd#KQEOB(K{u_uuv5px1okowWE!ryj@>+5IsCVCp=X2gZ1w8u~EW zv0<=Gq7elS3BIgb?nb0u23{B^=7e6{yk9W*1~ywO!`qVw6@C6Td4d^QGNyU%S?3-f zR$E?v+=fg-0ej}#zU#~BSyS3|a6RVRv2GndW2#T@37SDWsAG$x<|YfP=*)+Mwd5rX z^M%5gyLN3seYJq4Z4_PfkMD=SlkU72bnAoVXAkH0h;guFZ!EtY$k%7o?}wLrDC_FaDX=ad zKd`+)vf54(Opr-fRG1vchbG6Qv2kJsW8>u+jE&<)IZ(2~)_4Lip|fmZW!x5{BB6o= z>x2bPpjojN$O){iidgM$Bha@o7bFq))~~iCGl-KEK;Zff%nj;zzm90LRMJy zA~77>BKtc@^u(m<)C}fExrMAQ4dY_!DsVvP3y!9LJw&ZCtAdYir4M z7wNjaz43Xan&1eGMzV1==&f~?)EMXcNmZ6#<};h3+K|{#Gli}@7F9I2u_THYdeVS+ zhVx~PJjWg_cbVNY-_1MUJkMXe?ad3aHx4#0%Kqh``A72aFXj8ovgfUCUg3}2xOlJp zc{qEOo6qq9{rvsx&K_-kfE^m}7t5#p&F8aEE9`DG{}1_YUo&9WAAj|l5#OC}X0KZ_ z;RBag&2|lToYl;BFR**LxyJTJbDb?WRz38voxLcorKhGrB8IIKENU`Z%}oyDa&2`^ zhi&tXG9PyNOLY4(=H#tl@dH1L6}ZX~Jj1nY_mUjHHM*N0l*7n|lEb#W?1!=gzm(lG zUjbyBALcI__~qgl(B$$pp^VQ1=Q%WuOUD! z|E0s3h&rJaB8qR6hNOx3pAdu5@Lj*cycnb(eM`3 zid59cC}ZxM3DKEZh~0f^E$MV1o!hM^8?82rpOoa-E8;##W!H@=sxH(ieCc_iqh{E$ zxI3)QVeyQaq}}p& z@yqgy%HVuIp<|x`r&8{A2B%uPZ%T3&%H92A2s?0_5ys+>CmSENQq}^R>(q~sY~WR zl~AgH^tSDQ1PimBdGHyDbUT3b#xWq>dHaDRMZ|2^O+6h&6)nc7oZ4#J0Es0(-8{+R zGgI64bj2?Y_4jYg_4j9T{r&rL{hjZX{?1${9y*QkTpMn`P6NnK&3FTLch{J`P>R@!kDmcsGEaV!(N5$cuBjCWLE6L_I7T1%R<;M-e~Fk9%G6t|F*HQ2xf zH(y}4jLq+PoniB5hS*%qv8m;9^E-2F^1Z?)``d-h@7RUh9INZSCv&>x5JwjzzT^3p zVK{+>w~YYfX?^pZ)7S)Fy0v7QQfkW2r{$UDCJRP#ve-iI0_ucf7t7du`)9B@Gd8y; z4&N~bus3ZxG4DCREU0JAjHsNP7(u9OmT41ATm`UqO#+MzBUkym@Z{>~eOo!pgn>4; zz;UH3V^5)X??$Uj%1;zTq#KcV6n4iv8?VUAOOa{cuJH1*$Or|f@$J~tUS4(1tp1O} z*cl1Nel8fF&B6Dda>2;=N-(llg7LF%{iOY^W4PUx@V3S(&hLp}G%cT{g+eQ2Dan+2 zREF(JwcBaIcybcA0MCg^X4(Zw1nA{t37TKf@*)Oh!T1xeGr{;@hLiS7 zIW|w_*!7i`8k>&7rnlhb z73pW6w817P>*8A`n{{f^zVvc|B*!M-D{QjAUDzBai4JZ%-`@hc zNl-!JdbnrOC^1WJ4OZtMHT zl*V^$C;Z&K2G~}~AQcnyBV~Y*0Iy^0U`^XgHe8~);N>f`%_#gbjT3;ukn0rgC^6&* zn!As^f0c%tUP~xCwN^XXtq0xO zwSX&;ShJeMYuCv`=ftb6MwD=+7kiC1+4Qx|;JQ>Acz5kuqg$6lR84_8*II5w?N+Ci zc5Clzwc}dcih6QnOr3M+vh#c5WqWVVT z#a=>JrlUs3E$*3=Zqa!}{g^$X{JBx<1XmN)&UTMZtA&jX3RcuoDgL2)NXkE~wSqWn zJT)YG>fTZNx+)Y>>$Y3XVB?V*RRp3sy-yF&e)&~~OkGG$Wfa$gE=Ozz?QSFLtp)8G z#XRU#%zt`Yk_)A90|O0G7#4saMUd#&pw?5*R@0ptVfh5ztM+d6)~P)r!TQo>DO!?^ zy^PUzI`U;{2G%b13+zM4m%tI8u+AAK5w`TZz1<@@E-k9qHuv5m2qdUGcx@h)pYV z-YB*24kh`PFQ3@bYyI^f`-beIqmCNOK{|Zu)LH}m;8p~x9%iXxoTpnv<8P7sy(D=` z)7iUuR$BjXR-=u?;}g^oBJ*H{Dk~j|;PB0{{F|&4M^Si#oJj-+QiMaAkIL1DSx}N9 z^~~k(zi(e}%fdqkSCba$*Od2Lkqi?OT{p@3L-ei08&uZ0BbSq-Qc-h~cA^T+bOwn^ zOFl-{Nw+68a$ud${j_%0%|Jve)?{4I6DDJ8f@mBKqW zKmPCMzTn0FAvt=`Tmfjq=cqs3JAeLs|DMmklyo+ELzCJUS(^F$AExlnEMG}F`hzN2 zW+mc9RzzQy=c6jk;F*8B@w;Ere@ky8CdVd{GBt&a;m=MWxi_lRl3e4EI-`GomV)O} z@P-)!GiS*l#qv(7D>kI24RvcsHSD%1wKzC?Zj>|sXy`bstxl+tW%|UJ;c(uu+H*hCVqc6WG$Z9F(StfQ!R{Q8Wh@YXt-|d z2eF^(tVcWOCH=cqdN_3zk%(QoWbn*eKkI*eN&n5;cUk{fJL$C6dLj&mU3g+G=yX9e zKU|f{K|F|54x%sZnxyRDOz=SCuxwQSUPoVOY|h*Iylazpv5@q#Zunr{4Y}H-*YHCa z_-|Ra`H#s@_n=`eBvC6|V;+*t^l2m)`|31&#?+`+r`;{5@xsL<{7C-m)LB%UH|!b? zIo(B5%g?$m=&UWQ^AgT8KVEHBpGXNVtA>cPWxVne=c0gqNH!MMr`xAhop1+bSZH8t zs$HUcW}U#gA%wH3r#ZfL2S^erwK=pJG^I%{3$9Fc${i_1w-%y$Pc8J1;2!Pk~eH5*J#@ex72FF^5Owwnoy_SMUkfs8Jb2l2xP``Yb2$^ zatt3&owSMq5U9$e;}0h=&AJlkX+9yzEL_%{c)6URyvIjCWGaDN0}X3ac`~H89a9Yd9C3kiX3E> zrFp3n`JqPsOAr&(AqCJK9p_INrYyk8q9l>y$7mT*l-ewc6JzaIl&1+OsF#FhOxTBp zaqp*zZ^pi3n`Yo6B6Vzj7Ed%1BaQ>d_7ai{aZG6uGRw0`Z*U_D{`*Eq0$u8Rk!KN{ zY)Aq2ICg9sJ_{x*3KK+PQ>?6Dl<-}2Ed&Ga)Lr7^>xbpU7|Q?uYYg1j>^1=!O&ePs>(1!24+mx zq!cW7fRABCsjuqiGhdkr_4I9x@Cn_ue4nC=w#yjlmK7Lon0i)hNlntM=3oE*PGc2C zyhnMz(#`M8ZY53V-$9kWCR0AJ?jJaP9$jKeSakYFRmnZd7c21JiJNdGNKyLL%q5b? zWAdsoZ6QW=p9(H=M3|(lHuYHYSsLNwj}Gbe?~p=#Op4t0y(kWILz^HguK0$sj-hfkLL-}0%t2XnwLN&h}|Rp2GB@Jg?P9yWL$ z9cE6|O>Cc{E+Ds#q}W4OeMtHbXSM63R>!^45 zDAGqy@lErhQgBt%QVr$Hvi+3I2CC>A7FZ^OFZE5&^AOpHi$sqt7joR^56T=KIDLwm ziw{Hrnl8hSeaR40=1^341)jOnr)p<9ogRZf=zorgUFxmMSTFDn%)ewVU`}>&Yc~Qe>L>jWh5;c?VVcI8nOdw78heP0#MRJEV>nZM0s)GngCuuY&zAL7sPGcmA?u2| zk>^t)HFBdErBDkx?ovKp9KSvmlWJ3AJ~hNL}NNh2$Z!Le#&HO z5oPRkJr^ zBa{B8O9P$xNgUivxS{6p)D+nYQ>Gx7Di9`ja|!hQN1`2<GN~CRrTz(_OlW<|E5mSUUZf?y z!3qHQH~U8#>Kzbt*59ZKaX0^oH0e#}lJ2`YwI_1AMr4vq8P{viAtU!+poY!Z0Zbu> zGBxCj4)?Ok^UH%TEb19Q_c<88=acTGU}H5|s!8OD{Hx8&p9b~1^Z(DCKJ)mc(eI1i z94DQJ`B|!6I&<-f`6n(thv^|-K1~6DHNHOo#1%0{ko^49=Pp7JZFHAvC*LgxU7;ZM zQtgSL4Ka9$vh!3>Rbl|9Ygww+^Z$%bl#AESpFTZzq1}KuJ9T-f#-FRfM&pC(gzWY; zE_tohexY`{1zA||N~gIYtkg-l#=GaZ&EwdyOIS}n%|gwz=bqgZLp5F!K9gby5X;uw z>8u*jQtb*Qbm7?I7$d9$!&Mi`EyM z?c$jtp%jM_uNFaf3j0WvUB#&i1Ex--O@WkUgA7%bE2P>qIw|HxvapeKv(nQ%Pr5WL zY|)N`&4mCRK^-7>rAMzXHZ~WF5#{)-itxF{#tWkpVM3{27LG37ff$YIi;$A->y$@Z zUz<2Ft9xCvMaE);g6)Pujyyw8%M;F>$~twac5>LhZ5EOEqQ`-+SoBhxKXvKMdFd}TrqVY5Q?G_P`U#=omui9Bt+O2pEX}26OYBn!jjfU5TEtjA3h6}B+4gr$1$67B(?4t3d z<{?kIh;1doSV#l!MK0s`U@A#BCr2oOcJcI?`KKQe2(rKjdE zTsG$wM1pv|u`wU(mpUJR_AmD3+>RCf~Cp!A6WzWjKl74K9{3|+g_=OD3JoCl;)61%diyq(V z`{Dwnk$_GTMv2%T0)OB-+^Ugq=XFiiFosOCAa9%xun3OSXwT=P&k@fE=uP6ec1vbM z>2*Qx2BDK{!*_Yu>&2i9zt~|IYSXlcSfW&DUe3 z#t6{axQQ$YTQ3#jq;<6}v&?p2mM(<(AuiBWtgm0yg&YH+NscIJcj48x>q4qh7OyVa z$)fH6U(p9ZRJMlBcCFEQubACgc93ueDRorUn(1T813E{E!xHn251=DPqS%R_t#~2k zhAH-KapQV>QD4OTd=xF$h_t|_lxt||ve=V@=IR6~X1o=nhoWlxju=R2;l5|c!U+lb zBV`sX1MUN+{OrZTOwK4nh&a-6{Xrs)cw=t(Ot*oXyFO*LX+R3Qp%LNnaWn z%k<(fVcA7dX z0@s=)w|=VN-F>tO;ajOM4sSZv=Tp49Jh#wNP-Tuoc$kwUo@XWuYeXyPdQ8bA2^rS_ z`UpeN)^S|0_63zSEv#n4boH^Dd-B{Mmm*&OZO&tpt-1@R&OGU?g_84wvXdO1i1b0f_-g>B5j= zWox15SgbW-z=(P9s^yMGq@$DQ#3I{-BM*|G|K`$5&xC_cC`(7|;OxTd!TUkrC@kO3 z&MsCPbp6D#z=ah?gb{ka1F5KEIYU!H82}<9z|2HCXs`?rz^04YpU8p~js|PUNHn$M z3|da3Ir54U97Fo4hP%e#C!AfT?9MeUIq*?~(&i~|LF{52I}VmJCM$1c=o^vcz*s=1 znrt*%Cy$F2im6(`(d2d|Sh{q4#Z4JrFiJ$CaQ5Y!K2zM(4ykMHB&ikifG(@TSd0~( zzBuuqM&rbS!8UYcUTna0!J_U$p6)TH<<Dl2; zLtUt73mQyVHq)bj2^`R2V?xr7AX4D}g-c0D5z$;06yZTdG=#!G$6MS~W=deS#Z4jH zd<%9&h5Gpp9UYp923-Uj12@OY=I~QV48!3ENra0th;+oCArv9+2Jd7UNaBYPe~~z{ zL?4~#-lvK&u(&DDDLNytj z3|cR-4F_J+hV8<4gd}3M4tawuNNwFvd|}m1B?16fFhH7k(&DCpgZdNrdYDAiloqsT z6fQ9g)&qe=b)fKK-cJfn!xZA^cd5*T1H^`A(<8(`HPFiFl`&PWNAzYRv+*a* z-1@jyuvTn@1JMoTn?9Ytr>wn%=0o{z6NLx)BROPcVe z(aK`9C6P4HnMY)sRlK)y?-@*?Vi>w;m+*3sufbP~J+;-3}M0VgraH6q1H@CE33$Vj0h z$&=c|Aj?gWy)5H2cGE&Qh=fP!Np)C#lY*4IfxhMWOgj;Rfp<4VyTn;yfoFMYFToST z^h*CADOu-|fS`QUz~?@4sLZmX))p)~e@?UP#qVX7{qZxbWq9V|e9k1DA1B(ORD@>V zifDhlA+e~nQ!L8Gg0e8uuyI?^>5sP_AJVvIN^G@|=}_J$A3uNQ^c0y6pRP~xt`f&F z6YmO1T|BUmgc*aleKX`ZA(N#sBQhBkQL8-xpWG(!wRRcqAC@Aclur|0wGJ6tW|S{H zJ;o_pM4WjeO8ME#TTse8s|PzY)1&1is%j=p76PcCPM6P|n}7Q9mF3G`ISGhCj zg-PC2pT{Hk4P@=xY1&}Q`d15I zD)Ya;m>cWF<9AuJFN1a$zdj0Qr?5#ojK+oM+!KN?pL%|I8?{FG3fD2^#ggJOz#7-$pP zSAJ8*l$g$vMm=#;f-2yF2r@{qt5b+lFEROl5K#w#sE~-LIqXj1H4`I*P{1VRI1cb^ z*0Z!G^h~*_Ew7r`gCyY>w!?eIpVT815P)LoLH$sNG$D$^u>#v9q1r;JBd`QcgN`T8 zEFoyyf#OZTvg0UYYC`49ZkoMum}X{Sgibsu@p2fGM0mKwrr4mwf+Pd2#N$N~iWgd6 zNUMmvAY_j)Np2;iN-D1mPaRGJ3FcZ^N$`7S@t(eM;z>Q9*u{wA2iQag=rOUYF$W`q zzJw=&5yu=SW5pjMWfD2ITYRd z;P_2h0-9GQh7`kuhlVl#VjL>vdH_#t3b#Y z)-~e=FRx2gU1Iej=uci0=5K&(66;6Ewi3K@Q=4^yrf&)tmrZS?a}}>l{+<@y%bSjq z4z85UyzK5q7=6rG8W4kW|^=g37;n9n8@>hIi6J;0ymLhJ0Uwvf&f#9*6AnZ zrb_nWD<6*OXOE95ZifWM5&s(wLQ-y61XCDz7;GX6v9A-Mq6|li5LW!-RmFF~ixshM zJj8B=j-+lX{)iG$e{B3oA)qLB0|CfGgn>z%Cx(7Zscu<^SeCEHSrD-{RIKs%1QS}Z z4XMDyOLTfb4Y0~5b(DV;Vu8dArI@{S{HBO)VisXgbw&vod1xYV$Z$h2a}Ke8u;W0@ z@L=Z|TM4{pwn13nJb^>29#dFHPo7j#Gt^DrFn&|QaABKL;ECHys`5c|@{~X+5E+a% z2&Vy`4y{c1CmI`}!>TSW0sOqd6*>~#izgV~Mv@Wpo4#dyOo1vgkn1wVLve>iqJ?`*?d7F@1m)K8AXd$mFd|TN~VgDG`;ys;sQUpuvFo&j0Bg9ww zo=4&YYBsN}yd-I4kUS`LMKIDzy-raRs#u#nu-P)3Wqn3cQ5p~36c;r zCOju<3NgK)3IjurVZLD9&|XkwaJ4ZZB`zuiA1$gR5v}o zDo^sO!<(Y_BJ(9DNuhT_3^HCRq1Gm*0tgAQCVUosqT&j27O%{Njs)2+Sv+JRGHr=@$eLaWen@E4gkWgb#D$7$ z6ql?U^IB4)*fD7dnTz0#8L09}xhYC7E{Wnv?;A%i4nm@(J$j3`)uFQ^3CQ3N-5?T# zc^&Nx_nD*{la|TbN;)q|LU{hjvOyo*`lbf*p}6V9EQ8LDe8syk%tiR%sWKe zBQ3ZluMzC7i`s&UO>7PsO6YGg)(i%Ym|&}$lC6jsL@mzHJJG$Y>xNMs;Yi29KvEKU zMQETpdOx;Pf_4g!Nq->2h=E0WV$o5lsc z>*95$_jor`Gy-DoQ^Ii_bbh21eubn`3_{dPr4Wh4 z%e!~tNpb9>sxUYNOknckhH%i{CCZ8X1cZVm1)7AHM_P(?&JZK$sVQcnE!w<@6=G0s zn&m1LirIwbK*k!DCb=L&Hel{2IQS)#k7*o1fpdaj6EZoF!3bt1IFD&2!a&7N+5P1Dh1Z7D+zr_49Pho zoJ?FntT#cp1#-ILrcmfSDREp7EQN5$=hNb*C`LidJcXu(&I?oKklKybK*9^j5+>pn znSpv3ejsH%8}l zm4_cC5l(}Q6`R8FNIgPE$f!XzBd9@R5rK(WMs6yknTiJDzJJKfD$FO{m*=G~Ic!I^`By7Fzh^ z(LeS4&~x~cN6MZQZ2dEV0q3Y||7q{K+hBkeAs^ZVN#TlG?I1v#jNAAN@sMvv_nqV z=1Jt|+!a6F_4(<$8G&J2tDMqm1}w$0S39LkvFs0w#;7!3Oh&d}or-K{E}nJv&lD>R zAlMP%{>Ns2Ef2`g#VfLP?K<_+$QxB+bpBeeV=P2#tsZ%ro02^vTEUc4ecM7Kc@pn0 z9qr#_$q|CFh)aSjfK4FET7yp{%{ziD*D%ry6&FZEHiyBWCpf!&Y&CRwVl9bJ7I&9~ zu{jvCI5ot}<~YQ+IfT+l4>UKtU3uW__Hvo zeZ157BMkD+vAhjgF(lNn5`9V7Ko6$6lTVPoxJyXRAc~GlLbPKg5*MmtjB`;8NGx^u z0a-;1r#e+t$l5mvPsJXC(G(iSB{&R)TD(96kP>81Ha%97_#t49iK&!ybc%lvVUL1s z;Z7xU0B#nJj8ISb33P6JjLO*v!4!%m3+qpSt;zBx^Z~8_DlJ47-UZ30;o6YkMkKC5 z@dIF%;BkN!B1RT_1^7n;@M!Au;UmJ7ed`IA)CoxCmxn^ z0(dhL9c3Kr5gq|Q1VM24T}bS~&x1{?69A|A21FYK25u1|O0h?YR;Bm|w%{u)If7lO zL#uKW|SSv;ndPUk?^IXn~>lmMIj8}cL%hXAQ&X-6 z)*CxjhouCWbR!Y4B$1GEK^&?Mzeda~aq7gbO2t3AlF($RAxLuvhp-l7uMj{_sHs#R zkjPnr3?Q~6jW-RK8n}WLG$DVuFLAzvX2#<2OK_N*Fr=`T#A`!O3+L{@3E^_a7Z+nw z!e4Sao?uciU|X>WofLW#GLrXKLP&`BrnrQ%QWM%o35l3+TQbQ)?k`2s$m${#RwG_o z%EQDqaU_1AlM6*fU>vK|VIau@9{{->I0T_z0?>_9jE}cP017rg(VTeORvZ)+sZRkVjJ4{vr4oD*-l7%oz$aaVUDa4@jc998y zSqD7Ce?$l@Id2h_G%&So-e?jT9G4InXfaZFs6$~A2~Gon7(pa1&L^_fsN2IU7UEOD zPR4nPkRZ2$7#r#q>pz~if+KC z0UsCw4ey7698j48;=_S-<97|>F@-QERC1EK zJq!sVS85p1qrg&J$b=5?hT)&LaO-M#I|(Jg`4Sbn$z`Z%|r^myoatDpw)o;TuSv5Qj0*Bd|7vDd8f<9R=4U ztTK_95#EJ_my5}Xaz^+cUA!u|$B5FWVhX-7xWb)_4yja0nXx@pdT_GnkYt9AA9B-0 zhx%_Qml$F?T%fAEPA#1+>kE}i3XK&TN}5lfP}P05tqQbzjU$+`ZV?q)h`d0i!&FPP zF?>b1QpA-lVfqBIqY5~bLZoid*7b+*hTt+qcFK|s9&s{4ml2kObS7em$Zb}v6Xy-3 znIZ~mmd(nQ%@!3vIs@t(oz3I@);kfcQ@c^VGQA&m>fp?u6a4_mRTpKxUj2iRDVCIrbPvpHW zMMt*m^PT#euFH!uDV~e`XjPPHo$ydb|l=0fp^68pAS;e%HeRAeX4QSS=aYcIQ{&VEv=0wq; z`8!hHr*!C;DRbcR725T_pi{?o?y90_7s$&!J{*Yuzq@n$jcdE>c;b6vn&y;4%cba; zRxPP|d>dZ}Fgf-(jvdFB*hx=&s)N~{+2fh*%gmYaICcaTFK|+^A3)tu`Tzxqhf00m z58$Om2q7T^FFYV5B*X&`yrZgu!som8+B17D_KZ&)2#F%wGqY!}y>7qtTi@UJ_gzCP zk1>fcu{Q5Rwa4WRMLCiQ`t7%3nZ_RzOg3Y|LIB_^P?Y`Wr*Mzk!n1~ITvL=4V;6Y_ z5N^Uyq^g{oWSfjB%F4ecADAUKDIGsI32@Is>5wQyFo9u!eiRtKgauiGAiS`H0G1~E zj(p*=qWS4!Lk4UopWBp2cf1(TDVYuSL;N=kt5(g7k3I7GK z9rZ`?5?BcFkd-RQ;tpR^TogDOuyje?!)XrVQq@AWPyzpmmMWZ`XidD(XR+ zfk@yFrHN^hv_klnZ40px0y0Dx2+>Uf^NU!78$>XHogm;l#f~@DltR(Dps`Wogkwis zs#T#-Jn)dGp{25=BHTw1fxQtP8!^af!f*I2%rb>eW|6ss$u}lQA3hxP2bcp;jazBw zn&I*BOo3#DBh=b<0Vem%vd{+c*MRZrn+-wPFk_dT?63x(5BqA?HX98^Adk%ryEceZ zxP!_b5gKIl?+-3$-NFWBtSzhV5`1jjH*yL284c0vvq}qUR__o zRbO)sB-6iphTQ2;uDFbHjv&NrA@E0+0WytZ6{_>-8dhbd;>)c?adnTN1Lk|RU5ReN z7BK-~IEl)}Gga&ktN6gSE9;VS3F&2RjM-3#_|5VJ@05U#cC6YYLNrY@* z$)%uz#6`*AWNP45!DAplPpOw;8o-&84y$XU(DCZbL~RIv2YML!plD?2VR4Y5dL!Ba z%mUp|n?Fd1!$Pf1OJIY7V9_yhHM{z=4tPGRh9Xb>CFkkRVFt@N1QkFK23|aj z6KEvR5(sC~IHG{z2BK$~$+70(2$5JPS{m>W+gdomECDU#8~lFUrc$AJ7OZ!oo=}~q zA_5^?0Obi`5ptrVuC+Gxp=}FnCeOjV#IE5Dff$Kk1vZ5=0$Vg-6ZQ)<7o&^~B>5Gp z3UOnY%=m$0Hd<<0+1@#7W#Ktcm)O7~Bnv6Q!Bn#UgzinKl>I)^ogyV;3gE?|>p^rM zQWMG7$mHT)u^k~giQYzMLf%rLhPkYiN5#PXoB86775^dsMo~RZ8BHMa4-L!E6aFz; zd%z(H0b!9@2BhR2c>ko2>b_$m(bexLhr*LFd?cC&-;)VJ1;I151Qm zJsIv~alnRUltB0Zl@aR#LOfanF8g_88=T1d48{S=)?00I*;F$?;@ zo`59QBx4gM5HOi!3fLb}E{^~PiLc9`66+Hl4Yy)Tjf2n31_os3ufx6|c_85oI006K z?@9`_0~ZZs0-;dIjNp$LBY;8@2*~IrFPPWV6O;r+VD1i3;ZPkEKA0xJ7R)3VW^l2{ zC5AmHxd?XIPyuE@U71I$)TCAbRv;cLlxhNGMnEiJrg9{(vS1yw7A3MAqN9@qQ9v1X z2BH?s5I{4e^#Pek#Q`RPAxMG~I}|3|7-AoyWC}l)LCgY{>hjASgRM-pX+3_}Q& zSE*J&0>OI((1QDmCd?EI48j*6&7kT0&`3h93A_Y54xwNBcGy(Zk`@MsBgKKH>@!XQ}`%gfnejx zZikw~kVftsXcg>BBwAeNw1&|no)M59tRx--b~A&Gy1>a~4G}X}s5`nVxCRJSfCQqz z%GOx9HQMC@)v+5^ni$O?;1vfMwl$zFJUskM5Iy*_pj6Ps9a8JCz@!7v4Zuen7@@HT z7ffm4F9>>52M9-G=BP#KG=z20i$eEUbRcYW%wbf3&<-5 zG82J04y~LOnxRezhxwbv5s|nrh8K)HiGIj5t1&6_m^C^QN-w}Ti|8~t6HtsCdk!-R4&jgkOyW)j|@?amI2=7 zk!hn@0DVkw5fLW#FId%l|5rvPev<85gx#MfPUO55OHXH z;5%$0Vd}GULspICP67sWJwBc$0bZGc64-jkQtTU;v4$0n0yic_VI(2|BFACih@!CF zAhN@Froph%Oa*N_nUZt?wDMi-lMqtcsuR!?xiDM{*uJPxNjANu(mE@9^^%Vadfs`- zO6%Saac#f>FG51W@tT~9b9|7Opxpj{Cu4pA_{#c3EQVMsEPN&&-Y~1SnLsQG>?0sR zvkxMTtR4})r1(4Q8&Naq5RpIONOp)25d3MJV`dW>TD)eX!ol76Uqq3C@U8fJ#ru(5 z)|j?-6H@nC=#Cf@`2l!QBDJ!lOQKIyf8wYK;z5lt-4s@Z^$RnCp;6wD0@?Nlm`9cc z6JI_}wag0**Majf%4 z`NPU#@ZdKdUB6Z>YrI;P-^YO#=!^spu2nv9Eh-rd&M>}$2T%U%-BZszZ1?ttr9cjF ztOY`z92&8DGyJS;?aQ_z=j<1v8=q76+VeDDczxd9x^Az;c0Ot)_A>U$1_<&wkrG;{BTXp|m56M3kTpO7+awzE=HOfB3b{hOe<7hX}9Z`7FIz zU-Q4EV2Gr@8yA_;J$JP1WZ35xh9g<`a^7k2UcNlMhr(ti-}!Y-m1%P`z%S5tvi0Ll^JyC=YHAsSK879K8$R9rYFmpdj&==6@uZ65pjddrwDtIT zH{6p0SUS0zUd$IV8hj)N5ZB&q^r=}Ijod(`YYqaMvF#9bTuEAhdI}z%r7o2 zJB*86TR+>1sk-{n$DlwYNt2iuZ^gIHtKV6knEed;D+d0$5%$b{?Ve&AD>H+hF;Hi$ z&7yM%n!4KdOmtH_pU=4|Nm3S>GTogx??I#P-d}!pw7HZ$&CD0)O568O?l08$cYQGi zJp`>{26MPwZOlg}$TU4W777`p@<=gPtiSI&b!`HZ9l)7LkHpww_iZ~`pRMFh3-@=I z?v>|qAKYKq|G<_q7`A+Dw3^V4GP=O@B)1tWB~sUEdito5+_hryct7RMoo*C2A8ocN zBRql$^xWdjrX!4mbt|h7>gP1IPveu5Sc7dqZk9ktt=-$T&*=ogwW|NS&r@EfRine^^Xb_^!PJ4@^?61 z@e4zd@*X)5#UjrWeP?BJq}p|>*Qk^c_5O}KtzP&3 z-rTpTlBgIaO(ko+-@cOGKX9{__49k2GAF8PZomyi>)Q;E6fV7U#E6jq`r91t0Z5n5 zXE<>8cBTAEHHl(k#9+qNBuW|YxZlrjl2@^Q2~$7J?(0xLLaoHZFimA_oaR(=O318p->tKEG%s z@;=8Enhrm&D;t`|`-0x=sBfN|TdyqqDVh)S~4-x^vXf2Q7!^3bnvD zG6}=v2)|0c(YhW@Ba&S!c*68!VK=cgWK*ACG$Q?&Z)ECe2#(d%X`F({dFUY+Io04h z%&e`Xwl=mmmL3nMHnuj0*HCAk-yU9gxRF}r@WdJ^GsfY3dx#Mp`5J@x8e2T0=EP$? zYeRo{U(%c5ocM~l&iks~xso~XK6hdc{EE4+@xo%w3E^)XADrfld0}mv(@S%+=U%Ip ze1+?YOMQj)bWMADd*;_2FVAoPBM%gBpRcdJs>1}JNHU0OzPM-l+6@y^PdsqgR_G^1 zPJ#Ej)l<$XM_0_~h&26=Jn`4Do~?FNuW3D-HXE-)J)3q|(b{$14y$dYTkNpvO?iBW zb!oF)b)u{;OW?iS^}OcOHh46+wc(22@q%pq1T~=dM{;K6f_UH7Utt~U-P(TCKn#!E zY_5o+azdklUk2P$;dRb|@uK={v{a!=;$mgcu!qhrJER-ge5riAP1q9<4%ZIjJ5KU} zPLbpYs)-4(zyTeKTD`)Wt;xrLwi5zKxMI*ggpQa7JA7O!cn1OqVo_C4Q2mTvj=n|wc#eTa4fi>VDz`m@*feAt`{hrfIAsslCGSv@DDd*ri zu)*w${#Y10U7DST_@t8@mljE#o?Tp;S{l1IpBP7GVrp?=HhC{~Z$3GnN~IFX)KqE- z;nvjR66}U4js_x+n{q{1Vu|PiuilDU0GJ;?c z3TD{03^iD|AbfX)wpzBWJxnT#tu5-C%CCY22ANAa*vix;nH2^*q&Wl#RsVxND zcx^dy@KC*?+YU{_@`Kt2?Gz1lNR%+Lpq!GDNRBU*MTf>gwWSpJKWnjhk&g4bhbA>p zEO-ux=E!(1BY%%^pq)Z>I7#Z9|06IaHDJhwU~rsCErVB^Zb?!7q3uYGuGT)@f2gVY z09%exaPWR$UfD+ReyCSh*Bst|>VECp!TXV}YtstewcA|Ox(#L~-wV7hecnOUokQmt zNd&J+)su98r&X`ow%4WZt6MUR*X~`9TmL;DQGvK9J@<(w? z-d)NZ#SMA4$%+YoerD_x(~O}`B$m(@NzFqLotRyipGl?WXXj@Z7Vk||O>}41h9>ws z%_ewS(=TpxHgd76TQA|&d4mhYP@cy6FQU;?%EklFx@Q>qOfjj!5j%ls%_by*}JDXg)`NK=yJY#1OJQBy_hxW{Sl@alvocRd8AO< z8+A|f$B^JMa8)3$1>RE(q50u+@K!i+<(r@6OBJXe$ZeRXI5{>`H(};$w6A#iUzqCT zk@Cf;KBLi-{cnHIm@rM@i<-_1@8}6H{|&>>YFCCGXi+H(QTx$*Bd2Vq)2?=1M%m8v zYh-?T^ajH_YRzuor!H}m#?d%xEo))`N7<=Z_}zF3Nz$qv5}Gl+q2 z2#;#<^B&ohQD^!BKiBTTtpE4IhK|jAr$x0hYe=}XyOjn?W9J6!s&{j@?)?7pwfcY8 z?Mpmo^RL_fCdJqMLnGPz>$krL?C%@)caZ!1>W$wFazAw(Yz3=bAM*1n>+Bfc2@LW@QuLxhWxwU=%w~ZLKd7Lm&i@7UgO@=y6c_Q z>#Kvj_=MlJF&ljSdH7y;?vv~5>ks~$f9A*PUF!LDmEXMrkmUFCGlW?Bw>cERy!T^| zDsJg)yRsW1Oaq&x!bzUw0WhYmkQL|;Yzsb9_JrTR7;;(h@wc3((FHdULODX-TtrHhZvL7;J0e>F&EPZ5u|T*)*D#gru>@z|ilmT~*WF)l-W! zGBFP38IMRMQ>e5 zR<))jGc%s$-ma>9?%BTco$vd9%lRV*zV>JK?A;^(^zYsbHsYYO5VhLLLfQ`2lR^LJ z<3TrgQvLnO!NXrZ_{iX7|KLi@mxKP>%Fj18x=DK@SnDjT2OGg^((VlU#~)j3MK3OA zp9iY^$rpIRgX0C`kb!aL_+Yztkh29GuAGy$OU1`Kgd(c00G3n6YLI235kJaA?jP8Yi8zQ#ny-#5|mJ<{>hzoTe{OGY$%_Uy~Q*q`4I z8Z)&GxrP!H?T=$q+>)dT(gz4qFmzFJ@HA82e|u?BVi=^yLV1H*P! z>OrRtvs;ht{LlUIMrTleQ6AzSO7U;@Pov)C`>AjG?~=KAr+Mm~#*_RvF{ykroYr@b zJvccAJUN_RZS2X4N#^14X)X^*f6qXDOh#ifJzDiN8$Xu*cK`JEpTGS4puRc&FW+9c zIOy-c+-eW%?RvXE_kl*c*SXy41`Ks){NMhe=bvn~*(U1U@qhcr8XIY=y{<@i&_7Ub ztTGpeuLkXn#>VQPex=^yU%6&~$)~OUy;_%lugH@hp}DdbAKUD$b&{2+)!XR8?)vw1 zl1LUwXC=78b{2$d$w0Qr!>h?g(x&14BT&l9TBF1EHzzZ&(uo47p+DD&+DWp}skgd= zq}RzSsDJqEJ~nVRyN-I#=Rb=qajkZdBCT~gk<=dNRqaODlUi$+8r`H*d+y@1wNQi( zsit=F*$=Heerbg-AA9!ULI0jo+4-7!-5}{7VD+mSUZ9$!Ki4ky-O-ojHtnr{#S4S} zt8PqC|Af>R)c>fum21$YhLin!PJigJOHZ7hzkKFY?Xe)Pow>kJd4^_a^O`%a8MP-F zWg`qWYN2VlUJ`}#hU+KuRuFsho@4RRHoYVO05Obl>#(bm|<&Zs9M!CF+&b;A|nwYwVW12=Z??;X{ZzXmz?*)l5ADKyH`$ifjv0E-`kBSC% zl(?}M&0DUe&s&ym@sc2&Pb1y+11AkVJs$Kw`_iSSY07h#YDE`oXIivB8!s9&)-rAM z`Z!8#(>9WM*NPZClfS&kcIRW?(|uU66S)4M|2gvd(U4I|r`xG9e8UQKo*H&tFLzz@ zJR@bw;QMsK*0p&*wW4`Ab{uG4pc{!@F6xfj=CVtKR;16TuIA5Msb$YI&ve~R{UET7 zAhanu*|z#b+w6IRePh(N66H9w%?Xldo(+a+vHfs9^!0Gwj_uIUEcUK|u^krGO5I9y z-;EMKn2%E^&k7Q2K5&?zAn`3X@Ke`|!dcp8vTNSB2l{MJG08W2m!(MI#!t;sqdu>( z%WwBC-JjPD)+<7XP*6QzezmpMYDPXjV#=by>e`Nkd5h-F%Sdfa=JHH7)7w8o|IIC1 zW6_knHCwdTTGZW{+H1}0jLnVOq9YXD@R=L-+nU!HzqeJ7u(jyT*kGBa8#P8_!QJqg z89Jpg2{(KX%l3xPFgROGmAPo@Gxgk@fwXvr#kGBFOj!Oltubbs2j1e{xF(%vw(Pg= z%-C<85#EAq%o)kXWN8i(+0B7AkPMEb`L;X=WEY`em{$jN6XOCBkh1%hBl zr07FY>uS4^NZH9}$7q|rN$K6T9Qu-u@c8^yR+G;pdN#pE3-dRlJJ zvCh>-_rpm$8-sG|ijGyca#V4-dBe#VwsSarIh{;RU(u+k@jMa*>tRbxdbz<<-5U;b zL7Zb!FG5B!sV!hL?q7v1< zY_X3G{@7XucvS3QY|W2x7M@TnV7qsWUOCNOPL`O*&VRje-8X*X*0pZ?H~+zH+4k+; z{?|`uuWoJKulDV)rhFo*yV~<*FCYDTvhNAF(E)*M3V0E=8ykrrhYLY(am4WF8=Lb2 zQlO5AM(@n){^Fqj<}Hh6B7;W(7!$PFBNiUH_h?G{i{g}p{bp0 z_OOQm`XS|xAjM;wL8sHWlB@{A+&{b?tO-bnz_rncI~B0wr>(C28NPS#6YH&R(yb|& z%~%xGTTp~zX!ymUF$s=e7Yu7pr%$H@9^ZslU4m`FNpxcb!-d=(p4cE|Y3uy1@ z-fB{NZgZ_AkW~2z-S7?5n|$KnQ$h41nwouBdOHdi3b#xBauZ_rKIXn6%qsglY9U{ke0kE|70;BVHIZzYMdty7b?F zF?p$%U~K>m4jXZtY%J7Ht*y1LCUK1)+Sh6r50lz@aIIDkt|YY(Q%5a%IRZRSw#(Elexxoz+4AKG5|bj@wD6Q)_J0!~vp%A3*;E-)v%S5erP549@QD zpNNw#CYU5%fhmgdqW>n@?vX=ECQ6tyJ#BRwU07vD>^2V#i^Z+08?wB3Lnm0@TvLV@ zHDc1P=ErE`R?TVtpZs`sZ}a2aUKliAkxzS?*VU(2@rGV!YIw3{Jn(pH9q=KWj`FyS zH{|3Dw%)>AJZUgoyw>ns3rO&D^HH37K+J24o!%z!2!^Z4PLI(GbK8}PI*}@YGCEH&2P@e`_FJY z*ZdZB{Z@7THuXcr!+V?Z@J9yfX>Rg(|1B4jRkqb&t%lnO-aPD1@(p;!wLw!})qm{# zMpA2~wQfDBrBG1q;+cz`TClOfvWOt~pmq}forl4<>6Vz~)`QJWAf%$qnF|Yp&$MR7 zv4KZ5I`F96a(gHZ)*Ik!=hRf3-7}j0AC;-eo@)L$e@{O#BY~Xk9~Eef_QCY}#mbnl zxsMzv4hCz<%K_Z6fADI(#SYJ3M+!4A4CrM2BlRzmQ2M^2gs|>|J+=582A72eLH&o{Y^6dvYuutv=PC zZljC+n*N-?83W#nXPH`#d~+=SCUfqhS>c+vS{=sotcwj)3LVIP+yC6fXYnX&#DizP zgv_23u;c3rwU9yQ9Npr zb0HOF^VOd(3d-~?WTV<`weaE-SC{E>W3yWl%}a9l)~5ZP6T!X-b9{*iPReNAH=OGg zHJpleI?z!zqRU_To=*RGMqnLfkb$X#NW1N8s|AsdY z{RH~Qlb40#7rz|n-<9hcD{6r@)V7K9MQ3Fl#4>Fp@!)#@L~rv7;(n(nwWoig_;sb5 zyeu2KX=`ln*I=istr`$AFDTj}{u<|+zX$cOtKZWN+N*5!arQ1u0&25Aq|jCM=K-lo zHkmuG05l^qw1)lI(|@3=toJK*{5I&H_+V@(XN~I+AI=-SZk@%?hag4}=>+h8C|ZcP z|DYY4z8`6UXT^b|hgO(cnx6P*S#!*U0NX`l#0NulJabp9f1LHf5~9_h1fuDP6N6!2 z){Q02U$Pv$rW{Sf#Pm=*S(C>`%Xmdvg=@(bCFMLg-h3R4R*>5^*h>+Cjzw!&SmTwn z-CAeoyi+8aiD5rd4Eqh*ae@UPE)AmzyK_Wr8IOXz`g1|Ii=wfDjwuq?k;cYKhH_u; z-;uVI7+4znV-t-zl#jO1@{wLg9B9Sq_D*1;C|RIyFE%z7t_X3Ih(QhO94r(%5K(W? zf3K`!0i0Uhms$UfWaCPJmua?!JBW*&#l||L)LD#^RDPMyN-u0eSN-F>J8P72$M? z3ygZR>;=fD9poQ2hX(2cf64O;wGY;j|3!Y1`L4A#aePuAix)gnYjkT!O-az^hZg!m zE$ywXi3GJ8v_q!x5!yi~>DxxM)`NGc@|*QGov*#?rCzK1-Y3+O&g!f+Ql&Q3a3+Q! z(J97+qOCUG(%nb00*q*<6*Un3l8sdWOS~d^5PhP)(Ljq~C^Ml?H9BrlXHu%7^N4Cf z)svXJymzqzNSRrTDRS51{;smuGSk- zozZ6mXutd_Q>I=dMR^krZalFWw7ZR{w-&TfuGoh=NS}9FtFX zH;-qZ?%?)H^G>c$J(~NtHt*t7{|?P_2y@Bt+%p8`=IS68qTJU=cS$zXjjK}G&hOa@d`CfUglEIqq=TCT9(rZ2{Uskx%RtcH^N#wd4iff9G zv6mj)J>gQ#`!nDAllScDHCI$G)P^vFaJd5)=R(TV3t_QZ%B=9C9SNGs<(3^v$(>Vz zW@XXaENkxFTGo{9`HdxNUV)ZgtD@%Dd`8qn^nXo=nqMz0>n23apacQDsgikAap^>A zo1O19KgRRB%&w)w&;0XG9fMu}ZE4N6Sin{caF^|1K#>xMb`FgX4Gn!q;AC`1V2)lp zh^~Q&#|@&-mVXNtxdmFIPcYAu+gY-AY*`coxsAmMYwFDzzm>K0W{T!E+?y$C&*Ry< z^9GNss5jNu+%kMK4bCjTH&tuyy|A5o!A-q4b6ZGehkY{T@|pUl_U)NQenhb>kRQ|v zAd*>-pLcAD{M<7G^7G0J$j=>iZN0HUIL6k{&(FauZsC6X$_&s?LaudF$46YDD2jNKL?*} zgehLMw-fR?M9^;kpiWq#wH@S>tu9%O3i8e|pI?SHKQd_k3b*Co+}COTs@m8DW^MkO z{E3I8LUI0!eE9qe?c|EWLkx>>h#nY6;V?~<6G(voeQZZHf$(ZU?WxCjsv{aZXbHOe zp!xsvnzPS0e}mf#gZe)Rn!hDq>}md2^+ofyxm|DmPWIjJa_b)(Q?h@Lug*2I_0;^I zd_WofU)gOhqri*yWw-s@UTGfSdcAp&D@wK+rUz{T#2imgwJ;)XNjEi=ZYv-Xr+I|O zc-@>Tb4<#7WAivSQIK_fxS6-h&p>bZge)+f@>=o;{2w|x~^;ZlsqOr>$N9UKxszr2h~rYS~88t%D?x5 z8xz`Gw|O<#Sk+9!8Y8o?1X;5**qZ0p6a2duI_5&K9())p^wrD=rM_Ow0PD`8;EyY| zEAiYoKr}v_#EYJm|GJVmv6Z?(m`?7@E4BM&r ziiA$YwR1`LYODQXWzss@=CyqytPRpBy$J+yyj z0{a8Dsrt8@Z2swu$>uoTk0Tp*b60j-+lXa~U=!(K+y76CwbaS$Q=g=m5>FHA>@EDxkuLS$EzuDVfu7BU-m{qUUL`)mS zIOJi@nIvDtBZ_raY-xn*i|kfgG>v?B`-elp?Vs0wuKx46=(cxj$^N*$>#`eCn`MTY z5d^vynCQ9&arS8yHT{`MYC`-nm&{Cd)08vA4ydW3aEY4E{ef5KHPMxJ zYlE|0yq_yJILq@b&2n|!nBL%2nb|hD-@V;h%TM$d)iV+I@$bb@?kZ9hD&m@ zCf>%L*c)4WQRnT=O1-fpStU(dp;wj{JyL0p!PvS;B#64+s?h^vxU zeOo1Q(EUggn(eCu` z>;IwtAM3wd|4;Q_ssC#IKi7Y){_FMsQiX%QG6s_$C+uts)$C;RAIfg^snTxMKYD7I z$0FD#ghTOSc(D`i)sQ(5@S25=#s81kd!ucZ}4HQ!h11MOHyue{O=d^r3Oa zSkRmuYH(GBOSEd(R`v0u| ze*J${?OEfd-Q%Xa^`7;QWzYI2ySQgz@wFTTS~s*KAEyN;_9`jlJ0~eb?OBGkL^@#d z`0i}a$~L_5!et8i$(bo+?lq`w={uEvnvzAkxlbOGmm!K)LVLY!}0blJ#o93vu2r>&bL z=d0M@zH5vSaY!>Si*LTYM3!nFd+!c}r|QBbLR{8g*TU2C!5vfLn`GMWmCJo{xnC|1 z$mKz~yjd=9k;_AJ`7F7-RW5In%iHBrlgnqzKpGx?Bvom~ye?V#~$hG6PMzTZ(EYoBvAQ^9$-dyFrtF zVp*2!0*1P_VF6!}ZJ#`=6^!w_$7m8KU*$SuTT7$Bj+g0MGtLVJ+NV`g^#L{+gapf-jdPxx7~{?~}{>&t$rQ&(A`AhPi|4+SVSLl)r+VQkB40R(+Qzs(94(W3$=<+X2 z(4}r&*7PNl4cj4}ZbxVbj^GuAOLTemw_eYZCedJteW{7xs{$E z3({7~NAutCiXg|{U!An4yAg@sy;u)I*EUH;Ptte4(jfg8$B2jYT$-R=1az7P(e*p> zHLWgOCY~RBT@%k=+9~lY3*DTP%lX-eN78_8fwngP-EI*NnVh^Nh&4aw`3Jnl6^&zj|5J}}&Azd(reqFgS` zMyV!8jci4!+3vVg_&;_%Cp63`vb8wTy+n_3k~ZS14e@)+WGO-FnV*a)VI$h?{_~P< zq`GjKEPrHXvOLnqN7fT$ zA>D1V3)7h6n{3xg9Y3--3k;t_omj7F8~a}wBRc>M6vvG0uvZYcHX}?dT&}usiR_kx z*}V;4Yius3yMH1w;NIpx&2CE0%V3e^AHNY5zG^}5KaT{xK*%qYOEfDD+PhAJVX8&q zNS%_E$d7QjaD0watDwQ}o1{T@TKp41K0t}dtGqKBtSDTj!JnL+24CxvUZ#*V6;1BX zXmWqX8MFO(`3G+~P5%0bCKDmYR4%Kt(&TP?VY3HguSi{6vvtEY9dr?*+A5WgzdAva zx~FK;UDEXhJVtj$lU0SwH2JsQI5eqP;*o4){^)_*urYsXxG^_`_L_2eaYTUI#E!Eu zZ)v}{N!Qv4Q7{fe4G+o4GCkKcu~I~pfo|VFNq}y#F`Em{PB&&;B!|LeQMgQipE&S_ z5C{)ubocV@pu3SkxGp5OA(z&SbZ2i3F5evL5`|_OgrTVc1;(0f5}8T}ic_^2|G*^O z*(K89Jcb=@#(G8JGTnXI>zD2nqs#Z%GjF;LjBbRpyd<>NmP=<=g0psA`qMNA%@>bw z&BS!!kkG&mDjD4mP7)j*QzON9rvz6~xJ+=*zUd9Y=ngl(Hq$^3e9X)Vu+ethPhm}e}@2^dgAC|L%{M^~y0Wt+x z%x;r~%jEa=W3O-W+m|UD`!Z!?U)j*HeD5t+Hhy)aY+Mua`>l!IX`B5B}nN zZYvY~h|u1b$>pOX0^C;Fuyhg|+ zKCPl~nE+SrdA&11CHuW+Y!Cjn`)(`weYsHH$K>)AGm@WEK7e93l5<3Xr^iI!IAkL? z9mfh1GvH9ADxKqpC&`akt&IFEKjq8~hB!=d-i2eb|HA&9q;lW=8Pm08;TiqMj{73(+(TyHeTskx7CZ zTHDC^XYN$ct0-J1xR2cXx+S>WvZ3hi;MhLv-462me}|az9}~*^<8t}xS;=qLeGCH2 z@L+f`js-EGUgEo_vq`K{PKNv{}}nXw*%=LZMXlI zP~O+b<&(3L->xHlff2iA7=?BcIRJg36QrI)TCZtegCCtFzcN^7?Uei~3YW?6eXnz* zZ~r!S-LKkvgFX0F`x=y>mai4^`#QP&$q@~13$-}A?rT88wvbSN-8CaqC(92>C2*Cm zqQM`Vq(SA?NAwR)rB0p}Vup-0xyV;hxJ-jzH+%HYYu(pCZN-^O^YWj#9eePI3H~Xe zy>F1qH;xE!Td3uh5TG4~hJ#zPr|SfWM>>qKiU5DSk^uA6fk=-#(>W9Yju$Qy;Mcr< z_uyRiQwEN;+X1eO2=1GN*8a3yzIj%H+kFFvW|FHiOvra4{wy41?rVBwyyM>*BRG?z zR0?p#T;MGEoe*4g;WEL!^u_>J4rh)8KYjlV_SxO_Ed3TCxo?%rx6Mj-TV^J>S)+!Z zBu0dyVS4z{lRwao0@tm~u=BSk>8`Mi5yar&61W3K2i;W^F4NsVy8rdA>nbn4O2e9Q z%MEM4GBT`vyO7_XlgoFEXmDHOuCwcQ4MN&nJ96DfH#|E5ZZSPOt&HLLi3u7c;kOvp zB#9Vad^^Hh%=xOqWg1+1gBjMc7^3CBcsn-V5#aY-LVJH+F5f*O!0n~ITS0(?b@;KV z1*VN}i*I;|Q|V3hla&OR32gSxq`iUw#|xJU@cUlBo3E1g@?H1)4&8=bcLeeMMWMCt zk<0haNO11%6P$(vRp>{4oS@+Pw)|sOnlyfDg5XH1nw!#gls#JXTT_k&o+?}>xF0(7 z`rdW-W*AFlJjd_f@?E!tvHWErzrP}v?;FwJw!5yk>*ic9j__J0a+iZTFy`XdXQobN zDBIteq(S9c*uw<&R+#QO2k~ppK=_?AC3Gkl7 zZ(JsL?RGN3zb@qWLvs1y5e@F&&ac$l^^KU&A1iWWozM;4#PC5_uV+?Det&O*2E{GU zTCx<-Ykc;PYu{)gFj;nzZBZ_?}E5w$pFawFO3 zW~XBJ_dW64pnqhIV<)>kPRV}i(Wlpc?xW!kd{6(_CTENUYuRI*q`lVKSS_B}_x<1b z{I&Q0T>p5~>TPt}*NS&Nd69ReYr*PDue~nVj@}@M^u)=nRI3p{tJzacezjY;;?#wd~}@u{X?huWcqPbbO5?e~W`) z+sSJ7!oyKLXw!N*IQ&SwJ~~C5vvfzDHaULz$&05r+qV3zG3f7;v6yQoo4u|&(oLo}W@G=a)Y7*X9nt&>Kx!c24G@C);w)v- z&=gPfp$Ij>zSxT;}9*OfJW{Br_k#{vY>mc_90qi38b7M`%~k z^*JV`OxKV7Qtcv?Gi-K+25_Sc4|Fovw&G(vf760 zY>dFRE>%HtcL`D5Eth-b@+P_5E0_D^a=%<2;PMB7(s!J?oB2COh$>?dUXn@9ezx4?3-u_p3)q*6Qk} z%^Bor?C6dcr*^6(fuTpPWyhiCCs7h`U`P}heq=`}=Y~Wv{vH-7)osmZ7a8NW{llxt zM$!)0S&szy0lb4`OMVF_ZF8=7JAu1*1~0(7A9!ND)lIr9at7~;j>!}#Y$57g8T9Wj z{W5RNlWDW!hZSRfSRyHL-;=U0+&A2)SJbwuw!_Xqeo`q_myhqAK8kVqS4)Xjf2My# zjx|$^3s=r?{u=e*~e)fVQNcau38Yi8o-Pn}Fvj_dR zO0K%v(?O>W58`y(+WAl&wI0`=yZCHp(7y}OK^_k|cv-b`a5jWLA)GKw%^KVz=pRpB z-fXo+N@BAgoITvXYdu)I8nly@G+1w}HPn#yk2N|g>#ewvHj;R7y?>&&d4&<~6s7j` zPZYndbd#66hzYh)hOqi~@PeW>9N#uL*Zh9AVOsHS)rxz%L3=fUqh@bx=hdDVW3z*x ze`vMc>TOE%`v;^2B5mAxC0J`9Mzw~W+|z%cTW=>pcco6J=zJ#%Ha3C~`9~zJ&WfBu zj-++He>8|WnZ6UWuMLny_BG-`|3N#lJpx}t(1IXM@gw(87E__pIp$uD&dFPMXss2! zsK(=fn#|@y^re58^lxkmyosaZ1q3t5t#jGXmo%S~lsRVt(OpAkY$ph#ba+Hh(y*x8 zxI(Y?_8%PYK|SC{mIX(p^W(7yDV4Hv{xmY-opI~x#>9jiDJJ9w?LeMeU(dv3MF5QF zs6`o3EdM4;EXz{3(umdIA8Bl?sHtEK??^dKyLEL$W5{_EjX9JLxDu@79Pn%xJrQw? zdE8@aID%V6dkX$#5jZ(##EU|B)w1-t^1a?LTol*ZdXvu&4Q}+_o?L zYuSUp&TaXd_c#9wcN*~<+^#o&GyCngvfF>oMPs4eNM`sWH7PXa?<|jxLUvn=Gs% zGan4rl9y4;7Yb$W>eU7H)dHf=Vuy{jv5~eGD+=aN+k8<_khdwQZMs~J02C)HY^k{1 zKcTqnK-D<#p;LfyNPx1Rz4(9rZvA?8mEWZ-S*Jsr42bX&Y z>*~)bVqHGIZ+nGgwVfoWAd_TKp>iA_svMKb#)%n}jaOz+HjW!*N689ZBY>EYS+>wJ zZi`ZpkU@e|#{wtNtXK==gcEhR;SH4vi}gOPRFI%rbLKgp>hP?MWq5Y zC{A%%;na)7aBPd{?WKe0fCQiq;5R(F${#aM&UUAOl#w6 zJy=^yuDNj6?e&fKmU4o_FdE6mm7urQRa|2n?yAYh&22P^ zVnI(T5GmzlkF0Y?%589a=0{lb%_e`b+M6%R-Pqq;llv<{b3OllBfq!g&Z=&1@<*;* zwB^r(*-~zH`G9=h<97B)^9na4;Fsmo-sZLJ)0c9)-u%Pz-Ja%0xb?@EUh|`TcdnT& zx8|4gfmeJ*cKbLtN_}N^`vkXFny+xZ-n`D0iq!}`XlDz>we-|92*j{;oJCD$tJ&u< zUiZgUnXl&Bv}Hg16Z|EzeVOKDRdD!$pZN-W4NuUAPiD7)Jij${H@{9EBN|E`+xE48 zDtqu7xIOa~kZkiC`HKdA6SwQlKb`&h&DrhGaFf~lR_^_ADs28)zPsN1cKPL1kzDgT z)QiRmt@&N@-h!x_-_5673Anukb?DPgP#phg##%%Y3n#TAb-2_tK{?wIl(B$%poIKg zC8*JBUq=MB{7nZl7IlJ?$TAkiH;P3)p0lX${ep}|@x5YE+!c$mhAc`QsWHW(`b$r? z+BLS3%{2hS+FGO2t??(?L`{sO-CDu6gUuMW4gAN~-C&{BUR@ky-0i2vi1DE^cY9@w zyPeR-PuAWI_9lm_U6SrIbp`18>b+I5$zEQ;4$cgh;a^mEBMV#Cfaq738IDdGI zI1g_}oaR{am0clD_R%y95;Cvo2{Dkm;{wlB5vMmvoVr9<7@Y17(oN!TEpt(sW|fu1 zY0Mj*6xR69;~c*%zNk!`A0lG!GsLNcyBiayI=gR*a~8tgo5mB8|kq&$s2r2PQ z%?dfFGj)mlClg8)A-#7yLIQ=^PCfVxN4gz^^yV=_I(qvFNs@@!uA6!~f+|vsQMt9f zZyQ45$WJ#9a`?>Fwmn?&YeV_{TXOmRnOuJViCli?dnLbfSMs}e>*e>qwgVCz%cQd# z^1A`ToMKN0MdOSV4xaTmxrbbK)0^V^r%BLoF6)NaGYRxk=Z2ymPLtqP^1CgCIr3QZ z7Ys8?zF3yuAN=|^hWuV&v;THTn`=33&QH)L-z(bWu4wZex1Kh~b<4SJ+2dI3!>-V# zFLq8dwDG3#>%c%A-FKoi)Qn2n{QL^qROAKU)GZ+5%nxLC+EkuQ;2s#sG&3t)rp|-+t?9^RJK5=E3dwrd4)(-4%P7K`vy?Pe49(+s9EUOsvqa z)K4C*piK}HPLk(8d%<_IxW(CNQ>V6^#PhqU>L3BLK$Ic@U2 zqD}6KHXpk6v^g$sj+tsFjTzRi@C}F%)3rt7SOY1Mr2M-j3CrC%d~MOt|GA0lLSVD zk*n-oSaNmbzO9U9fMj$e$E)5%Zcw7a>mH_iZOCmjPbK>{igj_$LMxjz}p(j zIKL~5(X@Py77DG9qa;)EQ5m)?*>0y9dbnx7oYUs1oHqYqPMdtMXp{S=hc>r058n#fG~&P_5x7QX(!jA& zqDNzrLr&A?6V_KNtepiMnZG|p=CLp=`d$kVN~()Re&mb57Wl?(pO z@XgQArt&a<)lT`<9p{16HQ-GI)~qJ++BM?PDR`yTh!WoPQm@e_n!dIfT$4-# z57(|Xx^;O()SD%f7s;(U(zXVgXixr<=ND=p ztS1{hl++}rK&`cz@RWQkUhqf_fAC;)Gac000l{q4-v(`vCYP}oONH#(`3_8V_P_)%dxP{$Z^Z#98CXA<NQU7GF`X3wPd3R6qyr&+` z9?#>E?jWz@*l8WRpfJ0MMzSEs^HR=2)wIZQBiAu2k;F4&yw4%?qvCxIA>yz`ZW8kc>syI8 z$gFcX=aZvUQF9V@q7uz?28jwwK1S3@wIJ>|6EqTI8CAdbG!lRqt_Rr?t|5E>eJUwWBDfBh$M?LPHJ9n;s*ZVFeolRC~ zQu`uHGhg^T693Hdm4u_;uYzS(A{Md&`nvRwtTcmX{>jGw_>%rxdmAw^Hj$*MDR>Nj zb^?jLQK^>X9S2m2{+qH8JePzw>=>vyO9mm9N6D_(keoK;ts&H~+alHC;Ow)bnE6LT z$Kh;sT$L=-$9K*QOoLNOOd{g-(6jB>_kAxmgOs%Ch81YG>)Qdob(SF+rBclusFW6; zIL5%_P0&fWQPnh9w2v4j9oh}s34_72}5FL@sL5!tclaL*Z2_DoqOdHj|+tC*qoAb6l z@7ly&EF`^b7``qahFt8@YuF(S?6;iT{PptFT}YS`p1hf{O|Gk@(lCQe>Mq>>36+-9=K%OWhN6))v-Tg!Al=S6bBtNx@~+;B2LQeCi53Q}X7S1?eSvL zA|e#b8s2q`kzS0^-C41h^I}tzBIRsCzEn>*F$KGX>dCzu$yM4mLzP-hP+lxxY!j;J z9VB_$kf~`@6M<}0ZjGRHP>x~uRH0P_fIwv?9q*iwX*S%@C_JN>A=bz?v{pp{cae>( zyFH0k6}#gq$so$qmh|seYjKJ%stj*)SyHE!7n5sQ#y3)jsXvbJ%}S^7;bgG9=Low) zEAFlJI)mr;!LK!}M3DopvNSJsB0toKe+gooIwS$QqhtID!;}L!Ig})F{21XPic*_H zabmO`i}W-B3H6fDjB)$WQ11OS@y*zGY|{*USfq~5&*6ziV#IOa*j_?#A%-a}f@gU) z;SFv?!hhcg37|`TFY+v$lMPA09>=o(UiJy~LwhEeLFqxyLEdJXY*zp>8E!lIjM(rZM>g0?W3wIMp;Wu%kFJ zeA3`XnC^1P2XYgW^P0EaP+j7!0j4VHJ z{m?a&gn11Umx01p$90p4!+iTkB+H&;BOde*smM5;8~{fH_ymbc>g%NWyGU}z?(aK&4q0M~S#IS2g*$O*RK@X3<@EuXA=AP4-C z^zTt`g}h`5uk<>|VS^WtVdhlc#P%uj0#bD($sW4uL(+dR%UvhAnx#wwCM~iOon?d$ z@|7eFJQ;WvsXZKmNTAMGA}C{7mSV!N9Xm-=0?(5u&en#FMU51c=JiJX}4$RBP+oy{#C9`qz*GB1NS=X9S@?C9h3dtlLa z0Ne94C&o?0B2R#m%4$yodgf|~pNvBo2DmtdX&P&0YH>zr?7=b;S3@?9!A!9U1PG1} zoZR6&Th3P@!%Jj`oGa=^o==L@$cW?MaWZ=;XEVFl%!vUs%`m|T5E8hSh9(5ZRuEvBz!@QQnLy3;b&pf*c^5Q^ z_luM2R7(DXAaP@uqU$q(7EC(~Tg<5erASW8z1;!@L)^i(qzxFe3#G!b~BED zlL1cH7T}dOJAgyr6?!#Fqs3X6WbL3isc>0_C}vnA;*b;BBgxyF!eB`=tHp$l;#$K1 zYLe0+bTyl1xHOe>Ze02unT$U}8tCj#V&G=O4K|< z!CwCaECCE>CBrbFO(w)iIlF|FPEHawWe%<*Al*hOa6DQ2!fEG53>>b&w6Gr8)C`kU z|F}>lv_56YFkPA#X^C%e0s!{S{-K6i1ByELo@U*Umb&?i(x|sQn{?mZsXdVcHo}!; z)3{c99xl1}JXvhU9$*tWkO?ARbg-A@o?jk(ev#4m`OiW1J(qMZ1{}RQV@yvxM=AXFuJj#cB`7|j2*7*9|6PHCDf%o&T zK6e3#XrsGSJNd9YbeWXcOSLD0HqhWj63>%ERWSmvu4Tzv&;J>sC@-&_JAHcYe7ga3 zcIwhnjXzg|jmC#nfvox(ue{o7zgRon0xm3&rPEXhE_G7g@$ekgJdP&2g#P5yECfw^ z?zv4-RpTW=G)ad5v~10t&him0)h?4n7nCiIQNuc5Ty+86LbMPd!#02wh!z0Asx%b9 zO8`ef{uEYMv>L2alIkzeF8UM+s5s<#wFtmd@JI6ODpXZ4FjbH?1(KKzI8^1XkbKif zr6?T9!bZ}~l26m0bZMB{q8$gD3jtDsdO&JrM6WG2HW!N-<@qd+@UxAL7e@ubLdjqj zj$YmY8jb3Uz>@82BuHCdn<$uNzAoA#b1|ZV?WRGVJi|y!59dy0gSu3^uyB5%_E_uX z8heWG%$Y@(MG+45Ycdsp~1~RySGr`&=l7%GgC4f>gy$$nz4|{*pW6EHh3L%+dv7CDBxl2!Q z?4>q;>f)JmGFIy6Y-rV=1qls*yHH1dT&lf?1JX5{T-*GkmWF!z2?64lYJt@8=&-rP zYiA*yd^DyTb{W{ZX!gZ(=M8_@Wcj5`45v@m&To>oTOk|LZh2tTY!+ROhS!EIm!I>7 z3$U>c1d_DJS}#xRpz)>V!B4s{ZpFbkN(1{v&g1xCDo!^iPbh|V;q;mLr!JnFQ^}6o z5ag2==UVO6rP}$6PtBjdWX>xR3F7s}#(c!LmronnS6!Mn{!NDXE!CcV;;B=oKQyUtBfi!5#S2O^0iYz965czbTm44h^G-#A~$F*uT? zJ>QQ$M{FZdZxYY7Te2Iu%S>kkrX#G7-~XSxkk?)oIw zrU5DVhK7?TxDYxWHmf)^EYpj_goAI56z@+*6Xg!L-3SabN+QxdA~BCu4!Ufy|B51S zds*cV79%hL3NKQ32-1^?qzzt=DnhQqz{L}VtcPh3pr2?7dX@)giNY|^&^XM%wSB>X zKw>x=Lh639=s2(^XemG}k#$a1_XByyE2`E&(rn~4w4K0@Jjtr$7+e+07I&)ZrtWQpP)LjbCV!R9e4^(|fnq5%{Z29W^39D5u2AQ>s_Hi<(kN*pGEDFD)i>7WjyA_VXPEIy4gvzz94BbdIylL8y`#jKdF-2qR|@>99XT zKtk3AYqCs8Vu=xpk(jbX9-SE8r;0hH8XUMnDA9m(COTPyArjfaEYp!xUXXV{TmV*x zFtGt~Otv-9HFzU-kBLeJDQ0+K@)-XzYg^UuS}7w67({=A7!b{}K*j*d0PMXewrz(4 zJiv1RSP72B%7QIKXLJbS27L0_Gsk*5s+2j!D`TRkL+Zu-93%@+6N*Y~;CD9y{iJ%6 zvnnE1BIp&PVH!BB+ZaGVN?|(KiLs{u>r_>Wa}35m6K@cVf90MQm4Xu)fQRJ1O;CAF z79aMB1iJz=3(t#mkGvji7$H^<65e7x0#THRb<910uf}wx*kw(bQyUBG1al~;HzF>M zZsKz9+W?b9bdu~j7WfQcFR={=WYY%k!g>TJ;=B%7!4|N#ZYadCs#5U*z!(f6P4u*= zG;k1q0$&f4h^*2=EgGpy41*IvfKeSlyqNV#%4x7dO#LponJ|Ia0Bw2%`zH%pnR;bT zmGKez+(t~ASTe=%MzNMAo(u5kgII>J)X)wP6#^go4l`(n>={s+p~u+HY>Yn|Ai5iw zV3v^+RZuSw5_2j^Pn3*uCi+BE|6p(%n|P; zB4~YP9s3}T5760oPcy?l#uc;`8|Hw2L%GtY^L5JUOGrK>@HP>6;6D;Y25T2snPXQ3 z5(ZGliU$Y{G72&o%l9Cs4rsM8$&oTMt>M))M=G79-hw$G+_7kUE5-umV!^~#1zwBz zi6|(iyI_mL1__YMYDOvp>or`gY)GQGTVT(d?rAosFnl&>O!4KOKAHCv2{W+_7nZA8 zMy!WSt;eo~fzDQdJNAnN%@iw~#B}IP0ZSKY946*Pw705K9c#M;=1tA%u&1H$IKXa% zS189wQq$HG*>=F!Q^*BVB3XFIae^C(1p_4T6taffhfx3tPF0Gl2LdO<3rCWCo8_Js zTN|$j=hoQ7U}}aBypC+q|RE*DP6Jg|HQt;qSELtNJ7VKj3v9*W=%8a{Y>W%@q6+1Std$Gr0 zv8}2U$$|C4)`mtg*3)8m6RcP;8`HE%k?%67EJQtUU1->{b>#UFnFRZQSZGCcz)XyA z4NGwntO0uNG*ZY&(o-8RWT_P1t4~x~FbCoA2tBC|u5Xf(k`?G%p3k-u!5CP(A<`x0 z5(|2kUV90)7`9i&2TsXJm$(Gw=LSCiF-{>pH$>SHYYUW}Kc`Xl;`cJj{`eVAGdy!) zK1Y&xSpmWc&<>;`F#A?O`{NDqMy;LVST2r~1(61g+X7C1y!H4H#ywL)s|8F4@;>?a zxihDyz;y6*eG+#SPmY;zS3v5b!vYd!2;%n5kmm$Umd1?0WJE-*_5^rx8`sy`C9r=` ziVRXdjf2%XU}zapKL7L>rflJJ=8Yib=PqplDbrUEbZDlodYlX#|j|3Z0V7jRk;EXuIQNheY>8C z#RDL)WIr0~nJT}7u1z+*JYQA6C}y8>jr(2;y2qRK&&Yj#gG5kZ+uA^ zHjvYAr(uIB?Oz>zsnq}eVy>*?k>BOizRc5oJ&7AZq+I+K({K@Y40AC|y6cUX$+@of zl>?bZdTJ6Y0QP0`6OTK=RhR61L;gn5Tm2nY#c5Ir^p6!Quk>JEY4e-pb>da2Y7-=NtwgNUNYa$*LGRYm|>UM;N0LSu!F3A1F!sI*b(=~HFt8?{^dd44mV&nhipa6j(;4Ow$5twN8c!A+400@iIF2a{ZW-nlf z3GpDW6wQ}>ALxU{@IE|IDaf50@LJsGaN`SX7gsuQT?16IMA9S+1TJg_vWVuVIO9Zd zOj;TQQ`Eyin~=WpN|{rPQf)3 zBLq-DCFMCD@N7=Bv?k6KL6Slrl9T@@17~D-PAnER@iRp5ifwGKr6ei+73*l~{me zP%9pJQH0=y)ECk!d@pd?!%>o|1XM|7$G#)N2Xv9CXa9nUID^(DRFtb9={M@Y4LZW8q z640qIv=H0@igEHm`N7f3LAV6H1gmC286nUD4v;~BXQ+)hAA<7$SO*nKC_M$CLfyvg zw$L5!8}F(3mx9`$az`E-FQy0>1-?vxCFEg*sBrATK?ofep$Zt#PFea)`Mj;{kBVgej64 zVGj6j0q8=$BAPvW}E1?gdDQMM1C!mMoiiJxk-fMW3 zG2O6v6gKcO%p;hAust~r9=sKV1Qy4f;=zyWf5Gq{%!aq9c83@ab^;8zwG$B!`Cea!;rn&-2-aB3??#Mnc3R8$< zG~w@&EF1&JEAVSeGw`A|QS#vs7V8FISTa7LIfCh$*uwDYtEyCVe7Y&n&A6~o>@spJ zi>yDE0#0LS*UT5Vye@fl@z#rgKUpa3-w?8iw;xX1it$RNHYWv5R|*!FZEeJH6-y>x zr^WEH(lOG3m9pM(*VA=QadxBJOqqc9^&U zrU0$eJ*85`d$E-d=k&A3=M=L;0^*4M4Fe%THynd02s{WjK85Jli9k_?qeU<){$;6R zyI^5OoE#6ZTOlKpF+jyn0ZM+siP<3VrGV+i_z>vX)K;|60 z|3JqfHNyj)XKuyyp4|p!f$;*D=M5-s?3g>5UV6!ed2E!OEoPhl*v!ycNl zjo@MFdmf<^h}kS#StMy>5JM1H#4{k1(H_oULMDY@fCYm^Rud8iHRTO5WDXCF4=?bz z2_?a3OmI%b6uf$&DijPo2KfSYLwZ4!!PLfvl(>ixe6+}uhy!h^S1^2f3P-{j2!>w} z(nL>n;t7BeZBC_UYlA!qQ^2p3W9k8@QiLK8(;;igB@P24jf2Onff0ysISIo66dwZs zMKGgMBz$GX8?MuQPKRtz7(Qk*aR+Ah$Ub6wG2jVXG;$b+^x@P1%ZM3rjtoNPhX^c! zF);c7Do^68!%C5R;rSAkq^Ng-4KiOT&ekTX0u&OWP52!9M9vkW^(>883yzaS;6|*+ zgo*pDkJ~n;HUMmb9-yx+dMf)V%%Rv%Cx+LxL~)9F2`Up2fMSp25MBaFcr&X9Av`r` z5>^%4ife?RbkI`baIt+Fs4jKHR z8+d}SuOppdK9e|O0y9~y1oRRngyoMo8|1;QD>dK`MWqwF3^F_X75fIFnFw6?)_Vw~ z&6u1Y1=~ydrE6u{fjNiQ(mBHirVs&QpSeq#l0bchh;5<=C$V2cW!mxB|N#O*HDQUeDgz*rWA1;MmA*p180QHh9 zL_G2G;hpFyhJ8d8CI^QJRDR454$`}LIT4`%Q?MjOli>1jOVQ4mVi-MH#Z06{n}t}x z2Bp$0TB#7sCL{-9*3dMG1`)6Ubw9ztFR^@V<1h-06F8d?%K;CDF|)yWY%>uCViZbt z@+!kOk*QgwfL?{%J5ed_3M4Q^K}8owGQqMVa&6>8BZx(qg>h>@O2F*J)`MmvXNLPg zA^4bxz+cH6#17&J^_s=-K9J36VP4RfP z)EVw%VhZBK3EVB<(-oBhq0>|RxByrR=8*5FMWqNvLCijdq=n22QsxlcjnqKM3*izb z>=vGZco<{YL*jHnVQ^g$nGqDpnRMI8?3Dz8%Pv#ePjfi1s8mP%6W=dkd9ZgKRE3I> zIbCJpM@R(IAZEoTH9TAoml0xW5Y2FE&^Sh5VwaIh1vFFMK-60>{9J1*)PJ^7&WC}o z!r9Uo?H<_@>SSj#@kGH!3sW-i4ulgS{3l>82+HtH-Bgm{#PEu33tu(0%fR!8wyk{0 z6qOQ0WFZt_i4I)QJ_Z@;@Yu_7H6j%xN(K%U@I|q!F|TOgtSc}&3t5}`C$zS#QZXGu zMJ&}~$s8RgBmzQFCy0+BND07*keLJ#USzI>uujxqP|Co8?KR_Q%9k?MCtSH%wYE8G(-@LBA>he+U($`pbV~0r(GY1%Kn}HttP#j<`;#V#`zu zpE~l#Ul>{r|J9+g<&ZN0uy_^`I(+blQ94D04qrOTy11z8kJMBFPRJ0aSu6V}=L*P2 zGyfG=c=>4O9}8!~QGn0#r6(^>MfSk0EFw0?OpaJ0ZKHNlMgDL!Y4&d^-ls4_s<0W! z=YzRq3p3;>0nq7Id$W}V5!6mfQ%crH#B0D9oC2&d>tpfVEOrtJkr@uEm~S$pPG$Y_ zvzQ&#fDB_;&Tk~;d_}>v+~#;OiOF>kmrafzJT+!=gsg3&+T=)(5+2D=oIlnxz7W6a zQjk)M7$e4~TkG^Xn;3bCM(QL{PX&aj5VB59zL#Vk5~f6)RVsfb`1WH7CJj;AZmpNv z-`ZHi?UQ$KN-i;(Bur9ykW|7VNu(r!MU7BptB|ZoqZCYea+Mlq@wQZS6j_Cc$?eJ) z{F$uc_fE8@ilHM&s@>|XlJjZHnjb07@FmD~owsDYl%!2dqu&3aVE~j05M3{_MoDIg zh1%%3(O+^@@TCi5=b<)Kwz_I29?UT7Jt<6_%a`QFp8z z>LriP(16RM2`i@QN^cE^+#qb=y-f_W1d)wu-)xgQAnKB0i72trtZdU1HT}sfZIQvq zCPrSq7F;C@6!B?MB5M=7>Y4<{G4ce1b-LU4f4#GTd^29@Xw*l4NtH~!P#)u%XTsvU z$Io3FPC?$cQK6~3)#SDxy~4RX@?Zp zrYG`qZi=5C`n>o~W?7ChS#<(nuxFuE z`&g&3M;Jt&qj?*0W=N=`CHfMufgDVJCm$z$F_#dWffpUG1ZYP~#4l7w8Rw-akZ9`Q z19FZSMs@P45VvpQo{ByOqA4(pi*pzPwOE00AjQd^czU!Xu|t3y<5MXC>7@U_!yW?;{d1m20$AC24)dFO3_F0Rwexiy5Or!I)YxQ z1FP~rR1qu-WEqLY5W+xlfHQc!8`CSs#RApeeaUznV zv#;{P}^~dbu+5lLCtp^PpY5}4WN|wwzIEWkQb3g+ihggg8rY2zx zs5g454oV4SGK_e@5=27C1%9YH_!>U5_^IQ&DyjY$N?enHh5*eS48mHBzJdciuBMWI zKs;x0G62|)G*%iWHRuXd&;mS93KKwHrWofLQzFp~8vE+qJSlU_n;sR`{PiA0RMEsmU!YAK?N^%v(e*4ODHL6-^+6VG5L1mg1k(iDWsWS; z%yFC`OHp#rVFM9UOSY;$wQAI zfB-uw&IJblf^A}7BIJ&BYq)#^w+iqM0`X>JNC5GGd0=xYR8bSK2R9S)C@~FKm?47z zxD9@ZAs8aATx?DxG{XMqVpYLBhL=7$Q?QMJ72Y`QkP4NQ9otjM2Pe}GNo45wBR8FP zsDE!c$q?J&0(sqavgvG@VW^Z;Xe`}O(o9aM{65>}1=_j95zLsmh#W0=Ucl2qswLkT zwjxX^V#*dbeVo`41sswglDTN>3`AH%Fqy(T<fPezi;YFT2OU`C$Hk!l_)bGRbD7KK zXD@L*eTs{{z!OZxShAy&{kvko2hvYo8m0p3-$^kI@aL6P;!h}d!2CM?(gSf_lCz8htTpGcG1U6)3nxZ3v2u}hX zO~7+O8L^&9tPz=(RG=v0n`{U80}zr#G8wi6);d|>K-6`xHe%YCHTI9e%t@D?$VXk0 zj%+#RHyUq-E>Fw!zq>n^*toK^j>m~#iRpC0qzOYaYBOjW58Zy1p9S)C+vT|J*pA(? zo9^jR$XvV1t~z$Ps;gXXCrD@n!_dRr9e2U7p54F-R>MOeu>*-M8$bvlAp{#1hz*F} z|J-w{ZawTOcN_?bqByR{z4yGn^PT_q|NfuFxyX;UvP^mCp{O%ibwdBO#w9~j$AQ)G zHxc$38^gsM6C+0Lg~b6~l1@0|bz;RP$GVAY_B2WMyqUlgz{rw%NPY|GEqolHR?@3T zd$xbPp<3;b%!XN-BI$z6WsDsRnlx}Fjxtd@o;;@7WA2DzdR0dkE1MQO zqO5EWGCKzmx*|igYmHP~hZP0puD%reXx(Y%>ee=o_MunKa(q6v%4i#;=Kff9ECyG$ zv5GOpHuD2@$;E9&IZ_Jx-W#!G<5z@~%{aUe4EPdcW&iF|=*MjlTFW-B$;yhfi$Vh+ zH<2i^RnE+_O~zzpim%sNT^{3+v^9T@?q$6q*%>J0S$g}+u{YaWW)d$~Y#^S}`=n)MP4HIt(7Y4i? z2}n^B*b8xzl`YBs4rNnx6lfX{b;;htZw^CK)thRs0s#~=RZu$toA^zq-A%=@C2yEB zL;{y+m#`*zD@1TPxey*9CPR>cDBUDTzqmzsLc|j|41&LN+wsPha#N%(=xii8q1h3d zYIRds9yrO9((2!Ng68R9wz!OVj!?us1gl4v!7{CA71HyF8&;L3;ybPba&?WM1M+*dUkPwQ z7_l*7Xo*V5vrW7fHu1jeSGFdl6Eey=8*`=*_nRFG>M1cF9a?oxgl`7DK^4Jw@XT@g zcd*PbnI~QJJAP9l3vjH^3?Y;U2`JvL%kHLxk>HReNr%NdhiVTmlH_M4(a$Ie8k!7Y zQ$4{_Ylof>Wm-D$?MRH8M|6}EK6-IN0$PCq0_xy7t(ynkY& z$}a^NBs5AACrbmz3MvCBddj{O*#O#{#8@*f5FKyMOw@-^cwmT;5{gWg9u^-Nwl}&R zAT2Nsb^e0~og}oZNG$ByU1@A^BZzd&T&=FYJr78qT|>dAzLNLp<9r&+IS3m-Cv_(jZj)vCR)HT-^*i4>-b%|ZWAp$fK#|n4~bp%dnASWCd=q_d%XGl^k z)D%L;keP7>$6UbF_OiQj)XRc&U@vioM@<%9f`_T(2nyqyXemd2^gG2%#uPw}L)wD? zKfEULuhGiI!{S6jfD*}#&eXgmMGbjbS&s^X`!{mM$4>u;6dVQiC^ecu;2$QIWhned zwD$l-5(UB{vkgejJ23yLx9Yy*g3;CQD2>8qcSga>7T|%$_5GK@UMzr@I26Q2A=>f z!hI!++JlY;IDuLyd`2Khj1gENIRqqilN!wLv=g8NSzxXXR^ibcL_Sz1AQ!A8NM_Kn zNGFCsD8&d4+OPp;0A5)~?9^mefLEX(E1+rua7I`xc&5@Mu(H4%^cHtyJ48xn4^RPl z*crH5kVC-D(ANiNA{z&!1d<>*P8?ELaAW9wh?OY_St=d4=QsvHuP|mXp);^Lgww!j z;eFD1XpEL1U@2QM*9RU3Q(<{y`eubi!eQclJbU~*R7`*|U{R3Z5B?0H1nm>HciB96 zN+7pX7EJI5DkZQNGCb0x#zv##fISiY8XVDfE>It27bvtqE@N2tT}CDiDS{0}sut)+ zV-ZLOMnsh12Qq{(H;oC#Hv&&ejzhthZz-UL0S5bkdMr*ePz~0fqcXa&03S)j9nwr8 zq+TUl0S^T45ljpEFS0OGY%pkF05$`t^N(f{f=xgs*l{@hI=VxsqLuV8P#jqfj1I|W zoI24l-~;TuNuH43m_C3!K!nWNNkB#>HEbnLlVpQvLNLw%tK1bz3iu6s4AT@!3UDCs zxDwo9=P;$w{03bG{t}NCmw8vyXcEr|R1abjj{(7%$wphCWwM8eoGaiR=@nc9v?>4t zkzwU@tn?ZkbV2Jl5GzxR?hy8hgACys+!iVx{w1Iu6k32P7~>w^#b zt76-ifO`|cVh|;0&Wa`13M_9G zzzj+{ol^oEIdtV|2=7Riz`DT@f%UN%C4qw^22GQffw=_rNt5Z$ydk6m4wqs2p{ond zD-tpbfi(`ZoE@5}P85gryNe?tgs3?!^xuyHogY0@TO8F}~? zattw2JP8?AWFe61k-^kqcY!YjEaRB)#M292iEs?zR*3j4JiK9cZM%Tj6gWq~ zf#w`UCRsfwdO-zv_BR4&k|H97!jtk4Q6MPPILE9elC=1pg9_EV@xKTpgW?MfLjk^G zUT0j-1?zqm#v{f=egIySc&%*dQt1=hpHOOokWeF1H-%MU|H6!5Xp}mnSho8I%wvxY z6JLIpW}k!9ohPsz0(4CZ+i}QkQw?jLkU(k!l!~IL514h@`pG(ob%#Z&u5Et=w%0=$ z1xoPvUp|>D7x%`YN99ikbH&MDs5=b|{whVl=;i>nOGU!JK>$h%lQq1gerpX5D@6O^|=Z3 zLrddh@@mxiNh6?xC2}b z4=bNj{X;4!QoxFL{GT{DLP}9U3%ol-RVeZ&30SI1+=>mftDj|&th)=j<3%I|kR>Ql zlTfIZ!)a36SqcY!@Nmt&JgVWbH5AKI9EZ7QUqEDDD2bRdYU+jr<)RA;fO_Lm1^8*+>+hYy{7a z_iu3n^Zn|#d)>Fq_jtXgfhYwDD-+bU!m%_R<`63&WAPdpYN|cr8~R-bZIMoooHxK{j*91oMu|CrpgO4j->P zrM%-w=J24f=RM5~Q*W+vz%0q{b6Pme4QrY0%!MB2~ zts2wjV&Go@?&R#pyXL1|w5X|PEC3k}a8LMj6kBscB*r)jHl)UrFpiJn5Dwed<7ZuP zUp`>zYJ4L!AHv; z^J2%f&-G%eu6>L#KoF_Yq$kFE@r|?E_asN;eg+j5i-27ZM`pfuO>vHupTWpjv@_Oc zQ8j|5p>`t^UDU1TGcHQ1lmn;ia3{`s&}g_1mY*JNF72JB=ZkZtt@lpeTc{uJ`rB9l z5x|NSOp&|VoR2EWG(9^O3NfVeNHJTizwWzreFC2y%$Z=1B-vuuZ97|^u4GRO@9iwz zE6-&=d2iw16L*(^u;*j5)kb%e*9EL6(aqRhB8{DmpgYLf4ulo5ZeMx zi<=M5fA%nQNOy^kLfih?TRF|2E^f}Pr`B@oi%aevZuU2|gxSv+uzR?mj_sd`b`$l} ztwMTlt*|+l{@|fmF}dA`8}2@Czp#rCJPeG?ewcM(gY}>P z23K=MIJTioHI<~Mkwfoe7dtNCUp@+KWVg?$?+5-*5_;20a`=Xk)q&6-yZv595sf^KXX_66@B$Ur-VV=@6>nvPbzY%A7nDW&fy9L6tv^BR@o$ z#jg%V`g>$T6pK7h^qrN>k?PQ`c2zsuE~CHIqp4%q&9L^f>KGyNu4ByK>-}>(rH>-r zlxfejFAlb+m!eKr`ye? zDZG2DQhuSjL|_eJm~nN96306p_p`g?MQmTfwhy!WGPI9qDSPs7C^`V!vlr^@&T_f!4VaJJ17r-P){-4+3*Ce7obPb{ADQ zm_N{j)bpA@)c?W;w3wPV#i^S`A2UI@(&S{_>}>5EwdncJ?;JIZLCfj6M=S7+Y}zoH z!Y`6?XE{ALQw_eu%=${| z;l|d+()Ms_v-FDAstHF&gLFgUs;A*BHRpDDaG06QAf=8^*(w z^+aE*bJN)!N_e3$D@%7agb(#PaNeofl7xzqGx@ltDi3bkh3KgZuDKIZv zJLQ~Gz+y&)()2g-#9zjCwmMP0r0r}vY`hHZY&u~@d)HYfthSAAal)!MJfqB0BdCjM7@Mv&r!yUil4cYk#>Ok`&IkR#>%pd80VH@h*+CDTvES20Iu85*i zr_sVM{h3qYb>5-%qIzAlRG~`ZVr9^xL$t|O$&u%`0rw2w-V-f4R9#k ztiI9xA@TXZza54yK^jw>w@YwX1IhvR?s=3=5OV2vpQa1DfmbQh{O~U2EOZABn7z?| z7RFAOX6NBPsh;D~A_>&9i%U~WWB2A0C{2#!T4o8kI0 zRAS)+;j1h3)w1jDVX|3VYti6TmK8)W_*}}wR=zGNt&rH^%^{PBrugn2t%ZXdZ!Luf z^BNUhc5o7+AM7@mrzokzqlAy*SqGJRn!dUOujEv3N!lEdc3JI?LoZGxbP@RW(B zbUYs;i;sDrlR|YmN${M%BakLFVMvHzay*e{2ET1)N{Z?aZbh1Owf-?*P*?Q=wj875 zU|zGoxlS>6_1oojhxwwe*S;Uj>-t=qUNB$Mhg$c+%;d*`c|-4a&~z{FJtdFeC24w+ z;qSERRonKmw0*pF+cP>2!uEL%mK!vw5X(_sN035tknFE<3k#b$K@tOWe3AswMTTSx zA05`I%3_iqaK42_s{89(%Tx19%@$U}Z0lzL;*ng@Y+>h*$Y32@Ega;I!frY;t>_MJ3YmpM^DB_ z;VDpEoxpN=6tIp&xyIQX_-{qmV%6*(jIhk0#2S3$kwR&IG;^9e zh6I;}s{(l~Fad_p{^L`AD_pqp%};Wr3e*ooH|$fK9NVRvui!%+4s**CL4 zmmSJ}HTzcf?d))NM9&x9G6Susm&olTT2DGMb$h3nzw8aacL%Q5f#@GLirZ^5J9uZ= z@6Yd-9`hzpSN~2WcZeh>|LrNGmYWHFJ6P>m?Op9sLv2XzFEOOqhvu(jPyd>KR&T5h zG`{_jeY?4r)P}EpH?@4l{poT)IeOSX*W6Fir0pN1rtP0T_p{&qyzYJmG#s8{nIC@l jV?Zws6Ou>TD_PLw`r|xYTD>56tj9Y(E?L6i&dC1&;3YGE diff --git a/tests/testdata/win_proc_test.pkl b/tests/testdata/win_proc_test.pkl index d5f23d5a76abee3a7334e9fc6f436239c5596839..4000398971336a9bde2547affcfc28408a8b7602 100644 GIT binary patch delta 888 zcmZWoPe>F|7~l8iPl<(QVv87?o2=WRRjH(u#7z(3;1&@?bQou5XPwd6*>V1$ONm`l zgMnQ3&CaRl(9IHJTjm;6P!JV#>SEmzDzJkG3D@4tY8k!5%s2CWzdzr{_txHr-+Ty@ zw<)K!Kz36kn;q8+eW&K^7L8NWoRMG^nKu%$YKpqbDF(6|SWDGpVNwxUUdaiQsEF*t z{}gk&&gF4s8_R0>nZMtfUWgtF_;x@%*ba4u$Y?>7~K@!m{vPnyoO)R7u$gma= z?|zEWksb#6aH-yI3M?gpZg42-vViP*%#+LVRwg6r*hsuI7%6{F4n&GSlKbZZ2eNOw z=75k|Q>oO*Ha@|F37LpzKw#DeL&)@n&NGl97~mszrKPCU;kPKoYCM2x_|xE}J@huX zh4u&(yTE}mFPtfrFY{4Yb~mT#;`-(abf`)r=#9A#GT^8;KMvA_w*cxakc6`t`gTOkH|q# z=Y)3(z4i^_5b!o2$!@vbugHo!2C1k!_MI%1x~cv;hu&rEc}?E%aI(7Pt>2@b0K$12 zt8nzk>d|JlRR-o283P1D*%tPpmej1yq`tO?iS zh1feU>3X>X3<7Fm8>5ODn4l((_2Z}nJIHy=?7r-z+fUmRXPUaN_Ar75z27nxN!Uc@(O(XjZ$Z?TS0{Qv*} delta 836 zcmaKq?@Lor7{~89_eYyChxTidHMjONbGo!x1U2-9=*izppdaUM(}IEL#W~#j{XEZkzRz=By>)E7 zaR|4CBEKYbNaDz-GOa9~=oEr;BtXA1Kd#bw@MqBV$1+HY_;Y=(R>;J=6d6T(m zlE`;Qouv=a9;b_a)TXjmQn~W1s?xWFeYx~W>BEnIT$8Lt3x_y!8J`il=_$p3D%cqE zq1N}-BDX1pKcXkd=ta2yx3##d`j@_Q^Izz_=lC>DuizUrzKY%S(K=qG^$~u>xR3e$ zzpTX_n>2dJUtAM}C^DiBp%ED)SQutH+SD6f3TyPmr1+E$9}t&mOS9;v^;Xes*s%DF zfph+HnVjKT6t8<{Rc2H*n`{F+8yz&%y2h;aWy=tN<0cQ0m^RNwu}uuB#(-bhHehyZ zruMB{yx@Z%9EMgn0&Nh2cIbdG9EDEkf@A;Rug(x%>Ij9qLgC7@Q?hD?K%FinQj?d) zGlcnKo^ Date: Mon, 27 Apr 2026 12:07:23 -0700 Subject: [PATCH 3/5] Address PR review: improve archive extraction safety - Replace startswith string checks with Path.is_relative_to() for robust containment validation (handles root destinations correctly) - Restrict tar member types to regular files and directories; reject device files, FIFOs, and other special types - Add tarfile filter='data' on Python >= 3.12 to avoid restoring unsafe metadata/permissions - Fix unclosed ZipFile resource leak in sentinel_query_reader.py by wrapping extraction loop in a context manager - Add test for device file member rejection --- msticpy/common/archive_utils.py | 41 +++++++++++-------- msticpy/data/drivers/sentinel_query_reader.py | 17 ++++---- tests/common/test_archive_utils.py | 13 ++++++ 3 files changed, 46 insertions(+), 25 deletions(-) diff --git a/msticpy/common/archive_utils.py b/msticpy/common/archive_utils.py index 6afa4088..e6441a74 100644 --- a/msticpy/common/archive_utils.py +++ b/msticpy/common/archive_utils.py @@ -8,6 +8,7 @@ from __future__ import annotations import logging +import sys import tarfile import zipfile from pathlib import Path @@ -60,15 +61,13 @@ def validate_archive_member_path( ) dest = Path(dest_dir).resolve() target = (dest / member_name).resolve() - if not (target == dest or str(target).startswith(str(dest) + "\\")): - # Also check with forward slash for cross-platform safety - if not str(target).startswith(str(dest) + "/"): - raise MsticpyUserError( - f"Archive member path escapes the destination directory: '{member_name}'.", - f"Resolved path '{target}' is outside '{dest}'.", - "This may indicate a malicious archive (path traversal attack).", - title="Unsafe archive member path", - ) + if not target.is_relative_to(dest): + raise MsticpyUserError( + f"Archive member path escapes the destination directory: '{member_name}'.", + f"Resolved path '{target}' is outside '{dest}'.", + "This may indicate a malicious archive (path traversal attack).", + title="Unsafe archive member path", + ) logger.debug("Validated archive member path: %s", member_name) return target @@ -100,10 +99,22 @@ def safe_tar_extract( symlink/hardlink pointing outside dest_dir. """ - if member.issym() or member.islnk(): - _validate_tar_link(member, dest_dir) + if not (member.isreg() or member.isdir()): + if member.issym() or member.islnk(): + _validate_tar_link(member, dest_dir) + else: + raise MsticpyUserError( + "Archive contains an unsupported member" + f" type: '{member.name}'" + f" (type={member.type}).", + "Only regular files and directories are allowed.", + title="Unsafe archive member type", + ) validate_archive_member_path(member.name, dest_dir) - tar.extract(member, dest_dir) + if sys.version_info >= (3, 12): + tar.extract(member, dest_dir, filter="data") + else: + tar.extract(member, dest_dir) def safe_zip_extract( @@ -168,11 +179,7 @@ def _validate_tar_link( # Resolve link target relative to the member's directory member_dir = (dest / member.name).resolve().parent resolved_link = (member_dir / link_target).resolve() - if not ( - resolved_link == dest - or str(resolved_link).startswith(str(dest) + "\\") - or str(resolved_link).startswith(str(dest) + "/") - ): + if not resolved_link.is_relative_to(dest): raise MsticpyUserError( "Archive contains a link that escapes the" f" destination: '{member.name}'" diff --git a/msticpy/data/drivers/sentinel_query_reader.py b/msticpy/data/drivers/sentinel_query_reader.py index fd8d2778..4099be38 100644 --- a/msticpy/data/drivers/sentinel_query_reader.py +++ b/msticpy/data/drivers/sentinel_query_reader.py @@ -132,14 +132,15 @@ def get_sentinel_queries_from_github( archive = zipfile.ZipFile(repo_zip, mode="r") # Only extract Detections and Hunting Queries Folder - for file in archive.namelist(): # type: ignore - if file.startswith( # type: ignore - ( - "Azure-Sentinel-master/Detections/", - "Azure-Sentinel-master/Hunting Queries/", - ) - ): - safe_zip_extract(archive, file, outputdir) # type: ignore + with archive: # type: ignore + for file in archive.namelist(): # type: ignore + if file.startswith( # type: ignore + ( + "Azure-Sentinel-master/Detections/", + "Azure-Sentinel-master/Hunting Queries/", + ) + ): + safe_zip_extract(archive, file, outputdir) # type: ignore print("Downloaded and Extracted Files successfully") return True diff --git a/tests/common/test_archive_utils.py b/tests/common/test_archive_utils.py index 754f1a6e..e2678ddc 100644 --- a/tests/common/test_archive_utils.py +++ b/tests/common/test_archive_utils.py @@ -139,6 +139,19 @@ def test_rejects_absolute_symlink(self, tmp_path: Path) -> None: with pytest.raises(MsticpyUserError): safe_tar_extract(tar, member, tmp_path) + def test_rejects_device_member(self, tmp_path: Path) -> None: + """Reject tar member with unsupported type (device file).""" + buf = io.BytesIO() + with tarfile.open(fileobj=buf, mode="w:gz") as tar: + info = tarfile.TarInfo(name="devfile") + info.type = tarfile.CHRTYPE + tar.addfile(info) + buf.seek(0) + with tarfile.open(fileobj=buf, mode="r:gz") as tar: + for member in tar.getmembers(): + with pytest.raises(MsticpyUserError, match="unsupported"): + safe_tar_extract(tar, member, tmp_path) + class TestSafeZipExtract: """Tests for safe_zip_extract.""" From 67b70164d0eb9a23bf54a67bd71fb2ef50efa774 Mon Sep 17 00:00:00 2001 From: ianhelle Date: Mon, 27 Apr 2026 13:54:36 -0700 Subject: [PATCH 4/5] Fix mypy str-bytes-safe error in archive_utils implicit bytes-to-str conversion. --- msticpy/common/archive_utils.py | 2 +- msticpy/context/azure/sentinel_analytics.py | 8 +++- msticpy/context/azure/sentinel_bookmarks.py | 8 +--- msticpy/context/azure/sentinel_incidents.py | 12 ++++-- msticpy/context/azure/sentinel_ti.py | 20 +++++++--- msticpy/context/azure/sentinel_utils.py | 8 ++-- msticpy/context/azure/sentinel_watchlists.py | 12 ++++-- msticpy/context/azure/sentinel_workspaces.py | 3 +- msticpy/data/drivers/azure_monitor_driver.py | 42 ++++++-------------- msticpy/data/drivers/cybereason_driver.py | 28 +++++-------- 10 files changed, 69 insertions(+), 74 deletions(-) diff --git a/msticpy/common/archive_utils.py b/msticpy/common/archive_utils.py index e6441a74..09d7d7f5 100644 --- a/msticpy/common/archive_utils.py +++ b/msticpy/common/archive_utils.py @@ -106,7 +106,7 @@ def safe_tar_extract( raise MsticpyUserError( "Archive contains an unsupported member" f" type: '{member.name}'" - f" (type={member.type}).", + f" (type={member.type!r}).", "Only regular files and directories are allowed.", title="Unsafe archive member type", ) diff --git a/msticpy/context/azure/sentinel_analytics.py b/msticpy/context/azure/sentinel_analytics.py index b341ad7d..d4382be3 100644 --- a/msticpy/context/azure/sentinel_analytics.py +++ b/msticpy/context/azure/sentinel_analytics.py @@ -270,7 +270,9 @@ def create_analytic_rule( # pylint: disable=too-many-arguments, too-many-locals case httpx.codes.NOT_MODIFIED: raise ResourceNotModifiedError() case _: - err_msg = f"Received HTTP return code {response.status_code}: {response.text}" + err_msg = ( + f"Received HTTP return code {response.status_code}: {response.text}" + ) raise HttpResponseError(err_msg) logger.info("Analytic Created.") return response.json().get("name") @@ -355,7 +357,9 @@ def delete_analytic_rule( case httpx.codes.CONFLICT: raise ResourceExistsError() case _: - err_msg = f"Received HTTP return code {response.status_code}: {response.text}" + err_msg = ( + f"Received HTTP return code {response.status_code}: {response.text}" + ) raise HttpResponseError(err_msg) logger.info("Analytic Deleted.") diff --git a/msticpy/context/azure/sentinel_bookmarks.py b/msticpy/context/azure/sentinel_bookmarks.py index 1900835b..368b76a5 100644 --- a/msticpy/context/azure/sentinel_bookmarks.py +++ b/msticpy/context/azure/sentinel_bookmarks.py @@ -132,9 +132,7 @@ def create_bookmark( # noqa:PLR0913 case httpx.codes.NOT_MODIFIED: raise ResourceNotModifiedError() case _: - err_msg = ( - f"Received HTTP return code {response.status_code}: {response.text}" - ) + err_msg = f"Received HTTP return code {response.status_code}: {response.text}" raise HttpResponseError(err_msg) def delete_bookmark( @@ -185,9 +183,7 @@ def delete_bookmark( case httpx.codes.NOT_MODIFIED: raise ResourceNotModifiedError() case _: - err_msg = ( - f"Received HTTP return code {response.status_code}: {response.text}" - ) + err_msg = f"Received HTTP return code {response.status_code}: {response.text}" raise HttpResponseError(err_msg) def _get_bookmark_id(self: Self, bookmark: str) -> str: diff --git a/msticpy/context/azure/sentinel_incidents.py b/msticpy/context/azure/sentinel_incidents.py index 330e92da..254cbd07 100644 --- a/msticpy/context/azure/sentinel_incidents.py +++ b/msticpy/context/azure/sentinel_incidents.py @@ -103,7 +103,9 @@ def get_incident( # noqa:PLR0913 case httpx.codes.NOT_MODIFIED: raise ResourceNotModifiedError() case _: - err_msg = f"Received HTTP return code {response.status_code}: {response.text}" + err_msg = ( + f"Received HTTP return code {response.status_code}: {response.text}" + ) raise HttpResponseError(err_msg) incident_df: pd.DataFrame = _azs_api_result_to_df(response) @@ -334,7 +336,9 @@ def update_incident( case httpx.codes.NOT_MODIFIED: raise ResourceNotModifiedError() case _: - err_msg = f"Received HTTP return code {response.status_code}: {response.text}" + err_msg = ( + f"Received HTTP return code {response.status_code}: {response.text}" + ) raise HttpResponseError(err_msg) logger.info("Incident updated.") return response.json().get("name") @@ -429,7 +433,9 @@ def create_incident( # pylint: disable=too-many-arguments, too-many-locals, too case httpx.codes.NOT_MODIFIED: raise ResourceNotModifiedError() case _: - err_msg = f"Received HTTP return code {response.status_code}: {response.text}" + err_msg = ( + f"Received HTTP return code {response.status_code}: {response.text}" + ) raise HttpResponseError(err_msg) if bookmarks: for mark in bookmarks: diff --git a/msticpy/context/azure/sentinel_ti.py b/msticpy/context/azure/sentinel_ti.py index 04bf04bb..c3069938 100644 --- a/msticpy/context/azure/sentinel_ti.py +++ b/msticpy/context/azure/sentinel_ti.py @@ -237,7 +237,9 @@ def create_indicator( # pylint:disable=too-many-arguments, too-many-locals #noq case httpx.codes.NOT_MODIFIED: raise ResourceNotModifiedError() case _: - err_msg = f"Received HTTP return code {response.status_code}: {response.text}" + err_msg = ( + f"Received HTTP return code {response.status_code}: {response.text}" + ) raise HttpResponseError(err_msg) if not silent: logger.info("Indicator created.") @@ -336,7 +338,9 @@ def get_indicator(self: Self, indicator_id: str) -> dict: case httpx.codes.NOT_MODIFIED: raise ResourceNotModifiedError() case _: - err_msg = f"Received HTTP return code {response.status_code}: {response.text}" + err_msg = ( + f"Received HTTP return code {response.status_code}: {response.text}" + ) raise HttpResponseError(err_msg) return response.json() @@ -436,7 +440,9 @@ def update_indicator( # pylint:disable=too-many-arguments,too-many-locals #noqa case httpx.codes.NOT_MODIFIED: raise ResourceNotModifiedError() case _: - err_msg = f"Received HTTP return code {response.status_code}: {response.text}" + err_msg = ( + f"Received HTTP return code {response.status_code}: {response.text}" + ) raise HttpResponseError(err_msg) logger.info("Indicator updated.") @@ -501,7 +507,9 @@ def delete_indicator(self: Self, indicator_id: str) -> None: case httpx.codes.NOT_MODIFIED: raise ResourceNotModifiedError() case _: - err_msg = f"Received HTTP return code {response.status_code}: {response.text}" + err_msg = ( + f"Received HTTP return code {response.status_code}: {response.text}" + ) raise HttpResponseError(err_msg) logger.info("Indicator deleted.") @@ -610,7 +618,9 @@ def query_indicators( # pylint:disable=too-many-arguments, too-many-locals, too case httpx.codes.NOT_MODIFIED: raise ResourceNotModifiedError() case _: - err_msg = f"Received HTTP return code {response.status_code}: {response.text}" + err_msg = ( + f"Received HTTP return code {response.status_code}: {response.text}" + ) raise HttpResponseError(err_msg) return _azs_api_result_to_df(response) diff --git a/msticpy/context/azure/sentinel_utils.py b/msticpy/context/azure/sentinel_utils.py index 23a1f2fc..faec7297 100644 --- a/msticpy/context/azure/sentinel_utils.py +++ b/msticpy/context/azure/sentinel_utils.py @@ -154,7 +154,9 @@ def _list_items( # noqa:PLR0913 #pylint: disable=too-many-locals case httpx.codes.NOT_MODIFIED: raise ResourceNotModifiedError() case _: - err_msg = f"Received HTTP return code {response.status_code}: {response.text}" + err_msg = ( + f"Received HTTP return code {response.status_code}: {response.text}" + ) raise HttpResponseError(err_msg) j_resp: dict[str, Any] = response.json() results: list[pd.DataFrame] = [results_df] @@ -362,9 +364,7 @@ def parse_resource_id(res_id: str) -> dict[str, Any]: """Extract components from workspace resource ID.""" if not res_id.startswith("/"): res_id = f"/{res_id}" - res_id_parts: dict[str, str] = cast( - dict[str, str], az_tools.parse_resource_id(res_id) - ) + res_id_parts: dict[str, str] = cast(dict[str, str], az_tools.parse_resource_id(res_id)) workspace_name: str | None = None if ( res_id_parts.get("namespace") == "Microsoft.OperationalInsights" diff --git a/msticpy/context/azure/sentinel_watchlists.py b/msticpy/context/azure/sentinel_watchlists.py index d9d77429..49082bb0 100644 --- a/msticpy/context/azure/sentinel_watchlists.py +++ b/msticpy/context/azure/sentinel_watchlists.py @@ -150,7 +150,9 @@ def create_watchlist( # noqa: PLR0913 case httpx.codes.NOT_MODIFIED: raise ResourceNotModifiedError() case _: - err_msg = f"Received HTTP return code {response.status_code}: {response.text}" + err_msg = ( + f"Received HTTP return code {response.status_code}: {response.text}" + ) raise HttpResponseError(err_msg) logger.info("Watchlist created.") @@ -352,7 +354,9 @@ def delete_watchlist( case httpx.codes.NOT_MODIFIED: raise ResourceNotModifiedError() case _: - err_msg = f"Received HTTP return code {response.status_code}: {response.text}" + err_msg = ( + f"Received HTTP return code {response.status_code}: {response.text}" + ) raise HttpResponseError(err_msg) logger.info("Watchlist %s deleted", watchlist_name) @@ -413,7 +417,9 @@ def delete_watchlist_item( case httpx.codes.NOT_MODIFIED: raise ResourceNotModifiedError() case _: - err_msg = f"Received HTTP return code {response.status_code}: {response.text}" + err_msg = ( + f"Received HTTP return code {response.status_code}: {response.text}" + ) raise HttpResponseError(err_msg) logger.info("Item deleted from %s", watchlist_name) diff --git a/msticpy/context/azure/sentinel_workspaces.py b/msticpy/context/azure/sentinel_workspaces.py index d413de47..5ae2ad21 100644 --- a/msticpy/context/azure/sentinel_workspaces.py +++ b/msticpy/context/azure/sentinel_workspaces.py @@ -335,8 +335,7 @@ def _extract_resource_id( raw_res_id: str = uri_match.groupdict()["res_id"] raw_res_id = parse.unquote(raw_res_id) res_components: dict[str, Any] = { - key: str(value) - for key, value in az_tools.parse_resource_id(raw_res_id).items() + key: str(value) for key, value in az_tools.parse_resource_id(raw_res_id).items() } try: resource_id: str = cls._normalize_resource_id(res_components) diff --git a/msticpy/data/drivers/azure_monitor_driver.py b/msticpy/data/drivers/azure_monitor_driver.py index 7232fb3b..a6176416 100644 --- a/msticpy/data/drivers/azure_monitor_driver.py +++ b/msticpy/data/drivers/azure_monitor_driver.py @@ -136,13 +136,9 @@ def __init__(self, connection_str: str | None = None, **kwargs): "data_environments", ("MSSentinel", "LogAnalytics", "AzureSentinel"), ) - self.set_driver_property( - DriverProps.EFFECTIVE_ENV, DataEnvironment.MSSentinel.name - ) + self.set_driver_property(DriverProps.EFFECTIVE_ENV, DataEnvironment.MSSentinel.name) self.set_driver_property(DriverProps.SUPPORTS_THREADING, value=True) - self.set_driver_property( - DriverProps.MAX_PARALLEL, value=kwargs.get("max_threads", 4) - ) + self.set_driver_property(DriverProps.MAX_PARALLEL, value=kwargs.get("max_threads", 4)) self.az_cloud_config = AzureCloudConfig() logger.info( "AzureMonitorDriver loaded. connect_str %s, kwargs: %s", @@ -318,9 +314,7 @@ def query( return data if data is not None else result # pylint: disable=too-many-branches - def query_with_results( - self, query: str, **kwargs - ) -> tuple[pd.DataFrame, dict[str, Any]]: + def query_with_results(self, query: str, **kwargs) -> tuple[pd.DataFrame, dict[str, Any]]: """ Execute query string and return DataFrame of results. @@ -346,9 +340,7 @@ def query_with_results( workspace_id = next(iter(self._workspace_ids), None) or self._workspace_id additional_workspaces = self._workspace_ids[1:] if self._workspace_ids else None logger.info("Query to run %s", query) - logger.info( - "Workspaces %s", ",".join(self._workspace_ids) or self._workspace_id - ) + logger.info("Workspaces %s", ",".join(self._workspace_ids) or self._workspace_id) logger.info( "Time span %s - %s", str(time_span_value[0]) if time_span_value else "none", @@ -409,9 +401,7 @@ def _create_query_client(self, connection_str, **kwargs): # check for additional Args in settings but allow kwargs to override connect_args = self._get_workspace_settings_args() connect_args.update(kwargs) - connect_args.update( - {"auth_methods": az_auth_types, "tenant_id": self._az_tenant_id} - ) + connect_args.update({"auth_methods": az_auth_types, "tenant_id": self._az_tenant_id}) credentials = az_connect(**connect_args) logger.info( "Created query client. Auth type: %s, Url: %s, Proxies: %s", @@ -440,9 +430,7 @@ def _get_workspace_settings_args(self) -> dict[str, Any]: "sendcertificatechain": "send_certificate_chain", } return { - arg_name_map.get(name.casefold(), name): get_protected_setting( - args_path, name - ) + arg_name_map.get(name.casefold(), name): get_protected_setting(args_path, name) for name in args_settings.keys() } @@ -463,16 +451,12 @@ def _get_workspaces(self, connection_str: str | None = None, **kwargs): connection_str = connection_str or self._def_connection_str if workspace_name or connection_str is None: ws_config = WorkspaceConfig(workspace=workspace_name) - logger.info( - "WorkspaceConfig created from workspace name %s", workspace_name - ) + logger.info("WorkspaceConfig created from workspace name %s", workspace_name) elif isinstance(connection_str, str): self._def_connection_str = connection_str with contextlib.suppress(ValueError): ws_config = WorkspaceConfig.from_connection_string(connection_str) - logger.info( - "WorkspaceConfig created from connection_str %s", connection_str - ) + logger.info("WorkspaceConfig created from connection_str %s", connection_str) elif isinstance(connection_str, WorkspaceConfig): logger.info("WorkspaceConfig as parameter %s", connection_str.workspace_id) ws_config = connection_str @@ -516,9 +500,9 @@ def _get_workspaces_by_id(self, workspace_ids): def _get_workspaces_by_name(self, workspaces): workspace_configs = { - WorkspaceConfig(workspace)[WorkspaceConfig.CONF_WS_ID]: WorkspaceConfig( - workspace - )[WorkspaceConfig.CONF_TENANT_ID] + WorkspaceConfig(workspace)[WorkspaceConfig.CONF_WS_ID]: WorkspaceConfig(workspace)[ + WorkspaceConfig.CONF_TENANT_ID + ] for workspace in workspaces } if len(set(workspace_configs.values())) > 1: @@ -710,9 +694,7 @@ def _schema_format_tables( def _schema_format_columns(table_schema: dict[str, Any]) -> dict[str, str]: """Return a sorted dictionary of column names and types.""" - columns = { - col["name"]: col["type"] for col in table_schema.get("standardColumns", {}) - } + columns = {col["name"]: col["type"] for col in table_schema.get("standardColumns", {})} for col in table_schema.get("customColumns", []): columns[col["name"]] = col["type"] return dict(sorted(columns.items())) diff --git a/msticpy/data/drivers/cybereason_driver.py b/msticpy/data/drivers/cybereason_driver.py index e3613d7e..e6fb996a 100644 --- a/msticpy/data/drivers/cybereason_driver.py +++ b/msticpy/data/drivers/cybereason_driver.py @@ -39,9 +39,7 @@ logger: logging.Logger = logging.getLogger(__name__) -_HELP_URI = ( - "https://msticpy.readthedocs.io/en/latest/data_acquisition/DataProviders.html" -) +_HELP_URI = "https://msticpy.readthedocs.io/en/latest/data_acquisition/DataProviders.html" HTTP_TIMEOUT: float = 120.0 @@ -257,15 +255,13 @@ def _exec_paginated_queries( The queries are executed asynchronously. """ - query_tasks: dict[str, partial[dict[str, Any]]] = ( - self._create_paginated_query_tasks( - body=body, - page_size=page_size, - pagination_token=pagination_token, - total_results=total_results, - timeout=timeout, - max_retry=max_retry, - ) + query_tasks: dict[str, partial[dict[str, Any]]] = self._create_paginated_query_tasks( + body=body, + page_size=page_size, + pagination_token=pagination_token, + total_results=total_results, + timeout=timeout, + max_retry=max_retry, ) logger.info("Running %s paginated queries.", len(query_tasks)) @@ -544,9 +540,7 @@ def __execute_query( """ if max_retry < 0: if not previous_response: - err_msg: str = ( - "Will not retry query, and no previous response available" - ) + err_msg: str = "Will not retry query, and no previous response available" raise MsticpyDataQueryError(err_msg) return previous_response.json() if pagination_token: @@ -1034,9 +1028,7 @@ def _(parameters: str, param_dict: dict[str, Any]) -> str | list[str]: param_regex: str = r"{([^}]+)}" matches: re.Match[str] | None = re.match(param_regex, parameters) if matches: - result: list[str] = [ - param_dict.get(match, parameters) for match in matches.groups() - ] + result: list[str] = [param_dict.get(match, parameters) for match in matches.groups()] if len(result) == 1: return result[0] return result From 2f57041912eb6df000b00304cb434d385c1212a6 Mon Sep 17 00:00:00 2001 From: ianhelle Date: Sun, 10 May 2026 10:01:06 -0700 Subject: [PATCH 5/5] Refactor ZipFile to use direct context manager Move ZipFile creation out of httpx.stream block and open it directly as 'with zipfile.ZipFile(...) as archive:' for clarity. Addresses reviewer feedback from FlorianBracq. --- msticpy/data/drivers/sentinel_query_reader.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/msticpy/data/drivers/sentinel_query_reader.py b/msticpy/data/drivers/sentinel_query_reader.py index 4099be38..89fe105d 100644 --- a/msticpy/data/drivers/sentinel_query_reader.py +++ b/msticpy/data/drivers/sentinel_query_reader.py @@ -129,10 +129,8 @@ def get_sentinel_queries_from_github( file.write(data) progress_bar.close() - archive = zipfile.ZipFile(repo_zip, mode="r") - # Only extract Detections and Hunting Queries Folder - with archive: # type: ignore + with zipfile.ZipFile(repo_zip, mode="r") as archive: for file in archive.namelist(): # type: ignore if file.startswith( # type: ignore (