GetDuplicatesMlv2 Deprecated
Deprecated. Use the "PhishingDedupPreprocessingRule" script instead. Find duplicate incidents candidates. Using machine learning techniques with pre-defined data (can also use data from the local environment), this script takes into consideration different features such as: labels comparison, email labels (relevant for phishing), incident time difference and shared indicators, which can be customized by the arguments. This automation runs using the default Limited User role, unless you explicitly change the permissions. For more information, see the section about permissions here: - For Cortex XSOAR 6 see https://docs-cortex.paloaltonetworks.com/r/Cortex-XSOAR/6.x/Cortex-XSOAR-Playbook-Design-Guide/Automations - For Cortex XSOAR 8 Cloud see https://docs-cortex.paloaltonetworks.com/r/Cortex-XSOAR/8/Cortex-XSOAR-Cloud-Documentation/Create-a-script - For Cortex XSOAR 8.7 On-prem see https://docs-cortex.paloaltonetworks.com/r/Cortex-XSOAR/8.7/Cortex-XSOAR-On-prem-Documentation/Create-a-script
python · Common Scripts
Source
import demistomock as demisto # noqa: F401 from CommonServerPython import * # noqa: F401 from sklearn import impute import collections import re import dateutil.parser # type: ignore[import] import pickle import ipaddress import tldextract # type: ignore import editdistance import zlib from rfc822 import parseaddr # type:ignore from urlparse import urlparse import pandas as pd from sklearn.ensemble import RandomForestClassifier from datetime import datetime, timedelta # Site-specific allowlist for safe pickle loading — extends the shared base with classes this site needs. _ALLOWED_CLASSES = BASE_PICKLE_ALLOWED_CLASSES | { # Pandas internals (legacy BlockManager-based format) ("pandas.core.internals.managers", "BlockManager"), ("pandas.core.internals.blocks", "IntBlock"), ("pandas.core.internals.blocks", "FloatBlock"), ("pandas.core.internals.blocks", "ObjectBlock"), ("pandas.core.internals.blocks", "new_block"), ("pandas._libs.internals", "_unpickle_block"), # Python 2 compatibility aliases ("__builtin__", "dict"), ("__builtin__", "list"), ("__builtin__", "tuple"), ("__builtin__", "set"), ("__builtin__", "str"), ("__builtin__", "int"), ("__builtin__", "float"), ("__builtin__", "bool"), ("__builtin__", "bytes"), ("copy_reg", "_reconstructor"), } # Safe top-level modules whose internal submodules are all data-science code. _SAFE_MODULE_PREFIXES = {"numpy", "pandas"} # disable-secrets-detection-start FEATURES_OTHERS_STRING = ( 'x\x9c\xed\x9d\t\\U\xc5\xfe\xc0\xd1\\\x11\x17\x14\x85\x14\x91\x14\x11\xd7\xc0]\x11/\x17\xc1\r5C\x8f\x99\x1b\xb1\xe9\xc5\x009pIs/WJ[\xdc\xcb\xb5rIRSS4\xd3\x02\xcd\xad\xcc\xd44\xf7\x9e\xfbn\x9a\xf6\xf4Yf\xef\x9c3\xcc9\x9e9w\xeeY\xef\xbd \xf3\xfb\xbc\xff\xfb\xbe3g\xe67\xbf\xf9\xfd~\xf3\x9b9' # noqa: E501 '\xe0_\'\x96LH\x8fKK\x8c\xcbl\x960"#\xa9\xd9\xd0\x8c\xb8\xd4$\xf7\xc88k\\g\xee\x7f\xd1n\r\xdf\xa2K\x8c\xa3K\x06Q\xe5cS\x93\xacq\x89\xcc+\xfa\xb9\xc1t)\xaaT\xac\xf5\xcdt\xba4U\x9em\xe2\xc6\xd1e\xa8\xd2\xb1\\\x87\xb2"\xa5\xc9i\xd6\xa4\x8c\xb4\xb8\x94L\xf7\x88\x94\x11\t\xaf\xf7\x8cK\x8b\x1b\x96' # noqa: E501 '\x94\xe1N\x97ct\x97\x0f\x1aL\xbb\x07!\xdd\x13\x93F%e6\x8b\x8f\xcbLr\x8fMK\x1a\x19\xdb\x8dmq\xa7+\xe0\xbb\x15\xf4\xf0\x18GW\x0c\xa2Jq6TJH\xcbJM\x7f\x13tN\xcdJ\xb1&\xc7ed\xc4\xbd\xe9\x1e\x9b\x91\x940"-\xd3\x9a\x91\x95`u\xa7+\x83^\xee\x8c^\xee-]%\xdam\n\xedI\x95\x88' # noqa: E501 '\xa7\xabN\xa3\xab\xc5\xd0^A\xd1%\xa2\xabN\xa1\xab\x17tLdV\xcd\xf8\xa5\x06U\xf2\xa5\xb6\xb4w\xb4[t\x89i\xb4O\x0c\xfd|P\xf4sT\x89\xb1t\xcd^\xbdzu\xff\x97\x11\xee\xbf\xa2MV\xbaV|\xf6`\xda7\x88\xaa\x9e\x90\x95i\x1d\x91\x1a;49)%13vx\\BB\\F"]\x9b\xaa\x988"5.' # noqa: E501 '9-6\x95\xf9\xbf\x94D\xda\x8f\xf2)h\xc8d|\x1a\x9b\x92\x946\xccj\x89M\x1a\x95\x9ci\xa5\xebP\xcf\x83w\x99\xe0ef\xd6\xd0\xa1\xc9\xa3b\x13Fd\xa5Yi\x7f\xca#\x89y\x97\x02\x15\xbd@\xd5\x07\xcfY\x99\xac\xfb\x99\xee\xe9qV6\x12\xb1\x99\xc9\xa9\xc9)q\x19\xc9\xd67cS\xe3F\xd1u\xa9\xeaC\x93S\x92b-' # noqa: E501 'q\x99\x16\xa07.\x95\xd3X\x8f\xaa\x9a\x9c\x96\x90\x9c\x98\x94f\x8d\xb5&3\xed\x89\xc9C\x87\xd2\x01\x94\x0f\xe3\xfb\xe4\x848\xeb\x88\x8c\xd8H`*\\M}\xca[x\x17\xc5\xcd\x0e_\x05R5\x85W\x9d\x99\xf9\xfc{F\xb6\xe2\xdf6\xa0j!o\xfbt5\x87\xf0\xaf\x83\xa8\xda\xd2\xd7\xcd[\xb5\xe6;4\xa4\xbc\x84\x0e\xddz\xf3\xed\x8d' # noqa: E501 "\xa8\xeaB;\x15\xd3\x83\x7f\xd1\x98\x19\x90\x0e\xbd\x18\x9f\x96d-pq\x13\xca#9361+=\x85\x1d\x94D7\xa5*\xa5\xc4\xc5'\xa5\x08\x11k\x96d\xa5_\x8c\xa7J\xb1.\xa5\x83{eM\xa5Cb\xe8\xe6\x16\xdb\xd9\x99\x11\x976,\xc9=\x86\xfd\xef\x82\x1cm1\x8en\x19D\x95\xce\xb4\xc6eX\xe9V\xd1nT\xa9LkR" # noqa: E501 ':\xdd:\xba\x04\xfb\xbfF\xa4\xd3mzv/e\xe1\xf4\xb6\x8d\xa1\xdb%\r\xa6\xdb[*[\xb8\xb4\x0c\xb509\xd9!\x86\x0e\xe3r\x92\xe96\x95\xeeha2qh[\xda\x0421<\x866s\x99\xd8\x81\x8e\x10g\xa2\x9b\x95\xee\x14\x9f\xddwYrI7 wM\x84\x84\x84\x84E\x93P\\m\x07Y\xa71\xebC\xc5\xd5v\x11\x12' # noqa: E501 '\x12\x12\x12\x12\xaa!N\\=\xbf^q\xb5_\t\x95\xd1(\xd1\xaaO\xaf\xbdz\xd7\xe5\xac\xfd\xe0h\xc1\xad\xa3\xb0\xad\xcb\xd1\xf1t\xb4<\xabu\xb4\xb0\xdaU\xd8\xf2\xc0\xd1\xf6\x15\x15?\xa8\x15W\x9fsF\x9d+\xcfZ>\x13!R\x1c\x85\xec\xdb\xe2-F\xc5[m^\x90\xbcz\xb6Ek\\I\xfc\x89\x10!B\x84\x08\x11"D\x88\x10' # noqa: E501 '!B\x84\x08\x11"D\x88\x10!B\x84\x08\x11"D\x88\x10!B\x84\x08\x11"D\x88\x10!R\\\xc5\xd5\x7f~\x9c\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\xf0\xd9\xe78\x8f\xb7|\xf7\xd2\xb7\x9c4\xdf5\x84\xc2\xfb)^\x03N\xe7\xa6\xdeT\xa8\xe7\x9c\x84Y' # noqa: E501 "\xf5'Q\x14u[7m\xeb\xd7\xbe\xee\xf4[\xf4\x07\x01\xdd6\xf2\xeb\x93[\xe7\xbb\xa7\xc6\xe6\xe4\xe4\xdc\xc0\xf2f\xf72_\xe4\xe4\x9c\xc2\x12\xfa\x17\xac\xe7\xb2a\xf1C\xe7qo\xb8)7\xf5\xf4\x15\x9ep\x9d\x93\x7f\x1bv8\xca\xfb6O\xa3\xe2r/\xa4T\x86\xef\xde\xf3\x8a\t\xec\xbe\x84\xe5\x85^\x7f0\xf6\x9d\xc5\xf8K\x9a_->" # noqa: E501 '\x9bS\xd3\xcfo]\xc1\xf3zS\xf6\xc26\xd6\xc3QW\xf9\xf7\xef\x85U\x9a\x15\xd0\xed\x02\x96\xb0\xdf\xb5\n\xf9\xcc\xb8\xe3<a>\xa0\xfe\x94\xd3\x07\t\xd7\x81#\xaaW-\xc5\xf1\xfe\x95\xa7m\xbfJ\xfd\x06\x89\xda\x05\xf3\xb9\xf6\xa2\x87\xb5\xf6\xd2g$\x94\x8bo\x8d\xcd\x8f\xfaR\xd41\x89^\xd8\x0e\xe3\t\x89\xda/\xc7\xef"\xca\x9e\xcc^' # noqa: E501 '|B\xa2\x1f\xac\xe7\x8c\x84\xb6\xf3\x0f\xef\x0f9j\xb5W)\xe5\xf4\xe1\xd6\xe97\xbe\xddog\xcf\x9e\x95\x10\xfa]\x8ez\xfd\x82R\xed\xba\xf5\x12\x97\xaf\x908\xff\xc8\xd1\xed\xe7\xd2^\xa1\x1b~\xe1yt\xaeG?\x8a\xda\x8d\xa5\xed\xfd\xa7|?~\xfc\x11+\xfby\xaa\xf5;z\x1e\xa0\xf6\xa1q\x87\xfb\x02\xd4\xbd\xbd<\xe5\xf2\x1d\xdaW\x7f' # noqa: E501 '\xf9\xa1S\xb9\xa9?\x1a\x9e?(\'\xe6\x96[r"\xfb\xac\x84J\xf3\xd7\xd9\xf9\x8f\xda\xa7t\xde&\x81\xe7\xfc\xfc\xfc\xbe\xe5\xd9q\xfb@\xef\xa9q[\xb1y\x8f\xd6\xc1K\x93/2\xe7\xd6i\xd9:\x8d\xd3\xe7]\xa7\x93\xff^z\r\x7f\xae\xaa%\xbco\xa0D\xf7\x91n"~k\xc1\xc9E,\xf3\x96\xff\xbd\xbeZ\xe8y\x9eh\xbe\xcb\x9d' # noqa: E501 '\xf38?\xc2\xf1p?(\xbd\x1f(\xd5\x0f\x89\xbb\xb7(\xa5\xd2s\x06\xf4__P7\xb7\xf3\xf9\x00\xfc\xbe\x8b\xe7\xacC\xafV\xf1\xf4\xcc\xe7\t\xf3\xb5VJ\xf5\x1dS\xefmC\xeeS{\xb1D\xf5\x80\xf9\xd1\xef\x11;D\xec\xc2\xad_i\xfe\xa2\xe3@\\\xbfF\xb8_3\xe1~\xf8}\xed|&\x8e;\x15\x13\xc6\x05%\x8c\x13:\x0fz' # noqa: E501 "\x9f\x85zzoH\xf1\xf4\xf4<\xcc\xc7\x15G\xd4\xaf0\xbeh\xfc\xd0z\x05\xec9\xc0S\x1c\xd7<\x9e\xb0\xae\xa1\xe74\x9c\x0f\xfa\x1b\xb7\x1f\xe0y\x06\xd6u\x84'\xb4\x03\xae\x17\xdd\x9f\x90h\xde\xc9\x9d\xeb0\xaf\xd1u\x00J\xcfy\x18\x17\xd4\x1f8\xe2\xf6\x15|\x0f\xe7\xff}\xdf\x07\xde\x83\xad\x87M\xef\xf7/\xcb\xf0\xbcf\x02?\x9c\xc4" # noqa: E501 '\x12\xf5\x8b\xf8>\x02\xd7}\x88\xef\'W\x7f\xd5\x12\xad\xd78V\x9e5\xa1\xaa\xa7\xe7\x06\t\xe1\xf9\x8a\xe6\x01\xa4\xed{[\x1ev\x9f\xa1\xfa\xa1^\xb9\xef<4\x9e0\x8e\xe8\xfc\xb6\xebP\x1e\xb6\x9e\xa1D\xf5)]/.\xff\xd1<\x97\xbd\xf7"\xf5BN\x9f\xdc}\x1d\xa5\xd1\xf9%GXG\xa0\xbdC9\xb9\xc2\x13w/Q\x9a\xb7(\xd1' # noqa: E501 "s\n\xcd\x1b\xb9\xf3\xc1\xf69*\xf8\x1b\xe6\x9d\xb8.m\xe7\xdba\xbd\x95|\x07\xa0\xe7\xab&~\x85\x10\xff\x1e\xb7.\xb4\xaeC\xa2\xe7\x0f\x1f7D/\xae\x1d\x12\xf5\x1f\xca\x8b\xa1\xd5\xe7\xcd\x9b\xb7\x87'\x9a\xdf\xd8s\xbb`\x9d\xf0Yn\x9c\xb2\xefKi}B\xf5\xc0\xf8\xa2\xeb\x94\xdc\xcb\x0b\xf2\x03\xae\x0b\xcd\x1bT/\xec\x87\xea\x01y\x94" # noqa: E501 "\xa3\x9a\xe2\xfb\n\xfe\x9e\xa8\xf4\x1e\t\xfd\x84\x8b#\xce\x0e\xf4\xe7RJ)\xfe\xf9\x13z/\xc0\x13\xac{\xb5\x84\xb8\xf8\xe2\xe2l\xfb~\xfa5\x1f'\xdc<h~\xa2y\n\xfd\x05\xe3#\x97\x97\xb8s@\xf6^[\xd0\x0f\xc6\x91\xcfC\xa4\x1d\xadGr\xf7l\\\xfc\xe1\xf8W\x8e^\xe9CQ\x9by\xc2x\xc2\xfa\x8f>\xc3\xefj\xf8]\x8f" # noqa: E501 '\xbbwH~\x9f\x80\xd4=\xf4\x9e\r\xefc\xe88\xd8\x8e\xea\xb7\x9f\xcf\xdb\x14\xdf7\xd1{\'J\xdbu\xe2\x10\x9er\xe7\xbf\xdc9\x81\xe8\x13\xd7;i;z>\xa3\xf5_n<\x9a/h=\x06\xf9\xb6\x85\xe7\x8a\xff6\x1c\xb0/"\x97\'\xfc~\x81\x84qN\xde\xf1\xd2\x8e\xc9\x0f6\x9a\xc6x\xad\xebr~\xf4&\xfe\\\x87\xdf-\xf0\xe7' # noqa: E501 '\x0b\xb8s\x08\x12\xfd\xfd\x8d\xfd\xef@i<\xd0\xef"\xf4^h\xfb\x1c:"!\xcc\x13t\xbdp}\xe8\xbd\x15\xe6)\xec\x07\xfd\x07\xeb\x92\xd2:\x82\xfa\x9f\xf7\x0f\xa6.B\xfd\xe2:)]\x0f\x8e\xb8s\x05\xae\xc3\xfe\xcf\xef\xf0\xfbB\xa9\x9f!\xd1\xf1h\xbc\xc4\xdf5GL\xa7\xe2j\xe6\xdf:y\xaa\xc8\xf3\xb7\x06\x95w\x9e\x1eW#\xdc' # noqa: E501 '\xcd`\x81zq\xd4\xaa\x0f\xf7\xacv~\x9c>G\xdb-\xb7\x1e\xb5T:\x9f\x9c\x7f\xd4\xda\xad\xf4\xbd^\xff)\xd5\x8f\xb3[\xce\xcfJ\xe7S\xda\xaeV\x94\xda\xa3\xd7\xaf\xea\xf2\xc9_B\xad\xf9i[\xbf/O\xbd\xfb\x14\xb4\xfa\xa8\xf4G@\xb8}\xfa\xcaP\xbd_\xb5\xf9\x1d\xb5\xcbGf]z\xc5+\\\x1d\xeb\xca00\xdc\xf6<8\xbf' # noqa: E501 '\xfa D\xf7\x19\xfa\x1e%\xb4\x0b\xf5#\x14hO\xa0\xca\xb8\xc8\xe5\x8bt\xbf\x18C\xb9\xf5\xa2\xc4\xe5\x8fZ=\xd2\xfd\x84\xdb\xbf\xfa\xe8/\xd3.\xe7\x0f\xb5\xf9*Po\xddRF\xad\xfeu\\\xfd-\xec\xc4\xad_\xaf\x1f\xc0\xf8\xba<\xd5\x8d\xc3\xe7\r\x1awc\xfd\x80\xcf\x13t~g\xc7Gi\xbb\xa3\xf2\xdb\xbe\x1d\xbe\x92g9\xda\xef\xaf' # noqa: E501 'u\x1e\xb5u\x17=W\xe0y\xa5~?h\x9b_i}R\xde_m]u\xd4\xbe\x01\xed\xda\xeb\xbeQ\xf5\x0b\xb5C[|\xea"\xd4{\x7f\xa8\x82\x107\x9f\xf2\xf3Nk\xdc\xe4\xc6\x83\xf7\xea\xcfw\xa5\xe3\xecS\xeb\xfe\x96\xbfw\x88\xfb\xe3\xf7\x03\xec\xa76\xdf\xc4Tz\x7f\x92_\x8f\xb8]\xeb}\r\xb7N(r\xfbEm\x1c\xd5\xd6;' # noqa: E501 '\xc1\x0eez}e\xde\xab\x8d\x9fv\xda\xce\x7ft\xfdz\xcf-\xe5\xf9\x8f\xa3\xdasB\x9f=\xea\xef\xeb\xb6\xed\x96\xdf\xdf\xfa\xectV|\xb4\xcf\xa7\xf5\xde\xe6\\\xe2\xbf\x93\x1dk\xa7\xd6\xefo\xe3\xcf\x1dmv\xe0\xea\x95\xd4.m\xfbU~]\xca\xce?\xf4\x19\xd5\xab\xd6\x0f\xf8\xef\x03\xb5\xdf\x15J\xf5)\xf3\x1bz\x0e*\xbfG\xda\xafK' # noqa: E501 '\xda\x7f.b\xdbn\xa3\xf2[.^r?W\xd2J\xf4>\x8c\xa7\xbe\xef/\xb5\xfbZ\xe9\xfd\x1b\xf7\xac\xbf\x0e\x00\xe2\xbe\x13\x94\xeew\xa5\xf9!\xd7_\xe9=]\x8eJ\xf5\xc8}W\xa9\x9dGm\xbc\xb5\x9e\x0bu\x11\xca\xe5\xb5\xfa\xfb\x9b\x98\xa8>\xb9v\xb9\xfd\xaeW\xaf\xd1qA)\xf7\xfb\x01\xad\xfb\x00\xe7\x7f\\\x9c\x94\xc6K\xee|\x97' # noqa: E501 '\xb7W\xebw\xbd\x98\xe50\xf4B\x9e\x8d\xba\xd7\xaa=O\xf4\xd6c\xa5\xfa\x9c\xf7\xf3[G\xf3\x8f\xf9\xf7"\xfbn\x87\x7fo\x80q\x7f_\x02\xd4\x8b\xa3V}\xb8g\xb5\xf3\xe3\xf49\xdan\xb9\xf5\xa8\xa5\xd2\xf9\xe4\xfc\xa3\xd6n\xa5\xef\xf5\xfaO\xa9~9\xbf*\xb5_k\xfc\x8cZ\x8f\xdauk\x8d\xb7}=\xb7$\xd4\x9a\x9fr\xfa\xf5\xee' # noqa: E501 'S\x9c\x1e\xfb\xfe\x90\xaeO\x1d\xd5\xfbU\xab\xdf\xe5\xe67\x96z\xfd\xa2\xd4^\xe5\xe3\xb4\xf9\x077\xbf\xd6\xbcs\x94_\x8c\x8e\xb3Z\xfd\xf8\xff\x7faeu\xc6\xd9\xf6\x1a\x97\xafz\xcfY\xbdtU\xfd-\xec4:n\xc6\x9c;\xf8q\x8e\x8a\x93R}\xce\xce\x0f9?(\x1b\xaf\xbc\xdeh\xbb\x0f\\\x93\xd8\x85\x9b\x17\xb5[\xa9}\xca\xc6\xe1' # noqa: E501 '\xea\x15\xae.\xe0\xed\xc3\xd1Q\xf5J\xad^g\xefKG\xe5\xa7\xdeqr\xf1B\xf5i\x8b\x8f\xde\xfb\x03\xda\xef1B\xd8\xee\x16\x0e \x9f\x87\xb8\xf5\x19\x9d\x07b{\x94\xdf_\xec\xfb\xc3\xd1~W\xba.y?B\xbd\xea\xf2Mm\x1d\x92\xbb\xdfi\xbdw\xe3\xe7\xb1\x1f\xaf\xc7\xaa\xf7\x97\xb2\xf5\x1b]G\xd5\xef\x0fm\xeb\xd1:\x8fR\xbbU' # noqa: E501 '\xfc\xbdB\x06Q[]u\xd5\xf7,\xde\x0e\xfbv+\xf5\x87\xa3\xed\xd4znh\xff\x8evV\xbe\xab\xa5\xa3\xeeO\x80J\xe3\xa9v?\xca\xe93>\x8f\xb4\x9dSj\xf3P\xe9\xcfG\xa5uM\xdby\xa8=O\xb4\xfa\x11\xa7O\xa9^\xfb~\xd0o\xbfQ\xf7xc\xe8\xec:\xee\xea\xfa\xe1(\xbf9\xea\\A\x7f\x0f\x8c\xbe/\x8diwt' # noqa: E501 "~8\xfa\x1e\x0f\xd7\xab\xf4^\xadT\xbf\xd2\xfb\xb7\xdau;\xca?Z\xd7\xa5v>g}\xb7\x19\x15'\xb9<U\x9a\x17j\xf3I\xbb\xbd\xb6\xeb\x96\xfa\xba\xa7\xee\\\x90\xbb\xff\xe2~\x8e\xa67\x0f\x8c\xdaoZ\xcf)\xad\xfb\xb2\xf0s\xdf\x99\x172\xa7\x1dX\xac\xb8\x1f\x8eZ\xfb\xeb\xd5CHh/\x9f\x08\t\t\x8b\x1e\xdd\n\xc4\xd5v\x10" # noqa: E501 '\x12\x12\x12\x12\x12\xaa\xa1\x1bF\\m\x17a\xf1&./\xe5\xf2U\xeb8W\xd9o\xb4\x1fp\xfa\xb5\x8e\xd3Z/\xe4\xf4\x18\xbdN\xad\xf6(\xb5Sn<\xfa\xde\xe8\xf5\xa8\xb5\xd3Y\xf39{\xdf8\xda\xbfJ\xe77\xbani\xcd?\xa3\xea\x8eZ\xbb\x8b\x9a\xb8\xfa<S\x1b7W\xcf_TE\xad_\x1d=\xaf\xb3\xfd\xed\xa8\xfb\x83\xd6{' # noqa: E501 "\x80\xd6\xfa\xae\xf5\x1eQ\xd8\xf2\xbc\xb0\xecWW\xcf\xa3V\xcf\xb3&\xae\xaa\xe7\x8e:\x97\x1c\xed\x1f\xa3\xf5\x17\x17qt\xfe\xb8rm\xb6\xec\xd1{\x1ei\x1d\x8f\xbe7z\x9d\x85U\x9c]w\xb4\xf9_\xe9\x9f\xeb B\x84H\xa1\x17\xff\x19\xe1\xf6\xb9H\xcc\x1a+\xc4\xf4)\xa0\xdf\x1a\xfb\xf4\xd9l\x9b\xfe\xdb\x8d\xe1\x9c|\x11'\xa2\xf4\xde]" # noqa: E501 '0\xaf\x98\x13\xe1\xf3\xa2}<\x1b68E\xcd(\xf3\x03x\x1e"C\xff\x03\x1c\xc3g\x1f\xb6\xcf6G\xed2\xef\xe4\xaf"\x86\x7fs\xdc\x10\xba\r9%b\xf8S\x9cS\xedv\xa3\xce\xd5N\x83\xe7\x12g\xc5\xdc\xf5\x9b1\\\xfe\x1fUt\x9bs\xde.\xfd\x0bx\xcezAD\xff6\x97$\xfc!\xfb\x8d\xea\x93\x1e\\\xe3\x99x\xbd\xd3\xfc' # noqa: E501 '\xf1\xf1\xf7\xb9\xf7\xd7F\x960s\xf3\x1e\xb0\xcf\xd7\xf6\x97\xe48\xf12\xc2=\xcfq\\\x10T^\xc4e\x05\xcc\x8b\xb4\xcf\xbbfw\xbb\x0c\x1eXA\x17\xfb[=\x80]k\x10\xce\xac(\xe2\x89\xdd\xf6\x19\xee^E\xc4\xf5)\x80U\xf2m3\xb2wu\x11\xd3G\x03\xb6\xacW\x83\xa3\xff\x03\xc0\xbc\xb7\xbdE<\xb3\x04\xf0\xd6\x1a1\x1foS' # noqa: E501 "\xc7\x94\xda>\x1c\xc76\x16sQ\x17\xdb\xf4\xc8\x11sY\xd0\xf3\xba\xb8\xbe\xb5:\x06\xafR\xc7\xf0\xcd\xf6\xd9{\x97m\x1ejQ\xd3&\xc7\x1e\x04\x9cq\xc6>}\x07\xd6\x12\xb1I\xb2>z5\xf3u*\xfb\x0e\xb5\xcfM\xdb\xb4\xf1\xcf{b\x1e\xdaR\xdb.\xcf\xed\xb6O\xb7\x0b\xf6\x99\x1e\xe9'\xa2U%'\xc6\x88\xf9\xc1kb.K\x13" # noqa: E501 '3\xef\x1d\xdb\xbc\xbb\t\xd0\xeb\xb0m\x06\xdf\x06|\xcd\xbb\x0e\xc8\xf7\xc1b\xfa\xac~AD\xff\xf5\xf6\x19\xfc\xad}\xb6\xdd-f\xafS\x80\x96;\x80\xc3e\x98\xfe@\xcc\x89\xa5\xea\x8a8\xbd\x82>.\xf1\x17s}3\xc0m\xad\xc4<\xf1\xb2\x98nY\x02k\xef\xbf<\xe1\xc9Ob\xf6\xf2\xaa\xc7\xbd\xbf\x14n\x9b\xfd?\x13\xf3\xf3\xeb\x80\xb9' # noqa: E501 "\x0f\xed\xf3\xdb'R\x9a^\x19\x182\xfd\xf9\x00\x8e\x0b\x9ai\xe3\xa7\xad\xa4d\xf5?im\x9b\xe9\xa3\xebk\xe2\x07\xf3\xc4<r\xd0>\xebV\x0f\x14\xb1\x97I\xcc~\x9d\xc5\x1c\xdaW\xcceSls\xddl\xc0=\x9f\x03\x8e\xf7h\xc8qj51\xe7\xbd \xe6\xa1\x181o\x0c\xb3\xcf\xdf\xd3\xc4\x0c^\xa5\x8e\xed\xd7\x899\xf1\xb6\x94l\xbe" # noqa: E501 '%\x864\xe2h5\tLz\xfe\xc2\xa8\x8ds\x05\xfe~3\xef$\xbdE \xdb^\xf2\x0cx\xce\xff\xa7\x11\xc8\xa72\x8d\xcdy\x03\xfdK\x1c\xab p\xf1\xc4\xc0\xb73=\x05\xb2\xed\xf5c\xc0\xf3\xaeW\x1as\xe3\xde\x99\xdfD1\x07n\xf8.\xa5\xc7A\x81l\xfb\xa9\xb3R\xb2y8\xf9\xa2<\xd9\xfem\x9b7\xe5\xc9\xea-\x93.p\xb1' # noqa: E501 '\xe7\x8a\xb0\xa9#\x05\xaezso\xf6\xca\xd9\x02\xfb\xcc{!m\xea\\\x81\x0b\xa9\xa5\xaf\xaf\xfcT \xab\xa7_.\x18\xff\xeb\x0e0\xee\xc1I\xd0\xff\xd7\xd3\xa0\xdf\x83kM\xcd\x83\xcft\x9e4\xe4\x91\xc0\x8b\xadkN\xcc\x0fi&!\xfb~\x9d\xa9\x99\xf9\xe7\xa1\xc7\x86u\xa4\x04\xb2\xf6\xe7\xbd#p\xe3\xe2;\xc3\xde[\x08\x9e\xab\x1cnf' # noqa: E501 '\x1eu=0\xa4J\xc0\x8bX\x9e~4~\xf8\xd7\x9b\xc5,\xff\xf8Es\xfe\x0f\x9f\x94\x9e\xdd*\x98\xe7\xed\xb1\xa6VS\xcc\x02s\xef\xff\xd3wjo\x81l\xbfo\xfa\x07\x9b\xbb\x9e\x1f\xdd\xb7\xea@\x81l\xff\xb5\x89\xc1\xa0^%\td\xc7\xad\xcb\x04\xfd\xda\x8f\x07\xed\xd1S\xa4\xfck\xfc\xf0\x0e3\x1e\x07\x9b\x17}\xef\x1f<\xb2t\x08\xcf' # noqa: E501 'u]\xce\x9fz\xa3|\x88\xf9\xa7\x03\x07n\xbd^\x11\xb4/\r\n1\x8f\xa8:i\xe2\xe26!\xe6\xb3\x01e\xf2S\xda\x87\x98;\xe7\xde\x0fk\xff\xa1\xc0\x19)WC\xc7/\x10\xb8\xc6w@\xc0\xf0\xc5\x02\xd9~\xf1\x9b\xc0\xfb\x95\xdf\x80\xf6Yy!\x9c=\xa3\xfe\x91\x92y\xff\xfd\x12Ss\xf3\x8f\x9fD\xb5\xceMnn\xbe\xf5\xf2V\xbf' # noqa: E501 "7R\x9b\x9bk\xbdx6r\xea\x98\xe6f:\xcc\xbd\xcd\x1bc\x9b\x9b\x07\xbd\xbf\xb3U\x99I\xcd\xcd=\xdad\x9b\xe3\xd757\xb7`\xa4\xee\x1e\x81'\x0f>l\x11s\x06<w\xbf\xde\x9c\xd3_\xed!\xe0\xear-t\xf1pc<\xb7[g\xfb\xbcL\xb5`\xe3\xb4\xf9\xfd\x19-\xb88v\xbe\xca=\xb7j{\xbf\x05\x17\xa7v%[r" # noqa: E501 "q\xda\xed\xd1\x92\x1bw'\xc8Xz\xf7\x90'k\xe7\xad^R\xb2qo\xb4\xa5\xa59\x8a\x89\xdb\xed\x88V\\\xdcB\xba\xb7\xe2\xe2V\xfb\xa5V\xac\xdf\xff;x\x9a\x98SrZq\xe3\x9f\xdfk\x9b\xdb\xaf\x08d\xe3qldk\xce\x8eA\xdb\xf0\xfc\xa5g|p\xbf\x1f\xc4\x1c\x7f\xbb\xb5\xb9\xdc\x1a\xdf\xbf\xbeY\xd1\x86'\xab\xb7\xebW\x02" # noqa: E501 '\xd9\xf6\x8b\xfb\xdapz>=%\xcf\r\x19\x96?:\xdd\x15\xf8ITn\x8b\x1e\x0f\x05\xc6n\xeb\xe6\xf1\xd8\xbd-O\xb6\xdf\xeb\xd5\xdar\xef\xad5\xdb\xb2\xfe\xba\xdb\xbc\xa9@\xb6_@3\xf0<\xa0w[\xf3\xca\x85\xdf\xbb\xf5\xef+\xb0T\xbfJ=\xdf\x19$\x90\xa9\x0f\xef\x0c\x8b\x17x\xea\xe0\xc3\xfb\tC\x05\xb2\xe3&\x8e\x04\xfd7N' # noqa: E501 'h\xcb\xd9}N%\x93&9\x8f\xec:\xde\x9f\x02\xec\x7f7\x1b\xb4\xdf\x9e)f\xb9\xcfls\xe6Jm\xac\xbe\xa1-\x17\xff\xd2\xfb\xb9\xf8\x84\x04ui\xc7\xb3W|\x95\xb6\x91\xdd\x042e:hMw\x81\x97V,\x0cx-Z\xe0K3\xe7\x1f\x1c\xddC \xab\xa7\xf7p0>%\x05\x8c;\x9a\n\xfaOO\x03\xfd>\x1d\xd1\xce\xec;' # noqa: E501 ' \xf1t\xa5\x19\x02\xeb\x9d~\xf4\xed\xb2Y\x02\x99\xba\xfbx\xd6l\x81\xfb\xdf\xf8v\xe9\xce\xa7\xc8\x8c\x0b}\xf0\x14\xd9\xf5\xdc\x9e#\xf0\x87O\xa2j\x9c\xfdH \xdb\xfe\xf8S\x81#\xbf]\xda~\xc6J\x81\xac\x1d\xad\xbf\x04\xf3\xef\xdb\xdc\xce<s~Z\xf3\xf0\\\x81\xac\x1d\xdbr\xc1\xfc7r\xc1\xbc~[\x80\xbe\x8f\xbe\x11\xc8\xceWz' # noqa: E501 "\x07x\xfed\xa7\x98\xf5\xf7p\xe3\xeb|\xbfO \x93\xa7M;\xec\x17\xc8\xda\xb3i?\x98\xd7r\x12\xf4\xbbu\x13\xbcO\xbc\xd5\x8e\xdb\xd7\xe5\xc7\xb67Wj\xba\xb1\xf6\xb9\x07\x02Y\xfd%\xfe\x078\xb3d\xa8\xf9\xe8\xa8\xebe\xe6\x94\x11x\xfc\xb3\xf4\xb0\xaee\x05\x8e\xf1Z\xd7`\xf2Sd\xce\x8d'\xdf=EV\xcf\x9c\xf2R2\xe7{" # noqa: E501 '\x83\xbc\x1a\x02\xd9\xf9\xcb\xd5\x04\xefC\xea\x8a\xd9\xae\xa1@\xd6\x8e\xed\r\xc1\xfc\xe9\x8d\xc0\xbck\x1a\x81\xf9\xae6\x02\xfdv4\x11\xc8\xea\xbf\xd6\x0e<\xfb\xbe%f\x93\xf7\xd5\x93\xad?\xff~\x1ej\xfe\xa6\x9bG\xdd\xc4\xd3\x02\x99\xed\xe0\x9f\xf2\x87@\xa6\xdcV\xeb\xfb\x97\xc0\xe5\xe9a\x8dZ>\x16\xc8\x8e\x9b\xf1$\x94\xdb\xb75\xbd:p\xe3' # noqa: E501 '\xe60d\xfb\x8f\xad\xdd\x81\xeb7\xa8N\x07n\xde\xcb\xc1R\xb2\xfb\xcf\xa7\x956.3u0{\xf6o\xd7\xf7\xef\x08\x81\tU\xfa?\xff\xf8)\xb2\xf6\xf8D\t\xe4\xf6yO\xdb\xcc\xee\x8d\xe7\x9e\xe86\r\xbb\xbe&\x90\x9d\xaf\xdeP0O\xc0P\xa0?\xdc\x02\xde\xa7O\x02\xe3\xee}!%[\x0fN\xff\xaf\x03W\x0f\x1e\xfe\xd5\x81\xab\x07' # noqa: E501 "\xb1\x8f;p\xf5\xa0\xda?\x1d\xb8z\xd0\xf4I\x07n\xff\xe5\x87\x85q\xfb\xafOd\x18\xb7\xdf\xa2\xa2\xc2\xb8\xfd\x96\xc5\x90\xddo\xab\x19\xb2\xfb\xeb\x83\xe80n\x9f\x98\xfa\x87q\xfb\xe4\xfe0\xae_\x9d\x91\xa3\xc3\xb8}r\x87\xe1\xcf\x0f\xfb\xd4\xf3\x9f\xdb\x91'\x9b\xa7\xb3?\xef\xc8\xe5a\x97\xad\xa0\xbd+C6\x1f\xfff\xc8\xe6c\x9b\xaf;" # noqa: E501 'r\xf9\x98\xc1\x90\xcd\xbf\xcc}\x1d\xb9x{\xcf4q\xeb\xad\xf3\x99\x89\x8bs\xd95&.\xceW\xd7\x9a8\xbf\xac\xfb\xd3\xc4\xf9\xe5\xcb?A\xbf\x1f\x1f\x98\xcc\x17W,\x9c\xf3O\xb9p\xf3\x90m\xddf\xcc\t\x16\xc8\xbc\x9f8\xfe\xba}V\xfd[ 3\xce\xa3J%\xb3\x84l>4\xf7\x16\xc8\xb6/\xf21\x9b\xaf\xfd\xbd\xfa\xc3\xe4z\xe0' # noqa: E501 '\xf9F\x80@\xb6\xdf\x9e \xc0\x98\x16b^\x89\xe4\xfa\xcd\xe8\xdfS\xe0\x94\x9b/O\x1f\xfc\x14\xd9\xf6[C\xc0\xf3\x1f\x0co\x04\x86\xf8x$\x08\x8c\xd9\xea\xb7;3Q s\x0f\xaae}\x8al\xbfeV\xf0\xbe\xec\x1b\xa0\xbd\xdc\x1b@\xef\xe7\xb3\x05~x{\xec\x97\xaf\\\x17\xf8\x9f\x97fny\xff\xb6\xc0;\xab\xf64\xfe\xf1O\x81\xcc' # noqa: E501 '}\xdb\xed\xe8S\xf4(\xd9x\xd5\xe5\xa7\xc8\xe4g\xf2\x8d\xa7\xc8\xdc\xaf\xd76|$\x90\x9d\xe7\xe6_f\xf3\xb1Q\xd7\x7f\xad\xfb\xaf@v\xbez\xff\x82yb\xcbDp\xfa-\x0cY\xbdo2d\xf5\x8dg\xc8\xea\xd9\xe1\x1ea\xf6)\xd5\xef\xbdz\x95\x04\xb2zr\xabD\x98\x19\xf7\xef\xa4k\nd\xdfo\xa9\x03\x9eK7\x890\xe7\xfcq' # noqa: E501 "\xa4\xe2\xf6O\x05\xd6\x1e\x90X+g\x85@\xe6^\xfe\xdc\xba\xf5\x02\xd9~\xbd7\x81\xf7\x1d\xb7\x80\xf6\x88\x9d\x11\\\x1c\xfb\x8b9\xb1\xc2\xdd\x08\xce\xaf\x15\x9e\xeb\x84%\xdb\xaf\xb1\x07\xf7\xec\xd1<\xb0\x13\x1b\xdfrm\x02\xc1snC\x81L\xfc\x16\\\x0e\xed\xc4\xc6/\xaagX'6~\x0bY2\xfe{1dg'\xd6_m\x92\xf7tb" # noqa: E501 '\xfd\xf5\xc5\xf2\x9f:q\xdfAk\x192\xfej\xf0\x1dC\xc6_\xd7w1d\xfc\xd5\xf4\xb9#\x9dX\xff\xf4{|\xbc\x13\xeb\x8fJ\xff\\\xe9\xc4\xfa#"\xfa~\'v\x9f\xfe\xb3\xc23R\xc4v\xf5"9{\xd7\x87q\xf4\xd8\x17\x03\xf8q|$\xeb\x8f\x99s\xc7D\xb2\xf5a\xe1\xa4\xf1\x91\xec=j\xd2\xb4\xecH\xee^\xb9}+\xe0\xf8' # noqa: E501 'mx>\xd7xZ\x8d\xbe;\xc4\xbcv\x90{?\xa3\xfd\xa1\xa8\xa7\xe91\xf1X\x14k\xcf\xb8\t7@\xfb\x02\x86L\x99;\xda\xa3Bg\x9e\x89\xa1\xff\xf9\xd2\xf2\x14\xfb^\\\xf1\xf7\xf4\xa7\xc8\xf6;\xe7\x0b\xde?\xf6\x05\xed\xbe\xb5;\xb3\xf3\xcek:\x8f{\xdf7\xf0R\x17\xf6\xfd\x8b\x11\x0c\x99\xf7c\xe2\x19V,\xd9\xf8x\xd7\x96\xd1<' # noqa: E501 "\x99\xfa\xf3\xce\xecV\x02\xd9\xf63Q\xe0\xb9A\x17\xee\xf9\x95\xba\x15{\xb2\xcf\xee\xa9\x95z\xb2um\xc8\xa2\xcc^<C\xca\xad\xf1X\xfc\x14\xd9\xf6\xe0)\xe09\x84\xe1\x83\xa0Aw\xda\x07\xf6f\xe3\xd39\x94!\x9bWG\xe7V\xe3\x08\x05>\xcfY\x0c\xdb'\x84\xdb\xa5\xefGb\x0e\xfa\xd0v{\x8fYb\xfaL\xb1\xd9\x8e\xda\x83\n\xfe" # noqa: E501 '\xbd\xfc\xdfc\xd2yH\xbb;;\x1e\xfe\xee\xf2\xbfO\xc5\xd9vN\xf1\x1ap:7\xf5\xa6\xcb\xd7U\xd8XT\xfd2\xce\xe3-\xdf\xbd\xb4\xf2\xbf_H\xef:\xc3g<i\xbf\xa1\x9a\xe3\xfd\x94U\x7f\x12EQ\x97y\xa2\xef/D\xce\xfb\xeb\xfa\xaa;\xd8\xf5\xc0\xf6\xef"\xca\x9e\xcc^|BB\xb8\x0e\xbd\xac\x97\xf6\xdb\xa1(\xef\x9fx\xa2' # noqa: E501 'v\xf8w\x9e\xb0\xf8D\xb6\xfc\xdf\x17\x08\xed\xed\xbb`P\xe2\xd7\xab>\xe1\xd7\x07\x89\x1bwi\xf2Ef\xdci,Q\xfbPz\x8c^\x1a\xe5=\xf8\x92)o\xf9\xdf\xeb\xab\x85\x9e7}7\xf5\xcfE\x99\x07\xafK\xf8\xee\xa9\xb19997\x14\xb3D\xfc\x9f\xc7\xb3\x17\xef\xe3\t\xec=\xc7\x13\xae\xb3m\xaf\xeb\x97Z\xcd\xb9\xca3\xe7\xab\xbb' # noqa: E501 'c\xee\xec\xb8jZ\xdd?w\xfa\xf4\xe9\xd7x\xa2\xed\xb8~\x90cW\xed<\xc2\x88b~\x90\xd0\xb4\xf5\x9c\xe3\x87\xb0\x04v\x1f\x92\xf8\xab\xc9\xf0\xfb\xabsr~\x90\x10\xf4_f\xfa\xbc\xd6p\x8f\x17&/3\xbdzbm\x973\x9eWM\xf7BJe\xf8\xee=l\xba\xd9\xbd\xcc\x1799\xa7\xb0\xac\xb1\xf9Q_\x8a:\x86\xb1\xe3\x82\xa4' # noqa: E501 "\x1d\xf6\x97\xa3\\>(\xd5#\xa7\xbf\xf6\xa2\x87\xb5\xf6\xd2\x07x\xa2\xfd*\xce\x88Zr\xf5\xcd\x83X\xa2v\xc1}\x8b\x8b\xdf\xc7\x1f\xb1\xb2\x1fK\xb7\x9fK{\x85n\xd8e\xaa\x95R}\xc7\xd4{?\xf0\x84\xf9\x89\xfa\x1f\xc4)_\xc2\xa6?\xac[S\xab\x87\xf4ybn\xb9%'\xb2\x7f\x92\xc4\xe5\xf7\xb5\xf3g\x05t\xdbi\xaa\x10\xbc\x85" # noqa: E501 '\xeer&\x9f\x7f\x86\xf9$\xe6Q\x9d\xccS\xcc\x11\xa1A_\xaf\xf2\xdc\xa3\x98\x1fnx/m\xf4/?by\xe4\xed\x9a\xad\xe6\x1c\xcf\x93\xb0\xf4\xae\xd2\xd5c\xff\xd8-!\x1a\x07\x1c\xf5\xe6#\xca\xe4\x1d/\xed\x98\xfc`\xa7\xd3(\x17\xb7\xbc:\xfd\xdb\x9cL\xdc\xa5\x9a\xa8\xff/v\xfc \xbf\xc9\x85IX\xf6\xde\x90\xe2\xe9\xe9yX\xe2\x0f' # noqa: E501 '\xd8\x0e\xf6\xc7/\x92s\x12\xb6\xbf\x9b\xfa}\xa0y\xc9\xdb<\xd1\xfd-G\xb8\x8f\xafU\xc8\xb7\x1e\x8e\xda+\xb1\x8f\xdf\xa7\x05\xfb\xe1_\xaa\xe2\xc5\x1beo\x9b6\x8d\xbaR\xd7\xcbk2\xcf\x07\xd3*^\xf1\xda~\x0b[w\xa1}\xd4\xce2\xbd\xff\xde\xff6\xdf\x1f\x12\xae\x07]\xaf\xd2v\t9\xf9^Bq\xdd\xc1\x8fG\xd7m\xbf~\t' # noqa: E501 'v\xe1\xfa\xa1vK\xf4 \xf6)\x9d\xff@\xcaVO/\xaf\xe5<\xe1\xf9\r\xf7\xf3\xd1\xb9\x1e\xfd(J\xd8\xdf{\xcb\xef\xdd\x92zz\x0f\xcf\x8b\xa1\xd5\xe7\xcd\x9b\xb7Gv?,\xa8\xd3.\xba\xe1\x8a\xef%\x0c\xfc\xf9\xc0\x932\x95\x16\x99\x9a]\x1dU\xef\x7fo-U\xcd\xd4\x1f\xb7\r\xf1\x1b\xf8\x89\x84\xb8zg\xd4~\x97;\x97\xd0\xf1\xe8' # noqa: E501 '\xbe\x90\xdb\xa7\xb8\xfd\x06\xc7\xc3}\xa3:\xaf\x0b(woB\xf5\xc1sP)\xd1\xfd\x0b\xeb\x03\xca1^\xeb\xba\x9c\x1f=\xc74|\xc4\x8e9\x01\xdd>-\xd8\xe7\xb3L->\x9bS\xd3\xcfo\x1dO\xef:\x9d\xfc\xf7\xd2kx\xfe\xd6\xa4\xdb\x87\xf9\x8f>7%\xce\xed\x16\x11{h\x15\x9f\x8f\xc0\xff\xaby\xd68\xdb\xdd\xeb\xd1\x9a/x\x86' # noqa: E501 '\xdc\x1b\xd2`\xfa\xfe\x15\xa6\xdf\xa7g\xa5\x1f\x8eZ\xa5:\x0f@\xbe\xe7\xf2l\x12x\xce\xcf\xcf\xef[\t\xcf\xbd<\xfc\xf1\xfa\xae\x1f\xc9\x12\xcd\x1b\xe8\x07\xc8\xf4[\xf4\x07\x01\xdd6*&\x88\xd7W<WlZ\x12p\xd4\xbc\xd8\xb4q]Y\xdf\xa3\xe6\xb5\x12\x86\x0c\xfb\xed~~\xd9/y?B\x0e~y\xe1K\x145WB\x10\xaf\xe5\x92' # noqa: E501 "y\xd0\xfc\x86za\xdd\xee\x18\xd7\xe5f~\xd9\xa5X\xc2\xb8@\x02\x7fK\xd7\x8f\xd6+\xf4=\\Wm\xaf\xbbUS\xf2W\xf2\x84u\r\xcds\xd8\xbft\x8fm\x95C7|\x86\xcdg\x98\x87h\xfen\x8dw\x1b\xd0\xe7\xd7M|^\x82}\xba]\x92\x7f\xeem\xda|q\xee\xf2r\x9e\x95gM\xa8\xea\xe9\xb9\x81'\xa8+\xeby\xc2\xf8\xc3" # noqa: E501 '\xf1\xfd\x87\x1d\xf3^n\xce\x91|\x7fAv*\xeb\x1f\x9b}j\xb3\xe2\xfc\x80qnkZUkj\xdc\xe7<\xe1{h\'\x8cg\x0bN~\xd1L\xf4\xdc@\x99~y\xd0\xbd\xf7L3\xf8\xf8\xa3\xf1\x86\xcf0\x9e\xb8\xfb\xa7V\xee\xf8\xebt\xd5\x91\xdf\xef\x90%\x88\xf3"\ta>\xa0\xf1\x85\xf1D\xeb\x19\xac_8}\xf0\xfb\x12\x12\xc6G' # noqa: E501 "\xee\xfb\n\x8d'\xb4\x07\xcd/\xf4\x1c\x85\xf9\x85\xfb>B\x89\xea\x03\xfbu#O\xf4=\xd4\x0f\xd7\x8f{\x0f\x89\xbeG\x89\xfaSN\x1f\xf8>;\xa2\x98\xf0\xde\xe4,\xc2|\x80\xf6\xa2\xfb\xa3\xe3\xf6\x81\xdeS\xe3\xf6I\xa8\xf6\\\x86\x84\xdf\xab\xf0\xfe\x85\xfao\xdd\x02\xbfr/L\xc6\x13\xd6w\x1c\xe1:\xc0\xf7\x9e@\xf4|F\xeb\x13z\xce" # noqa: E501 '\xab%\xac\xf3\x90h\x9e\xa0\xefq\xe7"\xac\x8f\xa8~\xf4\x9c\x84D\xf5\xc2x\xa2\xedr\xf3B\xc2\xfd\x8b\xab\xd3\x90\xe88`\xe7\x0c\xbe\x9e\xa2qC\xefCrq\x1e3aD\xd5R\xe6e\x12\xa2~\x81\xf6\xa0\xeb\xac^\xb9e%OO\x810\x0f\xe0\xfd\x0b\xcd\x0fh7$\\\xff\x8dZ\xcbz\xd2\xfb\x97\xf1\xc4\xd5M9\xa2u\n\x12\xcd' # noqa: E501 "C\\?H4\xaf\xa0\xff\xd1v\xe0\xe7\x85\x12j\xad\x13\xb0\x1e\xa0\xf7 9^^z\xe6\xb5;\x0b>\x96\x10\xf5+J4\xbfp\xf9\x0c\xe3\x0f\xef\xb5 \xff\x17\xf0\xcf\xb8\xba\x82\xd6\r\xa5u\x00\xf5;lG\xedE\xf3\x1d\xb6\xc3\xf9a\x1e\xe2\xf6\x03\xd4\x8b\xe6\t\x9a\x0f8\xbf\xc3\xf9\xaaw\x0e\x19S\xea\xe1'<\xd1\x9fO\xa3\xcf[\xfd" # noqa: E501 '\xa6\xdc|y\xebA\xd3\xf8\xf93"jl<$\xb9\x0f@\xa2?\xd7\x81\xf1\x80\xeb9\x16\xd8gU\xc8\x87Kx\xc2<\x92\xfc<\xa8\xa0\x1d\x8d?Z\xaf\x03W7\xae\xe7\xe7\xb7\xc4\xe4?x|\xd8\xe5[+e\xcfi\xd4\x9f\xe8\xb9\x0c\xf7=\xe8\xbf\x8c\'h\xdf\x86%\x8c\x1b\x1a?H\xd4n\xb4n\xa2\xfa\xe0\xbd\x17\xd7\x0e\xe3\t\xe7\x83' # noqa: E501 '\xf7T\xfe~%3~\xc5\x7f\x1b\x0e\xd8\x17\x91\xcb\x13\xb6\xc3{"j\x1f<? \xc1\xb8\x95<\xe1\xbc1\xaf4\xefOQ+L9\xff\xae\xfb\xcb7\xe63I>\xc1\xf8\xa2u\x18%\xec\x87\xc6\x1d\xfdN\xc3\xc5\x17\x17\x1f4\x1e8\xffCB\xff\xc0\xef?Hh\x17\x9a\'\xf0\xfe\x8a\xfa\r\xfa\t\xddw8\xa2\xdf\xdd\xf0\x9c\x83\xdf\xcf(' # noqa: E501 '\xa1]\xf0\x19\xdc\xc7\xb6\xf2\x04\xdf\x03[x\xa2\xf1\x87ud@u\xcf\xd7\xbe^%|\x07\xc2\xf9Q=p\xdc+G\xaf\xf4\xa1\xa8\xcdX\xa2\xfb\r}\x0f\xef}\x90\xf0{\x15\x12\xce\x0b\xbe\xf37I\xfa\x01\xbf\xbb\xfe\xf7\xe3zI\xd5\xea\x9ap\xc4o\x97\xc3\xf4\xe2\xa8\xd7N9=r\xf3\xe3\xf49\xdan\xb9\xf5\xa8\xa5\xd6xj\xd5\xa3t' # noqa: E501 '\x9cQ\xfeS\xaa_\xce\xafJ\xed\xd7\x1a?\xa3\xd6\xa3v\xddZ\xe3m_\x8fT\xb4\xe6\xa7\x9c~\xbd\xfb\x14\xa7\xc7\xbe?\xf4\x8az\xbfj\xf5\xbb\xdc\xfc\xc6\xd2Q\xa2~\x1e\xf7\x86\x9brSO_\xd1\xe8\x1f\xdc\xfc\x828&.\xcf\x8e<\xeb\xfep\xec\xfe\xd4>\xbfQ\xf6\x16Uj\xf5\x9bc\xcf\x1d\xfc8G\xc5I\xa9>g\xe7\x87\x9c\x1f' # noqa: E501 '\x9cu\xbfPj\x87\xfdl\x92\xce\xaf\xd4>\xad\xf3\x18-\x8e\xaaW\xce\xaaOF\xe91*?\xf5\x8eS\xeb_\xa5\xfd\x8b\x9a8*\x0f\xb4\xceo\xec\xea\xb4\x8b\xde}\x85\xb6;\xc7j\xc7\x0b\xbaN\xf8sK\xf4\xbd\xb3\xe6\xc7\xd9a\xf4|F\xebu\xd5<z\xc5\xa8\xba\xeaj)\xaavk\x15\xbdu\xde\xd5RT\xect\xb5h=\xa7\x8c\x9a' # noqa: E501 'W\xee\xfcs\xf6\xf9`\xb4>\xa5z\xb5\xae\xdb\xd9\xf7\xf8\xe2"\xc4\x1fD\x88\x10)\xea\xa2\xf7\xfb\x9a\xd4A#\xc4\xf5\x7f\x1e\xc4\x18\x9e#$$$$$$$$$$$$$$$$$t\x01\xa1\xb8\xda\x0eBBBBBBBBBBBBB\xc2\xe2D\xf9?/\xb2y\x13+\x97\x90\xfeR\xc2~8j\xed\xafW\x0f!' # noqa: E501 '\xa1\xbd|"$$$$$$$$$$$$,\x9atS(\xae\xb6\x93P\x1fI\x1c\t\t\t\t\t\t\t\t\t\t\t\t\t\t\x9dOu\x7f\xae\xc3\xd5\x7f\xee\x85\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\xb0x\x12\x8a\xab\xed $$$$$$$$$$$$$,NT\xfa\xef\xd9\xb8\xfa\xdf\xdbQ\xcf' # noqa: E501 "\xf1\xc3\x93\xd2\x1fU<\xe0\xf0qZ\xe7)\xec\xd4\xbb\xaeg\xd5/F\xaf\xf3\xe3\x8fX\xb9.\xab\xdf9\xfe\xbc%\x99\x0fe\x8d\xcd\x8f\xfaR\xd41\t\x8d\xb5C\x10\xb5\xeb\xb7\xdd\x1f\xca-\x93\x988=\x87d('\xf2q\xd5F\xa5v8*?\x8c\x134o\xa0\xbf\x00\xf7K\x88\x8eo\xc1\xc9E\x95q9$\xd1k[\x8fR}\x82^" # noqa: E501 '\xfb\xd4.J\xfd\xa1V\x0f\xf4?N\xff\xb5\n\xf9\xd6\xc3Q[\xb0\xb4\xbf>\xa9\x9f\xd5\xda\xfb\xfb\xda\xf9\xb3\x02\xba\xed\xc4\xea\xb7\xcd\xa2#\xb8:*\xde\x17ryUt\xd7\xefXQ\xeb7\xfd\xf9\x8a\x8a\xdc9\xaaW\xbf\xda\xf9A\xeb-\xcc\xbcj\xeb;\xfe\xbc\xd5K\\=2J\xbf}\xff(\xf5\xa3 J\xedS\xe7_\xf9\xfd-W?' # noqa: E501 '\x94\xd5\x11G\x89\xfa\xfd\x87\xa3\xda}\xa9\xb6\xbf\xd68\xe9\xcd?\xa3\xed\x81\x02\xcfMH\xa3\xee\x0f8\x11\xe7\x99r\xd1\xeb7W\xd5U"\xda\x04\xcdK\xf4\xbd\\\x9e\xda>\'VK\xde;\xca~\xfb\xe7\xd5\xeaB\x9bw8\xbf\x1a]\x07\xf4\x89\xfc\xcf+]}\x9fr\xb4\x1f\xe5\xf4\x17\xaex\x119:\xd7\xa3\x1fE\xed6\xa9%\x18\xfd\xec' # noqa: E501 '}\xaf\xa9=\xaf\x1d=oq\xbb\x1f\x14\x97u\xea\x96\x9fK{\x85n\xf8\xca\xa4\x96\xb5\x17=\xac\xb5\x97\xdeN\xfc\xfa\x8c\x8b\xfd\x9f;\x12!b[H\xde\x10q\xbc\xb8\xfe\xf7\xdd\x84\x84\x84\xc5\x85D\x88\x14\x0f\x19\xca\xc9\x15\x92\xf7D\x88\x10!B\x84\x08\x11"D\x88<\x83\xb2)\xf6\xc5;+\x96\xed0A\xe2\xde\xbb\xc26"\xae\x93\xe2' # noqa: E501 '\x1ew\xb9}\x81\xf6s\xa6mD\xe4\x05\x8d\x9f\xabXX\xfc\xe0j;\x888F\x1c\x95\xaf\x855\x9f\x0b\x8b\x14\xb5:\x80JQ\xb3\x97H\xd1\x12\xb5\xf9E\xf2O,\xc4\x1f\xce\x11W\xdf\x0f\x8d=\xb7]\xfd{r\xf5\x1c|<\x8b\xf9\x8f\xfa\xbf7A\xed8\xad\xf3\x14v\xea]\xd7\xb3\xea\x17g\xaf\x13\xeaw\x96?\xd1\xf9\x9c=\xbf\x1b"' # noqa: E501 'j\xe7\xb7\xdd\x1f\x8a\xf1\xf6\xd9\x16g\xe5\x9f\xb3\xe77Z\xf4\xce\xef\xe8\xb8(\x15G\xfb\xcd(\xbd\xce\xca\x0b\xa3\xedu\x94~WKa\xdf\x9fEU\\\xefOe\xe7\xa8\xe3\xc4\xfe\xb9\x89\x8a\xf6\xfd-\xb7N\xb5\xc4\xd9a\xac~\x9c\x7f\x94\xfaQ\xea\x0fc\xe3\xad\xb7\xce\xba\xba^\xb8\xea\xde\x83\x9b\x1f/\xea\xee\x97\xf8qj\xf3O\x9d=j' # noqa: E501 '\xc5\xd9\xf1W\xafO\xaf\xdf\\UW\x89\xe8\x11\xed\xf7F\xb9\xf3\xcc\xd1\xf1Wv^\x15V)\xec\xf7F\xf9z\xe5\xea\xfb\x942;\x1d\xad\xbf\xb0\xc4\x8b\x08\x90\xc2z\xffr\xbe\xa8=\xaf\x1d=oq\xbb\x1f\x14\x97u\x1a#d\xdf\x12\xb1\'$\xceD\xb4\x08\xc9\x1b"\x8e\x14G\xff\\\x8d\x90\x90\x90\xf0Y#*F\xe9\xd3:\xbfZq\x96' # noqa: E501 '_\n\xeb\xfcjE\xef:\x89\x10!B\x84\x88}\x91;_\xd5\xea!\xf5\x97\x08\x11"D\x88\x10!B\x84\x08\x11"D\x88\x10!B\x84\x08\x11"D\x8c\x11W\xff^\x96\x90\x90\xb080\xab\xfe$\x8a\xa2.c\t\xfa\t\xff\x1e\xb1\xc7\xe8\xa5Q\xde\x83/\xf1\xbc\xd0\xeb\x8f\xc3Q\xdegM-8\xb9\x88\xe5\xc4\xdcrKNd\xff$!' # noqa: E501 "\x1c\xaf\x97\xe8\xbf\xb3\x8d\xce\x0f\xedG\xc7\x81\x7f_\xf8:\xa6\xbf\x9b\x1b\xda\x1f]\xff\xff|J\xb6{\xef\xe2\xb5\x82y\x8f\xc8p'\x96\xe8\xfc\x8e\xf2\x0b\xee\xdf#\x97\x8b\x9fV\xca\xcd\xaf\x95J\xe7qC\xe4^H\xa9\x0c\xdf\xbd\xe7\xf9\x7fWZn\x1e\\?\x98O\xf5\x97\x1f:\x95\x9b\xfa#\xcf\xde\x1bR<==\x0f\xcbr\xd6\xa1W\xab" # noqa: E501 'xz\xe6\x179\xa2\xebE)\xf7\xefx\xab\xd5\xaf6/pz\x95\xf6wT\xbe\x16V\x82<\xces:]\xbdnBe\xc4\x9d#J\xcf\x17\xb4\xbf\xdaq\x8e\xda\xf7Z\xf5k\x9dW\xab}h\x7f\xf4<\x83\xa2\xb7\xee)%n~\xbd\xe2\xe8s\xcb\xa8|r\x15\xd5\xda\xeb\xd8\xf3\xc2\xb8x\xab\x1d\xa7\xd7^\xbd\xebr\xd6~p\xb4\xe0\xd6o' # noqa: E501 't\x9c\xf5\x8a\x9c\xbf\xd5\xd6\xa9\xca\xb3&T\xf5\xf4\xdc\xe0\xb4\xf5\xe1\xecs\x94\x1d\xce\xba\xc7\xaa\xb5\xcbU\xf7\x17\xa3\xfd\xabV\x1c}\x9e\xba\xfa\xdcv\x94\xa8\x8d3\xdcO\xce\xa2V{\xb5\xceWX\xf2\x99\x08\x91\xe2+\xebMjYT\xeb/\x11\xb1\x18u\xefP{?)\xec\xf7\x1b"\xfaD\xeb}\x8d\xd4\x15"J\xe4\xc1\xbd\'\xd7{\x8e' # noqa: E501 '\xb8a\x9a\xfc\xdb\xb0\xc3Q\xde\xb7%\xc4\xbdG\xdb\xe5\xfa\xa9\xd5\x03\xac\xbb\x8b\xb5\x0b}OGZ\xe9\xa8\xf8\xb8\xc1tgK\x05\x8b\xc78\xbaK\x90\xa5\x92\xa5\xb2\xa5J\xb4\xdb\x14\xba\xab\xa5\xea4\xba[\x0c\xdd=(\xbaDt\xd5)t\xb4\xe5\xf9\xec\xc1t\x8f Km\x8b\x9f\xa5\x8e\xc5\xdf\xf2\x82\xa5\xae\xa5\x9e%\xc0R\xdf\x12hi`' # noqa: E501 '\t\xb24\xb44\xb24\xb64\xb14\xb54K\xb2\xd2=\xe3-\xc1\xbd\xb2\xa6\xd2\xbdb\xe8\x97\xe2\xc6\xd1\xbd\xa92\xc1\xcdBZ6\x0b\xa1_\x1eG\xc7\x04Q\xa5\xe2F%e\xd2},\xeeT\x99\xf8\x94\x11\t\xafg\xd2}\x07\xd3\xd48\xba_\x10U.uXF,\xd3\x96I\xbf\x92\x10\x1b\x1b\x9f\x95\x9cbMN\x8b\x8du\xcfLIN' # noqa: E501 'Hr\xa7\xfbG\xbbEW\x8d.1\x8d~5\x86\x1e@\x95y#.%\x8b\xd14\xd0\x12\x96\x15\x97\x95i\xa5\x07\xc5g\xc57\xfb?m\xc3\xe3\xfd' # noqa: E501 ) # type: str FEATURES_PHISHING_STRING = ( 'x\x9c\xed\x9d\t\\M\xe9\xfb\xc0KE\xb2\x15\xa9lIB%-\xca\xbe\xbc\xe7DH\xd9\xe2\xdaF\x92\x8a\x1bm\xa7n\x96\x88\x182\x19\xfb>\xc6\xd8\x89\x19\x8cl\x91\xad\x14\xd9\x85P\x96v\x8aBv\xc6\xf6\xbf\xdd\xf7<\xa7\xff}og\xce-\x99f\xfe\xff\xfb|~\xbf\xf9z\x9f\xf7y\x9f\xf7y\xd7{n\xe7=\xe7FT\xf3\n\xf2' # noqa: E501 '\x0c\xf0\xf6\x0c\xb1\xf6\n\x0c\xf6\xb1\x9e\x10\xec\xe9\xef\xa3\xd3\xdbS\xe2\xd9G\xf6/F\xcdb\x0e\xa3\x1e\xceT3\x17\xd5\xf4\xf0\xf7\x91xzK\xb3\x18\rwFS\xa4\xe9!\x99\x1e\xc4h\x89j\x96\xa8d\xe5\x98\xea"-\x0f\x99A\r9\xa7\xbe\x01\x12\x9f\xe0\x00O\xbf\x10\x1dG\xbf@\xaf\xc9\x03<\x03<\'\xfa\x04\xeb0\xdaR\xdf5\xcd' # noqa: E501 '\xdd\x19\x1ds\xc2\xdc\xdbg\x9aO\x88\xf5x\xcf\x10\x1f\x1d\x8f\x00\x9f\xa9\x1e\xce%\x1a\x1d\xa6\x16\xbf\x19kQ;\x9c\xa9c.\xd2\x94\xc5P\xd7+ \xd4?h:6\xf6\x0f\xf5\x93\xf8z\x06\x07{N\xd7\xf1\x08\xf6\xf1\n\x0c\x08\x91\x04\x87zIt\x98z\xd8JG\xeaW\x96\xcb\xe8\xba\xa8\xcdg\xf4D\xea\xe3\x99\xfa\x0b\x98\x06n\x8c\xbe\xb9' # noqa: E501 '\x8b\xbaK\xb3\xf9LC\xd6\xd0[\xdaji\xbf\x18\x88\xaa\r\xea\xcc\x18\xba\xa8\xb9\xa8/`\x8c\xdc\x98F\xe6.\x1a"\xf5\x99L\xe3\x81\x03\x07\xf6\xff*\x15\xd9\x7f\\\x90\x84i2>\xca\x9dij.\xd2s\xf2\xf7\xf4\xf5\xb3\xf1\x94H<\xbd\xc4\xfe>\x01\x92\x10\xa6\x99\xa8>V\x8a}<\xbd}\x82Cl\xa4\x1d\xef\xc3\x18\x93\xda>\xc1\x81' # noqa: E501 "\xfeLsQCy\xed\xd0\xd0\xf1\x93|\xbc$\x8c\x89HW>cX \xd3B\xa4\xc3\xea$\xfe~\x8c)\xa4$>\xd3$LKQC\xaf\xd0\x10I\xa0\xbf\xc7\x04_\x1f?\xef\x10\x8fI\x9e^^\x9e\xc1\xde\x8c\x99\xa8\x8ew\xa0\xd4.\xc0\xc3_\xfa\x7f?o\xa6\x95\xc8\x88U\x84HG\xd7\xc3\xcf'`\xa2D\xec\xe13\xcd7D\xc2\xb4" # noqa: E501 "\x165\xc2y!83$t\xc2\x04\xdfi\x1e^\x81\xa1\x01\x12\xa6\x8d\xa8\xb6OI\x85\xe0\xc8\\\xd4\n\xa7CCJ&\x82\xd4<H\xda\r\xd2\x7fz\x84\xf8\xfa\xfb\xfay\x06\xfbJ\xa6{\xf8{Nc,D\r'\xf8\xfa\xf9x\x88=C\xc4\xd8\xaf\xa7\xbf\xcc\xa3\xa5\xa8\xbeo\x80\x97\xaf\xb7\xb4\xdb<$\xbeR\xbd\xb7\xef\x84\tL[\x91" # noqa: E501 '\x91t\x16\xf8zyJ\x02\x83=z\xe3P\xa15V"\xc3\xd2<Y\xf3\xb9\xacv\xa2\xc6\xa5Y}\xa4\xf5\x99\x0c\xe8\xdd\x81\xcb\xb5\x165!r\x87\xf6\xa3\xed\xb8l\x1bQ3\xc5\xec\xf6\x1d:r\x06\xb6"\xfdR\x03\xe7\xc1\x9c\xdeN\xd4\xb0T/rs\xe52\xdaK\x0b\x04A/\x8e\x0f\xf0\x91\xb0]l/\xaa\xed\x1b\xe2\xe1\x1d\x1a\xe4W' # noqa: E501 'R\xc8\x87q\x10\xd5\xf5\xf3\x1c\xef\xe3W:b\x1dDud\xc5\xa4\xa3 \xf1\x0c\xf0\xf2a:\xb2\x8a\x10\x9f)>%\x9d\xcat\x12\xd5\x94)J&-\xd3Y\xa4\x13\x1a\xcc\rJ\x17\x1f\t\xd3u\xbcH\xb3d<\x98n\x03C#\x99\xeenL\x0fq\xd9\x8b,\xd83`\xa2\x8f\x8e[\xc9\x7f\xd9\xa5\xd63\x9cA\xe6"-i\xc5\xc1\x12\x86' # noqa: E501 "rQ\x13i\x86H|\x82\x18\xdaE\xbd\xe4_\x81A\x8c\xe3\x00\x1bu\xb1\xcco/7\xa6\xb7\x8f;\xe3$\xae'\x96\xad\xae>b\xe9\xd2\xea\xeb\xc6\xf4\x93--\xa9Y$\xe3,\x96.\xa8\t\x9d\x99\xfexA\xb9\xb81\xae\xb2\x05\xd5\x9d\x19 \xbf\xa0\xd4$\xcc\xc0\xf1Q\xc3\xd6\xd5WWSIe\x8a>U\xd5\x11\xfc\xa3B\xb9Qe\xa6" # noqa: E501 'I\xfd?.\x15\x1d\x07G\x9er|z\x90>\xd4\xdf\xb3\xbc\xfe\x94\x8dC\xc8Oe\x0b\xd9\xaf\xbd)y\x82\xe8R\xf2\xfcF\x89\xa0\x94\xf4\xd3\x9f\x92\xb7\xa7\xcbfD\xef\xbf\xa7\x90\xdf\x88a\x04I}_B/DZ\x80\x02\xf1\n\xc6\xcfJD?\xa2\xde~\x02\xec]\xb6^M\xd9\xf2J\x12\xfc\xa99\xb1$\xd6\x0fgG\xcc7\xe8\x1f\xb5' # noqa: E501 '^D9H;\x11vD\x9a\x97\x8e\xf2\x04\x7f\\\x1a\x08q\xf4\x92\xa7\x9a\x19\xcb\xd6Tl\xcf__|^n\xcbKl\xa7\xcf\xa3W\xb6\xbc\x99\xa0\xdd?M\x1c\x97\xb5B;p\xda\xf2\x1b\xfd\x9aWR|\xad\x95\xf6\x87\xedLy\xc7\x05\xeb\xad\x04\xca[\x12i\xd8O\xedY\xc2<5b\xa9\xcd\xb2\xb4\xbc\x9c=\xb7\xcf\x15#\xcc\x1el\xba' # noqa: E501 '\x0b\xcb!\xac\x1d\xeb7^$_O\xc4\x186\xcdr\x9c\x0f\xe6\xe6\xc9\x98)\x0c\x9b?\r\xd3\x84M\xeb\x86\xb1\x9c\xc2\xea!\xcd\xda\xa5\xcc`\xfd\x85\xb3\x9c\x83i\xce\xd2\x88\xe5~\x96\xd3~\xc4\x1c9\x9f\xd5\xb3LcY\x1c\x85i\xbb\x98\x8d\x87e\xef\xe5\x98A+1\x17\xadf\xfd\xac\xc5|\xb4\x19\xf3\xd3\x16\xcc];0\xe3\xa21\xe3\xf7' # noqa: E501 "c\xba\xed\xc1\xac\xbd\x0f\xf3\x19\xcb\x8d\x7fb^\x88\xc1\xb4>\x80\xb9\x8e\xe5N\x96:\x0715\x8e`\xf6\x8c\xc5\\s\x14su\x1cf\xdfc\x98\xea\xa71c0#&\xc7c\xda'`\xfaa\xaa}M\xc4\\\x88\x19\xa1q\x16s\x1f\xcb\xce\xe71k&\xb3\xf1cF<\xc3z\xb5-\x971\xe7_\xc1\xfa\xbbWe\xa4\x86\xa4`Fc\xaa" # noqa: E501 '\x05\xdc\xc0\xf9{X\xfa\xa5\xca\x18\xeft\x1bs\nf\xc4\xca4\x9c\x1e\x92\x8e\xa9wO\xc6\xac192\x8e{\x8fi\x92\xf9H\xc6\xe2\xaf\xc5\xd8\xae\xce\x0b\x19\x07\x17\xb3\xb4|)c\xca\xcdW2\xda\x86c\x16gb\xea\xe6c\x8e\xd3|\x8d\xe3\xfc\x05s\xdc\x1d\xcc\x88\x0c\xcce\xcfX>g\xf3\x8b1\xe3Y.\xd3}\x83\xfdI0\xa9i' # noqa: E501 '\x98\xfb\x97a\xaai\xbf\xc5\xfe\xea`R\xf30\x8b5\xdfa?\xa31\xf7\x1b\xbd\xc7\xf9n\x1f\xb0\xbf\xad\x98\xb6E\x9fd\xec\xd7W\x8d.\xa1\xf9K\xcc\xf3;\xd4e\xec<\xb5\x9a\x8c\x83\xdbh\xc8x\xb4/&\x15\x88Y\x1c\x8e9\xae\xa9&\xb6;\x8a\x99u\x1c3"\x03s\x9c\x96\x96\x8c\x9b\x07c\x0e\x16a\xaa\xcd\xc34\xba\x86\xb9\xacC' # noqa: E501 "u\x19w\xb1,\xde\x8d)~YKF\x93\x80\xda2\x8e4\xa9'cP\n\xa6mm]\x19?\xe9b\xfe\xd4\x00S\xdb\x10\xb3\xb6M\x03\x19Sm1\x1df`\x06\xc5a\xfa\x99\x1a\xc8X\xf4\xd8H\xc6y\xc3\x1b\xc9\xa8\xeb\x819\x86\xe5\xae\xb0\xc68\xee\xb9\x98\xefw`j~\xc1Lm\xd7D\xc6~\xee\x98A\xb31\xbb\xeb\x1a\xcb\x98\xe6" # noqa: E501 "\x82Y\xe0\x8ai4\x10s\xcc\x10\xccOK1u\xb6\xb5\x90\xf1\x19K\xe3\x0b\x98'\n0\xe7\xbde\xd3\xd5Le<\xc5RM\x83eu\xcc\x94\xa6\x98G7`\xde\xdf\x88\xd9~3\xa6\xc36\xccY\xd1\x98\xc1\xef0\xb7\xb3t{\xcf\xfa\x17\x9b\xc9\xf8%\x08S2\x13\xb3\xf1bL\xc7{\x98i\xcd[\xe1v\xf5\xc5\xac&\xc2\x9c\xf0\x04\xf3" # noqa: E501 '\xed\xe66\xb8=]\xcd\xf1\xf8\xb6\xb6\xc4\xfd:\xc5\n\x8fS\xedv2v\xa41/\xcf\xc7|}\x13s}\x1e\xe6\xe0\xf7\x98\x92\xdd6\xd8\xffg[\x1cG5;\x19-Vc\xba\xf6o/c\x87Q\x98\xf5}0?\x9d\xc6\xec\x1cd\x8f\xf5\x1b1\x07]\xc0<|\x05\xf3\xe35L\xb3\x14\xcc4\x96\xea\x99\x98\x9a,\xb7\xe4`\x1a\xd7\xef ' # noqa: E501 "\xe3\x05}\xcc\x8f=1o\x0e\xc2<\xb2\xa3\xa3\x8c\x0bl\xbb\xe0y\xe1\xdaU\xc6\xb1,\x15\xc4\x88]\xe7@R\xaf\xac\x9d\x11\xbb\xde\xc8|\x05\xbb\x86\xf2q@\x9a\xd4o\xafWv\xbc\xa0\xe7\xab\x97,G\xc6\xc3\x95g\xcb)\xf8\xe3\xf1\xc3\xf9\xd3\xfa{{._\x8b.\xbb\x1c\xa9'\xfc\x90\xed\x02\xbf\xbc\xf1\x08\xc4\xad\x10\x97\x92\xe3*\xbd\xde" # noqa: E501 '\x93O\x9b\x12i!\x81\xf2\xa4\x1f\x10{\x1e=H7\x9ex\xe0\xfa\xae=\xcb\xd2\xef\x11e\x13\xf2\xa1\x9c5\x8f\x9d\tK[\x1e\x82\x80\xbd\x15A\x88\x8f\xaf^+B\x0fbN\xe4[\x12\xf9d=d}d{\xac\x08}W"\x9f\x14r|\xc8\xf8\xc8\xb8\xba\x12\xf9d\xff\x90i;J\x9e \x10\x9f\x11A>\x818I?\xa4\x90\xf3\x03\xea' # noqa: E501 "!\xcbC\x7fX\x12iS\x96\xb6\x84=\xb4\xdb\x8aG\xdf\x8d\xc8o/@\x10\xf8\x1e\xc2W\x0f_\xdc \xa0\xb7&\xec@\xa0<\x8c+\xc4I\xae'K\xc2\x8e\x9c\x97\x1d\x88\xf8\xc8~\x03=\xd4o\xcb\xa3'I~o#\xdb\x03\xf57%\xec@O\xc6C\xe6\x93\xeb\x80o<\xa0^h7\xf9\xfd\x9c\xf4\xdf\x8d\xc8\xe7\xf3G\xce\xa3n<z" # noqa: E501 '\xb2>\xbe\xfe"\xe7\x1f\xdf\xf8\xf3\xf53I\xbe|\xd0\xb7/\xa7=\xd9\x7f\xe4\xba"\xf7ar~C\x9a\xaf^\xa1\xfe"\xf5d\xda\x9e\xb0\'\xf7\t\xbez\x84\xfa\x9bl\x07YNM\xed\x97\x1f#~\xd8t\xc5\x92\xe2\xa3\x90\x9d\x1a!|z>?X\xdb\x95\xc7\xaf\xa2\xbe\xa2\xfcV\x7f\xfftye\xed+\xbb\x9fH\xbf\xdaf\x85c\xa6S' # noqa: E501 '\xe4\xe7C\xe5\xc9\xb7\xfa\x17*\xff\xbd\xe2\x07\xbf\xdf\xbb\x7f\xfe\xabB\xf6\xcb\xff\x8d\xfe\x82\xfb\x19\xca\xeaY\x89\x80\xfb!<,\xaf?\xa5\xe3\x10\xf2\xf3\x9dE\xd9\xfb[\xdf,J\xdeg\x8c\x18J\xc9\xd9W\xf4\xbe\xdd\xdf\xf8-{\x9eSD\xba\xaf|\x1cB\x14\xbc\x0f\tq9)I\x1e\x89 \xe2\xe2\xee\x87\xf2\xb17\x8f\x9e\xbc\xcf\xd8\x97H' # noqa: E501 '\x97\x97D;\x15H\xde?\x04:\xb2\xf9\xbd\x08{\xc8w\x92\xb7SH\xf3\x90\xbc\xcf\xc8\xf9\'\xed{\x11\xf9P/bi"o\xa7p\xdf\x1b\x11\xf3\x86\xfc\x9e\x0b\xdf\xd3\xba\xf0\xe4\x83\xc0|\xb2\x97\xf7\x17\xc17_\x1d\x884\x1b\xaft\x1c\xe5\xf5@G\x05\x7fX\x0f\xf3\xd2\x81ew\x85\xfa\xe4\xeda\x1c;*\xc4\x03\xfe\xe4\xf5\xdd\x15\xdaU' # noqa: E501 '\xb6\xdf\xae\x9c_\xcc\x1e\\\xbc\xf2ig\x85\xf6\x97\xe9\x8f\x9c\xe7\\?\xf4ThO\xd9\xf1\xf4\'\xe2\x87\xfaa\x1e\xf0\x8d\xa3JT\xa2\x12\x95\xa8D%*Q\x89J*[\xb4DN\x8f\xd4\x0fe"j\x9c\x83\xe1\xbb\xcd\xcf\xd1\x99\xa3\xf73\xdb\x0c\xcc@iw\x1f3\xa3\xec\xb2P\xaf\xeb\x05\x11\xb1\xcds\x90\xd6\xdb%\xb7\xdf$\xa5\xa3\x8c' # noqa: E501 "p[\xe3\x86}o#\x8f\xfe'\xb7\xc7\xfd|\x0b\r=\xb7!~\xfb\xd0\\4D\xe2}`\xe7\x9e\xa7\xe8M\xc4\xfa\xdb\xe1+n\xa26\x86\x8en\x0eI\x99\xa8S\xfaW\xfb1q\x17Q\xf5\x18\xbby\xdb\xf4n\xb2\xe7\xbf\xb2P\xebl\xc3\x8d\xde\xbbs\xd1\x8dCN.\xb3b\xf2P\xdf\xb6\rG\xd51\xccD\xf5\xbe\xbe\x99\xbek\xc1E" # noqa: E501 '\xb4P\xbb \xf2e\xe3\x1c\xa4n\xf7Wa\xd2\xc0\xcb\\=\xf6KG\xcc\xb0\x7f\x98\x8d4vn\x89\xb8|\xe6)R\x8f\xea0\xe3\xc5\xa7B\xae\xfe\x0f\xa7\x03\x8f\xfeb}\x0b\xf5\x1c\x94\xf5\xd6\xe1\xccE4?g\xc7\xcd\x80M\x19\xa8\xdb\xc6\xd3\x1b\x1fk^By\xbeO\x86\xcfr\xbc\x8cN\xef\xe8y\xeau\xc6E\xd4\xdf\xeb\xa3W\xc7[' # noqa: E501 '\x17\x91\x85\xd7\xc0q7vg\xa3\xf0\xab\xf5\xb7Lt\xcd@\x01\xd7E\x9f\xee\xc4g\xa1S\xda\x7f\xac\xb6\x89\xccDz\x8d\x1e\x0f3*\xba\x84l\x06jE\xab\xfb_D\xd9\x05\xbb\xc7\xf4[\x9f\x83\x98\xba\xa9\x07"ff\xa3#iSv\x98o\xc9AOF=t\xde\xf4:\x1b\xe9=\x0es-|\x9c\x89\x16x\xad\xeb\xe9p\xfb9\xba\xf4' # noqa: E501 'B\xeb\xe7\xd5\xd9\xf7\xd0\xf4\xf5\xab\xae~rx\x80\xc6N\x8b\xffm\xf1_9\\\xfe\xd3g6/\x1b_\xbc\x89N\xad\xcc{\xe5;=\x15i>\x8d\xb3\x98\xd6\xe5!Z\x19~\xf2Q\xbf\x90<\xb4\xd9\xb2\xfb\xb3?]SQ\xf7\xf5\x1b\xba.j_\xaa\xf7\xba\xeai\xad\xb71\x15M\x90\xc9#\x14\xe5\x91}z\xcb\x87\xfb\x9c_\xa0z\xc7\x97' # noqa: E501 "5\x99\xe1\x8f\x90\xc8\xa1\xd6\x8b\x8d{\x9e\xa3#\xad_\xb7\xef\xb9\xb64\xbe3\x85S\xe7\x85]\xcc@c\x97oo\xd0\xea\xf8#n\\\xb8\xfc\xe1\xd7'\x9b\xff\x99\xcf\x95\xdf0j\xbf\xd5 \xd3D.\xffKT\xc1\xfd\xa55\xcf \xdb_\x8f=\x9d0\xfd\x0cgw\xf9\xe4\xe0\x91+\x7f}\x88RB\x1a\\\xbd\xde\xe9\x0e\x12k\xaex\xe8\x19" # noqa: E501 "{\x8b\xcb'Y\xd3{\xd3\xeagu\n\xd0\xec\xe4\xd1'\x037>B\xb1A\xfa1~3s\x15\xec~\xbe;\xf3\xf7\xdf\x7f\x7f\x82\xac\xa83W:\x04\xe4\xa3Xtb\xe8\xce\xdfrQ\x9c\xc3\xc1\x9b>\x0bs\x91\xce\x9dmA=t\xf2\xd1\xd6\xe8a\x97\xae:g\xa3\x1e-\xdf\xcf49\x9e\x85N\\1\xc9\xea9\xf7&\xd2?\xf4|W" # noqa: E501 '\xc7\xc67Q\x7f\xb1\x96\xcfFQ\x1e2l\xde\xcb$\x99Y\x844\xf7gU\xfb0\xf1!:Z\xfc\xa7\xe5\xa4E\xa5\xfa\xb3\x0f\xafj\xfd\xb0\xff\x16z\xdfj\xe1\x9ez\x8b\x1f\xa2+N5\x1a?o\x9b\x87V\xd4\x18\x11\xae\xf9.\x01=\x18\xe3`\xb4O\xf3\x0cr::bh\x7f\x8b\xb3\xc80\xa7\x85\xd9\x89\xebI(\xb4\xd5\x8f"\x91\xe8' # noqa: E501 '!2\x18\xfbg\xea\xce\x8eO9\x7f^K;\xad\xd1\xc8\xbc\x85\x1a\x84\xd4\r\x89*\xceS\xa8\x0f\xaf\x93<\xa4vr\xda\xc8ZA9\x9c\xde\xb1\xda\xf4\x9f\xee\xdfx\xc0\xa5\xc35\x0eYX7\xcaA\xd7\x9a|p]R;\x07\xed\xcd\xdbz/\xe9\x97G\xe8\xca\xe5\x12IE\xdb\x0ev\xacq(\xf2\x01:\xfe\xf5\xcd\x9b\xc0^\x99h\xf9\x1f' # noqa: E501 'sf\xa4\xfd\xf5\x88\xf3\xf3\xea\x87\xf6k\xaa\x1d\xce@3\xdf\xf5\xeae\xf75\x0fulx\xe3\xcf|\xcb\xdb\xc8\xfe\xcb\x80\xc5\x81\x91\xb7Q\xc0E\xc3L\xdd\xcf\xb9(\xb6\xf5\x01\x03\xbf\x84\x1cd<\xabK\xc6\x83\x07\xb7P\x9b#\x7f\xb4\x1a\xa1\x9b\x88\x9ct\xf4\xd7\x17\xfd\x91\x88f\xd2K\xe9\x13\xfdn\xa3\xa9\x87\xaeu\x18\xf3)\x05If\xdc' # noqa: E501 '?7\x7f\xd8u\xb4\xf9b\xad\x8c\xe4\xa8GH\x9d\xe9?\xdf$1\x075\xd7R_\xf1\xa8_.\xba\x19r\xc2\xe0p\xe3L\xf4\xd8$-2\xe9\xc4\x03Tc\x92\xa1\xd9\xaa\x8e\x19\xe8\x01=vkT\xeb\x1c.\x7f\xf7W\xf7\x83\xcdV\x9cC\x8e\x06\x17k\xed\x0b\xc8E\xcf\x86\xe9\xf7p\xff\x92\x8d\xec&\xbc\x1b\x1e\x1bU\x9a~\xb0\xbc\x85M' # noqa: E501 '\\\xc1\x194\xfa\xf9P\x9b-\'\x93\xd0\xf2\xfe\x17\xa9\xfa\x87N\xa1\xafm\'\xc5,\x1e\x19\x8b\xecf\xc5^n;(\x16\xbd>x7\xc1=<\x11e7c\xf6\xc4\x98\x9eA\x87\xbcoT\xfb\xe1M"\xda\x96\xb0(lS\xce\x19d/\x93\\\xa4\x9d\xff\xf9\x1c\xd3T:\x9ff\x99\xfd\xb22\xf3\x0c\xda=k\xd1p\xba\xeey\xd4v\x81A' # noqa: E501 "\xfa\xd5w\x89\xe8\xc0\xbe\x1aMS\xe9\x93h\xe2\xa4\xa6\xd6\xab3\x92Q\xbc\xc6\xd5\x86\x83\xe6%\xa2{\x06\x9f\xdd\x86\x0eMDI\xd7\x0e\xa9[\xab'#\x1b\xab\x0766\xeb\x92\xd1(\x8d\xabv\xdb_\x9d\xe3\xd2\xaf\xec\xf5tCG'\xa3\xb6\x83L\x8a\xf4\x0b\x93PC\x0b\xba\xc7\xfc7I\xc8b\xf0\xe61u\x17\x9d\xe5\xd2\x9br\x97f\xb7" # noqa: E501 '\xcfJD\rf\x84U\xcb\xcfJF\xad3\x8b\xff\xa8Q=\x19y\xf5I\xaa9\xbcQ<J\x1e\xf0qp\xee\xc5\x04\xe9\xfeb\x180d\xe1y\xd43xn@n\xe3\x14\xf4\xf6\xc7/>\x1b\xadR\x90\x13\x1dmJE^C\xd9.k\x0f\xad\xbbz\x06i\xfb\xbe\xbfo9/\x19\rx\xb4\xd6\xf1\x97\xd6IhQ\x88C\xef\x8d\x81\x89(' # noqa: E501 '\xa8ZR\xcf\xfd\x97\x13\xd1\xd9\xfb\x1b\xf2\xef\xf5NB\xe74\x16\xf7\xea-\xe5\xee\xa0\x9a\xe3\xaf\xe6\x9eA\xc7G.\xb61VOD\xa9\x01c\rN7ID\x8b?~\xb0m\xd35\x95\xf3\xdb*\xff\xb4\x8fI\xf3[hy\xa3s9\xe9CS\x91m\xf6\x0f\x03\xcf>IE\x06\x87?\x0c\x13\x89n\xa1\xd4\x01\x1b\x8eg\xf7\xbd\x85\xce\xe5E' # noqa: E501 '\xbd\x1bx \x15\xf5\xd9\xdf\xc9\xad}\xcaM\x94\xba\xba\xf6p\x91\xe8,j\xd44#\xddQ\xe3\x1c\xea:n\xf2\xd4%K\xcf\xa2\xd5\xb9.v7\x96\x9cE\x96k.\xbe\x9b\xd0#\x01Q)\xfb~\x9d\xbb6\x11%\xef\xb3X\xef\xb28\x11m>\xe6o[\xf8\xf9\x0c\xea\xba\xdc\x96\xf9qd"JX\x10\x1bR\xbdm\x12;~\x89\xa8ER' # noqa: E501 '\xf0v/\x8bD\xa4\xd1\xf1\xf9\x90\x9c\x89Ih\x7fT\x06\xda\xf0C\x12Z\xb8\xae\xc3H\xed\x94D\xb4\xcab\xabF\xa18\x11u>2Z\xb3yH"\xda\x12\xb5-6\x7fu\x12\x9a~\xc7*}\xb7I<\xaa;\xc1E\'68\x1e\xfd\xfeu\xdf_M\xdd\xa4\xfd\xdf\xd5\xd3\xf4\xde\xdc$\x14\xe9k1)l\xf49\xb4\xbb\xe8\xd4\xdd\xc8%' # noqa: E501 "I\xc8z\xc7\x98!\x07&'\xa2\xe1\x9f\x97h&\xbc:\x83\x9a-6\n\xbf\xd1\xe6)\xca\xd77\x1cu\xde\xf1\x11\x97~\xd1\xc2(0\xecf!G\xd8\x17\xf0:/F;\xc7\xb9\x87\xdd\xfc\xf5\x19\x97\xde<vf\x83n1\x85l{\n\xb9\xfc\x11\xd1\xceS\xa7N\xcdG/\x1b\x1f\x9a\xa2\xd9\xf0>\x8a\xdf\xfeq\x7f\x83n\x8fQ|\x88\xfa" # noqa: E501 '\xd9\x81Ey(\x7f|\xcfGf\xba\xd1\\\xfe\x0c\xfd}}\xb3\xc3\xb6+\xe8\x81\xa4?\xd2\xee\xa9\x99\xa5\x7f\xea\xd4G\x88>t,\xe3\xf5\xce|t\xa9\xa6v\xb3\xfbE\xd1\\\x9c\xa4?\xc8/\x0c\xd66\x0b\x9b\x19\x8d.\x9d\xe8\xf5\xfaa\xcc\x0e\xae\xbd\xe0\x0f\xec\xa9E_\xba\xc64(\xe4\xda\x01\xf5w\xfd\xd8\xb2{\xf7\xeeE\x9c]\x92\x86' # noqa: E501 '\xb9\xd1\xd8\xec\x1d\xc8\xb38,\xec\xc8\xc8\xdd\nq:\xbe\x1cdjj\x9a\x83\x96\xd4\xeb\xd5k\xff\x92\xd2x!\xfd\xf6\xe5\x97\xc7\x03\x02\x9f\xa0\x08\xa3\xcf\xa1\xe3\xdb<\xe2\xfc@\xbc\x9c\xff\x1b\xe1iQ\xbf\x15p4\x19\xf7\xa5E\x87\x84\x024\xef\xd5\xac\xdc\xceKr\xb9z\xb9qf\xd3\xd0\xde!\xea\xce\xddr\x96\x14p\xf1C\xfb@\x1fz' # noqa: E501 'th\xa2\xf3\x83|$t]\xb6\xd2*\xe3b\x8f\xc5Y\x82v\xa4\xb8f\xa8\xd9gn\xb9\xc7S\xee\xbe\x82\xbe\xef\xc7\xa4\x9d]\x1f\xdf-w=*Q\x89JT\xa2\x12,\x17_\xf5\x1c\xb7\xafY\x1a\xdaX\xa7\xb9\xcd\xee\x99i(\xef\x97\xd4\xd65~\xb9\xf3\xaf\xdfW\x07\xc7\xf8\xe9\xe9\xe9]\xff\xd7\xc7\xa9\x12\x95\xa8\xe4\xff\xab\x14W\xd1\xfe' # noqa: E501 'T\xd1z\xab*^\x95\xa8D%*Q\x89JT\xa2\x12\x95\xa8D%*Q\x89JT\xf2\xffW\x8a\x91\x8a*\xaa\xa8\xa2\x8a*\xaa\xa8\xa2\x8aUA8\xcfU\x80\xd6\xffR"\x8f\xd9\xf3}p.>\x8f`i\xf9g\xe7\x97\x19\xbaK\xae+\xad\x87\xf3\xe0\x90\x0e\xaf=\xa7i2S\xc4\x1b\x1f>/\xcc\x9f\x0f\x84\xb8I\xbfB\xfe\x85\xfc\x91' # noqa: E501 '\xe5A\xafcq\xe8\x88\xff\xbdG(\xea\xd7N\x92\xebN\xf9hI\x8f\xba+\xcc\x9csx\xfd\xe5\x0c|q\xdd\xc9\xf0\x81@\xbdE\x04K\xf3\xdf\x1bU\xeb\xb2$\xb7\x807-\xcf,\xa5\xdb\t~\xfe\xde_1*\xa8\x95 mg\xb2BZ^O\xd6\x9b%\xa0Wv^*\xda\xc3\xf9\\ \xe8a\x1c\xf8(\x1f\x7f\xacB\xfbA\x0f\xe3@' # noqa: E501 '\xe6\xafH\x19\xa5\xab\xa7\x97\x80"\x8ehoL\x8b\xba\x82ZmO\xb9{\xc4\xff\x12G(\x87\xcfi\xe7+\xf8#I\xe67\xdb\xf0\xaeI2s\x9f\xd0K\xdb}MK\xbf[\xccA.\x1f\xeb\xe3\xbfy\xfd\x97=\xfe\x05\xe8\xa5\x9dfp\xd3\xe4l.\xae\xee\xd36\xf528\x10O\xd4[\x84\x9e\xed]+\xed\xd73\x1c\xbf5\x1e\xbc\xbe.' # noqa: E501 '\x08\xae_\x9b\x82p\x03wI\x02g\x9f\xdb\xad\xe1\x9a5k\xce)\x10\xdb\xa7\xf0\x92\\\x970\x9f\xc1/\x8c3\x90\xd4CZ\xfe\xbc\xd2yN\x0f$\xe7\t\x1f!.\xf9\xf8\xcf\x13\xfd\x1eO\xd4sL\x81\xf5V\xcc\xae\xaf\xa7\x17\xc3\xf9\x854\x1f\xa1^Ro\xd5:\xcb\xd8\xd8\xf8\x14;\xbe78=\xa4\x81x?\xbc\xcdK\xb0\x03\x7f\xd0\x7f' # noqa: E501 '0o n\xe8\x7fn]\xcb\xe6}"\xcb\x9b\xc4z\x8f\xe7\xd2\xb0^\xe0s\x87L\xc3\xe7\x19\xd6\xdf)\xfd|\x92\xf3\x9f\xc8\xf5+\xacs\x9cN\xe5\xea\x91\x8f3\x96w\x1e\xc3\xb9r\xf2<=\x99/T^9\xfb\x02\xeey\x06\x9c\xce\xe2\xd5\x97\x1dW\x96@}\x05\xa5\xcf\x0b\xb1\xfe\xe4\xfd\x16\x10\x14\xaeG9\xbd\xa2_\xa8W\xd9\xfe)\xdb' # noqa: E501 "_\x16\x91\x16\xeao\xb2\x7f\x94//\xafW\x89J\xfe\xdbr\xb8\x86\xcfFQ\xea{\x04\xac\x98\x17\xbe\xdf\xb5\xa9\xa4\xdf\xbbQ\xda\x9f\xb2q\x94\xa6\xbf\xad\xdd*QIE\x84|\xff1\xf9^de\xa9(e\xcf\xe7\xca^\x87\xca\n_\xbd\xe5\xfd=2\xb0\xff^\xbf'\x07\xfd\t\xf1B\xda\x92G\x0f\x84\xf7\xf3\x92\xf1\x01\x9b\x12$\x7f\x07\x0c" # noqa: E501 '\xde\x1bK\xd6\xaf/`G\x92,\xc7g\xd7\x94\xc7\x8e\xef\xfd\xcbV\x84\x9d-\x91O\xf6\x0b\xe9\x97L\x93\xed\xe7\xeb/\xbe\xf2\xc0\xaa\xfe\xfb\x9a\x8a*~\x1bw\x1d*\xd9\xa8KY\xd5\xf1T.\xd5(\xa1\xfc\xb2\xdb\xad-P\xee\x9f\xa6\x16%\xcf\x8a\x96\xe3cU\xb7OEL\xc5\xbf\xe3\x96\x9d/\xbc\x9e\xcb[\xee\xfb\x90o\xfd\x957\x1e\xfe' # noqa: E501 '\xfb\x17\x95\xc3\x02\xc2?\x99&\xf5B\xf6|\xe5\xc9\xf8\xf9\xfc\t\x91,G\xf6\x13\x99/\xd4\x9e\xf2\xd6+\x14\x8fP\xbdB\xf3]\xa8\x9fy\xe7\x9bZ\xf9\xd2B\xfa\xff\n+\x1a\x7fy\xcbU\xb4\x9e\x7f\x0b\xc9\xf8I\xe1\xb3\xe7\xcb\xaf\xacx\x84\xe2\x12\xb2+\xef8)\xeb\xbf\xbc\xfe\xbe\xb5]\xe5\xad_H\xff\xbd\xe3\xaah\xff~/\xa9\xea\xfa' # noqa: E501 '+*\xff\xb6~,\xbfl\x1e\x923q\xd5\xfb\xf4\xff\\\xdc\xf2R\x8c\xa0\x1d$\x85\xec@\x0f\x16d9\xbe\xfe\xf9V=_\xfa\xef\xc7\x83?N!=\x9f\x9d\xb2q\t\x95/\xef<\xaa,{\xa1\xfa#\xfa\x9d\x0eov\xf4!*\xda\x14\xad\xfe\xe3\xf6\x02\xd4\xf6\x81\xfb\xc4^\xa7\xde\xa0k\x1b/\xa5\x9ai\xb7\xa4nF&\xde\x88\x7f\xde\x92' # noqa: E501 ':\x13\xdde\xfa\xf2\xddv\xd4\xba!V\xb1\x87v\xd2\x94k\x17\x8f\xa2\x93\xe2>\x94\xe3\xc8\xc5\xad\xf6\\\xefK9\xf8D7O\xbd\xe2LMou!$|F\x7f\xaav\xd7\x16\x92\x94{.TZ\xbbj^\xe1\x85\x03(\xab:\x9fvE\xf6\x18DY\xbd,\\\x90\xd6j0ub\xecz\xd3\xf8k#\xa9\xc6\x0f\xe8"W\x8d\xb1T\xfb' # noqa: E501 '\xa5\x9f\x12\xe2\x1b\x8c\xa5\x96{\xa0\xa4\xc8\xd9\x13\xa8V7:~\xe9\xfd\xc5\x9f\xa2\x1c^\xe55\xd6\x0c\xa0Pv\xd1\xed\x03}\x03\xa8K\r3\x1en\xfd\x9d\xa1v51/\xaek\x1cL\xdd\xcbL7\x0e?\x1dL\r\xd2n&\xb90"\x942\xfe8\xcaJk\xf6\x14j\xe5\xd9\xcf}\'<\x99Ie\xb7\xdev1H}\x16\x15r\xab{' # noqa: E501 '_\xef\xcc\x08*y\xfc\xaf\xc3\x1c\xb2"(\xf3\xdf\xfa\xd9v\x90R\xb7F\xcd!c\x1fEP\xa7\x12\x9f\xa6\xd8\xfe1\x8f2\x9c}\xaf\x81fX$e\xdd\xe5\xd9\xaa\xabR\xaa\xed\x1e\xb0\xa1{D$52\xabm\xdc\xe1CQ\xd4\x88q\xe7\x9f\x1ci\xbe\x88jU}\xce\xea^_\x17S\xcd\x9a\x16\r\xb8\x9c\xb9\x8cj/)\xda\xbc\xf5\xcf' # noqa: E501 '\x95\xd4\xb2-^5B\xfb\xaf\xa6\x82\xdc\xedZ\xfa\x05\xad\xa5\x06<X\xedn\x92\xb5\x99\xda\x90\x90i\xf3\xe8\xda\x16jZk\x07g\xfde;\xa8=\x99\xae\xae\x1ey\xd1\xd4\xa9W?\xd7\xdf.\xe5:\xef<+W\x93=\xd4\x89\xeb\xc93m\xd5\xf6Q\xab\xd7Mlu\xeb\xf9>\xea\xe93\xf5\xb8\xe7\x13\xff\xa4\xf4\x86\x9aF\xd5M\x89\xa1\xfa' # noqa: E501 "\xacz[\xfdU\xad\x03\xd4\xb4\xd9'F<\xfd\xf1\x00\xb5\xad\xa6~\x8cZ\xfc\x01\xaa(\xd2\xff\xe7\xbf>\x1e\xa0\xc2\x1665\xfdR\xe3\x08us\xdb\xee\x8dE\xf6\xb1T\xe6O\xcfFM\xdcp\x94\xb2\x1f\xdc\xe8k\xe3\xa3q\xd4\xcd\x81W\x1e\x06\xa8\x9f\xa2\xfaM\xae\xdd\xf5\xc5\xf3S\xd4\xb4\x15\x92+\x9f\xb6\x9d\xa6\xee\x0f\xfc\xa1\xa5\xa68\x9e" # noqa: E501 "\x9az|\xec\xfa\x97M\x12\xa8\xf6\xa8\x93\xc3\x87\x11\tT\xfa\xd5wC\x9b\xafL\xa0\x1a;\xbc\x1e\xf4\xd3\x8aDj\xc8\xe4\xf5S\xb3>$Q\x13\x7fmr\xf3\xe7\x83g\xa9\x1eG\xbbMns\xe9,\xf5\xd7\xacI':7I\xa6\xc6O\xd4\xf9m\xa9\x94\xe9\x85\x0f\x9a\x17\x0e\xbcD\xddX\xe4ts\xce\xba\xcb\x94\xff^\x9b\xfa[\x7f\xbaB" # noqa: E501 '\xe5\xa8\xfb\x0cu,\xbeJYJ\xc6z\x15:\xa7\xc8\xf4:\xdbS\xa8>\xa3-\x03\x9f\xfb\xdc\xa0$\xfb\xbf\\\xfb\xbc\xe5\x06\xb5\xbf\xc7A\xb3e^\xa9\xd4\x9c\xd6g"\xbf\xba\xdd\xa6F=x\xd2E\x8b\xb9M\xd5\x92:\xac\xb98\x8d\xba\\k\xffR\xcd\xc1\xe9T\xf0\xc2%yk\xf4\xeeQ\xfb\xd2<\xa6d\x8f\xcb\x91\xf5\xc3\xd8/9\xd4' # noqa: E501 '\xa9\xedv\xa3/\xa6?\xa2\x0e\x0fJ\xce]\xab\xfe\x82Bn\xbd\xab\xaf\xd5}Ay\x87\xfe1\xf1\x97\x17/(f\xea\xedgk\xdb\xbd\xa42\xa6l96r\xea+j\xa44\xb0\xbc\xd9\xaf(\xed\x18{\xad\x84\xacW\xd4\xec\x84\x804\xba\xe0\x15\x95y\xef\xf5\xc4\x87\xd5_S\xc9\x16]\xebG\xac{M\xb9g\xbb\xefCi\xaf\xa9\xd4\x17\xeb' # noqa: E501 '\xe6\xc4g\xbe\xa6\x86\x05\xd6)\x1a\xfa\xec5\xb5\xd7\xc1b~\xc0\xf3\xd7T\xa7\xc6\xf1?l{\xf1\x9ar{\xf9dC\xb7\x97\xaf\xa9)QO\xf6F\xe8\xbe\xa1\x8a\xed\xad\x9b&\x86\xbe\xa1"\xda\xa6\xdb\x99\x85\xbd\xa1\x9a\x8d\xf6>\xfee\xe9\x1b\xea\xf21\xfd\x11_k\xbc\xa5\x86\x0c<\xd46\xbe\xd6[*\xeeV\x88\x9bs\x97\xb7\xd4\xceY\x19' # noqa: E501 '\xa9=5\xdeQ\xb7z6[\xba}\xd4;\xea\xc9\xb4\xcb\xd4\xb8F\xef\xa9\x07\x87\xe7\xcd\xb4t\xfd@]\xda\xe2t\xa4\xf5\xb6\x0fT\xc9\xfba\xbd\x9f}\xa2\xb6:\x1d\tA}\xd4\xe8\x03\xd6\x01-\x8b_\xaa\xd1\x1d\xbb\x9f\xbcqz\xa7:}\xba\xee\x06\xfb\xdf\xc3\xaa\xd1\xa2\x84]fO,5\xe8\xb6o\xd7>\xb0\xe9\xabAK\x8b\x9d\xb4\x08' # noqa: E501 '\xd6\xa0\xc7,=\x13j9G\x83>\xf8$\xe4pqSM\xbaS\x14\x9d\xe5qT\x93\xfex\xe9\x99\xb3\xc9\tM\xfaJ\xb7\x81\xd7\xa7fh\xd2\xe7\xd7\x1d7\xb8\xa3\xa5Eo\xb0\xdfz\x08\r\xd6\xa2w\x9cL0\xec<\\\x8b>\xb6\xb8z\xb1\xd1|-\xfa\xfe\x9d9!\x99W\xb4\xe8\x11E6\xc7kt\xa8N\xaf]V/l\x84\x94a' # noqa: E501 '\xc9\x16q\xe3wW\xa7\xa5\xfdr\xef\xeb\xcbZ\xb4g{\x91\xed\xe9\x80\xda\xf4^\xdf\x0c\xe6\xb4I=\xbaW\xd3\xc2\xf1_S\xea\xd1^\xb3\xd3\xc3\x9b\xd7\xd6\xa5\xcd\xeb\xd5zsMW\x97n\x15Z\xed\xee\xa6\x06\xba\xf4\x91W\x9fS{\x19\xe8\xd2\xb1\xe3g\xa7/\xb5i@w\xbc\xd2\xadn\x90]\x03\xfaq\xec\x9f\x89\xb3g4\xa0k.l' # noqa: E501 "\xbemP\\\x03z@\xc3E\x0b'\x9b\x1a\xd0\xcfF;\x9e\xda\xf6\xd8\x88^?uC\x8e\xd7\xf0F\xb4^\xc7\xee\x9fo\x8emDw\x1fx]\xef\x8e\x94\xd7M\xef\x1d{5\xbd1=e\x90\xb1\x81dNc\xfa(57\xa7\xc1\x8e\xc6t\xb5\xf5\xda\xf7\xec?7\xa6GEv6\x18\xd4\xb5\t]<\xffB\xaa\xe1\xa4&\xf4\x94\xac\rC" # noqa: E501 '\xee\xcfnB\xdfP\xcb8\x93X\xcf\x98\xbe6\xe1\xd6\xc4$\x17c\xfa\xf2\xb3\x0b\x89\x07]\x8d\xe9\xfcE\xe6\xfe\xdb\x06\x18\xd3\xb5\xab\xb5\xed+\x19lL\x1f5\x9e_\xd8k\xa91}v\xa9\xdd\x9d\xc7[[\x94\x94\x7f\x91\xbe\xad\x05=6\xce\xf9r\xf6\xf9\x16t\xc06\xf5\x13\xce\x05-\xe8/>\xef4w\xa9\x9b\xd2\xa6~\xd3\xe2B\xeb\x98' # noqa: E501 '\xd2\x17\xdb\'\xbd\xb8/ez\x8f\xe9\x9d\xbb\xd75\xa5m-w\x1f4\xd15\xa5c\x06O\x0e\xeb\xdd\xcc\x94\x16\x1f|\xb2\xd2o\x83)}\xd9\xdd\xa5`\xcbFS\xda!"6\xab\xe6fS\xfa]\x9egB\xfaVS\xfac\xd7\xa0\xabz\xd1\xa6\xb4t{h~\xfd\x9d)\x1d]\xd0o\t\xf5\xde\x94>\x99\xab\x7f2A\xca\xc0\xe2\xf9\xce\xeb' # noqa: E501 '\xc5ft\xe2\x1b\xf3\xa6+\x83\xcc\xe8F9#\xd7\x0e\x98iF\xb7;\xf0\x9b\xcd\x81EftJ\xef\xb4\xc1\x9f\xee\x9a\xd1.\xa3"\x8d&5oE\xfb\xe7\x7f\xbcp\xa1\x8f\x94\xc3\xc3\x07\xde\x1d\xd6\x8av9_\xa3\xc7\x93\xc7\xad\xe8\xde\xbe\x81)\x877\xb7)i\xe7\xe4\x93\x949\xfd~h\xae\xd3\xce\xd6\x96\xf4\xed\xb3\xfe\x92\xe9\xe1V\xb2\xf1' # noqa: E501 '\x8c\xaa\xdf\x8e\xf6i\x94\xb3\xeeC\xdfvtV\xbbe\xe3&.jG\xbf\xb9wgN\xcc\xddv%\xf3\xa2\xb1Aa;\x9a\x9e\x9b3\xf1\xc2\x97vt\xfd\x1f\xe3/6\xdbmC\xeb\x8d\xec\xf2\xba\xcfg[Z\xbc\xfc\xe9\xfd\xf6\xd5\xec\xe8\x16\xfb\x83\x0b\xba\xac\xb6\xa3\xa5\xdbl\xa2e\xff\xf6%\xccm;\xaa=moo\xdf\xc0\xd8\xa7=}' # noqa: E501 '\xed\xddP\xaf\xd4\xd3\xed\xe9&6\x0f\xf2\xf4\x82\xeci\xa6\x87\xce\x1d\xf5\x8d\xf6\xf4\xb8\x87)9\xee\x17\xecK\xe6\xf5\xea\xac+\xf6\xb4k\xa7\xa8\xec\xa7\xd7\xec\xe9E~\xf9\x1fCS\xeci\xe9:\xb9\xf9@J\xe9<\xf8\xf04\xc3\x9e.\xf8\xb8\xfb\xc5;)_\xde\x18\x90\xb37\xc7\x9e\xce\x1c\xb4x\xc4;\xbd\x0e\xf4\xc0\xf1\xba\xeb\xce\xe9w\xa0' # noqa: E501 '\x9fG\x9fk\xfb\xbeg\x87\x92~\xbb\x7fgP\x07\xfa\x9cK\xa7\xc7\xebvt\xa4\xa5\xd32-\xc6\xbe\x0b\x9d\xb7\xe3\xd7\xed\x0b\\\xbb\xd2\x01\xf5\x7fT\x8b\x82\xdf\xc5\xb6:M\xc9\xb8\x1d\xb3d\xfd\x97\x90ZP\x8c\xf5#n\xb0\xf9\xcf\xa9\xff\xfdY\x1c\x1f\xc6\xe67c\x7f?\xd9!\x16s\xc73\x19\xb3.\xe1\xdf\xb7\x8f8U\xc8\x96\x1b\x8b\x99' # noqa: E501 "\xb5\tS\x8c\xcb\x8f]@\xe18:\xa5\xca\xd2\x9b\x83\xf1\xefas\xfaj\xf7e\xfa\xfd]\xf1\xef\xcd\xeb\x1f\xe8&\xa3\xf6\x9f\x98?i`\xbb\x88'E2;\xed\x1a=\xf1\xef\xbe\x7f\xed.\xe3\xa1\x93HF\xab\xb1\xd8\xbed\x1f,\xa1\xf7\xfbnr\xf9\xf1]k\xe2\xfa6\xea\xe1\xdfK\xf7d\xfb'\xe8\x9d\\\xfdj&8\x1e\x87\xe1\xb8<" # noqa: E501 'u\x18\xd7W;\x1a\xdbG\x04\xe2v\xa5t\xc6\xf6\x9b{h\xcb\xd9\xa9u\xb8\x8d\xdb\x19\x8d\xfbg\xddH\xfc{\xe5\x8b\xf6b\x7f\xe2\xdf\xb1\x9f1kp\xfcT>\x8e\x17\xfc\x98\xcc\xc2\xf1\x81\xff\x08\xb6\x1f\xd4D\xb8\xff"\xee\xe1~\x88\xff\x84\xc7%\xe5/l\xaf\x86\xe4\xfb\x8bk\xef\x11\\\xcf}\xb6?~R\xeb\x81\xeb\rg\xc7u\xe8m' # noqa: E501 '\xea\xddm\x17\xe7\x15f\xd9h\xd8\x95#\x86\xaf\xb5\x9er\xe7\xd4\xea,r\xda\x98?=\x03\x85\xb7\x1b\xa3\xef4$\x8f}\xcf\xeb9\xf6<\xe2=T\xack\x11\xb61?\x1d\xcd\xd7\x1f}\xef\x88\x7f!r\xd3\x1e.\xb6\xd9\xf2\x14%\xee\xd9V\xd4\xeaP2\x9aQ\xb8\xc3\xccy\x05\x9c\xbb/@\xc95\x93c\xfd\xef\x9d\xe3\xce\x95\x81\xbd\x99\xc4' # noqa: E501 '\xa0w\xef\xdey\xdc{\xa2\xddJ6\xae!\x05(\xad\xa3\xcdyG\x83\x1c\xae\xfc\xa66A3\x1a{>\xe6\xde#\x0b\xf5\xce\xcb\x98x\xdd\xc9\xf0)\x97\x96\xae\x0f\xe9\x92{\xc8\xf9\x99\x13s\xfeU\xf7k\xb9h\x93\xc5\xbe\x9aO[\xe5\xb1\xf5?\xe6\xda\x0b\x84z0\x1fs\xef\xb5\xbd\xbb\xb3\xd7\xa4y\x0f3\xb8\xf2\xf0^`8G\x8f\xeb\xcd' # noqa: E501 'e\xdf/\x9c\xab\x90\xc6\xfe\x14\xcf\xd59[g4\xd0\xd7O\xe2\xce\xe5\xd7\x0e\xdb\xe4d\xe8\x9e\xc7qeV\xd1\xe8\xc9{\xe1\xfc]\x0e\xd7\x1f\xf0\x9e\xf6Yu\x1ew\xc9\xdf\x90[\x1aG\xb3\xbd5\x9a\xcfT<\x0f\t\xe7\xc7\xa1\x1c\xe8\xff\xda\x1e7xl\xaf\xd2\xe7\x0e\xa0\x9f\x02\xbb\x99\x1f\x8b\xd6{\xc4\x11\xe2sI\x88{\xbd\xb3\xd3S.' # noqa: E501 "]\xfcb\xe8\x84U\xef\x8f)\xa4\xe1|3Yo\xcb\x80\x8c\x14'\xc3+\xe8\x97#\xa1\xaf\xec:_\xe3\xcaA?C\x1a\xeca\xfc\xa6\xbc3\x9c^\xe7\xe1C\xce\x0e\x08\xf9`\x8f\xcb\xefF\xcf~\n\r\xba\xee\x14\xcd\xc5\x8b\xdb\x97\x86\xb2[\xb8\xbd\xee~\xed&\x9a\xd7\xba\xce\xd8\xa8\xbb\xb78=\xcc\xbb'M6\x0f`.lF\xe9=[" # noqa: E501 '\xf7\xb7\xd8\x91\xc7\x11\xf4d\xff\x02\xa3\xb3\xdfZ\r9~\x00\x99\xb8\x19i\xd4\xa8{\x82;_\xdb#\xe9\xe0\x99O\xfb\x8e\xa0\xf7\x1a\x85\xad\x7f\xf5\xcb\xe1\xda\x07\xfep\xfdYh\xe9\xc8\x1a\x86\xee\x128\xaf^\x1a\x07\x8co\xbb\x8b\xfb\xf64qM\xe0\xf4P\xafu\xfe\xb4\x96\xef\xe7l\xe2\xf2{z\xf6-L\xa8\xb1\t\xb9\xb6\x18\xb9\xe5\xe4\xbc' # noqa: E501 'G(.\xcc\xdb\xe3E\xc3Ln^\xc3<!\xd7ex\x8bu\xd6q\x059\\\xb9\xc4\xc9\xa6\x16;V\xe5p4x\xd0_\xff\xc3\x9e{D\xbf\xe5\xb0\xfdv\x10\xe9\xc5Mz>\x899\xc8\xad\xe3IW?\xad^Rt\x0c5\xd0K\xa9\xf3\xb0C\x12\xe7\xd7\xbe\xff\xeel\xa9\xa0~G\x83_4\xf4\xc8&\x9e\xa7)\xe0\xd2\x8f\xd7\xef\xb2x' # noqa: E501 '9*\x9fKC\xbf:\xbb7zQ\\\x9c\xc5\xb1\x1ar\xea\x98\xee\x9d\xcb\xb5\xf3\xf4\x91\xe9\xb4\xc1\x81\xfd\xa8k\xe7\xe7\x9d\x96\xe4\x1eEQ\xdd\xce\xf65t?\x842\xd5\xd7\xf42w\x8cA-\xfa\xcd\x9f\xe3\xba\x10\xce=\x9f \x18\xcf\xa5a]vkl\xf7\xd7\xf6AO\xd0\x16\xc6\xcf\xfez\xef\x83\xa8\xdb\xd1\x9e-\xfb,:\x8a\x16>\x1f' # noqa: E501 '6r\xf4\xe88\x8e\xc5\x8e\xf9\xafFu*\xd5C\xfd+\x8a\x97.\x18\x9ev\x02\r7\xf6\xe95_\xe70Ji\xd5\xf9Z\\\xc2!.\x1f\xdew\x0f~I\xe2\xe7%N\xa0\xcb\xdayM\x8f-?\xaepN\x9e\x8c\x03\xce\xa7\x9b\xd9\x19-\xd9\xab\x1d\xc7\xd9\xa5\xed9\xfe\xde\xc2\xfa\x18\xfa\xe1\xed1\xfd\x8e5\x0e\xa0\x88\x97\xbf\x1dq\xe9q' # noqa: E501 '\x0c\xcd\x9d\xd7\xd6\xd0\xe3\xc5aN\x0f\x04\xfd\x97\x93\xce\xba\x9at<\xb7\xaeA?\xf4\x89I\xd3\xedt\x1c\xea\x8c\xa2\x9bDz\xeeB\xc1\xf3~\xf6J\xfa)\x06\xedj2\xa9v\x8by\x9b9B>\x1f\xc1\x0e\xfc\xc57\x1f\xd9)\xdd;\x11\xbd\xee}hJ\xad\xd3q\xec{\xe2\xb7q\xebi}r\xc0\xe89Zk\xb8\xfe\x18\x91\xfah\xa8H' # noqa: E501 "t\x98\xeb'<_\x8epiX\x0fP\x1e\xd2\xf2\xe3}\x14\x89-\x07\x19\x84m\x89%\xce\xc5\xc7#\xd9\xf6r\xf4\x14\x1a\xe0\xefg\xb2\x9d^\xcf\x8d\x17w\x9e\x9e\x8dgR\xe0\xc9Uf\xce[Q\xc3z\x0eu\xf5\xf4\xb6p\xf3\x19\xf6\x95\xbcy\xb9\xd2\xcf\x03x\x7fx\nG\xbco\x91\xcf]\xa5(\xec\xdf\xf2\xcf\xb7\xa4pi<\xbe\xe9\\" # noqa: E501 "}\xe4sMAE\xcc23\xe7\x03\xdc\xf3\x01\xf2\xf9\xb1\\?\x81\x1e\x9eg\x804\xe4\x93q\xcb?7\x15O\xd8\xc5s\xcf\x8d@\xbd\xf0<\x02\xf9\xbc\t\x94#\x9f\x97\x90\xf7\x9fB\xc4{\x99{.\x84l\x0f\xa9'\xe3%\x9fk\x81\xf6B\x1c\xf2\xfa\x1b\\\xdcP/\xc4\xcd=_\xc1\xc6\x0b\xe5\xca~\xae\xab\xb4\xdf\xc0\x0f\xe4\xe3x\x8f\xa3" # noqa: E501 'i?\xe9\xf7\xb8\xf6\xaa\x88\x9b/c\x0bf\xf6,\xac\x9e\xcb]\x87\xc18\xe2\xe7\t\xef\xa3\xcf\xcb\\\x13>\x18\xdd\xe7\x9e\xb3\x81\xf9\x02v\xe4s\x13\xba\x17f\xce\xd6|\x17\xc3\xa5!\x1eh?\xf9\\\x047~\xac=\xd4S\xf6\xf3\x0bY\xbc\xcfW\xc0\xefF\x90z\xf2\xf3\x13\xae\x17\xb8\xf8\xd8~\x85\xfe!\xcb\xc3\xf37\x90\x86\xe7t\xe4\xdb' # noqa: E501 "\x1d\x8f^F\xae\xda\xb0aC\x11\x17\x07|\x1e\xc1|\x81|\xee\xf9%\xf69\x1d\xb0\x03\x82\x1e\x9e_\x03=\x94\x83~\x84z\xc0\xef\\\xd9\xf5T!\xd7.\x18g\xb0\xdfU_\xeb\xf3\xa7O\x8a\xf1A>\xd8Cy\xf0\xab\xe5\x1aW\xaf[\xcc6\x85\xb4\xef\xc9A'\xe7\xbd\xdd\xca\xd5\x0b\xf1\xeexc1\xfa\xbc\xe3N\xd4\xc4\xaf\xe1\xc9\xc8\x97" # noqa: E501 '\xbfs~\xaf\xe4:\xce\x981\xa3\x90\xf3#??\xb2\xd0i\xc7\x1a\xe9Q\xbf\xa5q\xfe\xc0\x1e\xae#\xc0\xae\x9a\xf6\xbc3\xda\x9f\xcfq\x04=\xac;x\xfe\xae\xe7\x89\x1f\x0c#=\xcfs\xe3\xcd\xf5/+\xd0nR\x0f\xfdC\xe6\xe3\xcf\x91u\xec|\xfd\x85c\x86\x95\xf3\xf2\x84\x0f\xeb\xd0\xcc\xe837\xa4\xc2\xad+\xd2\x9f\xc28\xb3\x02\xe9s' # noqa: E501 "\xcf5\x0c\xf4\xf5\x0f)\x94\x834\xe4C\xbb\xa1\xbf\xa1}d=\x90\xcf\xa7'\xcb\xe1\xe7\x18\xaf\xa3e^\xed:\xae\xba\x93\xc2\xe9\xddF\xb4\x1f)\x12\xed\xe0~\x87\x04\xf4\xd0\xcf@\xf0K>\xe7H\xceW\xf9}\xff\x8eB=\xe0\x8f\xcf\x0f\xcc+\x98g\xe4u\x00\x10\xae\xcb\xc1\x8eL\xc3\xba\x84\xfd\x11\xfc\x92v|\xe5\x81\x107\xe4\xf3Q\xe8" # noqa: E501 '\xfa\x84\xcf?\x1f\xf9\xfa\x07\xc6\xa9\xbc\xfeH\xc2:\x87\xf9\x07~\xd5*(\xe0\x0f\xda\x0b\xdf\x9f`>C\xff\xcb\x97\xda\xcf]\xef\x80=\xc4\x01i\x88\x17\xd20\x1e\x90\x06\xbf$!\x0e\xb2]\xe4\xb8\x80\x9e,O\xee\xff\xf2\xcf\x1b\x93\x92B\xeccjjp\x1d \xef\'\x85\xcb\x97\xbf\x8e\xcb"\xecT\xf2_\x11\xf9q#\xaf\xaf\xd5\xd4\xe4\xaf' # noqa: E501 '\x7f\xf8\xcb\x93\x9f+\xe4u\x13\xa9\x87r\xf2\xcf\r_@e\xd7\x97\xa5p=&__\x16\x97&\xfd\xf0\x91\xbc\x8e\x82\xfd\x16\xe65\xdfu \x19\x1f_\x9a\xac\x87\xaf<\xdf\xba)\xfby\xfcR\xff\xa4\x9e\xecG\xbe\xf8\x85\xd2d\xbd|\xf6B\xf1\x97\xfd|1\xec+\x97\x15\xe2S\xb6\x1e>\xfb\xcfW\x12"w\xee;\xcdQ\xd9\xfd\x88\xaf\x1f' # noqa: E501 '\x85\xf4d\xbe\x90\x7fr\x7f\x15\xf2\xc7\xe7\x9fo=B\xbb\xe5\xdf\xf7\xa28\x1f\xf9\xbe\xffA9\xa1\xf6\t\xe9\xc9\xef}d<|qq\xf3\x8f}\x9e_h\xdf\xf9g\xa4\xfc\xbf\x8fV\xd5\xc2\xd7\xafU\x1dWy\x05\xe6sU\xc7Q^!\xf7!\x15U,\x8bx\xb6\x94\xbe\x0f\xa9\xbc\xd7]\xf2\xe5\x15\xaf\xaf\xc8\xf7U\x90\xd7c|\xd7)`' # noqa: E501 "O\xfe]\x8b\xef\xfd#d\xbe\x10\xc9\xb8\xe1{\x06\xf9}\x82\xcf/\xc4\xa7\xec\xf5\x81\xb2\xe5\xc9~\x12\xba\xae#\xf5\xca^\xcf\x08\xd9\t]\xa7\t\xc5\xcf\xd7^,)\x95~\xdd\xb5~\xca\x1f\xaf\x17\x87'rT\xf6\xba\xab\xbc\xfd[\xde\xcf3\xb0#\xaf\xbb\x84\xfc\xf1\xf9\xe7\x9d/l\xbb\xc9\xeb\x9c\xb2\xbf_$\xf3\xfc]\xf8\xa6`\xfb\x84\xf4" # noqa: E501 '|\xd7s|\xedPv\x9dT\x8d\xe4Uq\xfd\xe5\x97\xff+\xd7]0\x9f\xab:\x8e\xf2\n\xb9\x0f\xa9\xa8bY\xc4\xb3Eu\xdd\xa5\xba\xeeR]w\x95\xa7\xdfU\xd7]e\xebU\xd7]U+\xaa\xeb\xae\xaa\x95\xaa\xfe<W\xf1\xbfA\xb8\x1fP\xfd\xe4\xb5\xad?[?a\xaf\xbb\xd2\xb8\xfb\xcap\xcely\xcc\x92\x80\xb0\x9b\x97\x14\x88\xcf9' # noqa: E501 '\xdf\xe6\xce\x83\xc3:\xc7\xe7\xf2Oq\xe7\xff@o\xf5\xeb\xd3\xd5\x81\x1f\xce\xa1\x86\xb2}\xf5\x01w\xde\x06\xecq\xbdi\xdc{\xa376:\xba\xea\xce\xe0\x0c\xf6\xdc\xd0\r._\xfe\xdc}\x16\x97>~vG\xabCkSP\xc9s^=t\xeep\xe7#\xe3\xb7\x7f\xdc\xdf\xa0\xdbuNO\x9e\xef\x82\xf6`\x7f\x8f\xb8v\xc1yO\xf0\x0b\x84' # noqa: E501 '\xfb\x9a\xe0\x17\xda\t\xf9p\x8e\x1c\xe2\xc3\xe7\x05\x928\xc2\xb9P\xc8\x87\xf6\x02g\xad]\xe4hp \x85\x8b\x0b\xf4\xf2\xe7enpz\x85\xf79\xb3~\x810\xae\xf0yf5\xe9\xd5\xee\xdf\x7f\xbf\xc8]oW{\x93\xf3kZ\xd4In\xdc\xf1x\\\xe5\xf2\xe5\xcf)d\x11\xe7P\xe1\xfa\xf9\x18Z\xd7\xbc\x8b\x8b\xc5\x8e$N\x0f\xe5\xd6\x9c' # noqa: E501 "\n~\xd8a\xd5\x1d\x9e\xeb\xe7b\x858\xf1\xb9\xa3Tn^\xc9\xb7\xa7\x98\xf3\xa7\x1d\x136z\xf4\xe8\xbb(\xef}A\xb4\xbe\xce%\x8e\x01NW\x9a\x19\x1bg(\xf4+Ih/\xec\x9b0n\xf2\xed\x07\x89\xe7\xc6\x03\xec\xb8\xf7{\xb3\xfd\xfe\xa3'\xaa\xbffF\x1cG\x18G\xf9\xf8\xd5\xd4\xe4\xdf\xf7\x9e\x82,\x1c4G\x9ew<\xc7\xe5\xcb" # noqa: E501 "\x8f\xe7AN\x8f\xd7\xc1\xff\xba\xcf\xc7\xe6C\xbb\xd9\xd2\x08\xe2U\x1f\xff\xfaN\xd4o\xe7\x11\x94#\xafW\xe5\xe7K*\xb7\x1e!_~]\xa7sq\xc2\xb9G\xf2\xfc-\xcc\x03\xa8\x97\xac\x8f\xeb\x0f\xe2\\*\xac\x0b\xbc\x9e\xb2\xb94y\xff\x92\xeb'\xb6<\xaco\x88\x03\xe61>\x0fz\x84=\x0f\xbd\x17u\xca[\xf1<\xa1\xc6i.n " # noqa: E501 '\xf8\x87\xe7\x81\xd4\x08\x01;\x18O\xf2<.\x99\x0f\x84\xf8p\xbf\x1f\xe0\xe6\t\x94\x03?v\x133^%\xd4\xf8\x93#\xaeu?\xcb\xa3\\\x7f\xce\xdd9t\x89\xdd9\xc54\xc9\x91\x13o\x19n\xa7\x7f\xe7\xea\x01\xc2\xb9[\x88\x0f\xfa\t\xf4@2>\x18\x07\xd0\xe3t\xe9yC|\x8e\xea\xc87^\x1f\xc5s\xfd\x04\xe7\xaa`>\x93\xe7\xac`' # noqa: E501 '\xdf$\xcf\x17\x92\x1c\xddPo\xdc\xb1\xe8\x18\xce\x0e\xc6\t\xd2@8_\x06i8\x9f\x8ak\xdb\xcc\xd5K\x9eC\x03\xfd\xb0uc\xbc\x8fEo\xe1\xfa\x13\xf6;8\x97\n\xf3\x1f\xe6/\xa4\xe5\xbf\xdf\x17+\xd8\xc9\xef\xb7)\x9c\x1e\xf6}\xe8\x1fX\x97d\x7fB\xbe\xfc\xb9\x80x\x85}\x12\xfc\xca\xef\x1f\xa5v\xe4\xfc\x80|\x98\x87\xa4?\xc8\x87' # noqa: E501 "\xcf\x07\xf2\xbc$\xce\xdfO\xd8\xc3\xf7\x85c\n\xe7\x1bH;\xf9\xdfG8S\xea\x87\xdd\x07\xe5\xf7\xb5\x83\n\xbf+@\xfa\x91\xff\x1c\xe3\x17\xfbm\xab\x1a\x1b\x1b\xef\xe3\xfc\x90\xcf\x13\x80\x1f\xf9~R,/\xdf\xde\x0b\xdc\xf8\xcb\x93\xff\xfb\xb5\xbc\x08\x95+\xd5\xc3\xbc\x01\xbd\xfc9\xaf\x1bh\xd0|\xbfg'\xd5Sy\xe2)V:_\x88|\xe5" # noqa: E501 "\xe5\x9f\x8f+\xfd\xbe\xc8W\x1e\xd2\xd0\x0e!;\xe0\xdf\xf7{1\xcf\xf7~\xc5|2-\xd4>\xbe~$\xdb\xc1W/9\x9ee\xa7I}1\xb7\xcf\x90\xe3_Y\xe4\xebw8/\xc4G\xa1\xbf\xab\xf1\xe9\x95\xfd{\x0c\xdf:P\xf6\xef\xa0\xf2\xfb\x95\x9a\x9a|\xfbJ\xaf\xcf@\x0f\xdf\x07H=\x99\xcf\xa7'\xe3!\x7f\x87\x85o\x9e\x97\xfd\xf7" # noqa: E501 '\xb3\\\x85x\xf8\xe2"\xd7\x05_;\xf9(4\x0ed\xff\t\xd5\x1f\xfa\xb6\xef\xb4i\xd3\n\x94\xf6\xfb\xbdD\xd9\xfd\x8co\x1c\xe4\xd7[\xf9\xeb\xfd\x1em\xfa/\xd4_Q1[P\xf7\x96i\xbd\xf9\xdcz\xcf\xb6\xf3\xd0:\xdfa\x0e:V`wtp\xc8\\t\xd9o\xf1\xf2\xd8\xe6s\xd1\xbd[\x07\xbb\xd8\xad\x9b\xc3k\x07\xdf;a\xfcZ' # noqa: E501 '\xee\xd4ka4g\x0ej\xf5\xe2\xb0\xde\x9a\x19O\xb8\xf1\xd6\x7f\xe7\xe00\xca\xa1\xb4\xbe\x19\xb3\x03\xebk\xd2\xcb\xb8|\xee\xfa\x94\xd0\x03\xbdW;;z\xa4,\xe0\xd2:\xae\xe7\x7f\xd4|\xb7\x9cKC9\xd0\x03\xf7\xe6\xd6\x8e<\xd6\xd6E\xc1\x1f\xe4C<\xf2\xcfKD!\xb8N\x05{H?\xdct\x7f\xdc\xf3u\x0b\xd1\xcf\xfeI\xad\xe9\x8d' # noqa: E501 '+8\xf2}\x9e\x91\xf9\xd0N\xfc\xfci\xa9\x1f\xa8\x17\xe2\x02;\xf03\xf1\xe0\x80\x8dA\xb3\\\xb94\xd8\x91zh\x07\xc4{\xec\xa9iS#\xa3\x9f\x14\xdaK\xf6\x13\xf4\x1f\xf8\x93\xbfn\xaf\xea\xf7o\xaa\xa8\xe2\xb7\xb1i2#\xfd\xdfS\x8e\x15\xf3\x03\xa2\xac\xbe\xa2\x14\xf2\xa7l\x1c\xa5\xe9ok\xb7\x8a*~\x0f\x92"\xa4W\\\xcfe\x97' # noqa: E501 "\xab\xeavU=\x85\xfa\x87o?\xe0\xdb'\x85\xd2Bq\x94w\xff\x91\xb7/\x8d\x9bl\x8f\x90]\xc5\xf6=\xfe\xfa\xfe^*{\xfeW\xfd<R\xf1\xbfH\x10\xa1y\xf6_!_\xdcB\xed\x11\x92\x8a\xfaS\xb6\xbf\xab\xba\xbf\xbew\x1c\xca\xfa\xaf,\xf9^~U\xa2\x92\xb2\xa4\xa2\xf3L5?\xff\xab\x02\xf7\x87\xf1{z\xb2\x11\x99\x86\xfb\xd4" # noqa: E501 '\x90&)\x7f~K\xb1\x9c\x90?\xc8\'\xed\xab\x8a|\xed\x12"\xbc\xcf\xab\xbc\xfe*Z\x9f\xb2\xed\xe0\x1b\xd7\x8a\xc6\x07i\xb8\xbfN\xa6I\xbd\xb2\xf1\t\xcd\'!;\xa1q\x10\xa2\xfc{8\x84\xf5d>\x1f!^\xf2=\r\xca\xc6A\xf6/i\xc7\xd7\x1f\xf2\xefc\xf8\xf6\xf9D\xf6+\xd9N\xd2N\xc1\x9e\xb8\xbf[\xdeq\x11\xba_,4' # noqa: E501 '\x0e\xca\x92\xac\x1f\xceiU\x96\xff\xefM\xbes\xf5\x95^\x1f\xd9\xefB\xe3#0n\xf8\xd3\x88\xff\xfdl\xff\x1a\n\xcc7\x987\xf2\xefkQ\x9c\xff@x\xde\x86o]\xf0\xad\x1b\xb8\x8f\x0c\xeb\x1f\xce\xbd)K8\x8f\x04~\xf9\xf2\xb9\xf3\xa5,!\x9f\xaf\x1c\x10\xe6\x1d\xf7^V\xd6\x1e\xce\x05\x80\x7f>\x7fP\x8e\x8c\x87\xd4s\xe7\xa4\xd9\xf8' # noqa: E501 '\xc8z\xf8\xfc\x96ME\xff\xe4\xf94\xc8\x874\xd9^\x88\x83\xf4O\xda\xe3\xf9^\xd5\x7fgPQE\x15UTQE\x15UT\xb1|\x04\xf9V}E\xeb\xadl\x7f\xff\xd6\xfe\xfc\xb7\x90\x8c\x8f\x94\xffJ{\x94\x8d\xbb\xa2\xa2l\xbf)[\xdf\xbf\xa5\xbf\x85\xea\xaf\xacy\xad\xacT\xd6\xb8\x95w\xbeW\xd6>\xf4_\x93\xca\x9ag\xffV\xa9\xac' # noqa: E501 'yX\xd5\xfb\x98\x90\xbe\xb2\xdb)T\x8f\x90\x1fe\xed\xbf5\xfd\xad\xfb\x7fE\xeb\xa9\xea\xcf;\x15UTQE\x15UTQ\xc5\xffo\xe4\x13sJ>m\xc7\xa6-Y\xea\x13\xf9 \xd6<z[\x1e}\xa9D_\xfd\xb3G\xde\x01\x03^;e\xf3\x85(\x14\x87\x90_\xbex\x84\xec*Z\x7fy\xe3,\xaf]\xc5\xe2jJ\x95\x9d&\xf5\xdf' # noqa: E501 '_*\xa7\x7f\x1dy\xca\xf1\xe9A`^\x9b\xb2\xb4b\xc9\xd7\x0fB\xfe\xf8\xe3\x90o_\xa9\x1d_\xbb\xbf\xd7|\xac\xec\xf2\x7f?\x1f\xad\xa82\x9d(\x88\x91\xbc}\x84\xa3\x02+\xb6/\x10~\x15\xe69\xa9\xefM\xe8\x85h\xceKe\xf73\xe5\xc6A\xd9x\xac\xa8\xb2\xfb\x1f\xd8\x9a\xa5Y9\xdb\xc9\xc7\xd6\n\x94\xaf\x1f>g\xc8~7ai' # noqa: E501 'J\x94g\xd3\x11\xae\xf2vd\x9a\x97d=\x88\xa5\x19\x8f\xdd\x10\x82\xdf_*\xfa9Y\xde\xcf1e\xe3(\xef>P\xd1\xcf\xa9\x8a\xfa\xf9\xb7\t3H\xc2\x0c\x1e\xef\xe9\xce\x0c\x11\xd7\x12\xd7\x0eg\xdc\xcc\xc5u\xc5\xf5\xc4\xba.j\xf3\x99\xa1\xe2\xfa\x0b\x98an\x8c\xc8\xdcE\xdd\xa5\xd9|f\xb8\xb8Q\x94;3\xc2\\\xdcLl,n.' # noqa: E501 "6\x11\xb7\x10\x9b\x8a[\x8a\xcd\xc4\xad\xc4\xad\xc5m\xc4\xe6b\x0b\xb1\xa5\xb8\xad\xd8J\xdcNl-\xb6\x11\xdb\x8a\xed\xc4\xed\xc5\xf6b\x07q\x07qGq'qgq\x17\x1f\t3r\xbc\xb8\xdb\xc0\xd0Hf\x94\x1b3\xda3\x9c\xf9AT\xdd\xd6\xda\xce\xc1\xda\x8e\x19\x13\xce\xb8\x9b\x8b4=\xa7\xf9\x840c\xc5:\xa2\xea\xe3\xfd\x02\xbd&\x87" # noqa: E501 '0\x1e\xee\xcc\xb8p\xc6\xd3\\\xa4\xed?1\xd8C\xaa\x0ba\xc6{yx\x8c\x0f\xf5\xf5\x93\xf8\x06xx\xe8\x84\xf8\xf9z\xf9\xe80^.j.\xcd\\\xd4\x170\xden\x8c\x8f\xa8\xfa\x14O\xbfP\xa9\xa7\t\xe2~\xa1\x9e\xa1!\x12f\xe2\xf8\xd0\xf1\xd6\xff\x03ZR\x95\x95' # noqa: E501 ) # type: str # disable-secrets-detection-end DUPLICATE_COL = 'is_duplicate' IP_SUBNET_BITS = 24 IP_MASK_BITS_FOR_COMPARISON = 32 MAX_CANDIDATES_IN_LIST = 10 # known labels EMAIL_SENDER_NAME_LABEL = 'Email/From' EMAIL_SENDER_ADDRESS_LABEL = 'Email/headers/From' EMAIL_RECEIVED_LABEL = 'Email/headers/To' EMAIL_SUBJECT_LABEL = 'Email/headers/Subject' EMAIL_DATE_LABEL = 'Email/headers/Date' EMAIL_TEXT_LABEL = 'Email/text' EMAIL_HTML_LABEL = 'Email/html' EMAIL_ATTACHMENT_LABEL = 'Email/attachments' BRAND_LABEL = 'Brand' INSTANCE_LABEL = 'Instance' CANDIDATES_FEATURES_NA_RATIO = 0.2 TIME_FIELD = 'created' LABELS_BLACKLIST = [BRAND_LABEL, INSTANCE_LABEL, EMAIL_SENDER_ADDRESS_LABEL, EMAIL_SENDER_NAME_LABEL, EMAIL_SUBJECT_LABEL, EMAIL_RECEIVED_LABEL, EMAIL_ATTACHMENT_LABEL, EMAIL_DATE_LABEL, EMAIL_TEXT_LABEL, EMAIL_HTML_LABEL] EMAIL_LABELS_FEATURES = [] # type: list EMAIL_LABELS_MAP = {} # type: dict FEATURES = [] # type: list INDICATORS_FOR_JACCARD = [] # type: list ############################################################################################# class Utils(): email_pattern = re.compile( r"""[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*""") # noqa: E501 @staticmethod def extract_domain_from_url(url): extract = tldextract.TLDExtract(cache_file='/tmp/.tld_set') domain = extract(url).domain.lower() suffix = extract(url).suffix.lower() if len(domain) > 0 and len(suffix) > 0: return ".".join([domain, suffix]) @staticmethod def uri_validator(url): try: result = urlparse(url) if result.scheme and result.netloc and result.path: return True except Exception: return False @staticmethod def extract_email_domain(email): index = email.rfind("@") if index == -1: return None return Utils.extract_domain_from_url(email[index + 1:]) @staticmethod def get_url_path(url): return urlparse(url).path @staticmethod def ip_address_in_network(ip, net): try: ipaddr = int(''.join(['%02x' % int(x) for x in ip.split('.')]), 16) netstr, bits = net.split('/') netaddr = int(''.join(['%02x' % int(x) for x in netstr.split('.')]), 16) mask = (0xffffffff << (32 - int(bits))) & 0xffffffff return (ipaddr & mask) == (netaddr & mask) except Exception: return None @staticmethod def get_time_diff_seconds(date1, date2): try: if 'datetime' in str(type(date1)): return abs(date1 - date2).total_seconds() else: return abs(dateutil.parser.parse(date1) - dateutil.parser.parse(date2)).total_seconds() except Exception: return None @staticmethod def complete_email_missing_labels(labels): found_subject = EMAIL_SUBJECT_LABEL in labels found_date = EMAIL_DATE_LABEL in labels found_sender = EMAIL_SENDER_ADDRESS_LABEL in labels for label in labels.keys(): label_lower = label.lower() if not found_subject and 'email' in label_lower and 'subject' in label_lower: labels[EMAIL_SUBJECT_LABEL] = labels.pop(label) if not found_date and 'email' in label_lower and 'date' in label_lower: labels[EMAIL_DATE_LABEL] = labels.pop(label) if not found_sender and 'email' in label_lower and ('from' in label_lower or 'sender' in label_lower): labels[EMAIL_SENDER_ADDRESS_LABEL] = labels.pop(label) return labels @staticmethod def get_incident_labels_map(labels, labels_rename=EMAIL_LABELS_MAP): if labels is None: return {} labels_map = {} for label in labels: label_type = label['type'] if label_type in labels_rename: label_type = labels_rename[label_type] labels_map[label_type] = label['value'] return Utils.complete_email_missing_labels(labels_map) @staticmethod def get_domains(indicators, labels): domains = [] for email in indicators.get('Email', []): domains.append(Utils.extract_email_domain(email)) for url in indicators.get('URL', []): domains.append(Utils.extract_domain_from_url(url)) for label_value in labels.values(): if " " not in label_value.strip(): if Utils.uri_validator(label_value): domains.append(Utils.extract_domain_from_url(label_value)) for email in Utils.email_pattern.findall(label_value): domains.append(Utils.extract_email_domain(email)) domains = [x for x in domains if x is not None] return domains @staticmethod def get_unique_list(lst): return list(set(lst)) @staticmethod def get_email_name(email): name = parseaddr(email)[0] if name: return name @staticmethod def get_email_address(email): addr = parseaddr(email)[1] if addr and Utils.email_pattern.match(addr): return addr @staticmethod def is_groups_cross_empty(group1, group2): return group1 is None or len(group1) == 0 or group2 is None or len(group2) == 0 @staticmethod def intersection_set(x, y): return set.intersection(*[set(x), set(y)]) @staticmethod def union_set(x, y): return set.union(*[set(x), set(y)]) @staticmethod def get_hashable_from_dict(d): return [(k, v) for k, v in d.items() if isinstance(v, collections.Hashable)] @staticmethod def jaccard_similarity(x, y): if x is None or y is None: return 0 if type(x) == dict: x = Utils.get_hashable_from_dict(x) if type(y) == dict: y = Utils.get_hashable_from_dict(y) x = [v for v in x if isinstance(v, collections.Hashable)] y = [v for v in y if isinstance(v, collections.Hashable)] if len(x) == 0 or len(y) == 0: return 0 intersection_cardinality = len(Utils.intersection_set(x, y)) union_cardinality = len(Utils.union_set(x, y)) return intersection_cardinality / float(union_cardinality) @staticmethod def canonize_ip_to_netrok(ip_address, mast_bits): try: return str(ipaddress.IPv4Network(unicode("%s/%d" % (ip_address, mast_bits)), strict=False).broadcast_address) except Exception: return ip_address class IncidentFeatures: def __init__(self, incident1, incident2): self.incident1 = incident1 self.incident2 = incident2 self.indicators1 = incident1['indicators'] self.indicators2 = incident2['indicators'] self.labels_map1 = Utils.get_incident_labels_map(self.incident1['labels']) self.labels_map2 = Utils.get_incident_labels_map(self.incident2['labels']) domains1 = Utils.get_unique_list( self.indicators1.get('Domain', []) + Utils.get_domains(self.indicators1, self.labels_map2)) domains2 = Utils.get_unique_list( self.indicators2.get('Domain', []) + Utils.get_domains(self.indicators2, self.labels_map2)) if len(domains1) > 0: self.indicators1['Domain'] = domains1 if len(domains2) > 0: self.indicators2['Domain'] = domains2 if IP_MASK_BITS_FOR_COMPARISON < 32 and IP_MASK_BITS_FOR_COMPARISON > 0: if 'IP' in self.indicators1: self.indicators1['IP'] = map(lambda ip: Utils.canonize_ip_to_netrok( ip, IP_MASK_BITS_FOR_COMPARISON), self.indicators1['IP']) if 'IP' in self.indicators2: self.indicators2['IP'] = map(lambda ip: Utils.canonize_ip_to_netrok( ip, IP_MASK_BITS_FOR_COMPARISON), self.indicators2['IP']) def get_email_labels_features(self): def add_label_ld_feature(label_name): if label_name in labels1 and label_name in labels2: features[label_name] = editdistance.eval(labels1[label_name], labels2[label_name]) def add_label_text_feature(label_name): if label_name in labels1 and label_name in labels2: features[label_name] = Utils.jaccard_similarity( labels1[label_name].split(), labels2[label_name].split()) features = {} labels1 = self.labels_map1 labels2 = self.labels_map2 if EMAIL_SENDER_ADDRESS_LABEL in labels1 and EMAIL_SENDER_ADDRESS_LABEL in labels2: sender1 = Utils.get_email_address(labels1[EMAIL_SENDER_ADDRESS_LABEL]) sender2 = Utils.get_email_address(labels2[EMAIL_SENDER_ADDRESS_LABEL]) if sender1 and sender2: features[EMAIL_SENDER_ADDRESS_LABEL] = editdistance.eval(sender1, sender2) if EMAIL_DATE_LABEL in labels1 and EMAIL_DATE_LABEL in labels2: time_diff = Utils.get_time_diff_seconds(labels1[EMAIL_DATE_LABEL], labels2[EMAIL_DATE_LABEL]) if time_diff is not None: features[EMAIL_DATE_LABEL] = time_diff add_label_ld_feature(EMAIL_SUBJECT_LABEL) add_label_ld_feature(EMAIL_ATTACHMENT_LABEL) add_label_text_feature(EMAIL_TEXT_LABEL) add_label_text_feature(EMAIL_HTML_LABEL) return features def get_incident_features(self): features = {} incident_time_diff = Utils.get_time_diff_seconds(self.incident1[TIME_FIELD], self.incident2[TIME_FIELD]) features['incident_time_diff'] = incident_time_diff features['same_type'] = self.incident1['type'] == self.incident2['type'] features['same_severity'] = self.incident1['severity'] == self.incident2['severity'] features['custom_fields_jaccard'] = Utils.jaccard_similarity(self.incident1.get('CustomFields', []), self.incident2.get('CustomFields', [])) features['labels_jaccard'] = Utils.jaccard_similarity( [(k, v) for (k, v) in self.labels_map1.items() if k not in LABELS_BLACKLIST], [(k, v) for (k, v) in self.labels_map2.items() if k not in LABELS_BLACKLIST] ) if INSTANCE_LABEL in self.labels_map1 and INSTANCE_LABEL in self.labels_map2: features['same_instance'] = self.labels_map1[INSTANCE_LABEL] == self.labels_map2[INSTANCE_LABEL] for indicator_type in INDICATORS_FOR_JACCARD: if indicator_type in self.indicators1 and indicator_type in self.indicators2: features['indicator_%s_jaccard' % indicator_type] = Utils.jaccard_similarity( self.indicators1[indicator_type], self.indicators2[indicator_type]) return features def calculate_features(self, expected_features=FEATURES): features = {} # type: dict features.update(self.get_incident_features()) features.update(self.get_email_labels_features()) for key in set(expected_features).difference(set(features.keys())): features[key] = None return features ################################################################################## def create_or_condition(field, terms): return " or ".join(map(lambda x: "%s:%s" % (field, x), terms)) def get_incidents_by_time_diff(incident_id, incident_time, ignore_closed, max_number_of_results, time_frame_range_hours): # noqa: E501 line too long incident_datetime = dateutil.parser.parse(incident_time) max_date = incident_datetime + timedelta(hours=time_frame_range_hours) min_date = incident_datetime - timedelta(hours=time_frame_range_hours) query = '{0}:>="{1}" and {0}:<="{2}"'.format(TIME_FIELD, min_date.isoformat(), max_date.isoformat()) if ignore_closed: query += " and -closed:*" if incident_id: query += ' and -id:%s' % incident_id res = demisto.executeCommand("getIncidents", {'query': query, 'size': max_number_of_results, 'sort': '%s.desc' % TIME_FIELD}) incident_list = res[0]['Contents']['data'] return incident_list def enrich_incidents_by_indicators(incident_list, max_number_of_results): incidents = {} # type: dict if incident_list is None: return incidents query_part1 = create_or_condition("investigationIDs", map(lambda x: x['id'], incident_list)) query_part2 = create_or_condition("type", INDICATORS_FOR_JACCARD) query = "(%s) and (%s)" % (query_part1, query_part2) res = demisto.executeCommand("findIndicators", {'query': query, 'size': max_number_of_results}) indicators = res[0]['Contents'] for incident in incident_list: incident_id = incident['id'] incidents[incident_id] = incident incidents[incident_id]['indicators'] = {} for indicator in indicators: for incident_id in indicator['investigationIDs']: if incident_id in incidents: indicator_type = indicator.get('indicator_type') indicator_value = indicator.get('value') if indicator_type is None or indicator_value is None: continue if indicator_type not in incidents[incident_id]['indicators']: incidents[incident_id]['indicators'][indicator_type] = [] incidents[incident_id]['indicators'][indicator_type].append(indicator_value) return incidents def get_unique_key_for_pair(id1, id2): key_tuple = (id1, id2) if id1 > id2 else (id2, id1) return "%s_%s" % (key_tuple[0], key_tuple[1]) def get_my_duplicate_incidents_features(incident_type, days_to_fetch_duplicates, max_number_of_results, max_indicators): since_date = datetime.now() - timedelta(days=days_to_fetch_duplicates) query = "linkedIncidents:* and %s:>=%s and type:%s" % (TIME_FIELD, since_date.isoformat(), incident_type) res = demisto.executeCommand("getIncidents", {'query': query, 'size': max_number_of_results, 'sort': '%s.desc' % TIME_FIELD}) incident_list = res[0]['Contents']['data'] if incident_list is None: return None incidents = enrich_incidents_by_indicators(incident_list, max_indicators) related_features = {} # type: dict for incident in incidents.values(): related_incidents = incident.get('linkedIncidents') if related_incidents: for related_incident_id in related_incidents: if related_incident_id in incidents: related_incidents += list(set(incidents[related_incident_id]['linkedIncidents']).difference(related_incidents)) # noqa E501 line too long for related_incident_id in related_incidents: key = get_unique_key_for_pair(incident['id'], related_incident_id) if incident['id'] == related_incident_id or key in related_features or related_incident_id not in incidents: continue related_features[key] = IncidentFeatures(incident, incidents[related_incident_id]).calculate_features() related_features[key][DUPLICATE_COL] = 1 return pd.DataFrame.from_dict(related_features.values()) def filter_features(features, selected_features=FEATURES): features = features[[col for col in features.columns if col in selected_features]] return features def union_complete_missing_values(df1, df2, keys=None): df = pd.concat([df1, df2], keys=keys) imp = impute.SimpleImputer() return pd.DataFrame(imp.fit_transform(df), columns=df.columns, index=df.index) def get_ml_model(): return RandomForestClassifier(max_depth=10, n_estimators=100, random_state=1) def get_result_record(incident, probabilty): occured_time = incident[TIME_FIELD] try: date_obj = dateutil.parser.parse(occured_time) occured_time = date_obj.strftime('%Y-%m-%d %H:%M:%S') except Exception: pass return {'id': "[%s](#/Details/%s)" % (incident['id'], incident['id']), 'rawId': incident['id'], 'name': incident['name'], 'closedTime': incident['closed'] if incident['closed'] != "0001-01-01T00:00:00Z" else "", 'duplicateProbability': probabilty, 'time': occured_time} def camel_case_to_space(s): return ''.join(map(lambda x: x if x.islower() else " " + x, s)).strip().capitalize() def has_phishing_labels(incident): for label in incident['labels']: if 'email' in label['type'].lower(): return True return False def load_compressed_features(features_str): try: return safe_pickle_loads(zlib.decompress(features_str), _ALLOWED_CLASSES, _SAFE_MODULE_PREFIXES) except UnsafePickleError as e: return_error("Security: blocked unsafe pickle payload: %s" % str(e)) except Exception as e: return_error("Unable to load feature data: %s" % str(e)) def get_incident_email_labels(incident): labels_map = Utils.get_incident_labels_map(incident['labels']) labels_map = Utils.complete_email_missing_labels(labels_map) return [label for label in labels_map.keys() if 'email' in label.lower()] def main(): global IP_MASK_BITS_FOR_COMPARISON global EMAIL_LABELS_FEATURES global EMAIL_LABELS_MAP global FEATURES global INDICATORS_FOR_JACCARD global MAX_CANDIDATES_IN_LIST global TIME_FIELD for email_label in demisto.args()['compareEmailLabels'].split(","): email_label = email_label.strip() if ":" in email_label: email_label, custom_label = email_label.split(":") EMAIL_LABELS_MAP[custom_label] = email_label EMAIL_LABELS_FEATURES.append(email_label.strip()) if demisto.args().get('compareOtherLabels', 'yes') == 'yes': FEATURES.append('labels_jaccard') if demisto.args().get('compareIncidentTimeDiff', 'yes') == 'yes': FEATURES.append('incident_time_diff') INDICATORS_FOR_JACCARD = map(lambda x: x.strip(), demisto.args()['compareIndicators'].split(",")) USE_MY_DUPLICATES_X_DAYS_AGO = int(demisto.args().get('UseLocalEnvDuplicatesInLastDays', 0)) IP_MASK_BITS_FOR_COMPARISON = int(demisto.args().get('ipComparisonSubnetMask', 32)) MAX_CANDIDATES_IN_LIST = int(demisto.args().get('maxResults', 10)) MAX_INCIDENTS = int(demisto.args().get('maxNumberOfIncidents', 1000)) TIME_DIFF_HOURS = int(demisto.args().get('timeFrameHours', 72)) IGNORE_CLOSED_INCIDENTS = demisto.args().get('ignoreClosedIncidents', 'yes') == 'yes' MAX_INDICATORS = MAX_INCIDENTS * 100 THRESHOLD = float(demisto.args().get('threshold', 0.5)) TIME_FIELD = demisto.args().get('timeField', 'created') incident = enrich_incidents_by_indicators(demisto.incidents(), MAX_INDICATORS).values()[0] incident_email_labels = get_incident_email_labels(incident) email_features = set(incident_email_labels).intersection(EMAIL_LABELS_FEATURES) indicators_features = [] for i in set(INDICATORS_FOR_JACCARD).intersection(set(incident['indicators'].keys())): indicators_features.append("indicator_%s_jaccard" % i) use_features = set(FEATURES).union(email_features).union(indicators_features) if len(email_features) > 0: features_df = load_compressed_features(FEATURES_PHISHING_STRING) else: features_df = load_compressed_features(FEATURES_OTHERS_STRING) use_features = set(features_df.columns).intersection(use_features) if USE_MY_DUPLICATES_X_DAYS_AGO > 0: my_tagged_data_features = get_my_duplicate_incidents_features(incident['type'], USE_MY_DUPLICATES_X_DAYS_AGO, MAX_INCIDENTS, MAX_INDICATORS) features_df = union_complete_missing_values(features_df, my_tagged_data_features).reset_index() X = filter_features(features_df, use_features) Y = features_df[DUPLICATE_COL] model = get_ml_model() model.fit(X, Y) candidates = enrich_incidents_by_indicators(get_incidents_by_time_diff(incident.get('id'), incident[TIME_FIELD], IGNORE_CLOSED_INCIDENTS, MAX_INCIDENTS, TIME_DIFF_HOURS), MAX_INDICATORS) candidates.pop(incident['id'], None) candidates_features_list = [] for candidate in candidates.values(): feature_dict = IncidentFeatures(incident, candidate).calculate_features() feature_dict['id'] = candidate['id'] candidates_features_list.append(feature_dict) if len(candidates_features_list) == 0: demisto.results('Did not find any duplicate incidents candidates') return candidates_features = pd.DataFrame.from_dict(candidates_features_list) candidates_features = candidates_features.dropna(axis=0, thresh=(len(use_features) * (1 - CANDIDATES_FEATURES_NA_RATIO))) candidates_features_x = filter_features(candidates_features, use_features) candidates_features_x = union_complete_missing_values(X, candidates_features_x, ['features', 'candidates']).loc['candidates'] predications_prob = model.predict_proba(candidates_features_x) predications = model.predict(candidates_features_x) result = [] for i in range(0, len(predications)): incident_id = candidates_features.iloc[i]['id'] probability = predications_prob[i][1] if probability >= THRESHOLD: result.append(get_result_record(candidates[incident_id], probability)) result.sort(key=lambda x: x['duplicateProbability'], reverse=True) # handle results if len(result) > 0: hr_result = map(lambda row: dict((camel_case_to_space(k), v) for k, v in row.items()), result) markdown_result = tableToMarkdown("Duplicate incidents candidates", hr_result, headers=[ 'Id', 'Name', 'Closed time', 'Duplicate probability', 'Time']) demisto.results({ 'ContentsFormat': formats['markdown'], 'Type': entryTypes['note'], 'Contents': markdown_result, 'EntryContext': { 'similarIncident': result[0], 'similarIncidentList': result[:MAX_CANDIDATES_IN_LIST], 'isSimilarIncidentFound': True } }) else: context = { 'isSimilarIncidentFound': False } demisto.results({ 'ContentsFormat': formats['markdown'], 'Type': entryTypes['note'], 'Contents': 'Did not find any duplicate incidents', 'EntryContext': context}) # python2 uses __builtin__ python3 uses builtins if __name__ == "__builtin__" or __name__ == "builtins": main()