From 7793bc7e243350e563a8d1a49dc749f138138219 Mon Sep 17 00:00:00 2001 From: Splunk Git Pusher Date: Sun, 8 Feb 2026 20:14:43 +0100 Subject: [PATCH] SOC_app_test Pushed by: admin License: 61BF9B31-726 (Enterprise) Timestamp: 2026-02-08T20:14:43.636552 --- .../README/addon_builder.conf.spec | 4 + .../README/inputs.conf.spec | 3 + .../ta_socradar_incidents_settings.conf.spec | 14 + .../TA-socradar-incidents.aob_meta | 1 + .../aob_events_in_meta.json | 1 + apps/TA-socradar-incidents/app.manifest | 59 + .../appserver/controllers/update_status.py | 93 + .../appserver/static/javascript_mvc_guide.md | 398 + .../js/build/11.5f537ef2df4a1dddfa28.js | 3 + .../js/build/238.8e15410feb4dc7301333.js | 2 + .../js/build/313.77cc81cceb759a35a0be.js | 1044 ++ .../js/build/354.b1e0bf4a3fa043f59a8b.js | 3 + .../js/build/399.d2adffc7ddcdb8217d78.js | 2 + .../js/build/504.c17789cd2f8fc244f4e5.js | 2 + .../js/build/692.eb5b40c69adcdb9b6b67.js | 2 + .../js/build/748.0721de96fda1fbd45cdc.js | 2 + .../js/build/838.861aa9f1e37dd3330f18.js | 3 + .../js/build/870.01a167948c7c5321c30e.js | 2 + .../js/build/98.dcec2b756ef421ae0b81.js | 2 + .../appserver/static/js/build/entry_page.js | 3 + .../static/js/build/globalConfig.json | 323 + .../appserver/static/openapi.json | 719 ++ .../appserver/templates/base.html | 40 + .../bin/TA_socradar_incidents_rh_settings.py | 123 + ...cidents_rh_socradar_incidents_collector.py | 78 + ...ocradar_incidents_collector.cpython-39.pyc | Bin 0 -> 8348 bytes ..._socradar_incidents_declare.cpython-39.pyc | Bin 0 -> 856 bytes ...put_module_socradar_incidents_collector.py | 392 + .../bin/socradar_incidents_collector.py | 94 + .../bin/status_update_with_log.py | 228 + .../aob_py3/Mako-1.2.4.dist-info/INSTALLER | 1 + .../aob_py3/Mako-1.2.4.dist-info/LICENSE | 19 + .../aob_py3/Mako-1.2.4.dist-info/METADATA | 87 + .../aob_py3/Mako-1.2.4.dist-info/RECORD | 42 + .../aob_py3/Mako-1.2.4.dist-info/REQUESTED | 0 .../aob_py3/Mako-1.2.4.dist-info/WHEEL | 5 + .../MarkupSafe-2.0.1.dist-info/INSTALLER | 1 + .../MarkupSafe-2.0.1.dist-info/LICENSE.rst | 28 + .../MarkupSafe-2.0.1.dist-info/METADATA | 101 + .../aob_py3/MarkupSafe-2.0.1.dist-info/RECORD | 13 + .../MarkupSafe-2.0.1.dist-info/REQUESTED | 0 .../aob_py3/MarkupSafe-2.0.1.dist-info/WHEEL | 8 + .../aob_py3/PySocks-1.7.1.dist-info/INSTALLER | 1 + .../aob_py3/PySocks-1.7.1.dist-info/LICENSE | 22 + .../aob_py3/PySocks-1.7.1.dist-info/METADATA | 321 + .../aob_py3/PySocks-1.7.1.dist-info/RECORD | 8 + .../aob_py3/PySocks-1.7.1.dist-info/WHEEL | 5 + .../aob_py3/PyYAML-6.0.1.dist-info/INSTALLER | 1 + .../aob_py3/PyYAML-6.0.1.dist-info/LICENSE | 20 + .../aob_py3/PyYAML-6.0.1.dist-info/METADATA | 46 + .../aob_py3/PyYAML-6.0.1.dist-info/RECORD | 26 + .../aob_py3/PyYAML-6.0.1.dist-info/REQUESTED | 0 .../aob_py3/PyYAML-6.0.1.dist-info/WHEEL | 6 + .../aob_py3/__pycache__/socks.cpython-39.pyc | Bin 0 -> 21412 bytes .../aob_py3/_pyrsistent_version.py | 1 + .../aob_py3/_yaml/__init__.py | 33 + .../aob_py3/attr/__init__.py | 103 + .../aob_py3/attr/__init__.pyi | 388 + .../aob_py3/attr/_cmp.py | 160 + .../aob_py3/attr/_cmp.pyi | 13 + .../aob_py3/attr/_compat.py | 103 + .../aob_py3/attr/_config.py | 31 + .../aob_py3/attr/_funcs.py | 522 + .../aob_py3/attr/_make.py | 2960 ++++++ .../aob_py3/attr/_next_gen.py | 631 ++ .../aob_py3/attr/_typing_compat.pyi | 15 + .../aob_py3/attr/_version_info.py | 86 + .../aob_py3/attr/_version_info.pyi | 9 + .../aob_py3/attr/converters.py | 151 + .../aob_py3/attr/converters.pyi | 13 + .../aob_py3/attr/exceptions.py | 95 + .../aob_py3/attr/exceptions.pyi | 17 + .../aob_py3/attr/filters.py | 72 + .../aob_py3/attr/filters.pyi | 6 + .../aob_py3/attr/py.typed | 0 .../aob_py3/attr/setters.py | 79 + .../aob_py3/attr/setters.pyi | 20 + .../aob_py3/attr/validators.py | 711 ++ .../aob_py3/attr/validators.pyi | 83 + .../aob_py3/attrs-24.2.0.dist-info/INSTALLER | 1 + .../aob_py3/attrs-24.2.0.dist-info/METADATA | 242 + .../aob_py3/attrs-24.2.0.dist-info/RECORD | 36 + .../aob_py3/attrs-24.2.0.dist-info/WHEEL | 4 + .../attrs-24.2.0.dist-info/licenses/LICENSE | 21 + .../aob_py3/attrs/__init__.py | 67 + .../aob_py3/attrs/__init__.pyi | 252 + .../aob_py3/attrs/converters.py | 3 + .../aob_py3/attrs/exceptions.py | 3 + .../aob_py3/attrs/filters.py | 3 + .../aob_py3/attrs/py.typed | 0 .../aob_py3/attrs/setters.py | 3 + .../aob_py3/attrs/validators.py | 3 + .../ta_socradar_incidents/aob_py3/bin/json | 8 + .../aob_py3/bin/jsonpath.py | 8 + .../aob_py3/bin/jsonpath_ng | 8 + .../aob_py3/bin/jsonschema | 8 + .../aob_py3/bin/mako-render | 8 + .../aob_py3/bin/normalizer | 8 + .../certifi-2025.4.26.dist-info/INSTALLER | 1 + .../certifi-2025.4.26.dist-info/METADATA | 78 + .../certifi-2025.4.26.dist-info/RECORD | 11 + .../aob_py3/certifi-2025.4.26.dist-info/WHEEL | 5 + .../licenses/LICENSE | 20 + .../aob_py3/certifi/__init__.py | 4 + .../aob_py3/certifi/__main__.py | 12 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 300 bytes .../certifi/__pycache__/core.cpython-39.pyc | Bin 0 -> 2126 bytes .../aob_py3/certifi/cacert.pem | 4676 +++++++++ .../aob_py3/certifi/core.py | 114 + .../aob_py3/certifi/py.typed | 0 .../INSTALLER | 1 + .../LICENSE | 21 + .../METADATA | 269 + .../RECORD | 22 + .../REQUESTED | 0 .../charset_normalizer-2.0.12.dist-info/WHEEL | 5 + .../aob_py3/charset_normalizer/__init__.py | 56 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 1734 bytes .../__pycache__/api.cpython-39.pyc | Bin 0 -> 11266 bytes .../__pycache__/cd.cpython-39.pyc | Bin 0 -> 8854 bytes .../__pycache__/constant.cpython-39.pyc | Bin 0 -> 13785 bytes .../__pycache__/legacy.cpython-39.pyc | Bin 0 -> 3048 bytes .../__pycache__/md.cpython-39.pyc | Bin 0 -> 14742 bytes .../__pycache__/models.cpython-39.pyc | Bin 0 -> 13181 bytes .../__pycache__/utils.cpython-39.pyc | Bin 0 -> 8012 bytes .../__pycache__/version.cpython-39.pyc | Bin 0 -> 283 bytes .../aob_py3/charset_normalizer/api.py | 608 ++ .../charset_normalizer/assets/__init__.py | 1244 +++ .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 7367 bytes .../aob_py3/charset_normalizer/cd.py | 340 + .../charset_normalizer/cli/__init__.py | 0 .../charset_normalizer/cli/normalizer.py | 290 + .../aob_py3/charset_normalizer/constant.py | 503 + .../aob_py3/charset_normalizer/legacy.py | 95 + .../aob_py3/charset_normalizer/md.py | 559 ++ .../aob_py3/charset_normalizer/models.py | 392 + .../aob_py3/charset_normalizer/py.typed | 0 .../aob_py3/charset_normalizer/utils.py | 342 + .../aob_py3/charset_normalizer/version.py | 6 + .../cloudconnectlib-3.3.0.dist-info/INSTALLER | 1 + .../cloudconnectlib-3.3.0.dist-info/LICENSE | 201 + .../cloudconnectlib-3.3.0.dist-info/METADATA | 28 + .../cloudconnectlib-3.3.0.dist-info/RECORD | 47 + .../cloudconnectlib-3.3.0.dist-info/REQUESTED | 0 .../cloudconnectlib-3.3.0.dist-info/WHEEL | 4 + .../aob_py3/cloudconnectlib/__init__.py | 20 + .../aob_py3/cloudconnectlib/client.py | 91 + .../cloudconnectlib/common/__init__.py | 15 + .../cloudconnectlib/common/lib_util.py | 58 + .../aob_py3/cloudconnectlib/common/log.py | 57 + .../aob_py3/cloudconnectlib/common/util.py | 79 + .../cloudconnectlib/configuration/__init__.py | 16 + .../cloudconnectlib/configuration/loader.py | 316 + .../configuration/schema_1_0_0.json | 344 + .../aob_py3/cloudconnectlib/core/__init__.py | 17 + .../cloudconnectlib/core/checkpoint.py | 50 + .../aob_py3/cloudconnectlib/core/defaults.py | 50 + .../aob_py3/cloudconnectlib/core/engine.py | 341 + .../aob_py3/cloudconnectlib/core/engine_v2.py | 140 + .../cloudconnectlib/core/exceptions.py | 59 + .../aob_py3/cloudconnectlib/core/ext.py | 397 + .../aob_py3/cloudconnectlib/core/http.py | 315 + .../aob_py3/cloudconnectlib/core/job.py | 160 + .../aob_py3/cloudconnectlib/core/models.py | 338 + .../aob_py3/cloudconnectlib/core/pipemgr.py | 27 + .../aob_py3/cloudconnectlib/core/plugin.py | 119 + .../aob_py3/cloudconnectlib/core/task.py | 600 ++ .../aob_py3/cloudconnectlib/core/template.py | 36 + .../splunktacollectorlib/__init__.py | 15 + .../cloud_connect_mod_input.py | 85 + .../splunktacollectorlib/common/__init__.py | 66 + .../splunktacollectorlib/common/log.py | 67 + .../splunktacollectorlib/common/rwlock.py | 85 + .../common/schema_meta.py | 21 + .../splunktacollectorlib/config.py | 427 + .../data_collection/__init__.py | 16 + .../data_collection/ta_checkpoint_manager.py | 174 + .../data_collection/ta_config.py | 192 + .../data_collection/ta_consts.py | 69 + .../data_collection/ta_data_client.py | 100 + .../data_collection/ta_data_collector.py | 191 + .../data_collection/ta_data_loader.py | 180 + .../data_collection/ta_helper.py | 176 + .../data_collection/ta_mod_input.py | 310 + .../splunk_ta_import_declare.py | 30 + .../ta_cloud_connect_client.py | 48 + .../decorator-5.1.1.dist-info/INSTALLER | 1 + .../decorator-5.1.1.dist-info/METADATA | 127 + .../aob_py3/decorator-5.1.1.dist-info/RECORD | 8 + .../aob_py3/decorator-5.1.1.dist-info/WHEEL | 5 + .../decorator-5.1.1.dist-info/pbr.json | 1 + .../aob_py3/decorator.py | 451 + .../defusedxml-0.7.1.dist-info/INSTALLER | 1 + .../defusedxml-0.7.1.dist-info/LICENSE | 49 + .../defusedxml-0.7.1.dist-info/METADATA | 978 ++ .../aob_py3/defusedxml-0.7.1.dist-info/RECORD | 17 + .../aob_py3/defusedxml-0.7.1.dist-info/WHEEL | 6 + .../aob_py3/defusedxml/ElementTree.py | 154 + .../aob_py3/defusedxml/__init__.py | 67 + .../__pycache__/ElementTree.cpython-39.pyc | Bin 0 -> 3607 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 1355 bytes .../__pycache__/common.cpython-39.pyc | Bin 0 -> 4395 bytes .../aob_py3/defusedxml/cElementTree.py | 62 + .../aob_py3/defusedxml/common.py | 129 + .../aob_py3/defusedxml/expatbuilder.py | 107 + .../aob_py3/defusedxml/expatreader.py | 61 + .../aob_py3/defusedxml/lxml.py | 153 + .../aob_py3/defusedxml/minidom.py | 63 + .../aob_py3/defusedxml/pulldom.py | 41 + .../aob_py3/defusedxml/sax.py | 60 + .../aob_py3/defusedxml/xmlrpc.py | 153 + .../deprecation-2.1.0.dist-info/INSTALLER | 1 + .../deprecation-2.1.0.dist-info/LICENSE | 201 + .../deprecation-2.1.0.dist-info/METADATA | 114 + .../deprecation-2.1.0.dist-info/RECORD | 7 + .../aob_py3/deprecation-2.1.0.dist-info/WHEEL | 6 + .../aob_py3/deprecation.py | 290 + .../aob_py3/idna-3.10.dist-info/INSTALLER | 1 + .../aob_py3/idna-3.10.dist-info/LICENSE.md | 31 + .../aob_py3/idna-3.10.dist-info/METADATA | 250 + .../aob_py3/idna-3.10.dist-info/RECORD | 14 + .../aob_py3/idna-3.10.dist-info/WHEEL | 4 + .../aob_py3/idna/__init__.py | 45 + .../idna/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 848 bytes .../idna/__pycache__/core.cpython-39.pyc | Bin 0 -> 9869 bytes .../idna/__pycache__/idnadata.cpython-39.pyc | Bin 0 -> 42088 bytes .../idna/__pycache__/intranges.cpython-39.pyc | Bin 0 -> 1993 bytes .../__pycache__/package_data.cpython-39.pyc | Bin 0 -> 208 bytes .../aob_py3/idna/codec.py | 122 + .../aob_py3/idna/compat.py | 15 + .../aob_py3/idna/core.py | 437 + .../aob_py3/idna/idnadata.py | 4243 ++++++++ .../aob_py3/idna/intranges.py | 57 + .../aob_py3/idna/package_data.py | 1 + .../aob_py3/idna/py.typed | 0 .../aob_py3/idna/uts46data.py | 8681 +++++++++++++++++ .../INSTALLER | 1 + .../LICENSE | 202 + .../METADATA | 134 + .../importlib_metadata-6.7.0.dist-info/RECORD | 16 + .../importlib_metadata-6.7.0.dist-info/WHEEL | 5 + .../aob_py3/importlib_metadata/__init__.py | 1015 ++ .../aob_py3/importlib_metadata/_adapters.py | 90 + .../importlib_metadata/_collections.py | 30 + .../aob_py3/importlib_metadata/_compat.py | 74 + .../aob_py3/importlib_metadata/_functools.py | 104 + .../aob_py3/importlib_metadata/_itertools.py | 73 + .../aob_py3/importlib_metadata/_meta.py | 63 + .../aob_py3/importlib_metadata/_py39compat.py | 35 + .../aob_py3/importlib_metadata/_text.py | 99 + .../aob_py3/importlib_metadata/py.typed | 0 .../INSTALLER | 1 + .../LICENSE | 202 + .../METADATA | 104 + .../RECORD | 49 + .../WHEEL | 5 + .../aob_py3/importlib_resources/__init__.py | 36 + .../aob_py3/importlib_resources/_adapters.py | 168 + .../aob_py3/importlib_resources/_common.py | 207 + .../aob_py3/importlib_resources/_compat.py | 109 + .../aob_py3/importlib_resources/_itertools.py | 38 + .../aob_py3/importlib_resources/_legacy.py | 120 + .../aob_py3/importlib_resources/abc.py | 170 + .../aob_py3/importlib_resources/py.typed | 0 .../aob_py3/importlib_resources/readers.py | 144 + .../aob_py3/importlib_resources/simple.py | 106 + .../importlib_resources/tests/__init__.py | 0 .../importlib_resources/tests/_compat.py | 32 + .../importlib_resources/tests/_path.py | 56 + .../tests/data01/__init__.py | 0 .../tests/data01/binary.file | Bin 0 -> 4 bytes .../tests/data01/subdirectory/__init__.py | 0 .../tests/data01/subdirectory/binary.file | Bin 0 -> 4 bytes .../tests/data01/utf-16.file | Bin 0 -> 44 bytes .../tests/data01/utf-8.file | 1 + .../tests/data02/__init__.py | 0 .../tests/data02/one/__init__.py | 0 .../tests/data02/two/__init__.py | 0 .../tests/namespacedata01/binary.file | Bin 0 -> 4 bytes .../tests/namespacedata01/utf-16.file | Bin 0 -> 44 bytes .../tests/namespacedata01/utf-8.file | 1 + .../tests/test_compatibilty_files.py | 104 + .../tests/test_contents.py | 43 + .../importlib_resources/tests/test_custom.py | 45 + .../importlib_resources/tests/test_files.py | 112 + .../importlib_resources/tests/test_open.py | 85 + .../importlib_resources/tests/test_path.py | 69 + .../importlib_resources/tests/test_read.py | 82 + .../importlib_resources/tests/test_reader.py | 144 + .../tests/test_resource.py | 252 + .../importlib_resources/tests/update-zips.py | 53 + .../aob_py3/importlib_resources/tests/util.py | 179 + .../tests/zipdata01/__init__.py | 0 .../tests/zipdata01/ziptestdata.zip | Bin 0 -> 876 bytes .../tests/zipdata02/__init__.py | 0 .../tests/zipdata02/ziptestdata.zip | Bin 0 -> 698 bytes .../aob_py3/jinja2-3.1.6.dist-info/INSTALLER | 1 + .../aob_py3/jinja2-3.1.6.dist-info/METADATA | 84 + .../aob_py3/jinja2-3.1.6.dist-info/RECORD | 33 + .../aob_py3/jinja2-3.1.6.dist-info/REQUESTED | 0 .../aob_py3/jinja2-3.1.6.dist-info/WHEEL | 4 + .../aob_py3/jinja2/__init__.py | 38 + .../aob_py3/jinja2/_identifier.py | 6 + .../aob_py3/jinja2/async_utils.py | 99 + .../aob_py3/jinja2/bccache.py | 408 + .../aob_py3/jinja2/compiler.py | 1998 ++++ .../aob_py3/jinja2/constants.py | 20 + .../aob_py3/jinja2/debug.py | 191 + .../aob_py3/jinja2/defaults.py | 48 + .../aob_py3/jinja2/environment.py | 1672 ++++ .../aob_py3/jinja2/exceptions.py | 166 + .../aob_py3/jinja2/ext.py | 870 ++ .../aob_py3/jinja2/filters.py | 1873 ++++ .../aob_py3/jinja2/idtracking.py | 318 + .../aob_py3/jinja2/lexer.py | 868 ++ .../aob_py3/jinja2/loaders.py | 693 ++ .../aob_py3/jinja2/meta.py | 112 + .../aob_py3/jinja2/nativetypes.py | 130 + .../aob_py3/jinja2/nodes.py | 1206 +++ .../aob_py3/jinja2/optimizer.py | 48 + .../aob_py3/jinja2/parser.py | 1049 ++ .../aob_py3/jinja2/py.typed | 0 .../aob_py3/jinja2/runtime.py | 1062 ++ .../aob_py3/jinja2/sandbox.py | 436 + .../aob_py3/jinja2/tests.py | 256 + .../aob_py3/jinja2/utils.py | 766 ++ .../aob_py3/jinja2/visitor.py | 92 + .../aob_py3/jsl-0.2.4.dist-info/INSTALLER | 1 + .../aob_py3/jsl-0.2.4.dist-info/LICENSE | 31 + .../aob_py3/jsl-0.2.4.dist-info/METADATA | 123 + .../aob_py3/jsl-0.2.4.dist-info/RECORD | 21 + .../aob_py3/jsl-0.2.4.dist-info/REQUESTED | 0 .../aob_py3/jsl-0.2.4.dist-info/WHEEL | 5 + .../aob_py3/jsl/__init__.py | 22 + .../aob_py3/jsl/_compat/__init__.py | 80 + .../aob_py3/jsl/_compat/ordereddict.py | 127 + .../aob_py3/jsl/_compat/prepareable.py | 42 + .../aob_py3/jsl/document.py | 419 + .../aob_py3/jsl/exceptions.py | 151 + .../aob_py3/jsl/fields/__init__.py | 5 + .../aob_py3/jsl/fields/base.py | 263 + .../aob_py3/jsl/fields/compound.py | 578 ++ .../aob_py3/jsl/fields/primitive.py | 161 + .../aob_py3/jsl/fields/util.py | 24 + .../aob_py3/jsl/registry.py | 31 + .../aob_py3/jsl/resolutionscope.py | 71 + .../aob_py3/jsl/roles.py | 230 + .../DESCRIPTION.rst | 3 + .../json_spec-0.10.1.dist-info/INSTALLER | 1 + .../json_spec-0.10.1.dist-info/METADATA | 39 + .../aob_py3/json_spec-0.10.1.dist-info/RECORD | 43 + .../aob_py3/json_spec-0.10.1.dist-info/WHEEL | 6 + .../json_spec-0.10.1.dist-info/metadata.json | 1 + .../jsoncomment-0.4.2.dist-info/COPYING | 19 + .../jsoncomment-0.4.2.dist-info/INSTALLER | 1 + .../jsoncomment-0.4.2.dist-info/METADATA | 189 + .../jsoncomment-0.4.2.dist-info/RECORD | 10 + .../jsoncomment-0.4.2.dist-info/REQUESTED | 0 .../aob_py3/jsoncomment-0.4.2.dist-info/WHEEL | 5 + .../aob_py3/jsoncomment/__init__.py | 48 + .../aob_py3/jsoncomment/comments.py | 177 + .../aob_py3/jsoncomment/wrapper.py | 15 + .../jsonpath_ng-1.7.0.dist-info/INSTALLER | 1 + .../jsonpath_ng-1.7.0.dist-info/LICENSE | 202 + .../jsonpath_ng-1.7.0.dist-info/METADATA | 384 + .../jsonpath_ng-1.7.0.dist-info/RECORD | 21 + .../aob_py3/jsonpath_ng-1.7.0.dist-info/WHEEL | 5 + .../aob_py3/jsonpath_ng/__init__.py | 6 + .../aob_py3/jsonpath_ng/bin/__init__.py | 0 .../aob_py3/jsonpath_ng/bin/jsonpath.py | 68 + .../aob_py3/jsonpath_ng/exceptions.py | 10 + .../aob_py3/jsonpath_ng/ext/__init__.py | 15 + .../aob_py3/jsonpath_ng/ext/arithmetic.py | 72 + .../aob_py3/jsonpath_ng/ext/filter.py | 140 + .../aob_py3/jsonpath_ng/ext/iterable.py | 143 + .../aob_py3/jsonpath_ng/ext/parser.py | 176 + .../aob_py3/jsonpath_ng/ext/string.py | 129 + .../aob_py3/jsonpath_ng/jsonpath.py | 845 ++ .../aob_py3/jsonpath_ng/lexer.py | 174 + .../aob_py3/jsonpath_ng/parser.py | 205 + .../jsonpath_rw-1.4.0.dist-info/INSTALLER | 1 + .../jsonpath_rw-1.4.0.dist-info/METADATA | 245 + .../jsonpath_rw-1.4.0.dist-info/RECORD | 14 + .../jsonpath_rw-1.4.0.dist-info/REQUESTED | 0 .../aob_py3/jsonpath_rw-1.4.0.dist-info/WHEEL | 5 + .../aob_py3/jsonpath_rw/__init__.py | 4 + .../aob_py3/jsonpath_rw/bin/__init__.py | 0 .../aob_py3/jsonpath_rw/bin/jsonpath.py | 71 + .../aob_py3/jsonpath_rw/jsonpath.py | 510 + .../aob_py3/jsonpath_rw/lexer.py | 171 + .../aob_py3/jsonpath_rw/parser.py | 187 + .../jsonschema-4.4.0.dist-info/COPYING | 19 + .../jsonschema-4.4.0.dist-info/INSTALLER | 1 + .../jsonschema-4.4.0.dist-info/METADATA | 200 + .../aob_py3/jsonschema-4.4.0.dist-info/RECORD | 43 + .../jsonschema-4.4.0.dist-info/REQUESTED | 0 .../aob_py3/jsonschema-4.4.0.dist-info/WHEEL | 5 + .../aob_py3/jsonschema/__init__.py | 58 + .../aob_py3/jsonschema/__main__.py | 3 + .../aob_py3/jsonschema/_format.py | 482 + .../aob_py3/jsonschema/_legacy_validators.py | 224 + .../aob_py3/jsonschema/_reflect.py | 149 + .../aob_py3/jsonschema/_types.py | 217 + .../aob_py3/jsonschema/_utils.py | 348 + .../aob_py3/jsonschema/_validators.py | 463 + .../aob_py3/jsonschema/benchmarks/__init__.py | 5 + .../aob_py3/jsonschema/benchmarks/issue232.py | 25 + .../benchmarks/json_schema_test_suite.py | 12 + .../aob_py3/jsonschema/cli.py | 284 + .../aob_py3/jsonschema/exceptions.py | 363 + .../aob_py3/jsonschema/protocols.py | 167 + .../jsonschema/schemas/draft2019-09.json | 42 + .../jsonschema/schemas/draft2020-12.json | 58 + .../aob_py3/jsonschema/schemas/draft3.json | 177 + .../aob_py3/jsonschema/schemas/draft4.json | 149 + .../aob_py3/jsonschema/schemas/draft6.json | 153 + .../aob_py3/jsonschema/schemas/draft7.json | 166 + .../jsonschema/schemas/vocabularies.json | 1 + .../aob_py3/jsonschema/tests/__init__.py | 0 .../aob_py3/jsonschema/tests/_helpers.py | 5 + .../aob_py3/jsonschema/tests/_suite.py | 228 + .../aob_py3/jsonschema/tests/fuzz_validate.py | 49 + .../aob_py3/jsonschema/tests/test_cli.py | 911 ++ .../jsonschema/tests/test_deprecations.py | 123 + .../jsonschema/tests/test_exceptions.py | 475 + .../aob_py3/jsonschema/tests/test_format.py | 107 + .../tests/test_jsonschema_test_suite.py | 447 + .../aob_py3/jsonschema/tests/test_types.py | 217 + .../aob_py3/jsonschema/tests/test_utils.py | 124 + .../jsonschema/tests/test_validators.py | 2169 ++++ .../aob_py3/jsonschema/validators.py | 1058 ++ .../aob_py3/jsonspec/__init__.py | 9 + .../aob_py3/jsonspec/__main__.py | 4 + .../aob_py3/jsonspec/_version.py | 21 + .../aob_py3/jsonspec/cli.py | 545 ++ .../aob_py3/jsonspec/driver.py | 30 + .../aob_py3/jsonspec/misc/__init__.py | 0 .../jsonspec/misc/schemas/draft-03/card.json | 48 + .../misc/schemas/draft-03/hyper-schema.json | 50 + .../misc/schemas/draft-03/json-ref.json | 21 + .../jsonspec/misc/schemas/draft-03/links.json | 21 + .../misc/schemas/draft-03/schema.json | 142 + .../misc/schemas/draft-04/hyper-schema.json | 168 + .../misc/schemas/draft-04/schema.json | 150 + .../aob_py3/jsonspec/operations/__init__.py | 98 + .../aob_py3/jsonspec/operations/bases.py | 203 + .../aob_py3/jsonspec/operations/exceptions.py | 17 + .../aob_py3/jsonspec/pointer/__init__.py | 33 + .../aob_py3/jsonspec/pointer/bases.py | 265 + .../aob_py3/jsonspec/pointer/exceptions.py | 72 + .../aob_py3/jsonspec/pointer/stages.py | 68 + .../aob_py3/jsonspec/reference/__init__.py | 62 + .../aob_py3/jsonspec/reference/bases.py | 119 + .../aob_py3/jsonspec/reference/exceptions.py | 15 + .../aob_py3/jsonspec/reference/providers.py | 191 + .../aob_py3/jsonspec/reference/util.py | 23 + .../aob_py3/jsonspec/validators/__init__.py | 37 + .../aob_py3/jsonspec/validators/bases.py | 103 + .../aob_py3/jsonspec/validators/draft03.py | 665 ++ .../aob_py3/jsonspec/validators/draft04.py | 681 ++ .../aob_py3/jsonspec/validators/exceptions.py | 70 + .../aob_py3/jsonspec/validators/factorize.py | 131 + .../aob_py3/jsonspec/validators/formats.py | 143 + .../jsonspec/validators/pointer_util.py | 20 + .../aob_py3/jsonspec/validators/util.py | 243 + .../lib2to3/Grammar3.7.4.final.0.pickle | Bin 0 -> 32252 bytes .../PatternGrammar3.7.4.final.0.pickle | Bin 0 -> 2093 bytes .../aob_py3/lib2to3/__init__.py | 1 + .../aob_py3/lib2to3/__main__.py | 4 + .../aob_py3/lib2to3/btm_matcher.py | 163 + .../aob_py3/lib2to3/btm_utils.py | 281 + .../aob_py3/lib2to3/fixer_base.py | 186 + .../aob_py3/lib2to3/fixer_util.py | 453 + .../aob_py3/lib2to3/fixes/__init__.py | 1 + .../aob_py3/lib2to3/fixes/fix_apply.py | 70 + .../aob_py3/lib2to3/fixes/fix_asserts.py | 34 + .../aob_py3/lib2to3/fixes/fix_basestring.py | 14 + .../aob_py3/lib2to3/fixes/fix_buffer.py | 22 + .../aob_py3/lib2to3/fixes/fix_dict.py | 106 + .../aob_py3/lib2to3/fixes/fix_except.py | 93 + .../aob_py3/lib2to3/fixes/fix_exec.py | 39 + .../aob_py3/lib2to3/fixes/fix_execfile.py | 53 + .../aob_py3/lib2to3/fixes/fix_exitfunc.py | 72 + .../aob_py3/lib2to3/fixes/fix_filter.py | 90 + .../aob_py3/lib2to3/fixes/fix_funcattrs.py | 21 + .../aob_py3/lib2to3/fixes/fix_future.py | 22 + .../aob_py3/lib2to3/fixes/fix_getcwdu.py | 19 + .../aob_py3/lib2to3/fixes/fix_has_key.py | 109 + .../aob_py3/lib2to3/fixes/fix_idioms.py | 152 + .../aob_py3/lib2to3/fixes/fix_import.py | 99 + .../aob_py3/lib2to3/fixes/fix_imports.py | 145 + .../aob_py3/lib2to3/fixes/fix_imports2.py | 16 + .../aob_py3/lib2to3/fixes/fix_input.py | 26 + .../aob_py3/lib2to3/fixes/fix_intern.py | 41 + .../aob_py3/lib2to3/fixes/fix_isinstance.py | 52 + .../aob_py3/lib2to3/fixes/fix_itertools.py | 43 + .../lib2to3/fixes/fix_itertools_imports.py | 57 + .../aob_py3/lib2to3/fixes/fix_long.py | 19 + .../aob_py3/lib2to3/fixes/fix_map.py | 110 + .../aob_py3/lib2to3/fixes/fix_metaclass.py | 228 + .../aob_py3/lib2to3/fixes/fix_methodattrs.py | 24 + .../aob_py3/lib2to3/fixes/fix_ne.py | 23 + .../aob_py3/lib2to3/fixes/fix_next.py | 103 + .../aob_py3/lib2to3/fixes/fix_nonzero.py | 21 + .../aob_py3/lib2to3/fixes/fix_numliterals.py | 28 + .../aob_py3/lib2to3/fixes/fix_operator.py | 97 + .../aob_py3/lib2to3/fixes/fix_paren.py | 44 + .../aob_py3/lib2to3/fixes/fix_print.py | 87 + .../aob_py3/lib2to3/fixes/fix_raise.py | 90 + .../aob_py3/lib2to3/fixes/fix_raw_input.py | 17 + .../aob_py3/lib2to3/fixes/fix_reduce.py | 35 + .../aob_py3/lib2to3/fixes/fix_reload.py | 38 + .../aob_py3/lib2to3/fixes/fix_renames.py | 70 + .../aob_py3/lib2to3/fixes/fix_repr.py | 23 + .../aob_py3/lib2to3/fixes/fix_set_literal.py | 53 + .../lib2to3/fixes/fix_standarderror.py | 18 + .../aob_py3/lib2to3/fixes/fix_sys_exc.py | 30 + .../aob_py3/lib2to3/fixes/fix_throw.py | 56 + .../aob_py3/lib2to3/fixes/fix_tuple_params.py | 175 + .../aob_py3/lib2to3/fixes/fix_types.py | 61 + .../aob_py3/lib2to3/fixes/fix_unicode.py | 42 + .../aob_py3/lib2to3/fixes/fix_urllib.py | 196 + .../aob_py3/lib2to3/fixes/fix_ws_comma.py | 39 + .../aob_py3/lib2to3/fixes/fix_xrange.py | 73 + .../aob_py3/lib2to3/fixes/fix_xreadlines.py | 25 + .../aob_py3/lib2to3/fixes/fix_zip.py | 46 + .../aob_py3/lib2to3/main.py | 268 + .../aob_py3/lib2to3/patcomp.py | 204 + .../aob_py3/lib2to3/pgen2/__init__.py | 4 + .../aob_py3/lib2to3/pgen2/conv.py | 257 + .../aob_py3/lib2to3/pgen2/driver.py | 178 + .../aob_py3/lib2to3/pgen2/grammar.py | 211 + .../aob_py3/lib2to3/pgen2/literals.py | 60 + .../aob_py3/lib2to3/pgen2/parse.py | 201 + .../aob_py3/lib2to3/pgen2/pgen.py | 386 + .../aob_py3/lib2to3/pgen2/token.py | 85 + .../aob_py3/lib2to3/pgen2/tokenize.py | 563 ++ .../aob_py3/lib2to3/pygram.py | 40 + .../aob_py3/lib2to3/pytree.py | 853 ++ .../aob_py3/lib2to3/refactor.py | 728 ++ .../aob_py3/lib2to3/tests/__init__.py | 8 + .../aob_py3/lib2to3/tests/__main__.py | 4 + .../aob_py3/lib2to3/tests/data/README | 6 + .../aob_py3/lib2to3/tests/data/bom.py | 2 + .../aob_py3/lib2to3/tests/data/crlf.py | 3 + .../lib2to3/tests/data/different_encoding.py | 6 + .../lib2to3/tests/data/false_encoding.py | 2 + .../lib2to3/tests/data/fixers/bad_order.py | 5 + .../tests/data/fixers/myfixes/__init__.py | 0 .../tests/data/fixers/myfixes/fix_explicit.py | 6 + .../tests/data/fixers/myfixes/fix_first.py | 6 + .../tests/data/fixers/myfixes/fix_last.py | 7 + .../tests/data/fixers/myfixes/fix_parrot.py | 13 + .../tests/data/fixers/myfixes/fix_preorder.py | 6 + .../lib2to3/tests/data/fixers/no_fixer_cls.py | 1 + .../tests/data/fixers/parrot_example.py | 2 + .../lib2to3/tests/data/infinite_recursion.py | 2669 +++++ .../lib2to3/tests/data/py2_test_grammar.py | 974 ++ .../lib2to3/tests/data/py3_test_grammar.py | 947 ++ .../lib2to3/tests/pytree_idempotency.py | 94 + .../aob_py3/lib2to3/tests/support.py | 58 + .../aob_py3/lib2to3/tests/test_all_fixers.py | 27 + .../aob_py3/lib2to3/tests/test_fixers.py | 4640 +++++++++ .../aob_py3/lib2to3/tests/test_main.py | 139 + .../aob_py3/lib2to3/tests/test_parser.py | 634 ++ .../aob_py3/lib2to3/tests/test_pytree.py | 472 + .../aob_py3/lib2to3/tests/test_refactor.py | 333 + .../aob_py3/lib2to3/tests/test_util.py | 591 ++ .../aob_py3/mako/__init__.py | 8 + .../aob_py3/mako/_ast_util.py | 713 ++ .../ta_socradar_incidents/aob_py3/mako/ast.py | 202 + .../aob_py3/mako/cache.py | 239 + .../ta_socradar_incidents/aob_py3/mako/cmd.py | 100 + .../aob_py3/mako/codegen.py | 1309 +++ .../aob_py3/mako/compat.py | 76 + .../aob_py3/mako/exceptions.py | 417 + .../aob_py3/mako/ext/__init__.py | 0 .../aob_py3/mako/ext/autohandler.py | 70 + .../aob_py3/mako/ext/babelplugin.py | 57 + .../aob_py3/mako/ext/beaker_cache.py | 82 + .../aob_py3/mako/ext/extract.py | 129 + .../aob_py3/mako/ext/linguaplugin.py | 57 + .../aob_py3/mako/ext/preprocessors.py | 20 + .../aob_py3/mako/ext/pygmentplugin.py | 150 + .../aob_py3/mako/ext/turbogears.py | 61 + .../aob_py3/mako/filters.py | 163 + .../aob_py3/mako/lexer.py | 469 + .../aob_py3/mako/lookup.py | 362 + .../aob_py3/mako/parsetree.py | 656 ++ .../aob_py3/mako/pygen.py | 309 + .../aob_py3/mako/pyparser.py | 220 + .../aob_py3/mako/runtime.py | 968 ++ .../aob_py3/mako/template.py | 716 ++ .../aob_py3/mako/testing/__init__.py | 0 .../aob_py3/mako/testing/_config.py | 128 + .../aob_py3/mako/testing/assertions.py | 167 + .../aob_py3/mako/testing/config.py | 17 + .../aob_py3/mako/testing/exclusions.py | 80 + .../aob_py3/mako/testing/fixtures.py | 119 + .../aob_py3/mako/testing/helpers.py | 67 + .../aob_py3/mako/util.py | 388 + .../aob_py3/markupsafe/__init__.py | 288 + .../aob_py3/markupsafe/_native.py | 75 + .../aob_py3/markupsafe/_speedups.c | 339 + .../_speedups.cpython-37m-x86_64-linux-gnu.so | Bin 0 -> 53568 bytes .../aob_py3/markupsafe/_speedups.pyi | 9 + .../aob_py3/markupsafe/py.typed | 0 .../aob_py3/modinput_wrapper/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 196 bytes .../__pycache__/base_modinput.cpython-39.pyc | Bin 0 -> 19780 bytes .../aob_py3/modinput_wrapper/base_modinput.py | 549 ++ .../aob_py3/munch-2.3.2.dist-info/INSTALLER | 1 + .../aob_py3/munch-2.3.2.dist-info/METADATA | 23 + .../aob_py3/munch-2.3.2.dist-info/RECORD | 9 + .../aob_py3/munch-2.3.2.dist-info/REQUESTED | 0 .../aob_py3/munch-2.3.2.dist-info/WHEEL | 6 + .../aob_py3/munch/__init__.py | 511 + .../aob_py3/munch/python3_compat.py | 1 + .../packaging-24.0.dist-info/INSTALLER | 1 + .../aob_py3/packaging-24.0.dist-info/LICENSE | 3 + .../packaging-24.0.dist-info/LICENSE.APACHE | 177 + .../packaging-24.0.dist-info/LICENSE.BSD | 23 + .../aob_py3/packaging-24.0.dist-info/METADATA | 102 + .../aob_py3/packaging-24.0.dist-info/RECORD | 22 + .../aob_py3/packaging-24.0.dist-info/WHEEL | 4 + .../aob_py3/packaging/__init__.py | 15 + .../aob_py3/packaging/_elffile.py | 108 + .../aob_py3/packaging/_manylinux.py | 260 + .../aob_py3/packaging/_musllinux.py | 83 + .../aob_py3/packaging/_parser.py | 356 + .../aob_py3/packaging/_structures.py | 61 + .../aob_py3/packaging/_tokenizer.py | 192 + .../aob_py3/packaging/markers.py | 252 + .../aob_py3/packaging/metadata.py | 825 ++ .../aob_py3/packaging/py.typed | 0 .../aob_py3/packaging/requirements.py | 90 + .../aob_py3/packaging/specifiers.py | 1017 ++ .../aob_py3/packaging/tags.py | 571 ++ .../aob_py3/packaging/utils.py | 172 + .../aob_py3/packaging/version.py | 563 ++ .../ply-3.11.dist-info/DESCRIPTION.rst | 12 + .../aob_py3/ply-3.11.dist-info/INSTALLER | 1 + .../aob_py3/ply-3.11.dist-info/METADATA | 25 + .../aob_py3/ply-3.11.dist-info/RECORD | 13 + .../aob_py3/ply-3.11.dist-info/WHEEL | 6 + .../aob_py3/ply-3.11.dist-info/metadata.json | 1 + .../aob_py3/ply/__init__.py | 5 + .../ta_socradar_incidents/aob_py3/ply/cpp.py | 914 ++ .../aob_py3/ply/ctokens.py | 127 + .../ta_socradar_incidents/aob_py3/ply/lex.py | 1098 +++ .../ta_socradar_incidents/aob_py3/ply/yacc.py | 3502 +++++++ .../ta_socradar_incidents/aob_py3/ply/ygen.py | 69 + .../pyrsistent-0.19.3.dist-info/INSTALLER | 1 + .../pyrsistent-0.19.3.dist-info/LICENSE.mit | 22 + .../pyrsistent-0.19.3.dist-info/METADATA | 783 ++ .../pyrsistent-0.19.3.dist-info/RECORD | 26 + .../aob_py3/pyrsistent-0.19.3.dist-info/WHEEL | 5 + .../aob_py3/pyrsistent/__init__.py | 47 + .../aob_py3/pyrsistent/__init__.pyi | 213 + .../aob_py3/pyrsistent/_checked_types.py | 542 + .../aob_py3/pyrsistent/_field_common.py | 332 + .../aob_py3/pyrsistent/_helpers.py | 97 + .../aob_py3/pyrsistent/_immutable.py | 97 + .../aob_py3/pyrsistent/_pbag.py | 267 + .../aob_py3/pyrsistent/_pclass.py | 262 + .../aob_py3/pyrsistent/_pdeque.py | 376 + .../aob_py3/pyrsistent/_plist.py | 313 + .../aob_py3/pyrsistent/_pmap.py | 576 ++ .../aob_py3/pyrsistent/_precord.py | 167 + .../aob_py3/pyrsistent/_pset.py | 227 + .../aob_py3/pyrsistent/_pvector.py | 711 ++ .../aob_py3/pyrsistent/_toolz.py | 83 + .../aob_py3/pyrsistent/_transformations.py | 139 + .../aob_py3/pyrsistent/py.typed | 0 .../aob_py3/pyrsistent/typing.py | 80 + .../aob_py3/pyrsistent/typing.pyi | 292 + .../requests-2.31.0.dist-info/INSTALLER | 1 + .../aob_py3/requests-2.31.0.dist-info/LICENSE | 175 + .../requests-2.31.0.dist-info/METADATA | 122 + .../aob_py3/requests-2.31.0.dist-info/RECORD | 25 + .../requests-2.31.0.dist-info/REQUESTED | 0 .../aob_py3/requests-2.31.0.dist-info/WHEEL | 5 + .../aob_py3/requests/__init__.py | 180 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 3864 bytes .../__pycache__/__version__.cpython-39.pyc | Bin 0 -> 546 bytes .../_internal_utils.cpython-39.pyc | Bin 0 -> 1621 bytes .../__pycache__/adapters.cpython-39.pyc | Bin 0 -> 16213 bytes .../requests/__pycache__/api.cpython-39.pyc | Bin 0 -> 6787 bytes .../requests/__pycache__/auth.cpython-39.pyc | Bin 0 -> 8352 bytes .../requests/__pycache__/certs.cpython-39.pyc | Bin 0 -> 617 bytes .../__pycache__/compat.cpython-39.pyc | Bin 0 -> 1516 bytes .../__pycache__/cookies.cpython-39.pyc | Bin 0 -> 18814 bytes .../__pycache__/exceptions.cpython-39.pyc | Bin 0 -> 6115 bytes .../requests/__pycache__/hooks.cpython-39.pyc | Bin 0 -> 986 bytes .../__pycache__/models.cpython-39.pyc | Bin 0 -> 24234 bytes .../__pycache__/packages.cpython-39.pyc | Bin 0 -> 707 bytes .../__pycache__/sessions.cpython-39.pyc | Bin 0 -> 19647 bytes .../__pycache__/status_codes.cpython-39.pyc | Bin 0 -> 4231 bytes .../__pycache__/structures.cpython-39.pyc | Bin 0 -> 4443 bytes .../requests/__pycache__/utils.cpython-39.pyc | Bin 0 -> 24328 bytes .../aob_py3/requests/__version__.py | 14 + .../aob_py3/requests/_internal_utils.py | 50 + .../aob_py3/requests/adapters.py | 538 + .../aob_py3/requests/api.py | 157 + .../aob_py3/requests/auth.py | 315 + .../aob_py3/requests/certs.py | 17 + .../aob_py3/requests/compat.py | 79 + .../aob_py3/requests/cookies.py | 561 ++ .../aob_py3/requests/exceptions.py | 141 + .../aob_py3/requests/help.py | 134 + .../aob_py3/requests/hooks.py | 33 + .../aob_py3/requests/models.py | 1034 ++ .../aob_py3/requests/packages.py | 28 + .../aob_py3/requests/sessions.py | 833 ++ .../aob_py3/requests/status_codes.py | 128 + .../aob_py3/requests/structures.py | 99 + .../aob_py3/requests/utils.py | 1094 +++ .../aob_py3/six-1.17.0.dist-info/INSTALLER | 1 + .../aob_py3/six-1.17.0.dist-info/LICENSE | 18 + .../aob_py3/six-1.17.0.dist-info/METADATA | 43 + .../aob_py3/six-1.17.0.dist-info/RECORD | 7 + .../aob_py3/six-1.17.0.dist-info/WHEEL | 6 + .../bin/ta_socradar_incidents/aob_py3/six.py | 1003 ++ .../ta_socradar_incidents/aob_py3/socks.py | 847 ++ .../aob_py3/sockshandler.py | 111 + .../aob_py3/solnlib-6.0.1.dist-info/INSTALLER | 1 + .../aob_py3/solnlib-6.0.1.dist-info/LICENSE | 201 + .../aob_py3/solnlib-6.0.1.dist-info/METADATA | 28 + .../aob_py3/solnlib-6.0.1.dist-info/RECORD | 31 + .../aob_py3/solnlib-6.0.1.dist-info/REQUESTED | 0 .../aob_py3/solnlib-6.0.1.dist-info/WHEEL | 4 + .../aob_py3/solnlib/__init__.py | 59 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 685 bytes .../solnlib/__pycache__/_utils.cpython-39.pyc | Bin 0 -> 2236 bytes .../solnlib/__pycache__/acl.cpython-39.pyc | Bin 0 -> 5147 bytes .../bulletin_rest_client.cpython-39.pyc | Bin 0 -> 5853 bytes .../__pycache__/conf_manager.cpython-39.pyc | Bin 0 -> 16570 bytes .../__pycache__/credentials.cpython-39.pyc | Bin 0 -> 11219 bytes .../__pycache__/file_monitor.cpython-39.pyc | Bin 0 -> 3932 bytes .../__pycache__/hec_config.cpython-39.pyc | Bin 0 -> 4980 bytes .../solnlib/__pycache__/log.cpython-39.pyc | Bin 0 -> 10377 bytes .../__pycache__/net_utils.cpython-39.pyc | Bin 0 -> 3507 bytes .../orphan_process_monitor.cpython-39.pyc | Bin 0 -> 3296 bytes .../__pycache__/pattern.cpython-39.pyc | Bin 0 -> 1022 bytes .../__pycache__/server_info.cpython-39.pyc | Bin 0 -> 8569 bytes .../soln_exceptions.cpython-39.pyc | Bin 0 -> 1022 bytes .../splunk_rest_client.cpython-39.pyc | Bin 0 -> 6063 bytes .../__pycache__/splunkenv.cpython-39.pyc | Bin 0 -> 6962 bytes .../__pycache__/time_parser.cpython-39.pyc | Bin 0 -> 4509 bytes .../__pycache__/timer_queue.cpython-39.pyc | Bin 0 -> 10007 bytes .../__pycache__/user_access.cpython-39.pyc | Bin 0 -> 25999 bytes .../solnlib/__pycache__/utils.cpython-39.pyc | Bin 0 -> 4884 bytes .../aob_py3/solnlib/_utils.py | 79 + .../aob_py3/solnlib/acl.py | 182 + .../aob_py3/solnlib/bulletin_rest_client.py | 151 + .../aob_py3/solnlib/conf_manager.py | 617 ++ .../aob_py3/solnlib/credentials.py | 394 + .../aob_py3/solnlib/file_monitor.py | 133 + .../aob_py3/solnlib/hec_config.py | 182 + .../aob_py3/solnlib/log.py | 373 + .../aob_py3/solnlib/modular_input/__init__.py | 38 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 743 bytes .../__pycache__/checkpointer.cpython-39.pyc | Bin 0 -> 9217 bytes .../__pycache__/event.cpython-39.pyc | Bin 0 -> 7067 bytes .../__pycache__/event_writer.cpython-39.pyc | Bin 0 -> 13903 bytes .../__pycache__/modular_input.cpython-39.pyc | Bin 0 -> 14819 bytes .../solnlib/modular_input/checkpointer.py | 263 + .../aob_py3/solnlib/modular_input/event.py | 255 + .../solnlib/modular_input/event_writer.py | 494 + .../solnlib/modular_input/modular_input.py | 509 + .../aob_py3/solnlib/net_utils.py | 155 + .../aob_py3/solnlib/orphan_process_monitor.py | 120 + .../aob_py3/solnlib/pattern.py | 40 + .../aob_py3/solnlib/server_info.py | 299 + .../aob_py3/solnlib/soln_exceptions.py | 37 + .../aob_py3/solnlib/splunk_rest_client.py | 243 + .../aob_py3/solnlib/splunkenv.py | 317 + .../aob_py3/solnlib/time_parser.py | 151 + .../aob_py3/solnlib/timer_queue.py | 324 + .../aob_py3/solnlib/user_access.py | 949 ++ .../aob_py3/solnlib/utils.py | 195 + .../INSTALLER | 1 + .../sortedcontainers-2.4.0.dist-info/LICENSE | 13 + .../sortedcontainers-2.4.0.dist-info/METADATA | 264 + .../sortedcontainers-2.4.0.dist-info/RECORD | 10 + .../sortedcontainers-2.4.0.dist-info/WHEEL | 6 + .../aob_py3/sortedcontainers/__init__.py | 74 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 2290 bytes .../__pycache__/sorteddict.cpython-39.pyc | Bin 0 -> 23153 bytes .../__pycache__/sortedlist.cpython-39.pyc | Bin 0 -> 60427 bytes .../__pycache__/sortedset.cpython-39.pyc | Bin 0 -> 19763 bytes .../aob_py3/sortedcontainers/sorteddict.py | 812 ++ .../aob_py3/sortedcontainers/sortedlist.py | 2646 +++++ .../aob_py3/sortedcontainers/sortedset.py | 733 ++ .../aob_py3/splunk_aoblib/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 193 bytes .../__pycache__/rest_helper.cpython-39.pyc | Bin 0 -> 1581 bytes .../__pycache__/rest_migration.cpython-39.pyc | Bin 0 -> 5756 bytes .../__pycache__/setup_util.cpython-39.pyc | Bin 0 -> 8399 bytes .../aob_py3/splunk_aoblib/rest_helper.py | 43 + .../aob_py3/splunk_aoblib/rest_migration.py | 216 + .../aob_py3/splunk_aoblib/setup_util.py | 366 + .../aob_py3/splunk_aoblib/utility.py | 16 + .../splunk_sdk-2.1.0.dist-info/INSTALLER | 1 + .../splunk_sdk-2.1.0.dist-info/METADATA | 18 + .../aob_py3/splunk_sdk-2.1.0.dist-info/RECORD | 33 + .../splunk_sdk-2.1.0.dist-info/REQUESTED | 0 .../aob_py3/splunk_sdk-2.1.0.dist-info/WHEEL | 5 + .../aob_py3/splunklib/__init__.py | 34 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 738 bytes .../__pycache__/binding.cpython-39.pyc | Bin 0 -> 52814 bytes .../__pycache__/client.cpython-39.pyc | Bin 0 -> 140476 bytes .../splunklib/__pycache__/data.cpython-39.pyc | Bin 0 -> 7057 bytes .../__pycache__/utils.cpython-39.pyc | Bin 0 -> 1049 bytes .../aob_py3/splunklib/binding.py | 1504 +++ .../aob_py3/splunklib/client.py | 4002 ++++++++ .../aob_py3/splunklib/data.py | 272 + .../splunklib/modularinput/__init__.py | 12 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 682 bytes .../__pycache__/argument.cpython-39.pyc | Bin 0 -> 3271 bytes .../__pycache__/event.cpython-39.pyc | Bin 0 -> 3578 bytes .../__pycache__/event_writer.cpython-39.pyc | Bin 0 -> 3427 bytes .../input_definition.cpython-39.pyc | Bin 0 -> 1510 bytes .../__pycache__/scheme.cpython-39.pyc | Bin 0 -> 2148 bytes .../__pycache__/script.cpython-39.pyc | Bin 0 -> 5305 bytes .../__pycache__/utils.cpython-39.pyc | Bin 0 -> 1659 bytes .../validation_definition.cpython-39.pyc | Bin 0 -> 2282 bytes .../splunklib/modularinput/argument.py | 100 + .../aob_py3/splunklib/modularinput/event.py | 111 + .../splunklib/modularinput/event_writer.py | 102 + .../modularinput/input_definition.py | 55 + .../aob_py3/splunklib/modularinput/scheme.py | 82 + .../aob_py3/splunklib/modularinput/script.py | 167 + .../aob_py3/splunklib/modularinput/utils.py | 74 + .../modularinput/validation_definition.py | 82 + .../aob_py3/splunklib/results.py | 343 + .../splunklib/searchcommands/__init__.py | 157 + .../splunklib/searchcommands/decorators.py | 442 + .../splunklib/searchcommands/environment.py | 122 + .../searchcommands/eventing_command.py | 146 + .../searchcommands/external_search_command.py | 224 + .../searchcommands/generating_command.py | 379 + .../splunklib/searchcommands/internals.py | 825 ++ .../searchcommands/reporting_command.py | 277 + .../searchcommands/search_command.py | 1143 +++ .../searchcommands/streaming_command.py | 188 + .../splunklib/searchcommands/validators.py | 423 + .../aob_py3/splunklib/six.py | 993 ++ .../aob_py3/splunklib/utils.py | 48 + .../splunktalib-3.0.5.dist-info/INSTALLER | 1 + .../splunktalib-3.0.5.dist-info/LICENSE | 202 + .../splunktalib-3.0.5.dist-info/METADATA | 21 + .../splunktalib-3.0.5.dist-info/RECORD | 39 + .../aob_py3/splunktalib-3.0.5.dist-info/WHEEL | 4 + .../aob_py3/splunktalib/__init__.py | 17 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 212 bytes .../aob_py3/splunktalib/common/__init__.py | 15 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 198 bytes .../common/__pycache__/util.cpython-39.pyc | Bin 0 -> 3287 bytes .../aob_py3/splunktalib/common/consts.py | 17 + .../aob_py3/splunktalib/common/log.py | 164 + .../aob_py3/splunktalib/common/pattern.py | 59 + .../aob_py3/splunktalib/common/util.py | 147 + .../splunktalib/common/xml_dom_parser.py | 63 + .../splunktalib/concurrent/__init__.py | 15 + .../concurrent/concurrent_executor.py | 104 + .../splunktalib/concurrent/process_pool.py | 81 + .../splunktalib/concurrent/thread_pool.py | 366 + .../splunktalib/conf_manager/__init__.py | 15 + .../conf_manager/conf_endpoints.py | 162 + .../splunktalib/conf_manager/conf_manager.py | 311 + .../conf_manager/data_input_endpoints.py | 186 + .../conf_manager/property_endpoints.py | 93 + .../splunktalib/conf_manager/request.py | 63 + .../conf_manager/ta_conf_manager.py | 226 + .../aob_py3/splunktalib/credentials.py | 391 + .../aob_py3/splunktalib/event_writer.py | 166 + .../aob_py3/splunktalib/file_monitor.py | 77 + .../aob_py3/splunktalib/kv_client.py | 227 + .../aob_py3/splunktalib/modinput.py | 164 + .../splunktalib/orphan_process_monitor.py | 90 + .../aob_py3/splunktalib/rest.py | 95 + .../aob_py3/splunktalib/schedule/__init__.py | 15 + .../aob_py3/splunktalib/schedule/job.py | 124 + .../aob_py3/splunktalib/schedule/scheduler.py | 163 + .../aob_py3/splunktalib/setting.conf | 21 + .../aob_py3/splunktalib/splunk_cluster.py | 77 + .../aob_py3/splunktalib/splunk_platform.py | 63 + .../aob_py3/splunktalib/state_store.py | 280 + .../aob_py3/splunktalib/timer.py | 101 + .../aob_py3/splunktalib/timer_queue.py | 163 + .../splunktaucclib-6.6.0.dist-info/INSTALLER | 1 + .../splunktaucclib-6.6.0.dist-info/LICENSE | 201 + .../splunktaucclib-6.6.0.dist-info/METADATA | 21 + .../splunktaucclib-6.6.0.dist-info/RECORD | 54 + .../splunktaucclib-6.6.0.dist-info/REQUESTED | 0 .../splunktaucclib-6.6.0.dist-info/WHEEL | 4 + .../aob_py3/splunktaucclib/__init__.py | 17 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 215 bytes .../splunktaucclib/alert_actions_base.py | 220 + .../aob_py3/splunktaucclib/cim_actions.py | 1038 ++ .../aob_py3/splunktaucclib/common/__init__.py | 67 + .../aob_py3/splunktaucclib/common/log.py | 64 + .../aob_py3/splunktaucclib/config.py | 421 + .../data_collection/__init__.py | 15 + .../data_collection/ta_checkpoint_manager.py | 76 + .../data_collection/ta_config.py | 228 + .../data_collection/ta_consts.py | 50 + .../data_collection/ta_data_client.py | 132 + .../data_collection/ta_data_collector.py | 161 + .../data_collection/ta_data_loader.py | 176 + .../data_collection/ta_helper.py | 169 + .../data_collection/ta_mod_input.py | 233 + .../splunktaucclib/global_config/__init__.py | 80 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 1952 bytes .../__pycache__/configuration.cpython-39.pyc | Bin 0 -> 10387 bytes .../__pycache__/schema.cpython-39.pyc | Bin 0 -> 2575 bytes .../global_config/configuration.py | 389 + .../splunktaucclib/global_config/schema.py | 86 + .../modinput_wrapper/__init__.py | 15 + .../modinput_wrapper/base_modinput.py | 591 ++ .../splunktaucclib/rest_handler/__init__.py | 19 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 258 bytes .../__pycache__/admin_external.cpython-39.pyc | Bin 0 -> 4977 bytes .../base_hook_mixin.cpython-39.pyc | Bin 0 -> 1431 bytes .../__pycache__/credentials.cpython-39.pyc | Bin 0 -> 10385 bytes .../__pycache__/eai.cpython-39.pyc | Bin 0 -> 1576 bytes .../__pycache__/entity.cpython-39.pyc | Bin 0 -> 775 bytes .../__pycache__/error.cpython-39.pyc | Bin 0 -> 1203 bytes .../__pycache__/handler.cpython-39.pyc | Bin 0 -> 12860 bytes .../__pycache__/schema.cpython-39.pyc | Bin 0 -> 1338 bytes .../__pycache__/util.cpython-39.pyc | Bin 0 -> 3292 bytes .../rest_handler/admin_external.py | 222 + .../splunktaucclib/rest_handler/base.py | 715 ++ .../rest_handler/base_hook_mixin.py | 48 + .../splunktaucclib/rest_handler/cred_mgmt.py | 172 + .../rest_handler/credentials.py | 453 + .../splunktaucclib/rest_handler/datainput.py | 216 + .../splunktaucclib/rest_handler/eai.py | 73 + .../rest_handler/endpoint/__init__.py | 219 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 6682 bytes .../endpoint/__pycache__/field.cpython-39.pyc | Bin 0 -> 1538 bytes .../__pycache__/validator.cpython-39.pyc | Bin 0 -> 13378 bytes .../rest_handler/endpoint/converter.py | 312 + .../rest_handler/endpoint/field.py | 70 + .../rest_handler/endpoint/validator.py | 485 + .../splunktaucclib/rest_handler/entity.py | 32 + .../splunktaucclib/rest_handler/error.py | 60 + .../splunktaucclib/rest_handler/error_ctl.py | 158 + .../splunktaucclib/rest_handler/handler.py | 526 + .../splunktaucclib/rest_handler/multimodel.py | 184 + .../splunktaucclib/rest_handler/normaliser.py | 109 + .../splunktaucclib/rest_handler/poster.py | 195 + .../splunktaucclib/rest_handler/schema.py | 56 + .../splunktaucclib/rest_handler/teardown.py | 162 + .../splunktaucclib/rest_handler/util.py | 141 + .../splunktaucclib/rest_handler/validator.py | 305 + .../splunktaucclib/splunk_aoblib/__init__.py | 15 + .../splunk_aoblib/rest_helper.py | 68 + .../splunk_aoblib/rest_migration.py | 227 + .../splunk_aoblib/setup_util.py | 397 + .../splunktaucclib/splunk_aoblib/utility.py | 35 + .../INSTALLER | 1 + .../typing_extensions-4.7.1.dist-info/LICENSE | 279 + .../METADATA | 69 + .../typing_extensions-4.7.1.dist-info/RECORD | 6 + .../typing_extensions-4.7.1.dist-info/WHEEL | 4 + .../aob_py3/typing_extensions.py | 3072 ++++++ .../urllib3-1.26.19.dist-info/INSTALLER | 1 + .../urllib3-1.26.19.dist-info/METADATA | 1499 +++ .../aob_py3/urllib3-1.26.19.dist-info/RECORD | 46 + .../urllib3-1.26.19.dist-info/REQUESTED | 0 .../aob_py3/urllib3-1.26.19.dist-info/WHEEL | 6 + .../aob_py3/urllib3/__init__.py | 102 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 2503 bytes .../__pycache__/_collections.cpython-39.pyc | Bin 0 -> 11271 bytes .../__pycache__/_version.cpython-39.pyc | Bin 0 -> 210 bytes .../__pycache__/connection.cpython-39.pyc | Bin 0 -> 13739 bytes .../__pycache__/connectionpool.cpython-39.pyc | Bin 0 -> 25921 bytes .../__pycache__/exceptions.cpython-39.pyc | Bin 0 -> 11642 bytes .../urllib3/__pycache__/fields.cpython-39.pyc | Bin 0 -> 8157 bytes .../__pycache__/filepost.cpython-39.pyc | Bin 0 -> 2758 bytes .../__pycache__/poolmanager.cpython-39.pyc | Bin 0 -> 15124 bytes .../__pycache__/request.cpython-39.pyc | Bin 0 -> 6382 bytes .../__pycache__/response.cpython-39.pyc | Bin 0 -> 22490 bytes .../aob_py3/urllib3/_collections.py | 355 + .../aob_py3/urllib3/_version.py | 2 + .../aob_py3/urllib3/connection.py | 572 ++ .../aob_py3/urllib3/connectionpool.py | 1139 +++ .../aob_py3/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 195 bytes .../_appengine_environ.cpython-39.pyc | Bin 0 -> 1415 bytes .../contrib/__pycache__/socks.cpython-39.pyc | Bin 0 -> 5631 bytes .../urllib3/contrib/_appengine_environ.py | 36 + .../contrib/_securetransport/__init__.py | 0 .../contrib/_securetransport/bindings.py | 519 + .../contrib/_securetransport/low_level.py | 397 + .../aob_py3/urllib3/contrib/appengine.py | 314 + .../aob_py3/urllib3/contrib/ntlmpool.py | 130 + .../aob_py3/urllib3/contrib/pyopenssl.py | 518 + .../urllib3/contrib/securetransport.py | 920 ++ .../aob_py3/urllib3/contrib/socks.py | 216 + .../aob_py3/urllib3/exceptions.py | 323 + .../aob_py3/urllib3/fields.py | 274 + .../aob_py3/urllib3/filepost.py | 98 + .../aob_py3/urllib3/packages/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 196 bytes .../packages/__pycache__/six.cpython-39.pyc | Bin 0 -> 27579 bytes .../urllib3/packages/backports/__init__.py | 0 .../urllib3/packages/backports/makefile.py | 51 + .../packages/backports/weakref_finalize.py | 155 + .../aob_py3/urllib3/packages/six.py | 1076 ++ .../aob_py3/urllib3/poolmanager.py | 540 + .../aob_py3/urllib3/request.py | 191 + .../aob_py3/urllib3/response.py | 885 ++ .../aob_py3/urllib3/util/__init__.py | 49 + .../util/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 1105 bytes .../__pycache__/connection.cpython-39.pyc | Bin 0 -> 3437 bytes .../util/__pycache__/proxy.cpython-39.pyc | Bin 0 -> 1341 bytes .../util/__pycache__/queue.cpython-39.pyc | Bin 0 -> 1060 bytes .../util/__pycache__/request.cpython-39.pyc | Bin 0 -> 3498 bytes .../util/__pycache__/response.cpython-39.pyc | Bin 0 -> 2345 bytes .../util/__pycache__/retry.cpython-39.pyc | Bin 0 -> 16294 bytes .../util/__pycache__/ssl_.cpython-39.pyc | Bin 0 -> 11317 bytes .../ssl_match_hostname.cpython-39.pyc | Bin 0 -> 3259 bytes .../__pycache__/ssltransport.cpython-39.pyc | Bin 0 -> 7475 bytes .../util/__pycache__/timeout.cpython-39.pyc | Bin 0 -> 9146 bytes .../util/__pycache__/url.cpython-39.pyc | Bin 0 -> 10675 bytes .../util/__pycache__/wait.cpython-39.pyc | Bin 0 -> 3128 bytes .../aob_py3/urllib3/util/connection.py | 149 + .../aob_py3/urllib3/util/proxy.py | 57 + .../aob_py3/urllib3/util/queue.py | 22 + .../aob_py3/urllib3/util/request.py | 146 + .../aob_py3/urllib3/util/response.py | 107 + .../aob_py3/urllib3/util/retry.py | 622 ++ .../aob_py3/urllib3/util/ssl_.py | 495 + .../urllib3/util/ssl_match_hostname.py | 159 + .../aob_py3/urllib3/util/ssltransport.py | 221 + .../aob_py3/urllib3/util/timeout.py | 271 + .../aob_py3/urllib3/util/url.py | 435 + .../aob_py3/urllib3/util/wait.py | 152 + .../aob_py3/yaml/__init__.py | 390 + .../_yaml.cpython-37m-x86_64-linux-gnu.so | Bin 0 -> 2129400 bytes .../aob_py3/yaml/composer.py | 139 + .../aob_py3/yaml/constructor.py | 748 ++ .../aob_py3/yaml/cyaml.py | 101 + .../aob_py3/yaml/dumper.py | 62 + .../aob_py3/yaml/emitter.py | 1137 +++ .../aob_py3/yaml/error.py | 75 + .../aob_py3/yaml/events.py | 86 + .../aob_py3/yaml/loader.py | 63 + .../aob_py3/yaml/nodes.py | 49 + .../aob_py3/yaml/parser.py | 589 ++ .../aob_py3/yaml/reader.py | 185 + .../aob_py3/yaml/representer.py | 389 + .../aob_py3/yaml/resolver.py | 227 + .../aob_py3/yaml/scanner.py | 1435 +++ .../aob_py3/yaml/serializer.py | 111 + .../aob_py3/yaml/tokens.py | 104 + .../aob_py3/zipp-3.15.0.dist-info/INSTALLER | 1 + .../aob_py3/zipp-3.15.0.dist-info/LICENSE | 19 + .../aob_py3/zipp-3.15.0.dist-info/METADATA | 106 + .../aob_py3/zipp-3.15.0.dist-info/RECORD | 8 + .../aob_py3/zipp-3.15.0.dist-info/WHEEL | 5 + .../aob_py3/zipp/__init__.py | 402 + .../aob_py3/zipp/py310compat.py | 12 + .../bin/ta_socradar_incidents_declare.py | 23 + .../default/addon_builder.conf | 7 + apps/TA-socradar-incidents/default/app.conf | 30 + .../default/collections.conf | 3 + .../default/commands.conf | 8 + .../default/data/ui/nav/default.xml | 8 + .../default/data/ui/views/configuration.xml | 4 + .../default/data/ui/views/incident_logs.xml | 39 + .../default/data/ui/views/inputs.xml | 4 + .../data/ui/views/manage_alarm_status.xml | 121 + .../ui/views/socradar_incidents_dashboard.xml | 366 + .../default/indexes.conf | 5 + .../TA-socradar-incidents/default/inputs.conf | 8 + apps/TA-socradar-incidents/default/props.conf | 19 + .../default/restmap.conf | 19 + .../TA-socradar-incidents/default/server.conf | 4 + .../ta_socradar_incidents_settings.conf | 15 + apps/TA-socradar-incidents/default/web.conf | 21 + .../metadata/default.meta | 8 + .../TA-socradar-incidents/metadata/local.meta | 9 + apps/TA-socradar-incidents/static/appIcon.png | Bin 0 -> 948 bytes .../static/appIconAlt.png | Bin 0 -> 948 bytes .../static/appIconAlt_2x.png | Bin 0 -> 3823 bytes .../static/appIcon_2x.png | Bin 0 -> 3823 bytes 1090 files changed, 202110 insertions(+) create mode 100755 apps/TA-socradar-incidents/README/addon_builder.conf.spec create mode 100755 apps/TA-socradar-incidents/README/inputs.conf.spec create mode 100755 apps/TA-socradar-incidents/README/ta_socradar_incidents_settings.conf.spec create mode 100755 apps/TA-socradar-incidents/TA-socradar-incidents.aob_meta create mode 100755 apps/TA-socradar-incidents/aob_events_in_meta.json create mode 100755 apps/TA-socradar-incidents/app.manifest create mode 100755 apps/TA-socradar-incidents/appserver/controllers/update_status.py create mode 100755 apps/TA-socradar-incidents/appserver/static/javascript_mvc_guide.md create mode 100755 apps/TA-socradar-incidents/appserver/static/js/build/11.5f537ef2df4a1dddfa28.js create mode 100755 apps/TA-socradar-incidents/appserver/static/js/build/238.8e15410feb4dc7301333.js create mode 100755 apps/TA-socradar-incidents/appserver/static/js/build/313.77cc81cceb759a35a0be.js create mode 100755 apps/TA-socradar-incidents/appserver/static/js/build/354.b1e0bf4a3fa043f59a8b.js create mode 100755 apps/TA-socradar-incidents/appserver/static/js/build/399.d2adffc7ddcdb8217d78.js create mode 100755 apps/TA-socradar-incidents/appserver/static/js/build/504.c17789cd2f8fc244f4e5.js create mode 100755 apps/TA-socradar-incidents/appserver/static/js/build/692.eb5b40c69adcdb9b6b67.js create mode 100755 apps/TA-socradar-incidents/appserver/static/js/build/748.0721de96fda1fbd45cdc.js create mode 100755 apps/TA-socradar-incidents/appserver/static/js/build/838.861aa9f1e37dd3330f18.js create mode 100755 apps/TA-socradar-incidents/appserver/static/js/build/870.01a167948c7c5321c30e.js create mode 100755 apps/TA-socradar-incidents/appserver/static/js/build/98.dcec2b756ef421ae0b81.js create mode 100755 apps/TA-socradar-incidents/appserver/static/js/build/entry_page.js create mode 100755 apps/TA-socradar-incidents/appserver/static/js/build/globalConfig.json create mode 100755 apps/TA-socradar-incidents/appserver/static/openapi.json create mode 100755 apps/TA-socradar-incidents/appserver/templates/base.html create mode 100755 apps/TA-socradar-incidents/bin/TA_socradar_incidents_rh_settings.py create mode 100755 apps/TA-socradar-incidents/bin/TA_socradar_incidents_rh_socradar_incidents_collector.py create mode 100755 apps/TA-socradar-incidents/bin/__pycache__/input_module_socradar_incidents_collector.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/__pycache__/ta_socradar_incidents_declare.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/input_module_socradar_incidents_collector.py create mode 100755 apps/TA-socradar-incidents/bin/socradar_incidents_collector.py create mode 100755 apps/TA-socradar-incidents/bin/status_update_with_log.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/Mako-1.2.4.dist-info/INSTALLER create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/Mako-1.2.4.dist-info/LICENSE create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/Mako-1.2.4.dist-info/METADATA create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/Mako-1.2.4.dist-info/RECORD create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/Mako-1.2.4.dist-info/REQUESTED create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/Mako-1.2.4.dist-info/WHEEL create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/MarkupSafe-2.0.1.dist-info/INSTALLER create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/MarkupSafe-2.0.1.dist-info/LICENSE.rst create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/MarkupSafe-2.0.1.dist-info/METADATA create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/MarkupSafe-2.0.1.dist-info/RECORD create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/MarkupSafe-2.0.1.dist-info/REQUESTED create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/MarkupSafe-2.0.1.dist-info/WHEEL create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/PySocks-1.7.1.dist-info/INSTALLER create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/PySocks-1.7.1.dist-info/LICENSE create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/PySocks-1.7.1.dist-info/METADATA create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/PySocks-1.7.1.dist-info/RECORD create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/PySocks-1.7.1.dist-info/WHEEL create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/PyYAML-6.0.1.dist-info/INSTALLER create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/PyYAML-6.0.1.dist-info/LICENSE create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/PyYAML-6.0.1.dist-info/METADATA create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/PyYAML-6.0.1.dist-info/RECORD create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/PyYAML-6.0.1.dist-info/REQUESTED create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/PyYAML-6.0.1.dist-info/WHEEL create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/__pycache__/socks.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/_pyrsistent_version.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/_yaml/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/__init__.pyi create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/_cmp.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/_cmp.pyi create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/_compat.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/_config.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/_funcs.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/_make.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/_next_gen.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/_typing_compat.pyi create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/_version_info.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/_version_info.pyi create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/converters.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/converters.pyi create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/exceptions.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/exceptions.pyi create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/filters.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/filters.pyi create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/py.typed create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/setters.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/setters.pyi create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/validators.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/validators.pyi create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs-24.2.0.dist-info/INSTALLER create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs-24.2.0.dist-info/METADATA create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs-24.2.0.dist-info/RECORD create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs-24.2.0.dist-info/WHEEL create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs-24.2.0.dist-info/licenses/LICENSE create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs/__init__.pyi create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs/converters.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs/exceptions.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs/filters.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs/py.typed create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs/setters.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs/validators.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/bin/json create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/bin/jsonpath.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/bin/jsonpath_ng create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/bin/jsonschema create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/bin/mako-render create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/bin/normalizer create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/certifi-2025.4.26.dist-info/INSTALLER create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/certifi-2025.4.26.dist-info/METADATA create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/certifi-2025.4.26.dist-info/RECORD create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/certifi-2025.4.26.dist-info/WHEEL create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/certifi-2025.4.26.dist-info/licenses/LICENSE create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/certifi/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/certifi/__main__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/certifi/__pycache__/__init__.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/certifi/__pycache__/core.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/certifi/cacert.pem create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/certifi/core.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/certifi/py.typed create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer-2.0.12.dist-info/INSTALLER create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer-2.0.12.dist-info/LICENSE create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer-2.0.12.dist-info/METADATA create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer-2.0.12.dist-info/RECORD create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer-2.0.12.dist-info/REQUESTED create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer-2.0.12.dist-info/WHEEL create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/__pycache__/__init__.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/__pycache__/api.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/__pycache__/cd.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/__pycache__/constant.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/__pycache__/legacy.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/__pycache__/md.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/__pycache__/models.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/__pycache__/utils.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/__pycache__/version.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/api.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/assets/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/assets/__pycache__/__init__.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/cd.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/cli/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/cli/normalizer.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/constant.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/legacy.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/md.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/models.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/py.typed create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/utils.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/version.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib-3.3.0.dist-info/INSTALLER create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib-3.3.0.dist-info/LICENSE create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib-3.3.0.dist-info/METADATA create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib-3.3.0.dist-info/RECORD create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib-3.3.0.dist-info/REQUESTED create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib-3.3.0.dist-info/WHEEL create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/client.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/common/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/common/lib_util.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/common/log.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/common/util.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/configuration/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/configuration/loader.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/configuration/schema_1_0_0.json create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/checkpoint.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/defaults.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/engine.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/engine_v2.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/exceptions.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/ext.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/http.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/job.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/models.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/pipemgr.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/plugin.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/task.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/template.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/cloud_connect_mod_input.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/common/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/common/log.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/common/rwlock.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/common/schema_meta.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/config.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/data_collection/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/data_collection/ta_checkpoint_manager.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/data_collection/ta_config.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/data_collection/ta_consts.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/data_collection/ta_data_client.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/data_collection/ta_data_collector.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/data_collection/ta_data_loader.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/data_collection/ta_helper.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/data_collection/ta_mod_input.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/splunk_ta_import_declare.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/ta_cloud_connect_client.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/decorator-5.1.1.dist-info/INSTALLER create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/decorator-5.1.1.dist-info/METADATA create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/decorator-5.1.1.dist-info/RECORD create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/decorator-5.1.1.dist-info/WHEEL create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/decorator-5.1.1.dist-info/pbr.json create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/decorator.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml-0.7.1.dist-info/INSTALLER create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml-0.7.1.dist-info/LICENSE create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml-0.7.1.dist-info/METADATA create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml-0.7.1.dist-info/RECORD create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml-0.7.1.dist-info/WHEEL create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/ElementTree.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/__pycache__/ElementTree.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/__pycache__/__init__.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/__pycache__/common.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/cElementTree.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/common.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/expatbuilder.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/expatreader.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/lxml.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/minidom.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/pulldom.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/sax.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/xmlrpc.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/deprecation-2.1.0.dist-info/INSTALLER create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/deprecation-2.1.0.dist-info/LICENSE create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/deprecation-2.1.0.dist-info/METADATA create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/deprecation-2.1.0.dist-info/RECORD create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/deprecation-2.1.0.dist-info/WHEEL create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/deprecation.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna-3.10.dist-info/INSTALLER create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna-3.10.dist-info/LICENSE.md create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna-3.10.dist-info/METADATA create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna-3.10.dist-info/RECORD create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna-3.10.dist-info/WHEEL create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna/__pycache__/__init__.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna/__pycache__/core.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna/__pycache__/idnadata.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna/__pycache__/intranges.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna/__pycache__/package_data.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna/codec.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna/compat.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna/core.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna/idnadata.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna/intranges.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna/package_data.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna/py.typed create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna/uts46data.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata-6.7.0.dist-info/INSTALLER create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata-6.7.0.dist-info/LICENSE create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata-6.7.0.dist-info/METADATA create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata-6.7.0.dist-info/RECORD create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata-6.7.0.dist-info/WHEEL create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata/_adapters.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata/_collections.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata/_compat.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata/_functools.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata/_itertools.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata/_meta.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata/_py39compat.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata/_text.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata/py.typed create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources-5.12.0.dist-info/INSTALLER create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources-5.12.0.dist-info/LICENSE create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources-5.12.0.dist-info/METADATA create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources-5.12.0.dist-info/RECORD create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources-5.12.0.dist-info/WHEEL create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/_adapters.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/_common.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/_compat.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/_itertools.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/_legacy.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/abc.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/py.typed create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/readers.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/simple.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/_compat.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/_path.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/data01/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/data01/binary.file create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/data01/subdirectory/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/data01/subdirectory/binary.file create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/data01/utf-16.file create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/data01/utf-8.file create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/data02/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/data02/one/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/data02/two/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/namespacedata01/binary.file create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/namespacedata01/utf-16.file create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/namespacedata01/utf-8.file create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/test_compatibilty_files.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/test_contents.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/test_custom.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/test_files.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/test_open.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/test_path.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/test_read.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/test_reader.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/test_resource.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/update-zips.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/util.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/zipdata01/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/zipdata01/ziptestdata.zip create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/zipdata02/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/zipdata02/ziptestdata.zip create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2-3.1.6.dist-info/INSTALLER create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2-3.1.6.dist-info/METADATA create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2-3.1.6.dist-info/RECORD create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2-3.1.6.dist-info/REQUESTED create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2-3.1.6.dist-info/WHEEL create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/_identifier.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/async_utils.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/bccache.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/compiler.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/constants.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/debug.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/defaults.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/environment.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/exceptions.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/ext.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/filters.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/idtracking.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/lexer.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/loaders.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/meta.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/nativetypes.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/nodes.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/optimizer.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/parser.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/py.typed create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/runtime.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/sandbox.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/tests.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/utils.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/visitor.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsl-0.2.4.dist-info/INSTALLER create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsl-0.2.4.dist-info/LICENSE create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsl-0.2.4.dist-info/METADATA create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsl-0.2.4.dist-info/RECORD create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsl-0.2.4.dist-info/REQUESTED create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsl-0.2.4.dist-info/WHEEL create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsl/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsl/_compat/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsl/_compat/ordereddict.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsl/_compat/prepareable.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsl/document.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsl/exceptions.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsl/fields/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsl/fields/base.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsl/fields/compound.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsl/fields/primitive.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsl/fields/util.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsl/registry.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsl/resolutionscope.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsl/roles.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/json_spec-0.10.1.dist-info/DESCRIPTION.rst create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/json_spec-0.10.1.dist-info/INSTALLER create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/json_spec-0.10.1.dist-info/METADATA create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/json_spec-0.10.1.dist-info/RECORD create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/json_spec-0.10.1.dist-info/WHEEL create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/json_spec-0.10.1.dist-info/metadata.json create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsoncomment-0.4.2.dist-info/COPYING create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsoncomment-0.4.2.dist-info/INSTALLER create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsoncomment-0.4.2.dist-info/METADATA create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsoncomment-0.4.2.dist-info/RECORD create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsoncomment-0.4.2.dist-info/REQUESTED create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsoncomment-0.4.2.dist-info/WHEEL create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsoncomment/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsoncomment/comments.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsoncomment/wrapper.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonpath_ng-1.7.0.dist-info/INSTALLER create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonpath_ng-1.7.0.dist-info/LICENSE create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonpath_ng-1.7.0.dist-info/METADATA create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonpath_ng-1.7.0.dist-info/RECORD create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonpath_ng-1.7.0.dist-info/WHEEL create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonpath_ng/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonpath_ng/bin/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonpath_ng/bin/jsonpath.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonpath_ng/exceptions.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonpath_ng/ext/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonpath_ng/ext/arithmetic.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonpath_ng/ext/filter.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonpath_ng/ext/iterable.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonpath_ng/ext/parser.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonpath_ng/ext/string.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonpath_ng/jsonpath.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonpath_ng/lexer.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonpath_ng/parser.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonpath_rw-1.4.0.dist-info/INSTALLER create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonpath_rw-1.4.0.dist-info/METADATA create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonpath_rw-1.4.0.dist-info/RECORD create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonpath_rw-1.4.0.dist-info/REQUESTED create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonpath_rw-1.4.0.dist-info/WHEEL create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonpath_rw/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonpath_rw/bin/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonpath_rw/bin/jsonpath.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonpath_rw/jsonpath.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonpath_rw/lexer.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonpath_rw/parser.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonschema-4.4.0.dist-info/COPYING create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonschema-4.4.0.dist-info/INSTALLER create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonschema-4.4.0.dist-info/METADATA create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonschema-4.4.0.dist-info/RECORD create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonschema-4.4.0.dist-info/REQUESTED create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonschema-4.4.0.dist-info/WHEEL create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonschema/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonschema/__main__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonschema/_format.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonschema/_legacy_validators.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonschema/_reflect.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonschema/_types.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonschema/_utils.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonschema/_validators.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonschema/benchmarks/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonschema/benchmarks/issue232.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonschema/benchmarks/json_schema_test_suite.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonschema/cli.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonschema/exceptions.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonschema/protocols.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonschema/schemas/draft2019-09.json create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonschema/schemas/draft2020-12.json create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonschema/schemas/draft3.json create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonschema/schemas/draft4.json create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonschema/schemas/draft6.json create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonschema/schemas/draft7.json create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonschema/schemas/vocabularies.json create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonschema/tests/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonschema/tests/_helpers.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonschema/tests/_suite.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonschema/tests/fuzz_validate.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonschema/tests/test_cli.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonschema/tests/test_deprecations.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonschema/tests/test_exceptions.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonschema/tests/test_format.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonschema/tests/test_jsonschema_test_suite.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonschema/tests/test_types.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonschema/tests/test_utils.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonschema/tests/test_validators.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonschema/validators.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonspec/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonspec/__main__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonspec/_version.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonspec/cli.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonspec/driver.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonspec/misc/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonspec/misc/schemas/draft-03/card.json create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonspec/misc/schemas/draft-03/hyper-schema.json create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonspec/misc/schemas/draft-03/json-ref.json create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonspec/misc/schemas/draft-03/links.json create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonspec/misc/schemas/draft-03/schema.json create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonspec/misc/schemas/draft-04/hyper-schema.json create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonspec/misc/schemas/draft-04/schema.json create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonspec/operations/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonspec/operations/bases.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonspec/operations/exceptions.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonspec/pointer/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonspec/pointer/bases.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonspec/pointer/exceptions.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonspec/pointer/stages.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonspec/reference/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonspec/reference/bases.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonspec/reference/exceptions.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonspec/reference/providers.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonspec/reference/util.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonspec/validators/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonspec/validators/bases.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonspec/validators/draft03.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonspec/validators/draft04.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonspec/validators/exceptions.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonspec/validators/factorize.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonspec/validators/formats.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonspec/validators/pointer_util.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jsonspec/validators/util.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/Grammar3.7.4.final.0.pickle create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/PatternGrammar3.7.4.final.0.pickle create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/__main__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/btm_matcher.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/btm_utils.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixer_base.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixer_util.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_apply.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_asserts.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_basestring.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_buffer.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_dict.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_except.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_exec.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_execfile.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_exitfunc.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_filter.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_funcattrs.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_future.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_getcwdu.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_has_key.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_idioms.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_import.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_imports.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_imports2.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_input.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_intern.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_isinstance.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_itertools.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_itertools_imports.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_long.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_map.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_metaclass.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_methodattrs.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_ne.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_next.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_nonzero.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_numliterals.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_operator.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_paren.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_print.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_raise.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_raw_input.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_reduce.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_reload.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_renames.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_repr.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_set_literal.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_standarderror.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_sys_exc.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_throw.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_tuple_params.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_types.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_unicode.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_urllib.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_ws_comma.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_xrange.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_xreadlines.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/fixes/fix_zip.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/main.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/patcomp.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/pgen2/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/pgen2/conv.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/pgen2/driver.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/pgen2/grammar.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/pgen2/literals.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/pgen2/parse.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/pgen2/pgen.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/pgen2/token.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/pgen2/tokenize.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/pygram.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/pytree.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/refactor.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/tests/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/tests/__main__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/tests/data/README create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/tests/data/bom.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/tests/data/crlf.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/tests/data/different_encoding.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/tests/data/false_encoding.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/tests/data/fixers/bad_order.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/tests/data/fixers/myfixes/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/tests/data/fixers/myfixes/fix_explicit.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/tests/data/fixers/myfixes/fix_first.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/tests/data/fixers/myfixes/fix_last.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/tests/data/fixers/myfixes/fix_parrot.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/tests/data/fixers/myfixes/fix_preorder.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/tests/data/fixers/no_fixer_cls.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/tests/data/fixers/parrot_example.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/tests/data/infinite_recursion.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/tests/data/py2_test_grammar.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/tests/data/py3_test_grammar.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/tests/pytree_idempotency.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/tests/support.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/tests/test_all_fixers.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/tests/test_fixers.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/tests/test_main.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/tests/test_parser.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/tests/test_pytree.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/tests/test_refactor.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/lib2to3/tests/test_util.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/mako/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/mako/_ast_util.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/mako/ast.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/mako/cache.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/mako/cmd.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/mako/codegen.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/mako/compat.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/mako/exceptions.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/mako/ext/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/mako/ext/autohandler.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/mako/ext/babelplugin.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/mako/ext/beaker_cache.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/mako/ext/extract.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/mako/ext/linguaplugin.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/mako/ext/preprocessors.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/mako/ext/pygmentplugin.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/mako/ext/turbogears.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/mako/filters.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/mako/lexer.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/mako/lookup.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/mako/parsetree.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/mako/pygen.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/mako/pyparser.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/mako/runtime.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/mako/template.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/mako/testing/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/mako/testing/_config.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/mako/testing/assertions.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/mako/testing/config.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/mako/testing/exclusions.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/mako/testing/fixtures.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/mako/testing/helpers.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/mako/util.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/markupsafe/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/markupsafe/_native.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/markupsafe/_speedups.c create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/markupsafe/_speedups.cpython-37m-x86_64-linux-gnu.so create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/markupsafe/_speedups.pyi create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/markupsafe/py.typed create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/modinput_wrapper/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/modinput_wrapper/__pycache__/__init__.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/modinput_wrapper/__pycache__/base_modinput.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/modinput_wrapper/base_modinput.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/munch-2.3.2.dist-info/INSTALLER create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/munch-2.3.2.dist-info/METADATA create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/munch-2.3.2.dist-info/RECORD create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/munch-2.3.2.dist-info/REQUESTED create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/munch-2.3.2.dist-info/WHEEL create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/munch/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/munch/python3_compat.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/packaging-24.0.dist-info/INSTALLER create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/packaging-24.0.dist-info/LICENSE create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/packaging-24.0.dist-info/LICENSE.APACHE create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/packaging-24.0.dist-info/LICENSE.BSD create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/packaging-24.0.dist-info/METADATA create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/packaging-24.0.dist-info/RECORD create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/packaging-24.0.dist-info/WHEEL create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/packaging/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/packaging/_elffile.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/packaging/_manylinux.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/packaging/_musllinux.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/packaging/_parser.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/packaging/_structures.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/packaging/_tokenizer.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/packaging/markers.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/packaging/metadata.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/packaging/py.typed create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/packaging/requirements.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/packaging/specifiers.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/packaging/tags.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/packaging/utils.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/packaging/version.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/ply-3.11.dist-info/DESCRIPTION.rst create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/ply-3.11.dist-info/INSTALLER create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/ply-3.11.dist-info/METADATA create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/ply-3.11.dist-info/RECORD create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/ply-3.11.dist-info/WHEEL create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/ply-3.11.dist-info/metadata.json create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/ply/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/ply/cpp.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/ply/ctokens.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/ply/lex.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/ply/yacc.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/ply/ygen.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/pyrsistent-0.19.3.dist-info/INSTALLER create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/pyrsistent-0.19.3.dist-info/LICENSE.mit create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/pyrsistent-0.19.3.dist-info/METADATA create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/pyrsistent-0.19.3.dist-info/RECORD create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/pyrsistent-0.19.3.dist-info/WHEEL create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/pyrsistent/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/pyrsistent/__init__.pyi create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/pyrsistent/_checked_types.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/pyrsistent/_field_common.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/pyrsistent/_helpers.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/pyrsistent/_immutable.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/pyrsistent/_pbag.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/pyrsistent/_pclass.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/pyrsistent/_pdeque.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/pyrsistent/_plist.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/pyrsistent/_pmap.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/pyrsistent/_precord.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/pyrsistent/_pset.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/pyrsistent/_pvector.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/pyrsistent/_toolz.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/pyrsistent/_transformations.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/pyrsistent/py.typed create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/pyrsistent/typing.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/pyrsistent/typing.pyi create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/requests-2.31.0.dist-info/INSTALLER create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/requests-2.31.0.dist-info/LICENSE create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/requests-2.31.0.dist-info/METADATA create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/requests-2.31.0.dist-info/RECORD create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/requests-2.31.0.dist-info/REQUESTED create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/requests-2.31.0.dist-info/WHEEL create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/requests/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/requests/__pycache__/__init__.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/requests/__pycache__/__version__.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/requests/__pycache__/_internal_utils.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/requests/__pycache__/adapters.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/requests/__pycache__/api.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/requests/__pycache__/auth.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/requests/__pycache__/certs.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/requests/__pycache__/compat.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/requests/__pycache__/cookies.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/requests/__pycache__/exceptions.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/requests/__pycache__/hooks.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/requests/__pycache__/models.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/requests/__pycache__/packages.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/requests/__pycache__/sessions.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/requests/__pycache__/status_codes.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/requests/__pycache__/structures.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/requests/__pycache__/utils.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/requests/__version__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/requests/_internal_utils.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/requests/adapters.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/requests/api.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/requests/auth.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/requests/certs.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/requests/compat.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/requests/cookies.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/requests/exceptions.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/requests/help.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/requests/hooks.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/requests/models.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/requests/packages.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/requests/sessions.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/requests/status_codes.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/requests/structures.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/requests/utils.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/six-1.17.0.dist-info/INSTALLER create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/six-1.17.0.dist-info/LICENSE create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/six-1.17.0.dist-info/METADATA create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/six-1.17.0.dist-info/RECORD create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/six-1.17.0.dist-info/WHEEL create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/six.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/socks.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/sockshandler.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib-6.0.1.dist-info/INSTALLER create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib-6.0.1.dist-info/LICENSE create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib-6.0.1.dist-info/METADATA create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib-6.0.1.dist-info/RECORD create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib-6.0.1.dist-info/REQUESTED create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib-6.0.1.dist-info/WHEEL create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/__pycache__/__init__.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/__pycache__/_utils.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/__pycache__/acl.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/__pycache__/bulletin_rest_client.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/__pycache__/conf_manager.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/__pycache__/credentials.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/__pycache__/file_monitor.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/__pycache__/hec_config.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/__pycache__/log.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/__pycache__/net_utils.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/__pycache__/orphan_process_monitor.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/__pycache__/pattern.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/__pycache__/server_info.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/__pycache__/soln_exceptions.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/__pycache__/splunk_rest_client.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/__pycache__/splunkenv.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/__pycache__/time_parser.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/__pycache__/timer_queue.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/__pycache__/user_access.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/__pycache__/utils.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/_utils.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/acl.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/bulletin_rest_client.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/conf_manager.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/credentials.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/file_monitor.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/hec_config.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/log.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/modular_input/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/modular_input/__pycache__/__init__.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/modular_input/__pycache__/checkpointer.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/modular_input/__pycache__/event.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/modular_input/__pycache__/event_writer.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/modular_input/__pycache__/modular_input.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/modular_input/checkpointer.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/modular_input/event.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/modular_input/event_writer.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/modular_input/modular_input.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/net_utils.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/orphan_process_monitor.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/pattern.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/server_info.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/soln_exceptions.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/splunk_rest_client.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/splunkenv.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/time_parser.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/timer_queue.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/user_access.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/solnlib/utils.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/sortedcontainers-2.4.0.dist-info/INSTALLER create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/sortedcontainers-2.4.0.dist-info/LICENSE create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/sortedcontainers-2.4.0.dist-info/METADATA create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/sortedcontainers-2.4.0.dist-info/RECORD create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/sortedcontainers-2.4.0.dist-info/WHEEL create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/sortedcontainers/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/sortedcontainers/__pycache__/__init__.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/sortedcontainers/__pycache__/sorteddict.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/sortedcontainers/__pycache__/sortedlist.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/sortedcontainers/__pycache__/sortedset.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/sortedcontainers/sorteddict.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/sortedcontainers/sortedlist.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/sortedcontainers/sortedset.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunk_aoblib/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunk_aoblib/__pycache__/__init__.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunk_aoblib/__pycache__/rest_helper.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunk_aoblib/__pycache__/rest_migration.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunk_aoblib/__pycache__/setup_util.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunk_aoblib/rest_helper.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunk_aoblib/rest_migration.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunk_aoblib/setup_util.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunk_aoblib/utility.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunk_sdk-2.1.0.dist-info/INSTALLER create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunk_sdk-2.1.0.dist-info/METADATA create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunk_sdk-2.1.0.dist-info/RECORD create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunk_sdk-2.1.0.dist-info/REQUESTED create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunk_sdk-2.1.0.dist-info/WHEEL create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunklib/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunklib/__pycache__/__init__.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunklib/__pycache__/binding.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunklib/__pycache__/client.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunklib/__pycache__/data.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunklib/__pycache__/utils.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunklib/binding.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunklib/client.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunklib/data.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunklib/modularinput/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunklib/modularinput/__pycache__/__init__.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunklib/modularinput/__pycache__/argument.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunklib/modularinput/__pycache__/event.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunklib/modularinput/__pycache__/event_writer.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunklib/modularinput/__pycache__/input_definition.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunklib/modularinput/__pycache__/scheme.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunklib/modularinput/__pycache__/script.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunklib/modularinput/__pycache__/utils.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunklib/modularinput/__pycache__/validation_definition.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunklib/modularinput/argument.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunklib/modularinput/event.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunklib/modularinput/event_writer.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunklib/modularinput/input_definition.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunklib/modularinput/scheme.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunklib/modularinput/script.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunklib/modularinput/utils.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunklib/modularinput/validation_definition.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunklib/results.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunklib/searchcommands/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunklib/searchcommands/decorators.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunklib/searchcommands/environment.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunklib/searchcommands/eventing_command.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunklib/searchcommands/external_search_command.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunklib/searchcommands/generating_command.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunklib/searchcommands/internals.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunklib/searchcommands/reporting_command.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunklib/searchcommands/search_command.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunklib/searchcommands/streaming_command.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunklib/searchcommands/validators.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunklib/six.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunklib/utils.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktalib-3.0.5.dist-info/INSTALLER create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktalib-3.0.5.dist-info/LICENSE create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktalib-3.0.5.dist-info/METADATA create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktalib-3.0.5.dist-info/RECORD create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktalib-3.0.5.dist-info/WHEEL create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktalib/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktalib/__pycache__/__init__.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktalib/common/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktalib/common/__pycache__/__init__.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktalib/common/__pycache__/util.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktalib/common/consts.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktalib/common/log.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktalib/common/pattern.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktalib/common/util.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktalib/common/xml_dom_parser.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktalib/concurrent/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktalib/concurrent/concurrent_executor.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktalib/concurrent/process_pool.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktalib/concurrent/thread_pool.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktalib/conf_manager/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktalib/conf_manager/conf_endpoints.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktalib/conf_manager/conf_manager.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktalib/conf_manager/data_input_endpoints.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktalib/conf_manager/property_endpoints.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktalib/conf_manager/request.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktalib/conf_manager/ta_conf_manager.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktalib/credentials.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktalib/event_writer.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktalib/file_monitor.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktalib/kv_client.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktalib/modinput.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktalib/orphan_process_monitor.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktalib/rest.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktalib/schedule/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktalib/schedule/job.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktalib/schedule/scheduler.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktalib/setting.conf create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktalib/splunk_cluster.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktalib/splunk_platform.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktalib/state_store.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktalib/timer.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktalib/timer_queue.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib-6.6.0.dist-info/INSTALLER create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib-6.6.0.dist-info/LICENSE create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib-6.6.0.dist-info/METADATA create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib-6.6.0.dist-info/RECORD create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib-6.6.0.dist-info/REQUESTED create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib-6.6.0.dist-info/WHEEL create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/__pycache__/__init__.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/alert_actions_base.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/cim_actions.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/common/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/common/log.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/config.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/data_collection/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/data_collection/ta_checkpoint_manager.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/data_collection/ta_config.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/data_collection/ta_consts.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/data_collection/ta_data_client.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/data_collection/ta_data_collector.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/data_collection/ta_data_loader.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/data_collection/ta_helper.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/data_collection/ta_mod_input.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/global_config/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/global_config/__pycache__/__init__.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/global_config/__pycache__/configuration.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/global_config/__pycache__/schema.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/global_config/configuration.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/global_config/schema.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/modinput_wrapper/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/modinput_wrapper/base_modinput.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/rest_handler/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/rest_handler/__pycache__/__init__.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/rest_handler/__pycache__/admin_external.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/rest_handler/__pycache__/base_hook_mixin.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/rest_handler/__pycache__/credentials.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/rest_handler/__pycache__/eai.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/rest_handler/__pycache__/entity.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/rest_handler/__pycache__/error.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/rest_handler/__pycache__/handler.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/rest_handler/__pycache__/schema.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/rest_handler/__pycache__/util.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/rest_handler/admin_external.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/rest_handler/base.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/rest_handler/base_hook_mixin.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/rest_handler/cred_mgmt.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/rest_handler/credentials.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/rest_handler/datainput.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/rest_handler/eai.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/rest_handler/endpoint/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/rest_handler/endpoint/__pycache__/__init__.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/rest_handler/endpoint/__pycache__/field.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/rest_handler/endpoint/__pycache__/validator.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/rest_handler/endpoint/converter.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/rest_handler/endpoint/field.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/rest_handler/endpoint/validator.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/rest_handler/entity.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/rest_handler/error.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/rest_handler/error_ctl.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/rest_handler/handler.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/rest_handler/multimodel.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/rest_handler/normaliser.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/rest_handler/poster.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/rest_handler/schema.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/rest_handler/teardown.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/rest_handler/util.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/rest_handler/validator.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/splunk_aoblib/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/splunk_aoblib/rest_helper.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/splunk_aoblib/rest_migration.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/splunk_aoblib/setup_util.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/splunktaucclib/splunk_aoblib/utility.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/typing_extensions-4.7.1.dist-info/INSTALLER create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/typing_extensions-4.7.1.dist-info/LICENSE create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/typing_extensions-4.7.1.dist-info/METADATA create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/typing_extensions-4.7.1.dist-info/RECORD create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/typing_extensions-4.7.1.dist-info/WHEEL create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/typing_extensions.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3-1.26.19.dist-info/INSTALLER create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3-1.26.19.dist-info/METADATA create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3-1.26.19.dist-info/RECORD create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3-1.26.19.dist-info/REQUESTED create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3-1.26.19.dist-info/WHEEL create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/__pycache__/__init__.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/__pycache__/_collections.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/__pycache__/_version.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/__pycache__/connection.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/__pycache__/connectionpool.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/__pycache__/exceptions.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/__pycache__/fields.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/__pycache__/filepost.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/__pycache__/poolmanager.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/__pycache__/request.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/__pycache__/response.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/_collections.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/_version.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/connection.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/connectionpool.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/contrib/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/contrib/__pycache__/__init__.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/contrib/__pycache__/_appengine_environ.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/contrib/__pycache__/socks.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/contrib/_appengine_environ.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/contrib/_securetransport/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/contrib/_securetransport/bindings.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/contrib/_securetransport/low_level.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/contrib/appengine.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/contrib/ntlmpool.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/contrib/pyopenssl.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/contrib/securetransport.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/contrib/socks.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/exceptions.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/fields.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/filepost.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/packages/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/packages/__pycache__/__init__.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/packages/__pycache__/six.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/packages/backports/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/packages/backports/makefile.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/packages/backports/weakref_finalize.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/packages/six.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/poolmanager.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/request.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/response.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/util/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/util/__pycache__/__init__.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/util/__pycache__/connection.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/util/__pycache__/proxy.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/util/__pycache__/queue.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/util/__pycache__/request.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/util/__pycache__/response.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/util/__pycache__/retry.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/util/__pycache__/ssl_.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/util/__pycache__/ssl_match_hostname.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/util/__pycache__/ssltransport.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/util/__pycache__/timeout.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/util/__pycache__/url.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/util/__pycache__/wait.cpython-39.pyc create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/util/connection.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/util/proxy.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/util/queue.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/util/request.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/util/response.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/util/retry.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/util/ssl_.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/util/ssl_match_hostname.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/util/ssltransport.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/util/timeout.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/util/url.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/urllib3/util/wait.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/yaml/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/yaml/_yaml.cpython-37m-x86_64-linux-gnu.so create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/yaml/composer.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/yaml/constructor.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/yaml/cyaml.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/yaml/dumper.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/yaml/emitter.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/yaml/error.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/yaml/events.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/yaml/loader.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/yaml/nodes.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/yaml/parser.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/yaml/reader.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/yaml/representer.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/yaml/resolver.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/yaml/scanner.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/yaml/serializer.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/yaml/tokens.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/zipp-3.15.0.dist-info/INSTALLER create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/zipp-3.15.0.dist-info/LICENSE create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/zipp-3.15.0.dist-info/METADATA create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/zipp-3.15.0.dist-info/RECORD create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/zipp-3.15.0.dist-info/WHEEL create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/zipp/__init__.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/zipp/py310compat.py create mode 100755 apps/TA-socradar-incidents/bin/ta_socradar_incidents_declare.py create mode 100755 apps/TA-socradar-incidents/default/addon_builder.conf create mode 100755 apps/TA-socradar-incidents/default/app.conf create mode 100755 apps/TA-socradar-incidents/default/collections.conf create mode 100755 apps/TA-socradar-incidents/default/commands.conf create mode 100755 apps/TA-socradar-incidents/default/data/ui/nav/default.xml create mode 100755 apps/TA-socradar-incidents/default/data/ui/views/configuration.xml create mode 100755 apps/TA-socradar-incidents/default/data/ui/views/incident_logs.xml create mode 100755 apps/TA-socradar-incidents/default/data/ui/views/inputs.xml create mode 100755 apps/TA-socradar-incidents/default/data/ui/views/manage_alarm_status.xml create mode 100755 apps/TA-socradar-incidents/default/data/ui/views/socradar_incidents_dashboard.xml create mode 100755 apps/TA-socradar-incidents/default/indexes.conf create mode 100755 apps/TA-socradar-incidents/default/inputs.conf create mode 100755 apps/TA-socradar-incidents/default/props.conf create mode 100755 apps/TA-socradar-incidents/default/restmap.conf create mode 100755 apps/TA-socradar-incidents/default/server.conf create mode 100755 apps/TA-socradar-incidents/default/ta_socradar_incidents_settings.conf create mode 100755 apps/TA-socradar-incidents/default/web.conf create mode 100755 apps/TA-socradar-incidents/metadata/default.meta create mode 100755 apps/TA-socradar-incidents/metadata/local.meta create mode 100755 apps/TA-socradar-incidents/static/appIcon.png create mode 100755 apps/TA-socradar-incidents/static/appIconAlt.png create mode 100755 apps/TA-socradar-incidents/static/appIconAlt_2x.png create mode 100755 apps/TA-socradar-incidents/static/appIcon_2x.png diff --git a/apps/TA-socradar-incidents/README/addon_builder.conf.spec b/apps/TA-socradar-incidents/README/addon_builder.conf.spec new file mode 100755 index 00000000..80d47eb4 --- /dev/null +++ b/apps/TA-socradar-incidents/README/addon_builder.conf.spec @@ -0,0 +1,4 @@ +[base] +builder_version = +builder_build = +is_edited = diff --git a/apps/TA-socradar-incidents/README/inputs.conf.spec b/apps/TA-socradar-incidents/README/inputs.conf.spec new file mode 100755 index 00000000..0a820c2d --- /dev/null +++ b/apps/TA-socradar-incidents/README/inputs.conf.spec @@ -0,0 +1,3 @@ +[socradar_incidents_collector://] +socradar_api_key = +socradar_company_id = \ No newline at end of file diff --git a/apps/TA-socradar-incidents/README/ta_socradar_incidents_settings.conf.spec b/apps/TA-socradar-incidents/README/ta_socradar_incidents_settings.conf.spec new file mode 100755 index 00000000..b76c487a --- /dev/null +++ b/apps/TA-socradar-incidents/README/ta_socradar_incidents_settings.conf.spec @@ -0,0 +1,14 @@ +[proxy] +proxy_enabled = +proxy_type = +proxy_url = +proxy_port = +proxy_username = +proxy_password = +proxy_rdns = + +[logging] +loglevel = + +[additional_parameters] +how_many_days = \ No newline at end of file diff --git a/apps/TA-socradar-incidents/TA-socradar-incidents.aob_meta b/apps/TA-socradar-incidents/TA-socradar-incidents.aob_meta new file mode 100755 index 00000000..199f7d03 --- /dev/null +++ b/apps/TA-socradar-incidents/TA-socradar-incidents.aob_meta @@ -0,0 +1 @@ +{"basic_builder": {"appname": "TA-socradar-incidents", "friendly_name": "SOCRadar Incidents", "version": "1.9.22", "author": "Burak G\u00f6ger", "description": "SOCRadar Incident Collector", "theme": "#a65c7d", "large_icon": "iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAYAAABV7bNHAAAAAXNSR0IArs4c6QAADqlJREFUeF7tXGuMXGUZft5znZnd2dnt7lLdC9YWiuXStFCEYkvXRIyCmqAx3jAKXkkUjX+M/jH+0fiHRDRRE0VNUPGHoImAMRoXqNRioWutYBFqoduF0nZvs3OfOZ8878yh22a2c87MslWzX7LZZPfMd3m+9/q87xnBCozBwbHuRKK8FnCHjDGjxphtgLkJwMaIyz8DyAMisk9EjgKVqWLRO37ixPhCxM+3/Zi0/cnmHxRgzB4aQi8QjFpWkGk8lgCwBpB+Y8wFAC4BsB3ASMT1JwHsAXBIRF4GzCkA0wCK/HwQWHOAdXRqCrPAeA2AiThvy8eWGaAxZ+1az7ftwhbLwgeNMZdzByKwjYEHiAcYgpUG0A8g2XKH9QcKAAhKFpAiYMoiKBsDggERORgEuLdWS04cP14uAePViPO2fGxZAFq//m2Zcrn0BmNkQAQJY8wWwHwIgAK0AuMgIL8QkQljUBQxJz3Pf/7w4T/Mdbr2sgA0MrJzM4BbjDFbjRFPxFCdRgETqlin+2zxeZkDzFFjZFqE0iX7AdwzOfnogU4Xbgugiy56p5/NzmUcx+oVQR+Aa4yRWwBKDmwAVqcba/PzAUC1kwkRcw+AvcZgploNZtPpzNyzzz5UijtvWwCtXXvdBY4jlwHYYoxsE8GlAC4EaJzBOduaN+7mmzxP48yfWQAvGIOnRMw+ABPVqvnH8eOPvRx3jVgHWb/+qkyl4o8aIxuDQDaLmK2AbAMwFHfhFXp+CjD7jJH9lmUOiJhnXLd09PDhJyLbplgAjY5ed3kQWB+kSgGgux4AVMWieqMVwuXVZej9ZgCcBEDp2WtZwb1Hjz52MOpGIgG0bt1Yb6VSXmeM7BARAkRb4wNwoi50np+j26f9mTDG3Ctidruud+TIkXGq4jlHJICGh6/bAtgfA4Jdde+ktobGONLnW21iBf5Pu8SYaZbeDrAeBmo/PXbssYlWa5/zgKHNqdVkTAS3AbK11YT/G/83+43B3bZtxlvZpHMCtMjmjDXSA9qc/4dBm3QIwHgrm9QUoDDOcV3ZYYzc3sib2rY5ScvCGttGj22hy7LgSnuaWTEGuSDAXC3ATK2GQsCwp60R2qQ9IuZ7lYrZvVSc1HSnYZxjjOwSwc2Axjlt25xh18XVqSQuS/hY57notTlV/DFbq+Hf5Qr+USzhr/kCpiqV+JPUPxHapKeMwf0i5uGl4qSmAA0P79jYoCPG2olzbBH4IioxFzgONnqeArQp4eNC11UJOlGtIhsEoFRoxtlkEEY+221ZGHBsVA3wQqWCpxsA/atcxsvVKuZrAUqcx8RO4jVOoqqRTjl2bPczZ2+jKUAjIzuuCQLcIQLanthxTqpxIErMW7u7cKnvq4rx77YAR8tVPJrL41CppKpSXOJgCRH02hYu9n3s6EopuIQgH9RV7KlSCX9ayKlEnazW9O8xh8ZJxtAW4a7Jyd17zwlQmJUDZswY3NqIdyKvmbYsvN518DrHwVrXweWJBMa6U+i3bRyrVDFdq6EUGDxXLitA/yqVMVerKW9x9k0RCE8EaQLkeXhLVwobfE9B5nzDroNTtRrGF/I4WCzieKWKl6pVvFipS2bMMSGCHwMyfjYLcMa+TmfllByzoU5yRR8bfQ839aSxOZFAn22hz7FVco6UK7h/bh5PFUuqTjS0J6p1I0t1ZGYb/n7VQBgDHrNqDJKWYMB20GVbaggpmTdnetSeEfSZag2ztQAHikX8dj6LZ0rl6JuuPzkNyHOvaMz42SxACJAygcPDwfVA8BUAu+Jk5aHkbEsl8Z6eNC72PZUKAkFV2F8o4v65LI6WKyphGdvWg1JCEg2vtpgCCC0o7RNBDJkxShslZNRzcXMmja1JXoStNopzPVsq49fzWezLF+JKUoMFwMOA9c1jx6xHQmayAVCdCXTd4q4gMF8WMTviZOWUnHf1pHFNKqlqwIPRLlBi/lkqqec5VqlgreOohFEC6O55KAVGpKmKBQ0DHoLNOR+Yz+J4tQp6xjd6Lt7k+7g04ePyhA9HBIdLZfwlX4grScoCGCO7LUu+VakkHg6ZSQVoaGhsAKhdIkLJic4Eht5qWzKB29b0YXPS19smILtzeRwoFFW9KjDqzbYkErippxvrfU9tUcEEKmWVJZyPK1Agk2LBt+qHf2B+ARPFonovF6JqtjmZUCNOwAj6gUIJd0/PYF+hGNe7KTNpDCXJPjQ1NX6yAdD1Wy3L3GaMoVuPzASG3oqS85HeDF7nOjhYLKlKPZ4v4KVKVQ9GlaM3uyKRwOsdBwtBgCcLBTxdKimAtB/NBj0YAdjk+7gymVRVerFaxd+LRfVeNPIEmuu+OZVUlaMkcd2fzc5hb74Q07vVmUkRGQ8CuXtq6pH9CtDIyA56ra+9Eg/QrUce3Bg3dW0qpd6KqvXg/IIGcTw4YxiK/7ZUAtd3dan34QGpdnyGKlMHqHkkxICSAFElGUdRlSmJp6o1/DmXx5OFoqox1+VzfObGnm5dl97tL/m8XhYBiznGX9H6r09O7h7vCCCK9i19GbU99FY8+I+nZ/H3Qkklh/bhHeluBYm3TzBoQ/5WLKr3YYBXV7HmOsaDUsUYcHJ+zkNJXOe66uEoQb/LLui6lKQrkj5uXdOr63J+StA9M3Oq6jHHaYBY1PP9Ko3yV43BzigThbnV9lQSH1/Tq7dHu7Mnn1dvRc9FySJwlBwekB6GGyZAbbhh3RZtDAGiOhEEBpiP5fL4a6GgkkKPRu+2PVW3R7yQn0zPYk++oIBFzd1E8OgrTvYbpZKzW0ZHr9tgjHWNMbijwRS2xCjMrQjQzq6UBma/nJ3TjdBbrfM8laxtDbvx73IZv2nP/Z6xF0rTBY6ttuyGdLd6TMZQjH8oKUfKZfVu3NcHejNg+MGAlPuiSnNvEcdeEdwlEuyV0dFdO40JttQjZ3LMrQdzqvdmelRCGP7T2H77xCk10IxzeIMf6stgyHFUWihZbQZwTTfzBs9VydzeldRLoHT8YoYXlNf4h6p4x0A/NiU8TFaqKrn3zc1rDhdtyH5G1iLWhIyMXP9hY4JNAN4HgL9bDgaEn+nvw9XJJCyBBmbfOzWjxpZxDm/wEt/X0H/xxttIAZruhd5z0LH1Ij7al8GI655xEWnLxqf7+9Q50Mg+USjiB6dmdJ8Rx9MAfiViPS3DwzvvBAxr5JFr5du7UvjSYD82+Z7qOW/uvrmsGlQCtyWZUKO5r1BQGzAR30hGOgfXoQ3kRSUs0XV4UdlagPeoLUriIt/DoVIZd544hT25fKR5ATR6AWRShod3kFlLxamVhwAN2jYeyi4oQBTf9Z6HLwz2q9oxzqFo0wa8UI6s+1EPoM9d6LlqA69NJTVOer5SUVV/tlxWBoAAvbsnrUltTIDCXoA8AYpNooQAkY5gxMrQnrd2ZTKBOwb7kbEt1fk9uXo8tFScEwuNJg+HcRJtEW0iwwYCxPiInpbAfaq/T6PpmAC9ulpHADGP+s7JafUQzINotD/b38duDtV5AnSuOKdTgMI4iQBRtUkWcV1KLlMe2srPD6zRmOm8AMQDcuEn8gV1qZQs3hg31+6G2gEtlGiymD/kxeQLmK/VcGUqqbYy3GcMG7Q8EhQu/GS+gB6bXiWJT3Yo0p0C9KMGQKRG/qsAIsdDgD6xChBUlRaLLiVoFaBFst8MoFUVOwdANNLM1gkcI9hVI91QMSaK3224ebKLdPO3/5e4eVIooZsn29SuV+0oDqJbDQPFhVqgFAcj6fMdKJL66LbrgSKpYNIinQDUdqoxYNt4kKlGLq+k1YbzlGpQcplqsOrKSPpwuaIZPb0qCbsTnaUa7Serb/K9OlGWqxNlvLXzkayS8giT1e+fmtEK6/szPWoTR11XK7AxJeh0stoJ3cGNkU5g1s6NMThbTHdMVSv4GXmaXEFLNUw7lmPQIbCExBTjI8o7nUl3MEf73MAaXJVMaMXk8UJBUxA6k4jjNN3RKWHGGwoJM5Lwiwkzsn9k+wjQH7I5HC7Hrng2PQ9V+YY0CbMUrkj4eLl6JmFGkv+Lg/1Kyz5fqdfJKOH/bIcwey0pV/I1TCifC+tZhXo9q11JCiWHzuDGnjQ2+K6GFDTKzShXPv9ILqe5GcmyqejVjdOU62tJ2pNcZ9MBC3+UMtbK/pjNgRx1O4OS8/Y0SfsULvE95EygBUrOuxRpzyoL+ap6w1U0ZucM0p4bbbcuFrXsw3oWy8vPl8v440JOa1ntlH1YFHx7ulurKOR4DhVXoOzTCUBRC4ck0lgaXuPYqmIk8tspHFJqaJzJEFJynsivUOFwaGh5Ss/sCaKhPp+lZ8Y/7BX6+XKWnpejeeHWRc0LpFmbNS9sTdC4dta8wNL2/iWaF1gOYmf7gWIJP52e1WpGzNa85s0LQOftL4x/GNGyirBU+ws7z+h9ora/mEb7Cw9Jz0fpfHA+q+Wkxe0vrNOxzY/tfazg0mizmMDSdMRx7vaXei/Qa99ANdlooCI1Qj6buRzJdYYCTHzDbq7wlR26cJaLVQoApVFZGBw5q4GKXpKDgDyYzaqK8zl2kUQcrRqo6tOsdAtesdGCx5u3cLqJqg4Qu1aBAEbDhEHHQZdVf4YSs7gFjw2cDBbZpPD77IL2QMYcLVvwdL7z0cRJqaCENGu3ZX7FtIER8S52dXiuSh7/triJk/1ClBi2uTCliSE5IY7RmjjDp5e7DZgNUOy8YOXVidEGnBLBgOOoxOzqSmHIdZAPDLJBTbvtGXyuaBtwCNByN5Jf5Hm4KpXQTrE3ep62yUVtJK83pNtai2ckzN5qBprM8UhrnJdG8uV+FYEJ7FXJ+qsITBfYHtzOOFmtap2d3oz2hurU5ujsVYTlfpmFtoQqlrHqauaxJaSNUQoC7UViiZnUylId+hGm7uxllnCB1dehWrwxuPpCXcRXKldfyWyhtKsv9Uawanxk9bXwFkCtfrFAREla/WqKFkCtfrlJREk6nbutfj3OOSFb/YKlyBK1+hVdraBa/ZK3Vgg1+///8tcE/gdYQxUWQAlFUgAAAABJRU5ErkJggg==", "small_icon": "iVBORw0KGgoAAAANSUhEUgAAACQAAAAkCAYAAADhAJiYAAAAAXNSR0IArs4c6QAAA25JREFUWEfdmEtME0EYx/8Lu7RAohAgQLekUCgoJnow+AQvPi4ejBdvnJWrytGTMR40Xok3TxK9eFbjwVhfQQ6oQQTS8uhWGiAgiVDayprZMpvddndmFmkk7qnpfPvNb773rIQdPMFg32FdxylAH3J+XRqQJLxLJN589qpeEn1BVc/WAZtLovJ2OV+9pr1aFnlXCEhVe9cBVIooZMhsaFq0iqeDCRQInL4pSdI9nhIv67quDyaTb++7veMKpKq9iwDqvWzmQXZJ06INTvKOQKraq3tQvmNRTYsW7V/0R4ktUwhfZCkbkGjMPAg04UrNPqZlnqyu4UZygWu9wpiyAfFc1VNViWetLcYmS7nf6J/T8CWdtm3a7ffhUYuKgCIb/1+emcfI+gYTzOo6E4iX2h8jYaiKjF9bW+iamDY3aJBl+KW8moyuI5XLmWvfD3SguqwMP7I59EzFWFBmSTA08YreSCSMZkXG7dQiHi6vGIrfR9rQoiiOm8xnszg5FTfWrtbV4lZjgwBUvnhuA7lnFXUThbG67XpyAU9X12xQJLZIjFndRaF47iOu4wIlujtNN1EYLZvDcbYLjFgj8hSCui84PunqOgMo3yj1MScpmk1UCYFLZnM4xoGhuh6HgjhTXQXr+8SixLKORVGSjkiq2nfNrWsTABKkRydjZsywTui0CdFBgzra0YbWCsUELJaXBiRWqhNlF2KzGE9vgvx2ihleoaExRQ7S7qvA6/ZWBhDABSKKmmQZnzrDTEUsMHKYE1NxJLJZ42AsKwsBkfQmae7VXRSSQJAyQMrB/wnUKMsY3SsuOxebxcQuBTXpcy/CIV4MsdOe1h3aKrzGkbV2fe1qR015OTvtvRbGsXQaF2NzvGw31p+HQzjk99kK4/DqTwwmU+6FMd9c3XuZU+sY3UjjUpwN9TIcwkG/z3vr4AH9o+bKvnPRWcg6fnwgdcll/CAFkBRC6/gRz2TQNz3DcLVl/Ni2EvPu5TagNSkyFOQHtBx0o2/Rh3b4b+kMzsdYMLAPaFTBboywxMXDoaA5RfJmILK34whLFkSH/LvNjeiv3c/MtKHlFdxJkasd+2EO+duuK+UFsZCOfQ0SdR3v1KLrQhdFC1QpLeXtKk2hRGNK1CJEbscfG6yb8O5sgkB//znGDrWHPlgVWqCUn/T+AO1PHOWrYatkAAAAAElFTkSuQmCC", "visible": true, "tab_version": "4.5.0", "tab_build_no": "0", "build_no": 31}, "data_input_builder": {"datainputs": [{"index": "default", "sourcetype": "socradar:incidents", "interval": "30", "use_external_validation": true, "streaming_mode_xml": true, "name": "socradar_incidents_collector", "title": "SOCRadar Incidents API Collector", "description": "Collects security incidents from the SOCRadar v4 API. Configure global API credentials and other settings on the Add-on's setup page", "type": "customized", "parameters": [{"name": "socradar_api_key", "label": "SOCRadar API Key", "help_string": "", "required": false, "format_type": "text", "default_value": "SOCRadar", "placeholder": "", "type": "text", "value": "bfe8b319dca643589c10d740f0e02281d59c24fec0b3410ab68305117e57d850"}, {"name": "socradar_company_id", "label": "SOCRadar Company ID", "help_string": "", "required": false, "format_type": "text", "default_value": "", "placeholder": "", "type": "text", "value": "26808"}], "data_inputs_options": [{"type": "customized_var", "name": "socradar_api_key", "title": "SOCRadar API Key", "description": "", "required_on_edit": false, "required_on_create": false, "format_type": "text", "default_value": "SOCRadar", "placeholder": ""}, {"type": "customized_var", "name": "socradar_company_id", "title": "SOCRadar Company ID", "description": "", "required_on_edit": false, "required_on_create": false, "format_type": "text", "default_value": "", "placeholder": ""}], "code": "\"\"\"\nSplunk Add-on - SOCRadar Incidents v4 collector\nProduction-ready script for Splunk Modular Input with API pagination,\nrate limit handling, and a per-run total new incident cap.\n\"\"\"\n\nimport json\nimport time\nimport requests\nfrom datetime import datetime, timedelta, timezone\n\n# Splunk Add-on SDK objects (helper, ew) are injected by Splunk when the script runs.\n\nSOCRADAR_API_BASE_URL = \"https://platform.socradar.com/api\"\nAPI_TIMEOUT_SECONDS = 30\nDEFAULT_MAX_PAGES_TO_FETCH = 50\nDEFAULT_MAX_NEW_INCIDENTS_PER_RUN = 500\n\ndef validate_input(helper, definition):\n \"\"\"\n Validation for modular input configurations\n \"\"\"\n pass\n\ndef collect_events(helper, ew):\n helper.log_info(\"SCRIPT_START: SOCRadar Incidents v4 collection run.\")\n\n # --- Stage 1: Get Configuration ---\n # Get credentials from INPUT parameters (not global settings)\n company_id = helper.get_arg(\"socradar_company_id\")\n api_key = helper.get_arg(\"socradar_api_key\")\n \n # Log what we retrieved (be careful with full API key)\n helper.log_info(f\"Retrieved company_id: {company_id}\")\n \n # Check if they might be swapped (company ID is usually shorter)\n if company_id and api_key:\n if len(company_id) > 20 and len(api_key) < 20:\n helper.log_warning(\"WARNING: API key and company ID might be swapped! Company ID is usually shorter.\")\n # Swap them\n helper.log_info(\"Swapping credentials...\")\n company_id, api_key = api_key, company_id\n helper.log_info(f\"After swap - company_id: {company_id}, api_key: {api_key[:10]}...\")\n \n if not company_id or not api_key:\n helper.log_error(\"Missing credentials. Please configure socradar_company_id and socradar_api_key in the input configuration.\")\n return\n \n # Get how many days from GLOBAL settings (add-on level)\n how_many_days_str = helper.get_global_setting(\"how_many_days\")\n if how_many_days_str:\n try:\n how_many_days = max(1, int(how_many_days_str))\n except:\n how_many_days = 1\n else:\n how_many_days = 1\n \n helper.log_info(f\"Configuration: Looking back {how_many_days} days\")\n \n # Get other settings from global\n try:\n max_pages_to_fetch = int(helper.get_global_setting(\"max_page\") or DEFAULT_MAX_PAGES_TO_FETCH)\n except:\n max_pages_to_fetch = DEFAULT_MAX_PAGES_TO_FETCH\n \n try:\n max_new_incidents_per_run = int(helper.get_global_setting(\"total_limit\") or DEFAULT_MAX_NEW_INCIDENTS_PER_RUN)\n except:\n max_new_incidents_per_run = DEFAULT_MAX_NEW_INCIDENTS_PER_RUN\n\n # Get Splunk settings\n input_stanza_name = helper.get_input_stanza_names()\n output_index = helper.get_output_index()\n sourcetype = helper.get_sourcetype()\n input_type = helper.get_input_type()\n \n # Log the actual input stanza name for debugging\n helper.log_info(f\"Input stanza name from helper: {input_stanza_name}\")\n\n # --- Stage 2: Load Checkpoint ---\n checkpoint_key = f\"{input_stanza_name}_socradar_v4_processed_alarms\"\n processed_alarms = {} # Changed to dict to store alarm_id -> status\n \n try:\n checkpoint_data_raw = helper.get_check_point(checkpoint_key)\n if checkpoint_data_raw:\n checkpoint_data = json.loads(checkpoint_data_raw)\n # Support both old format (list) and new format (dict)\n if isinstance(checkpoint_data.get(\"alarm_ids\"), list):\n # Old format - convert to dict with string keys\n for alarm_id in checkpoint_data.get(\"alarm_ids\", []):\n processed_alarms[str(alarm_id)] = None\n else:\n # New format - dict with status, ensure all keys are strings\n temp_alarms = checkpoint_data.get(\"alarm_status\", {})\n processed_alarms = {str(k): v for k, v in temp_alarms.items()}\n helper.log_info(f\"Loaded checkpoint with {len(processed_alarms)} already processed alarm IDs\")\n except:\n helper.log_info(\"No checkpoint found, starting fresh\")\n\n # --- Stage 3: Calculate Time Window ---\n current_time = datetime.now(timezone.utc)\n start_time = current_time - timedelta(days=how_many_days)\n \n # Convert to Unix timestamps (SOCRadar format)\n end_timestamp = int(current_time.timestamp())\n start_timestamp = int(start_time.timestamp())\n \n helper.log_info(f\"Time window: {start_time.strftime('%Y-%m-%d %H:%M')} to {current_time.strftime('%Y-%m-%d %H:%M')}\")\n \n # --- Stage 4: Build API URL ---\n api_url = f\"{SOCRADAR_API_BASE_URL}/company/{company_id}/incidents/v4\"\n helper.log_info(f\"API URL: {api_url}\")\n \n # --- Stage 5: Fetch Incidents with Pagination ---\n all_incidents = []\n page = 1\n consecutive_rate_limits = 0\n new_incidents_count = 0\n duplicate_count = 0\n \n while page <= max_pages_to_fetch:\n # API parameters - SOCRadar expects key as URL parameter for incidents endpoint\n params = {\n \"key\": api_key,\n \"limit\": 100, # Get 100 per page from SOCRadar\n \"page\": page,\n \"start_date\": start_timestamp,\n \"end_date\": end_timestamp\n }\n \n # Log the request details\n helper.log_info(f\"Making request to page {page}\")\n helper.log_debug(f\"Request params: {params}\")\n \n # Make request\n try:\n response = requests.get(api_url, params=params, timeout=API_TIMEOUT_SECONDS)\n \n # Log response status\n helper.log_info(f\"Response status code: {response.status_code}\")\n \n # Check for rate limit\n if response.status_code == 429 or \"rate limit exceeded\" in response.text.lower():\n consecutive_rate_limits += 1\n \n if consecutive_rate_limits == 1:\n wait_time = 30\n else:\n wait_time = 60\n \n helper.log_warning(f\"Rate limit hit! Waiting {wait_time} seconds... (attempt {consecutive_rate_limits})\")\n time.sleep(wait_time)\n continue # Retry same page\n \n # Reset rate limit counter on success\n consecutive_rate_limits = 0\n \n # Check for authentication error\n if response.status_code == 401:\n helper.log_error(f\"API error: HTTP 401 Unauthorized. Please check your API credentials.\")\n helper.log_error(f\"Response: {response.text}\")\n break\n \n # Check for other errors\n if response.status_code != 200:\n helper.log_error(f\"API error: HTTP {response.status_code}\")\n helper.log_error(f\"Response: {response.text}\")\n break\n \n # Parse response\n data = response.json()\n incidents = data.get(\"data\", [])\n \n if not incidents:\n helper.log_info(f\"No more incidents at page {page}\")\n break\n \n # Process incidents on this page\n for incident in incidents:\n # Truncate long text fields to 5000 characters\n if 'alarm_text' in incident and incident['alarm_text'] and len(str(incident['alarm_text'])) > 5000:\n incident['alarm_text'] = str(incident['alarm_text'])[:5000] + '...'\n if 'alarm_response' in incident and incident['alarm_response'] and len(str(incident['alarm_response'])) > 5000:\n incident['alarm_response'] = str(incident['alarm_response'])[:5000] + '...'\n if 'alarm_type_details' in incident and isinstance(incident['alarm_type_details'], dict):\n if 'alarm_default_mitigation_plan' in incident['alarm_type_details'] and incident['alarm_type_details']['alarm_default_mitigation_plan']:\n if len(str(incident['alarm_type_details']['alarm_default_mitigation_plan'])) > 5000:\n incident['alarm_type_details']['alarm_default_mitigation_plan'] = str(incident['alarm_type_details']['alarm_default_mitigation_plan'])[:5000] + '...'\n # Extract alarm main type and sub type\n incident['alarm_main_type'] = incident['alarm_type_details'].get('alarm_main_type', 'N/A')\n incident['alarm_sub_type'] = incident['alarm_type_details'].get('alarm_sub_type', 'N/A')\n else:\n # Set defaults if alarm_type_details is not present\n incident['alarm_main_type'] = 'N/A'\n incident['alarm_sub_type'] = 'N/A'\n \n alarm_id = incident.get(\"alarm_id\")\n \n # Generate alarm link\n if alarm_id and company_id:\n incident['alarm_link'] = f\"https://platform.socradar.com/app/company/{company_id}/alarm-management?tab=approved&alarmId={alarm_id}\"\n else:\n incident['alarm_link'] = 'N/A'\n current_status = incident.get(\"status\", \"N/A\")\n helper.log_info(f\"Processing Alarm ID: {alarm_id} - Status: {current_status}\")\n \n # Check if already processed and if status changed\n if alarm_id:\n # Convert alarm_id to string for consistent comparison\n alarm_id_str = str(alarm_id)\n if alarm_id_str in processed_alarms:\n old_status = processed_alarms.get(alarm_id_str)\n helper.log_debug(f\"Checkpoint check - alarm: {alarm_id_str}, old_status: {old_status}, current_status: {current_status}\")\n if old_status == current_status:\n duplicate_count += 1\n continue\n else:\n # Status changed - index the update\n helper.log_info(f\"Status changed for {alarm_id}: {old_status} -> {current_status}\")\n incident['status_changed'] = True\n incident['previous_status'] = old_status\n \n # New incident or status update\n all_incidents.append(incident)\n new_incidents_count += 1\n \n # Stop if we hit the per-run limit\n if new_incidents_count >= max_new_incidents_per_run:\n helper.log_info(f\"Reached max incidents per run ({max_new_incidents_per_run})\")\n break\n \n helper.log_info(f\"Page {page}: Got {len(incidents)} incidents ({new_incidents_count} new/updated so far, {duplicate_count} unchanged)\")\n \n # Stop if we hit the limit\n if new_incidents_count >= max_new_incidents_per_run:\n break\n \n # Check if this was the last page\n if len(incidents) < 100:\n helper.log_info(\"Reached last page\")\n break\n \n page += 1\n time.sleep(2) # Wait 2 seconds between requests\n \n except Exception as e:\n helper.log_error(f\"Error on page {page}: {str(e)}\")\n break\n \n helper.log_info(f\"Fetching complete. Found {new_incidents_count} new/updated incidents, skipped {duplicate_count} unchanged\")\n \n # --- Stage 6: Index New Incidents to Splunk in Batches of 30 ---\n indexed_count = 0\n indexed_alarms = {} # Changed to dict to store alarm_id -> status\n batch_size = 30\n \n # Process in batches of 30\n for batch_start in range(0, len(all_incidents), batch_size):\n batch_end = min(batch_start + batch_size, len(all_incidents))\n batch = all_incidents[batch_start:batch_end]\n \n helper.log_info(f\"Indexing batch {batch_start//batch_size + 1}: incidents {batch_start+1} to {batch_end}\")\n \n for incident in batch:\n alarm_id = incident.get(\"alarm_id\")\n \n try:\n # Get event time from incident\n event_time = None\n date_str = incident.get(\"date\") # Using 'date' field based on your sample\n if date_str:\n try:\n # Parse date like \"2025-03-18 10:40:10\"\n event_datetime = datetime.strptime(date_str, \"%Y-%m-%d %H:%M:%S\")\n event_time = event_datetime.timestamp()\n except:\n pass\n \n # Log what we're indexing for debugging\n if incident.get('status_changed'):\n helper.log_info(f\"Indexing status change for alarm {alarm_id}: {incident.get('previous_status')} -> {incident.get('status')}\")\n helper.log_debug(f\"Full incident data: {json.dumps(incident)[:500]}...\")\n \n # Create Splunk event\n event = helper.new_event(\n data=json.dumps(incident),\n index=output_index,\n source=input_type,\n sourcetype=sourcetype,\n time=event_time\n )\n ew.write_event(event)\n \n indexed_count += 1\n if alarm_id:\n # Store alarm_id as string for consistent checkpoint handling\n indexed_alarms[str(alarm_id)] = incident.get('status')\n \n except Exception as e:\n helper.log_error(f\"Failed to index incident {alarm_id}: {str(e)}\")\n \n # Log progress after each batch\n helper.log_info(f\"Batch complete. Total indexed: {indexed_count}\")\n \n helper.log_info(f\"Indexing complete. Indexed {indexed_count} new incidents to Splunk\")\n \n # --- Stage 7: Update Checkpoint ---\n if indexed_alarms:\n # Update checkpoint with new alarms and their statuses\n processed_alarms.update(indexed_alarms)\n \n # Keep only last 10000 alarms to prevent checkpoint from growing too large\n if len(processed_alarms) > 10000:\n # Sort by alarm_id and keep the most recent ones\n sorted_alarms = sorted(processed_alarms.items(), key=lambda x: x[0])\n processed_alarms = dict(sorted_alarms[-10000:])\n \n # Save checkpoint with new format\n checkpoint_data = {\n \"alarm_status\": processed_alarms,\n \"last_updated\": datetime.now(timezone.utc).isoformat()\n }\n \n try:\n helper.save_check_point(checkpoint_key, json.dumps(checkpoint_data))\n helper.log_info(f\"Checkpoint updated. Total tracked alarms: {len(processed_alarms)}\")\n except Exception as e:\n helper.log_error(f\"Failed to save checkpoint: {str(e)}\")\n \n helper.log_info(\"SCRIPT_END: SOCRadar Incidents v4 collection complete.\")\n\n\nfrom splunklib.modularinput import Scheme\n\ndef get_scheme():\n \"\"\"Returns scheme parameters for this modular input.\"\"\"\n scheme = Scheme(\"SOCRadar Incidents Collector v4\")\n scheme.description = \"Collects incidents from the SOCRadar v4 API.\"\n scheme.use_external_validation = True\n scheme.use_single_instance = False\n return scheme", "customized_options": [{"name": "socradar_api_key", "value": "bfe8b319dca643589c10d740f0e02281d59c24fec0b3410ab68305117e57d850"}, {"name": "socradar_company_id", "value": "26808"}], "uuid": "7ea794adf02c46a2920a50af3aa4af97", "sample_count": "76"}]}, "field_extraction_builder": {"socradar:incidents": {"data_format": "json"}, "socradar:status_updates": {"data_format": "json"}}, "global_settings_builder": {"global_settings": {"proxy_settings": {"proxy_type": "http"}, "log_settings": {"log_level": "DEBUG"}, "customized_settings": [{"required": false, "name": "how_many_days", "label": "How Many Days", "default_value": "", "placeholder": "", "help_string": "", "type": "text", "format_type": "text", "value": "1"}]}}, "sourcetype_builder": {"socradar:incidents": {"metadata": {"data_input_name": "socradar_incidents_collector"}}}, "validation": {"validators": ["best_practice_validation", "data_model_mapping_validation", "field_extract_validation", "app_cert_validation"], "status": "job_started", "validation_id": "v_1762123959_26", "progress": 0.7142857142857143}} \ No newline at end of file diff --git a/apps/TA-socradar-incidents/aob_events_in_meta.json b/apps/TA-socradar-incidents/aob_events_in_meta.json new file mode 100755 index 00000000..9e26dfee --- /dev/null +++ b/apps/TA-socradar-incidents/aob_events_in_meta.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/apps/TA-socradar-incidents/app.manifest b/apps/TA-socradar-incidents/app.manifest new file mode 100755 index 00000000..d972f0b2 --- /dev/null +++ b/apps/TA-socradar-incidents/app.manifest @@ -0,0 +1,59 @@ +{ + "schemaVersion": "2.0.0", + "info": { + "title": "SOCRadar Incidents", + "id": { + "group": null, + "name": "TA-socradar-incidents", + "version": "1.9.22" + }, + "author": [ + { + "name": "Burak Göger", + "email": null, + "company": null + } + ], + "releaseDate": null, + "description": "SOCRadar Incident Collector", + "classification": { + "intendedAudience": null, + "categories": [], + "developmentStatus": null + }, + "commonInformationModels": null, + "license": { + "name": null, + "text": null, + "uri": null + }, + "privacyPolicy": { + "name": null, + "text": null, + "uri": null + }, + "releaseNotes": { + "name": null, + "text": null, + "uri": null + } + }, + "dependencies": { + }, + "tasks": [], + "inputGroups": { + }, + "incompatibleApps": { + }, + "platformRequirements": { + "splunk": { + "Enterprise": "*" + } + }, + "supportedDeployments": [ + "*" + ], + "targetWorkloads": [ + "*" + ] +} \ No newline at end of file diff --git a/apps/TA-socradar-incidents/appserver/controllers/update_status.py b/apps/TA-socradar-incidents/appserver/controllers/update_status.py new file mode 100755 index 00000000..6ec24a37 --- /dev/null +++ b/apps/TA-socradar-incidents/appserver/controllers/update_status.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python +import cherrypy +import json +import requests +import splunk.appserver.mrsparkle.controllers as controllers +from splunk.appserver.mrsparkle.lib.decorators import expose_page +from splunk.appserver.mrsparkle.lib.routes import route +import splunk.entity as entity + +class UpdateStatusController(controllers.BaseController): + '''Update SOCRadar alarm status controller''' + + @expose_page(must_login=True, methods=['POST']) + @route('/:app/:action=update_status') + def update_status(self, app, action, **kwargs): + try: + # Get the POST data + cl = cherrypy.request.headers.get('Content-Length', 0) + raw_body = cherrypy.request.body.read(int(cl)) + data = json.loads(raw_body) + + alarm_id = data.get('alarm_id') + status = data.get('status') + comments = data.get('comments', 'Updated via Splunk') + + # Get SOCRadar settings + session_key = cherrypy.session.get('sessionKey') + settings = self.get_socradar_settings(session_key) + + if not settings.get('company_id') or not settings.get('api_key'): + raise Exception("SOCRadar API credentials not configured") + + # Make API call to SOCRadar + url = f"https://platform.socradar.com/api/company/{settings['company_id']}/alarms/status/change" + + payload = { + "status": status, + "alarm_ids": alarm_id, + "comments": comments + } + + params = { + "key": settings['api_key'] + } + + response = requests.post(url, json=payload, params=params, timeout=30) + + if response.status_code == 200: + return json.dumps({"success": True, "message": "Status updated successfully"}) + else: + return json.dumps({"success": False, "message": f"API error: {response.status_code}"}) + + except Exception as e: + return json.dumps({"success": False, "message": str(e)}) + + def get_socradar_settings(self, session_key): + """Get SOCRadar settings from app configuration""" + try: + # Try to get settings from the configuration + settings_entity = entity.getEntity( + 'ta_socradar_incidents_settings', + 'additional_parameters', + namespace='TA-socradar-incidents', + sessionKey=session_key, + owner='nobody' + ) + + return { + 'company_id': settings_entity.get('socradar_company_id'), + 'api_key': settings_entity.get('socradar_company_api_key') + } + except: + # Fallback: read from conf file + import os + import configparser + + conf_path = os.path.join( + os.environ.get('SPLUNK_HOME', '/opt/splunk'), + 'etc', 'apps', 'TA-socradar-incidents', 'local', + 'ta_socradar_incidents_settings.conf' + ) + + if os.path.exists(conf_path): + config = configparser.ConfigParser() + config.read(conf_path) + + if 'additional_parameters' in config: + return { + 'company_id': config['additional_parameters'].get('socradar_company_id'), + 'api_key': config['additional_parameters'].get('socradar_company_api_key') + } + + return {} diff --git a/apps/TA-socradar-incidents/appserver/static/javascript_mvc_guide.md b/apps/TA-socradar-incidents/appserver/static/javascript_mvc_guide.md new file mode 100755 index 00000000..668d6def --- /dev/null +++ b/apps/TA-socradar-incidents/appserver/static/javascript_mvc_guide.md @@ -0,0 +1,398 @@ +# Splunk Dashboard JavaScript MVC Guide + +## Overview +This guide explains how to properly implement JavaScript in Splunk dashboards to trigger searches and handle token values. + +## 1. Basic Structure for Dashboard JavaScript + +### Required Libraries +```javascript +require([ + 'underscore', + 'jquery', + 'splunkjs/mvc', + 'splunkjs/mvc/searchmanager', + 'splunkjs/mvc/simplexml/ready!' +], function( + _, + $, + mvc, + SearchManager +) { + // Your code here +}); +``` + +### Important: Wait for Dashboard Ready +The `splunkjs/mvc/simplexml/ready!` module ensures the dashboard is fully loaded before your code runs. + +## 2. Accessing MVC Components + +### Get Dashboard Tokens +```javascript +// Get default token model +var tokens = mvc.Components.get("default"); + +// Get submitted token model +var submittedTokens = mvc.Components.get("submitted"); + +// Get a specific token value +var tokenValue = tokens.get("mytoken"); + +// Set a token value +tokens.set("mytoken", "new_value"); +``` + +### Get Dashboard Elements +```javascript +// Get a search manager by ID +var searchManager = mvc.Components.get("my_search"); + +// Get a visualization by ID +var chart = mvc.Components.get("my_chart"); + +// Get an input by ID +var dropdown = mvc.Components.get("my_dropdown"); +``` + +## 3. Creating and Executing Searches Programmatically + +### Create a New Search +```javascript +var mySearch = new SearchManager({ + id: "my_programmatic_search", + search: "index=socradar_incidents | stats count", + earliest_time: "-24h@h", + latest_time: "now", + preview: true, + cache: false, + autostart: false // Don't start automatically +}); + +// Start the search +mySearch.startSearch(); +``` + +### Create a Search with Token Values +```javascript +// Using mvc.tokenSafe for token-aware searches +var mySearch = new SearchManager({ + id: "update_status_search", + search: mvc.tokenSafe("| sendalert update_socradar_incident_status param.incident_id=$incident_id$ param.new_status=$new_status$"), + earliest_time: "-1m", + latest_time: "now", + autostart: false +}); + +// Token values will be automatically resolved when the search runs +``` + +## 4. Handling Search Results + +### Listen for Search Events +```javascript +mySearch.on('search:done', function(properties) { + console.log("Search completed!"); + + // Get the results + var results = mySearch.data("results"); + + results.on("data", function() { + var data = results.data(); + console.log("Results:", data); + + // Process results + if (data && data.rows && data.rows.length > 0) { + // Handle successful results + alert("Status updated successfully!"); + } + }); +}); + +mySearch.on('search:error', function(properties) { + console.error("Search error:", properties.content.messages); +}); + +mySearch.on('search:fail', function(properties) { + console.error("Search failed:", properties.content.messages); +}); +``` + +## 5. Complete Example: Button Click Handler + +### HTML Button (in dashboard XML) +```xml + + + +``` + +### JavaScript Implementation +```javascript +require([ + 'underscore', + 'jquery', + 'splunkjs/mvc', + 'splunkjs/mvc/searchmanager', + 'splunkjs/mvc/simplexml/ready!' +], function( + _, + $, + mvc, + SearchManager +) { + + // Get token models + var tokens = mvc.Components.get("default"); + var submittedTokens = mvc.Components.get("submitted"); + + // Button click handler + $("#update_status_btn").on("click", function() { + + // Get token values + var incidentId = tokens.get("incident_id"); + var newStatus = tokens.get("new_status"); + + // Validate inputs + if (!incidentId || !newStatus) { + alert("Please select an incident and status"); + return; + } + + // Create search to update status + var updateSearch = new SearchManager({ + id: "update_status_search_" + Date.now(), // Unique ID + search: "| sendalert update_socradar_incident_status param.incident_id=\"" + incidentId + "\" param.new_status=\"" + newStatus + "\"", + earliest_time: "-1m", + latest_time: "now", + autostart: false + }); + + // Handle search completion + updateSearch.on('search:done', function(properties) { + console.log("Status update completed"); + + // Refresh the main search to show updated data + var mainSearch = mvc.Components.get("incident_details_search"); + if (mainSearch) { + mainSearch.startSearch(); + } + + alert("Status updated successfully!"); + }); + + // Handle search errors + updateSearch.on('search:error search:fail', function(properties) { + console.error("Status update failed:", properties); + alert("Failed to update status. Please try again."); + }); + + // Start the search + updateSearch.startSearch(); + }); +}); +``` + +## 6. Best Practices + +### 1. Always Wait for Dashboard Ready +```javascript +require(['splunkjs/mvc/simplexml/ready!'], function() { + // Dashboard is ready +}); +``` + +### 2. Use Token-Safe Strings +```javascript +// Good - tokens will be resolved +search: mvc.tokenSafe("index=main sourcetype=$sourcetype$") + +// Bad - tokens won't be resolved +search: "index=main sourcetype=$sourcetype$" +``` + +### 3. Unique Search Manager IDs +```javascript +// Add timestamp to ensure uniqueness +id: "my_search_" + Date.now() +``` + +### 4. Clean Up Search Managers +```javascript +// Dispose of search when done +updateSearch.on('search:done', function() { + updateSearch.finalize(); +}); +``` + +### 5. Handle Token Changes +```javascript +// Listen for token changes +tokens.on("change:mytoken", function(model, value) { + console.log("Token changed:", value); + // React to token change +}); +``` + +## 7. Common Patterns + +### Execute Search on Token Change +```javascript +tokens.on("change:incident_id", function(model, value) { + if (value) { + var detailSearch = new SearchManager({ + id: "incident_detail_" + Date.now(), + search: "index=socradar_incidents alarm_id=\"" + value + "\" | head 1", + autostart: true + }); + } +}); +``` + +### Conditional Search Execution +```javascript +$("#run_search_btn").click(function() { + var searchType = tokens.get("search_type"); + + var searchQuery; + switch(searchType) { + case "high_risk": + searchQuery = "index=socradar_incidents alarm_risk_level=HIGH"; + break; + case "recent": + searchQuery = "index=socradar_incidents | head 100"; + break; + default: + searchQuery = "index=socradar_incidents"; + } + + var search = new SearchManager({ + id: "conditional_search_" + Date.now(), + search: searchQuery, + autostart: true + }); +}); +``` + +## 8. Debugging Tips + +### 1. Check if Components Exist +```javascript +var component = mvc.Components.get("my_component"); +if (component) { + console.log("Component found:", component); +} else { + console.error("Component not found!"); +} +``` + +### 2. List All Components +```javascript +console.log("All components:", mvc.Components.toJSON()); +``` + +### 3. Debug Token Values +```javascript +console.log("All tokens:", tokens.toJSON()); +console.log("Submitted tokens:", submittedTokens.toJSON()); +``` + +### 4. Monitor Search Progress +```javascript +mySearch.on('all', function(eventName) { + console.log("Search event:", eventName); +}); +``` + +## Example: Complete Status Update Implementation + +```javascript +require([ + 'underscore', + 'jquery', + 'splunkjs/mvc', + 'splunkjs/mvc/searchmanager', + 'splunkjs/mvc/simplexml/ready!' +], function(_, $, mvc, SearchManager) { + + console.log("Dashboard JavaScript loaded"); + + // Get token models + var tokens = mvc.Components.get("default"); + var submittedTokens = mvc.Components.get("submitted"); + + // Debug: List all components + console.log("Available components:", Object.keys(mvc.Components.toJSON())); + + // Set up button click handler + $(document).on("click", "#update_status_btn", function(e) { + e.preventDefault(); + + // Get current token values + var incidentId = tokens.get("incident_id"); + var newStatus = tokens.get("new_status"); + + console.log("Updating incident:", incidentId, "to status:", newStatus); + + if (!incidentId || !newStatus) { + alert("Please select an incident and a new status"); + return; + } + + // Disable button during update + var $btn = $(this); + $btn.prop('disabled', true).text('Updating...'); + + // Create the update search + var updateSearch = new SearchManager({ + id: "status_update_" + Date.now(), + search: '| sendalert update_socradar_incident_status param.incident_id="' + incidentId + '" param.new_status="' + newStatus + '"', + earliest_time: "-1m", + latest_time: "now", + cache: false, + autostart: true + }); + + // Handle completion + updateSearch.on('search:done', function() { + console.log("Status update successful"); + + // Re-enable button + $btn.prop('disabled', false).text('Update Status'); + + // Show success message + alert("Status updated successfully!"); + + // Refresh the incidents table + var tableSearch = mvc.Components.get("incident_details_table_search"); + if (tableSearch) { + tableSearch.startSearch(); + } + + // Clean up + updateSearch.finalize(); + }); + + // Handle errors + updateSearch.on('search:error search:fail', function(state, job) { + console.error("Status update failed:", state); + + // Re-enable button + $btn.prop('disabled', false).text('Update Status'); + + // Show error message + alert("Failed to update status. Please check the logs."); + + // Clean up + updateSearch.finalize(); + }); + }); + + // Monitor token changes for debugging + tokens.on("change", function() { + console.log("Token changed:", tokens.toJSON()); + }); +}); +``` + +This guide provides the foundation for implementing JavaScript in Splunk dashboards with proper MVC integration, token handling, and search execution. \ No newline at end of file diff --git a/apps/TA-socradar-incidents/appserver/static/js/build/11.5f537ef2df4a1dddfa28.js b/apps/TA-socradar-incidents/appserver/static/js/build/11.5f537ef2df4a1dddfa28.js new file mode 100755 index 00000000..461c463b --- /dev/null +++ b/apps/TA-socradar-incidents/appserver/static/js/build/11.5f537ef2df4a1dddfa28.js @@ -0,0 +1,3 @@ +/*! For license information please see 11.5f537ef2df4a1dddfa28.js.LICENSE.txt */ +"use strict";(self.webpackChunk_splunk_ucc_ui_lib=self.webpackChunk_splunk_ucc_ui_lib||[]).push([[11],{41183:(e,t,r)=>{r.d(t,{A:()=>on});var n,o,i,a=r(96540),l=r(46894),u=r.n(l),c=r(33829),s=r(57914),f=r.n(s),d=r(37801),p=r.n(d),v=r(92568),h=r(59421),y=r.n(h),m=v.default.span(n||(o=["\n color: ",";\n"],i||(i=o.slice(0)),n=Object.freeze(Object.defineProperties(o,{raw:{value:Object.freeze(i)}}))),(function(e){return e.color}));function b(e){return a.createElement("div",{"data-test":"msg-markdown"},(t=e.text,"link"===e.markdownType?t=a.createElement(y(),{to:e.link},e.text):"hybrid"===e.markdownType?(t=function(t,r){for(var n=[],o=0;oe.length)&&(t=e.length);for(var r=0,n=Array(t);re.length)&&(t=e.length);for(var r=0,n=Array(t);re.length)&&(t=e.length);for(var r=0,n=Array(t);r div[class*='FileStyles__StyledHelp-'] {\n margin-bottom: 0px;\n }\n"])));var mt,bt,gt=r(52473),wt=r.n(gt);function Ot(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}var Et=(0,v.css)(mt||(mt=Ot(["\n width: 320px;\n"]))),_t=(0,v.default)(wt())(bt||(bt=Ot(["\n ","\n"])),Et);function jt(e){return jt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},jt(e)}function St(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function Pt(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=Array(t);re.length)&&(t=e.length);for(var r=0,n=Array(t);r *:not(:last-child) {\n margin-bottom: 10px;\n }\n"])));const ur=function(e){var t,r,n=e.group,o=e.values,i=e.handleRowChange,l=e.disabled,u=function(e,t){var r=0;return e.rows.forEach((function(e){var n;null!==(n=t.get(e.field))&&void 0!==n&&n.checkbox&&(r+=1)})),r}(n,o);return a.createElement(Ht,{title:n.label,description:"".concat(u," of ").concat(n.fields.length),isExpandable:null===(t=n.options)||void 0===t?void 0:t.isExpandable,defaultOpen:null===(r=n.options)||void 0===r?void 0:r.expand},a.createElement(lr,null,n.rows.map((function(e){return a.createElement(ir,{disabled:l,row:e,values:o,handleRowChange:i,key:"row_".concat(e.field)})}))))};var cr=r(28754);var sr=r(33563);function fr(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);rn)||a.createElement("span",{style:{color:"red"}},(0,pt.CK)(25,[n])):a.createElement("span",{style:{color:"red"}},(0,pt.CK)(1===r.length?28:24,[r.join(", ")]))}(r.name.split(".").pop(),r.size/1024,c,f);if(!0===e){O("");try{if(v.result&&"string"!=typeof v.result)o(t,h.decode(v.result));else if(v.result&&"string"==typeof v.result&&v.result.includes("base64,")){var n=v.result.indexOf("base64,"),i=v.result.slice(n+7);o(t,i)}else console.log("File could not be processed as it's format isn't recognized")}catch(e){console.log(e)}}else O(e),o(t,"##INVALID_FILE##");b(r.name)}}},onRequestRemove:function(){1===v.readyState&&v.abort(),b(null),o(t,""),O("")},supportsMessage:a.createElement(a.Fragment,null," ",u," "),disabled:r,help:w,error:!!w},m&&a.createElement(ft().Item,{name:m}))},helpLink:function(e){var t=e.controlOptions,r=t.text,n=t.link;return a.createElement(y(),{to:n,openInNewContext:!0},r)},multipleSelect:function(e){var t=e.id,r=e.field,n=e.disabled,o=void 0!==n&&n,i=e.error,l=void 0!==i&&i,u=e.value,c=e.controlOptions,s=e.dependencyValues,f=function(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r={};for(var n in e)if({}.hasOwnProperty.call(e,n)){if(t.indexOf(n)>=0)continue;r[n]=e[n]}return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||{}.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}(e,ye),d=c.endpointUrl,p=c.denyList,v=c.allowList,h=c.items,y=c.dependencies,m=c.referenceName,b=c.createSearchChoice,g=c.labelField,w=c.valueField,O=c.delimiter,E=void 0===O?",":O;function _(e){return e.map((function(e){return a.createElement(de().Option,{label:e.label,value:e.value,key:"boolean"==typeof e.value?String(e.value):e.value})}))}var j=we((0,a.useState)(!1),2),S=j[0],P=j[1],k=we((0,a.useState)(),2),x=k[0],C=k[1];(0,a.useEffect)((function(){if(d||!h){var e=!0,t=new AbortController,r={signal:t.signal,handleError:!0,params:{count:-1},serviceName:"",endpointUrl:""};return m?r.serviceName=m:d&&(r.endpointUrl=d),s&&(r.params=be(be({},r.params),s)),y&&!s||(P(!0),(0,$.Y)(r).then((function(t){e&&(C(_((0,Y.my)(t.data.entry,g,w,v,p))),P(!1))})).catch((function(){e&&P(!1)}))),function(){t.abort("Operation canceled."),e=!1}}C(_(h))}),[s]);var A=!!S||o,T=S?a.createElement(je,null):null,D=u?u.split(E):[];return a.createElement(a.Fragment,null,a.createElement(_e,{inputId:t,values:D,error:l,name:r,disabled:A,allowNewValues:b,onChange:function(e,t){var n=t.values;"string"!=typeof n[0]&&0!==n.length||f.handleChange(r,n.join(E))},inline:!0},x&&x.length>0&&x),T)},radio:Je,singleSelect:function(e){var t=e.field,r=e.disabled,n=void 0!==r&&r,o=e.error,i=void 0!==o&&o,l=e.controlOptions,u=e.dependencyValues,c=function(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r={};for(var n in e)if({}.hasOwnProperty.call(e,n)){if(t.indexOf(n)>=0)continue;r[n]=e[n]}return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||{}.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}(e,te),s=l.endpointUrl,f=l.denyList,d=l.allowList,p=l.dependencies,v=l.createSearchChoice,h=l.referenceName,y=l.disableSearch,m=l.labelField,b=l.valueField,g=l.autoCompleteFields,w=l.hideClearBtn;function O(e,r){c.handleChange(t,r.value)}var E=v?B().Option:F().Option,_=v?B().Heading:F().Heading;function j(e){var t=[];return e.forEach((function(e){if("value"in e&&e.value&&e.label){var r=(0,Z.nF)(e.value);t.push(a.createElement(E,{label:e.label,value:r,key:e.value}))}"children"in e&&e.children&&e.label&&(t.push(a.createElement(_,{key:e.label},e.label)),e.children.forEach((function(e){var r=(0,Z.nF)(e.value);t.push(a.createElement(E,{label:e.label,value:r,key:r}))})))})),t}var S=ie((0,a.useState)(!1),2),P=S[0],k=S[1],x=ie((0,a.useState)([]),2),C=x[0],A=x[1];(0,a.useEffect)((function(){if(s||h||!g){var e=!0,t=q.A.CancelToken.source(),r={serviceName:"",endpointUrl:"",cancelToken:t.token,handleError:!0,params:{count:-1}};return h?r.serviceName=h:s&&(r.endpointUrl=s),u&&(r.params=ne(ne({},r.params),u)),!p||u?(k(!0),(0,$.Y)(r).then((function(t){e&&(A(j((0,Y.my)(t.data.entry,m,b,d,f))),k(!1))})).catch((function(){e&&k(!1),A([])}))):A([]),function(){t.cancel("Operation canceled."),e=!1}}A(j(g))}),[u]);var T=!!P||n,D=P?a.createElement(ce,null):null,M=!(T||c.required||w);return v?a.createElement(se,{className:"dropdownBox"},a.createElement(B(),{value:e.value?(0,Z.nF)(e.value):"",name:t,error:i,disabled:T,onChange:O,inline:!0},C&&C.length>0&&C),D):a.createElement(a.Fragment,null,a.createElement(ue,{inputId:e.id,className:"dropdownBox","data-test-loading":P,value:e.value?(0,Z.nF)(e.value):e.value,name:t,error:i,disabled:T,onChange:O,filter:!y,inline:!0},C&&C.length>0&&C)," ",D,M?a.createElement(V(),{"data-test":"clear",appearance:"secondary",icon:a.createElement(W(),null),onClick:function(){return c.handleChange(t,"")}}):null)},text:D,textarea:function(e){var t,r,n,o,i;return a.createElement(L,{inputId:e.id,inline:!0,canClear:!0,error:e.error,className:e.field,disabled:e.disabled,value:(null===(t=e.value)||void 0===t?void 0:t.toString())||"",onChange:function(t,r){var n=r.value;e.handleChange(e.field,n)},rowsMax:null!=e&&null!==(r=e.controlOptions)&&void 0!==r&&r.rowsMax?null==e||null===(n=e.controlOptions)||void 0===n?void 0:n.rowsMax:12,rowsMin:null!=e&&null!==(o=e.controlOptions)&&void 0!==o&&o.rowsMin?null==e||null===(i=e.controlOptions)||void 0===i?void 0:i.rowsMin:8})}};function pr(e){return pr="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},pr(e)}var vr,hr;function yr(){return yr=Object.assign?Object.assign.bind():function(e){for(var t=1;t * {\n &:nth-child(3) {\n width: 320px;\n }\n }\n"]))),Cr=function(e){function t(e){var r,n,o;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),jr(o=wr(this,t,[e]),"controlType",void 0),o.controlType=t.isString(null===(r=e.entity)||void 0===r?void 0:r.type)?dr[String(null===(n=e.entity)||void 0===n?void 0:n.type)]:null,o}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&_r(e,t)}(t,e),function(e,t,r){return t&&gr(e.prototype,t),Object.defineProperty(e,"prototype",{writable:!1}),e}(t,[{key:"render",value:function(){var e,t,r,n,o,i,l,u,c,s=this.props.utilityFuncts,f=s.handleChange,d=s.addCustomValidator,p=s.utilCustomFunctions,v=this.props.markdownMessage||{},h=v.text,y=v.link,m=v.color,b=v.markdownType,w=v.token,O=v.linkText;if("custom"===(null===(e=this.props)||void 0===e||null===(e=e.entity)||void 0===e?void 0:e.type)){var E,_,j,S={value:this.props.value,mode:this.props.mode,serviceName:this.props.serviceName};c=this.controlType?a.createElement(this.controlType,br(br({data:S,handleChange:f,addCustomValidator:d,utilCustomFunctions:p,controlOptions:this.props.entity.options},null==this||null===(E=this.props)||void 0===E?void 0:E.entity),null===(_=this.props)||void 0===_?void 0:_.modifiedEntitiesData)):"No View Found for ".concat(null==this||null===(j=this.props)||void 0===j||null===(j=j.entity)||void 0===j?void 0:j.type," type")}else{var P,k,x,C;c=this.controlType?a.createElement(this.controlType,br(br({handleChange:f,value:this.props.value,controlOptions:null===(P=this.props.entity)||void 0===P?void 0:P.options,error:this.props.error,disabled:this.props.disabled,dependencyValues:this.props.dependencyValues,addCustomValidator:d,fileNameToDisplay:this.props.fileNameToDisplay,mode:this.props.mode},null==this||null===(k=this.props)||void 0===k?void 0:k.entity),null===(x=this.props)||void 0===x?void 0:x.modifiedEntitiesData)):"No View Found for ".concat(null==this||null===(C=this.props)||void 0===C||null===(C=C.entity)||void 0===C?void 0:C.type," type")}var A=a.createElement(a.Fragment,null,a.createElement(g,{text:h||"",link:y||"",color:m||"",markdownType:b,token:w||"",linkText:O||""}),(null===(t=this.props)||void 0===t||null===(t=t.modifiedEntitiesData)||void 0===t?void 0:t.help)||(null==this||null===(r=this.props)||void 0===r||null===(r=r.entity)||void 0===r?void 0:r.help)||""),T=void 0===(null===(n=this.props.entity)||void 0===n?void 0:n.required)?"oauth_field"in(this.props.entity||{}):null===(o=this.props.entity)||void 0===o?void 0:o.required;return this.props.display&&a.createElement(xr,yr({},null==this||null===(i=this.props)||void 0===i?void 0:i.entity,null===(l=this.props)||void 0===l?void 0:l.modifiedEntitiesData,{help:A,error:this.props.error,dataName:null==this||null===(u=this.props)||void 0===u?void 0:u.entity.field,labelWidth:240,required:T}),a.createElement(kr,null,c))}}])}(a.PureComponent);jr(Cr,"isString",(function(e){return!!("string"==typeof e||e instanceof String)}));const Ar=Cr;var Tr=r(17467),Dr="Error occurred while trying to authenticate. Please try Again.",Mr=r(44798),Nr=["fieldId"];function Rr(e){return Rr="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Rr(e)}function Lr(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r=0)continue;r[n]=e[n]}return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||{}.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}(e,Nr);Object.entries(r).forEach((function(e){var r=function(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,o,i,a,l=[],u=!0,c=!1;try{if(i=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;u=!1}else for(;!(u=(n=i.call(r)).done)&&(l.push(n.value),l.length!==t);u=!0);}catch(e){c=!0,o=e}finally{try{if(!u&&null!=r.return&&(a=r.return(),Object(a)!==a))return}finally{if(c)throw o}}return l}}(e,t)||function(e,t){if(e){if("string"==typeof e)return Lr(e,t);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Lr(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}(e,2),i=function(e,t,r,n){return"display"===(o=e)||"value"===o||"disabled"===o||"markdownMessage"===o?function(e,t,r,n){var o=Fr({},n);return o.data?(o.data[r][e]=t,{changesOccured:!0,data:o}):{changesOccured:!1,data:o}}(e,t,r,n):function(e){return"help"===e||"label"===e}(e)&&"string"==typeof t?function(e,t,r,n){var o,i=Fr({},n);return null!=i&&null!==(o=i.data)&&void 0!==o&&o[r]?(i.data[r].modifiedEntitiesData=Fr(Fr({},i.data[r].modifiedEntitiesData),{},zr({},e,t)),{changesOccured:!0,data:i}):{changesOccured:!1,data:i}}(e,t,r,n):{changesOccured:!1,data:n};var o}(r[0],r[1],t,n),a=i.data;i.changesOccured&&(n=a,o=!0)}))}))})),{newState:n,shouldUpdateState:o}};function Ur(){Ur=function(){return t};var e,t={},r=Object.prototype,n=r.hasOwnProperty,o=Object.defineProperty||function(e,t,r){e[t]=r.value},i="function"==typeof Symbol?Symbol:{},a=i.iterator||"@@iterator",l=i.asyncIterator||"@@asyncIterator",u=i.toStringTag||"@@toStringTag";function c(e,t,r){return Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{c({},"")}catch(e){c=function(e,t,r){return e[t]=r}}function s(e,t,r,n){var i=t&&t.prototype instanceof m?t:m,a=Object.create(i.prototype),l=new A(n||[]);return o(a,"_invoke",{value:P(e,r,l)}),a}function f(e,t,r){try{return{type:"normal",arg:e.call(t,r)}}catch(e){return{type:"throw",arg:e}}}t.wrap=s;var d="suspendedStart",p="suspendedYield",v="executing",h="completed",y={};function m(){}function b(){}function g(){}var w={};c(w,a,(function(){return this}));var O=Object.getPrototypeOf,E=O&&O(O(T([])));E&&E!==r&&n.call(E,a)&&(w=E);var _=g.prototype=m.prototype=Object.create(w);function j(e){["next","throw","return"].forEach((function(t){c(e,t,(function(e){return this._invoke(t,e)}))}))}function S(e,t){function r(o,i,a,l){var u=f(e[o],e,i);if("throw"!==u.type){var c=u.arg,s=c.value;return s&&"object"==Gr(s)&&n.call(s,"__await")?t.resolve(s.__await).then((function(e){r("next",e,a,l)}),(function(e){r("throw",e,a,l)})):t.resolve(s).then((function(e){c.value=e,a(c)}),(function(e){return r("throw",e,a,l)}))}l(u.arg)}var i;o(this,"_invoke",{value:function(e,n){function o(){return new t((function(t,o){r(e,n,t,o)}))}return i=i?i.then(o,o):o()}})}function P(t,r,n){var o=d;return function(i,a){if(o===v)throw Error("Generator is already running");if(o===h){if("throw"===i)throw a;return{value:e,done:!0}}for(n.method=i,n.arg=a;;){var l=n.delegate;if(l){var u=k(l,n);if(u){if(u===y)continue;return u}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if(o===d)throw o=h,n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);o=v;var c=f(t,r,n);if("normal"===c.type){if(o=n.done?h:p,c.arg===y)continue;return{value:c.arg,done:n.done}}"throw"===c.type&&(o=h,n.method="throw",n.arg=c.arg)}}}function k(t,r){var n=r.method,o=t.iterator[n];if(o===e)return r.delegate=null,"throw"===n&&t.iterator.return&&(r.method="return",r.arg=e,k(t,r),"throw"===r.method)||"return"!==n&&(r.method="throw",r.arg=new TypeError("The iterator does not provide a '"+n+"' method")),y;var i=f(o,t.iterator,r.arg);if("throw"===i.type)return r.method="throw",r.arg=i.arg,r.delegate=null,y;var a=i.arg;return a?a.done?(r[t.resultName]=a.value,r.next=t.nextLoc,"return"!==r.method&&(r.method="next",r.arg=e),r.delegate=null,y):a:(r.method="throw",r.arg=new TypeError("iterator result is not an object"),r.delegate=null,y)}function x(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function C(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function A(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(x,this),this.reset(!0)}function T(t){if(t||""===t){var r=t[a];if(r)return r.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var o=-1,i=function r(){for(;++o=0;--i){var a=this.tryEntries[i],l=a.completion;if("root"===a.tryLoc)return o("end");if(a.tryLoc<=this.prev){var u=n.call(a,"catchLoc"),c=n.call(a,"finallyLoc");if(u&&c){if(this.prev=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev=0;--t){var r=this.tryEntries[t];if(r.finallyLoc===e)return this.complete(r.completion,r.afterLoc),C(r),y}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.tryLoc===e){var n=r.completion;if("throw"===n.type){var o=n.arg;C(r)}return o}}throw Error("illegal catch attempt")},delegateYield:function(t,r,n){return this.delegate={iterator:T(t),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=e),y}},t}function Br(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function Kr(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=Array(t);r1?r-1:0),o=1;o1){var l,u,c;i.isAuthVal=!0;var s={disabled:!1,error:!1,display:!0,value:"oauth"===(null===(l=i.currentInput)||void 0===l?void 0:l.auth_type)||"basic"===(null===(u=i.currentInput)||void 0===u?void 0:u.auth_type)?null===(c=i.currentInput)||void 0===c?void 0:c.auth_type:a[0]};d.auth_type=s;var f={basic:"Basic Authentication",oauth:"OAuth 2.0 Authentication"},v={field:"auth_type",type:"singleSelect",label:"Auth Type",options:{hideClearBtn:!0,autoCompleteFields:a.map((function(e){return{label:f[e],value:e}}))}};p.push(v)}else i.isSingleOauth=a.includes("oauth");if(null==a||a.forEach((function(r){var n=[],o=null==t?void 0:t.options[r];o&&(o.forEach((function(t){var o,a,l;if(t){var u,c={disabled:!1===(null==t||null===(o=t.options)||void 0===o?void 0:o.enable),error:!1,display:null===(a=d)||void 0===a||!a.auth_type||r===(null===(l=d)||void 0===l||null===(l=l.auth_type)||void 0===l?void 0:l.value)};if(e.mode===sr.F9)c.value=void 0!==(null==t?void 0:t.defaultValue)?t.defaultValue:void 0;else{var s,f=(null==t?void 0:t.encrypted)||!1;c.value=f?"":null===(s=i.currentInput)||void 0===s?void 0:s[t.field]}e.mode===sr.rG&&(c.disabled=!0===(null==t||null===(u=t.options)||void 0===u?void 0:u.disableonEdit)||c.disabled),d[t.field]=c,t.type=(null==t?void 0:t.type)||"text","redirect_url"===t.field&&(c.value=window.location.href.split("?")[0].replace("configuration","".concat(i.appName.toLowerCase(),"_redirect")),c.disabled=!0),p.push(t),null==n||n.push(t.field)}})),i.authMap[r]=n)})),a.includes("oauth")){var h,y,m,b,g,w,O={popupWidth:(null==t||null===(h=t.options)||void 0===h?void 0:h.oauth_popup_width)||600,popupHeight:(null==t||null===(y=t.options)||void 0===y?void 0:y.oauth_popup_height)||600,authTimeout:(null==t||null===(m=t.options)||void 0===m?void 0:m.oauth_timeout)||180,authCodeEndpoint:(null==t||null===(b=t.options)||void 0===b?void 0:b.auth_code_endpoint)||null,accessTokenEndpoint:(null==t||null===(g=t.options)||void 0===g?void 0:g.access_token_endpoint)||null,authEndpointAccessTokenType:(null==t||null===(w=t.options)||void 0===w?void 0:w.auth_endpoint_token_access_type)||null};i.oauthConf=O}}}else{var E,_,j,S,P={disabled:!1,error:!1,display:!0};if("helpLink"!==t.type&&"custom"!==t.type)if(t.encrypted=(null==t?void 0:t.encrypted)||!1,"file"===t.type&&null!==(E=i.currentInput)&&void 0!==E&&E[t.field]&&(P.fileNameToDisplay="Previous File"),e.mode===sr.F9)P.value=void 0!==t.defaultValue?null==t?void 0:t.defaultValue:null,P.display=void 0===(null==t||null===(_=t.options)||void 0===_?void 0:_.display)||t.options.display,P.error=!1,P.disabled=!1===(null==t||null===(j=t.options)||void 0===j?void 0:j.enable),d[t.field]=P;else if(e.mode===sr.rG){var k,x,C,A,T;P.value=void 0!==(null===(k=i.currentInput)||void 0===k?void 0:k[t.field])?null===(x=i.currentInput)||void 0===x?void 0:x[t.field]:null,P.value=t.encrypted?"":P.value,P.display=void 0===(null==t||null===(C=t.options)||void 0===C?void 0:C.display)||t.options.display,P.error=!1,P.disabled=!1===(null==t||null===(A=t.options)||void 0===A?void 0:A.enable),"name"===t.field?P.disabled=!0:void 0!==(null==t||null===(T=t.options)||void 0===T?void 0:T.disableonEdit)&&(P.disabled=t.options.disableonEdit),d[t.field]=P}else if(e.mode===sr.UT){var D,M,N;P.value="name"===t.field||t.encrypted?"":null===(D=i.currentInput)||void 0===D?void 0:D[t.field],P.display=void 0===(null==t||null===(M=t.options)||void 0===M?void 0:M.display)||t.options.display,P.error=!1,P.disabled=!1===(null==t||null===(N=t.options)||void 0===N?void 0:N.enable),d[t.field]=P}else{if(e.mode!==sr.DJ)throw new Error("Invalid mode : ".concat(e.mode));var R,L,I,F,z;t.defaultValue=void 0!==t.defaultValue?t.defaultValue:void 0,P.value=void 0!==(null===(R=i.currentInput)||void 0===R?void 0:R[t.field])?null===(L=i.currentInput)||void 0===L?void 0:L[t.field]:t.defaultValue,P.value=t.encrypted?"":P.value,P.display=void 0===(null==t||null===(I=t.options)||void 0===I?void 0:I.display)||t.options.display,P.error=!1,P.disabled=!1===(null==t||null===(F=t.options)||void 0===F?void 0:F.enable),"name"===t.field?P.disabled=!0:void 0!==(null==t||null===(z=t.options)||void 0===z?void 0:z.disableonEdit)&&(P.disabled=t.options.disableonEdit),d[t.field]=P}else"custom"===t.type&&(P.value=null===(S=i.currentInput)||void 0===S?void 0:S[t.field]),d[t.field]=P;if("singleSelect"===t.type||"multipleSelect"===t.type){var V,U=null===(V=t.options)||void 0===V?void 0:V.dependencies;U&&U.forEach((function(e){var r=i.dependencyMap.get(e);r&&"string"==typeof t.field?r[t.field]=U:i.dependencyMap.set(e,en({},t.field,U))}))}p.push(t)}})),i.entities=p;var v={};i.dependencyMap.forEach((function(e){v=Kr(Kr({},v),e)}));var h,y={};Object.keys(v).forEach((function(e){var t=v[e],r={},n=!0;t.forEach((function(e){var t,o,a=!(null===(t=i.entities)||void 0===t||null===(t=t.find((function(t){return t.field===e})))||void 0===t||!t.required),l=null===(o=d[e])||void 0===o?void 0:o.value;a&&!l?(n=!1,r[e]=null):r[e]=l})),n&&(y[e]={dependencyValues:{$set:r}})})),d=u()(d,y),i.fieldsWithModifications=(h=i.entities.filter((function(e){return!("text"!==(t=e).type&&"textarea"!==t.type&&"singleSelect"!==t.type&&"multipleSelect"!==t.type&&"checkbox"!==t.type&&"radio"!==t.type&&"file"!==t.type||null==t||!t.modifyFieldsOnValue);var t})),h);var m=Vr({data:d},i.props.mode,i.fieldsWithModifications);return m.shouldUpdateState&&(d=Kr({},m.newState.data)),i.state={data:d,errorMsg:"",warningMsg:(null===(o=i.customWarningMessage)||void 0===o?void 0:o.message)||""},i.hookDeferred&&i.hookDeferred.then((function(){var e;if("function"==typeof(null===(e=i.hook)||void 0===e?void 0:e.onCreate))try{i.hook.onCreate()}catch(e){rn({methodName:"onCreate",error:e})}})),i}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&Qr(e,t)}(t,e),function(e,t,r){return t&&Yr(e.prototype,t),Object.defineProperty(e,"prototype",{writable:!1}),e}(t,[{key:"render",value:function(){var e,t=this;return this.flag&&(this.hookDeferred&&this.hookDeferred.then((function(){var e;if("function"==typeof(null===(e=t.hook)||void 0===e?void 0:e.onRender))try{t.hook.onRender()}catch(e){rn({methodName:"onRender",error:e})}})),this.props.mode===sr.rG&&this.hookDeferred&&this.hookDeferred.then((function(){var e;if("function"==typeof(null===(e=t.hook)||void 0===e?void 0:e.onEditLoad))try{t.hook.onEditLoad()}catch(e){rn({methodName:"onEditLoad",error:e})}})),this.flag=!1),a.createElement("div",null,a.createElement("form",{onSubmit:this.handleSubmit,style:this.props.mode===sr.DJ?{marginTop:"25px"}:{}},this.generateWarningMessage(),this.generateErrorMessage(),null===(e=this.entities)||void 0===e?void 0:e.map((function(e){var r;if(t.groupEntities.includes(e.field))return null;var n=null===(r=t.state)||void 0===r||null===(r=r.data)||void 0===r?void 0:r[e.field];return n?a.createElement(Ar,{key:e.field,utilityFuncts:t.utilControlWrapper,value:n.value,display:n.display,error:n.error,entity:e,serviceName:t.props.serviceName,mode:t.props.mode,disabled:n.disabled,markdownMessage:n.markdownMessage,dependencyValues:n.dependencyValues||null,fileNameToDisplay:n.fileNameToDisplay,modifiedEntitiesData:n.modifiedEntitiesData}):null})),this.renderGroupElements()))}}])}(a.PureComponent);en(nn,"contextType",Mr.A);const on=nn},37668:(e,t,r)=>{r.d(t,{A:()=>x});var n,o=r(96540),i=r(64200),a=r.n(i),l=r(92568),u=r(24379),c=r.n(u),s=r(20259),f=r(33563),d=r(74042),p=r(41183);function v(e){return v="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},v(e)}function h(){h=function(){return t};var e,t={},r=Object.prototype,n=r.hasOwnProperty,o=Object.defineProperty||function(e,t,r){e[t]=r.value},i="function"==typeof Symbol?Symbol:{},a=i.iterator||"@@iterator",l=i.asyncIterator||"@@asyncIterator",u=i.toStringTag||"@@toStringTag";function c(e,t,r){return Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{c({},"")}catch(e){c=function(e,t,r){return e[t]=r}}function s(e,t,r,n){var i=t&&t.prototype instanceof g?t:g,a=Object.create(i.prototype),l=new D(n||[]);return o(a,"_invoke",{value:x(e,r,l)}),a}function f(e,t,r){try{return{type:"normal",arg:e.call(t,r)}}catch(e){return{type:"throw",arg:e}}}t.wrap=s;var d="suspendedStart",p="suspendedYield",y="executing",m="completed",b={};function g(){}function w(){}function O(){}var E={};c(E,a,(function(){return this}));var _=Object.getPrototypeOf,j=_&&_(_(M([])));j&&j!==r&&n.call(j,a)&&(E=j);var S=O.prototype=g.prototype=Object.create(E);function P(e){["next","throw","return"].forEach((function(t){c(e,t,(function(e){return this._invoke(t,e)}))}))}function k(e,t){function r(o,i,a,l){var u=f(e[o],e,i);if("throw"!==u.type){var c=u.arg,s=c.value;return s&&"object"==v(s)&&n.call(s,"__await")?t.resolve(s.__await).then((function(e){r("next",e,a,l)}),(function(e){r("throw",e,a,l)})):t.resolve(s).then((function(e){c.value=e,a(c)}),(function(e){return r("throw",e,a,l)}))}l(u.arg)}var i;o(this,"_invoke",{value:function(e,n){function o(){return new t((function(t,o){r(e,n,t,o)}))}return i=i?i.then(o,o):o()}})}function x(t,r,n){var o=d;return function(i,a){if(o===y)throw Error("Generator is already running");if(o===m){if("throw"===i)throw a;return{value:e,done:!0}}for(n.method=i,n.arg=a;;){var l=n.delegate;if(l){var u=C(l,n);if(u){if(u===b)continue;return u}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if(o===d)throw o=m,n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);o=y;var c=f(t,r,n);if("normal"===c.type){if(o=n.done?m:p,c.arg===b)continue;return{value:c.arg,done:n.done}}"throw"===c.type&&(o=m,n.method="throw",n.arg=c.arg)}}}function C(t,r){var n=r.method,o=t.iterator[n];if(o===e)return r.delegate=null,"throw"===n&&t.iterator.return&&(r.method="return",r.arg=e,C(t,r),"throw"===r.method)||"return"!==n&&(r.method="throw",r.arg=new TypeError("The iterator does not provide a '"+n+"' method")),b;var i=f(o,t.iterator,r.arg);if("throw"===i.type)return r.method="throw",r.arg=i.arg,r.delegate=null,b;var a=i.arg;return a?a.done?(r[t.resultName]=a.value,r.next=t.nextLoc,"return"!==r.method&&(r.method="next",r.arg=e),r.delegate=null,b):a:(r.method="throw",r.arg=new TypeError("iterator result is not an object"),r.delegate=null,b)}function A(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function T(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function D(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(A,this),this.reset(!0)}function M(t){if(t||""===t){var r=t[a];if(r)return r.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var o=-1,i=function r(){for(;++o=0;--i){var a=this.tryEntries[i],l=a.completion;if("root"===a.tryLoc)return o("end");if(a.tryLoc<=this.prev){var u=n.call(a,"catchLoc"),c=n.call(a,"finallyLoc");if(u&&c){if(this.prev=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev=0;--t){var r=this.tryEntries[t];if(r.finallyLoc===e)return this.complete(r.completion,r.afterLoc),T(r),b}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.tryLoc===e){var n=r.completion;if("throw"===n.type){var o=n.arg;T(r)}return o}}throw Error("illegal catch attempt")},delegateYield:function(t,r,n){return this.delegate={iterator:M(t),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=e),b}},t}function y(e,t,r,n,o,i,a){try{var l=e[i](a),u=l.value}catch(e){return void r(e)}l.done?t(u):Promise.resolve(u).then(n,o)}function m(e,t){for(var r=0;r{r.d(t,{A:()=>A});var n,o,i=r(96540),a=r(59421),l=r.n(a),u=r(24379),c=r.n(u),s=r(52473),f=r.n(s),d=r(20259),p=r(78967),v=r(39643),h=r.n(v),y=r(92568),m=r(33563),b=r(41183),g=r(13199),w=r(17467),O=r(74042);function E(e){return E="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},E(e)}function _(){_=function(){return t};var e,t={},r=Object.prototype,n=r.hasOwnProperty,o=Object.defineProperty||function(e,t,r){e[t]=r.value},i="function"==typeof Symbol?Symbol:{},a=i.iterator||"@@iterator",l=i.asyncIterator||"@@asyncIterator",u=i.toStringTag||"@@toStringTag";function c(e,t,r){return Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{c({},"")}catch(e){c=function(e,t,r){return e[t]=r}}function s(e,t,r,n){var i=t&&t.prototype instanceof m?t:m,a=Object.create(i.prototype),l=new D(n||[]);return o(a,"_invoke",{value:x(e,r,l)}),a}function f(e,t,r){try{return{type:"normal",arg:e.call(t,r)}}catch(e){return{type:"throw",arg:e}}}t.wrap=s;var d="suspendedStart",p="suspendedYield",v="executing",h="completed",y={};function m(){}function b(){}function g(){}var w={};c(w,a,(function(){return this}));var O=Object.getPrototypeOf,j=O&&O(O(M([])));j&&j!==r&&n.call(j,a)&&(w=j);var S=g.prototype=m.prototype=Object.create(w);function P(e){["next","throw","return"].forEach((function(t){c(e,t,(function(e){return this._invoke(t,e)}))}))}function k(e,t){function r(o,i,a,l){var u=f(e[o],e,i);if("throw"!==u.type){var c=u.arg,s=c.value;return s&&"object"==E(s)&&n.call(s,"__await")?t.resolve(s.__await).then((function(e){r("next",e,a,l)}),(function(e){r("throw",e,a,l)})):t.resolve(s).then((function(e){c.value=e,a(c)}),(function(e){return r("throw",e,a,l)}))}l(u.arg)}var i;o(this,"_invoke",{value:function(e,n){function o(){return new t((function(t,o){r(e,n,t,o)}))}return i=i?i.then(o,o):o()}})}function x(t,r,n){var o=d;return function(i,a){if(o===v)throw Error("Generator is already running");if(o===h){if("throw"===i)throw a;return{value:e,done:!0}}for(n.method=i,n.arg=a;;){var l=n.delegate;if(l){var u=C(l,n);if(u){if(u===y)continue;return u}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if(o===d)throw o=h,n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);o=v;var c=f(t,r,n);if("normal"===c.type){if(o=n.done?h:p,c.arg===y)continue;return{value:c.arg,done:n.done}}"throw"===c.type&&(o=h,n.method="throw",n.arg=c.arg)}}}function C(t,r){var n=r.method,o=t.iterator[n];if(o===e)return r.delegate=null,"throw"===n&&t.iterator.return&&(r.method="return",r.arg=e,C(t,r),"throw"===r.method)||"return"!==n&&(r.method="throw",r.arg=new TypeError("The iterator does not provide a '"+n+"' method")),y;var i=f(o,t.iterator,r.arg);if("throw"===i.type)return r.method="throw",r.arg=i.arg,r.delegate=null,y;var a=i.arg;return a?a.done?(r[t.resultName]=a.value,r.next=t.nextLoc,"return"!==r.method&&(r.method="next",r.arg=e),r.delegate=null,y):a:(r.method="throw",r.arg=new TypeError("iterator result is not an object"),r.delegate=null,y)}function A(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function T(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function D(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(A,this),this.reset(!0)}function M(t){if(t||""===t){var r=t[a];if(r)return r.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var o=-1,i=function r(){for(;++o=0;--i){var a=this.tryEntries[i],l=a.completion;if("root"===a.tryLoc)return o("end");if(a.tryLoc<=this.prev){var u=n.call(a,"catchLoc"),c=n.call(a,"finallyLoc");if(u&&c){if(this.prev=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev=0;--t){var r=this.tryEntries[t];if(r.finallyLoc===e)return this.complete(r.completion,r.afterLoc),T(r),y}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.tryLoc===e){var n=r.completion;if("throw"===n.type){var o=n.arg;T(r)}return o}}throw Error("illegal catch attempt")},delegateYield:function(t,r,n){return this.delegate={iterator:M(t),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=e),y}},t}function j(e,t,r,n,o,i,a){try{var l=e[i](a),u=l.value}catch(e){return void r(e)}l.done?t(u):Promise.resolve(u).then(n,o)}function S(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r ",(0,d._)(s)))),i.createElement(f().Row,null,i.createElement(f().Column,{span:2}),i.createElement(f().Column,{span:8,style:{maxWidth:"800px"}},i.createElement(k,null,i.createElement(h(),{style:{paddingLeft:"30px"},level:3},(0,d._)(s)),i.createElement(b.A,{ref:y,page:p,serviceName:o,mode:a,stanzaName:u||"",handleFormSubmit:function(e,t){C(e),t&&n()},groupName:v})),i.createElement(x,null,i.createElement(O.OV,{appearance:"secondary",onClick:n,label:(0,d._)("Cancel"),disabled:P,style:{width:"80px"}}),i.createElement(O.OV,{type:"Submit",appearance:"primary",label:P?i.createElement(c(),null):A,onClick:T,disabled:P,style:{width:"80px"}}))),i.createElement(f().Column,{span:2})))}const A=(0,i.memo)(C)},96791:(e,t,r)=>{r.d(t,{A:()=>D});var n,o,i,a,l,u=r(96540),c=r(39643),s=r.n(c),f=r(20259),d=r(15759),p=r.n(d),v=r(68623),h=r.n(v),y=r(92568),m=r(78967),b=r(58813);function g(e){return g="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},g(e)}function w(e,t){for(var r=0;r{r.d(t,{A:()=>d});var n,o,i,a=r(96540),l=r(92568),u=r(78967),c=r(59421),s=r.n(c),f=l.default.p(n||(o=["\n & {\n font-size: ",";\n margin-bottom: 10px;\n white-space: pre-line;\n }\n"],i||(i=o.slice(0)),n=Object.freeze(Object.defineProperties(o,{raw:{value:Object.freeze(i)}}))),u.variables.fontSize);const d=function(e){if(null==e||!e.text)return a.createElement(a.Fragment,null);var t=function(e){var t=null==e?void 0:e.text.split(/\]\]|\[\[/);return null==t?void 0:t.map((function(t){var r,n=null==e||null===(r=e.links)||void 0===r?void 0:r.find((function(e){return e.slug===t}));return n?a.createElement(s(),{to:n.link,openInNewContext:!0,key:"subDescription".concat(n.slug)},n.linkText):t})).flat()}(e);return a.createElement(f,null,t)}},36253:(e,t,r)=>{r.d(t,{A:()=>Mt});var n=r(96540),o=r(46894),i=r.n(o),a=r(71083),l=r(36371),u=r(81705),c=r(10670),s=r(5556),f=r.n(s),d=r(52529),p=r.n(d),v=r(20259),h=r(84976),y=r(33563),m=r(17467),b=r(76536),g=r.n(b),w=r(92568),O=r(50934),E=r.n(O),_=r(66930);function j(e,t){var r=[];return null!=t&&t.length&&t.forEach((function(t){var o=(0,v._)(t.label);t.field in e&&null!==e[t.field]&&""!==e[t.field]&&(r.push(n.createElement(g().Term,{key:t.field},o)),r.push(n.createElement(g().Description,{key:"".concat(t.field,"_decr")},t.mapping&&t.mapping[e[t.field]]?t.mapping[e[t.field]]:String(e[t.field]))))})),r}function S(e){return S="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},S(e)}function P(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function k(e){for(var t=1;t=0;--i){var a=this.tryEntries[i],l=a.completion;if("root"===a.tryLoc)return o("end");if(a.tryLoc<=this.prev){var u=n.call(a,"catchLoc"),c=n.call(a,"finallyLoc");if(u&&c){if(this.prev=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev=0;--t){var r=this.tryEntries[t];if(r.finallyLoc===e)return this.complete(r.completion,r.afterLoc),T(r),y}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.tryLoc===e){var n=r.completion;if("throw"===n.type){var o=n.arg;T(r)}return o}}throw Error("illegal catch attempt")},delegateYield:function(t,r,n){return this.delegate={iterator:M(t),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=e),y}},t}function C(e,t,r,n,o,i,a){try{var l=e[i](a),u=l.value}catch(e){return void r(e)}l.done?t(u):Promise.resolve(u).then(n,o)}function A(e){return function(){var t=this,r=arguments;return new Promise((function(n,o){var i=e.apply(t,r);function a(e){C(i,n,o,a,l,"next",e)}function l(e){C(i,n,o,a,l,"throw",e)}a(void 0)}))}}function T(e,t){for(var r=0;r1?o-1:0),a=1;a");return e}function Ve(e){return Ve="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Ve(e)}function Ue(){return Ue=Object.assign?Object.assign.bind():function(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=Array(t);re.length)&&(t=e.length);for(var r=0,n=Array(t);r1?(0,v._)(" ".concat(O,"s")):(0,v._)(" ".concat(O))),t===m.zl?n.createElement(l.Rb,null,n.createElement(Ze(),{value:d,className:"dropdownPage",onChange:function(e,t){var r=t.value;h(0),y(r)}},n.createElement(Ze().Option,{key:"10",label:(0,v._)("10 Per Page"),value:10}),n.createElement(Ze().Option,{key:"25",label:(0,v._)("25 Per Page"),value:25}),n.createElement(Ze().Option,{key:"50",label:(0,v._)("50 Per Page"),value:50})),!r&&function(){if(o.length<2)return null;var e=[];return(e=o.map((function(e){return n.createElement(Ze().Option,{key:e.name,label:e.title,value:e.name})}))).unshift(n.createElement(Ze().Option,{key:"all",label:(0,v._)("All"),value:"all"})),n.createElement(Ze(),{value:b,className:"dropdownInput",onChange:function(e,t){var r=t.value;h(0),g(r)}},e)}()):null),n.createElement(bt,null,n.createElement(rt,{handleChange:function(e,t){var r=t.value;h(0),w(r)}})),n.createElement("div",null,n.createElement(Xe(),{onChange:function(e,t){var r=t.page;return h(r-1)},current:p+1,alwaysShowLastPageLink:!0,totalPages:Math.ceil(i/d)}),r&&n.createElement(_e.OV,{label:(0,v._)("Add"),appearance:"primary",onClick:a})),n.createElement(ht,{displayActionBtnAllRows:s,dataRows:u,changeToggleStatus:c}))}gt.propTypes={page:f().string,services:f().array,totalElement:f().number,isTabs:f().bool,handleRequestModalOpen:f().func,displayActionBtnAllRows:f().bool,changeToggleStatus:f().func,allFilteredData:f().array};const wt=gt;function Ot(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,o,i,a,l=[],u=!0,c=!1;try{if(i=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;u=!1}else for(;!(u=(n=i.call(r)).done)&&(l.push(n.value),l.length!==t);u=!0);}catch(e){c=!0,o=e}finally{try{if(!u&&null!=r.return&&(a=r.return(),Object(a)!==a))return}finally{if(c)throw o}}return l}}(e,t)||function(e,t){if(e){if("string"==typeof e)return Et(e,t);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Et(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Et(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);re.length)&&(t=e.length);for(var r=0,n=Array(t);r0&&void 0!==arguments[0]?arguments[0]:"name",t=Ot((0,n.useState)(e),2),r=t[0],o=t[1],i=Ot((0,n.useState)("asc"),2),a=i[0],l=i[1],u=(0,n.useCallback)((function(e,t){var n=r===t.sortKey?a:"none";l("asc"===n?"desc":"asc"),t.sortKey&&o(t.sortKey)}),[r,a]);return{sortKey:r,sortDir:a,handleSort:u}}(),p=d.sortKey,v=d.sortDir,h=d.handleSort,y=Pt((0,n.useState)(!0),2),b=y[0],g=y[1],w=Pt((0,n.useState)(null),2),O=w[0],E=w[1],_=(0,n.useRef)(!1),j=ze(),S=j.rowData,P=j.setRowData,k=j.pageSize,x=j.currentPage,C=j.searchText,A=j.searchType,T=(0,c.Sb)(),D=(0,n.useMemo)((function(){return function(e,t,r){var n,o,i=e===m.zl?null===(n=t.pages.inputs)||void 0===n?void 0:n.services:t.pages.configuration.tabs.filter((function(e){return e.name===r}));if(e===m.zl){if(t.pages.inputs&&"table"in t.pages.inputs)return{services:i,tableConfig:t.pages.inputs.table,readonlyFieldId:t.pages.inputs.readonlyFieldId,hideFieldId:t.pages.inputs.hideFieldId};var a=null==i?void 0:i.find((function(e){return e.name===r}));return{services:i,tableConfig:a&&"table"in a&&a.table||{},readonlyFieldId:void 0,hideFieldId:void 0}}return{services:i,tableConfig:(null===(o=t.pages.configuration.tabs.find((function(e){return e.name===r})))||void 0===o?void 0:o.table)||{},readonlyFieldId:void 0,hideFieldId:void 0}}(t,T,r)}),[t,T,r]),M=D.services,N=D.tableConfig,R=D.readonlyFieldId,L=D.hideFieldId,I=N&&"moreInfo"in N?null==N?void 0:N.moreInfo:null,F=N&&"header"in N?null==N?void 0:N.header:null,z=!!r;(0,n.useEffect)((function(){return _.current=!0,function(){_.current=!1}}),[]),(0,n.useEffect)((function(){var e,t=new AbortController;return e=(null==M?void 0:M.map((function(e){return(0,u.Y)({serviceName:e.name,params:{count:-1},signal:t.signal})})))||[],a.A.all(e).catch((function(e){if(!a.A.isCancel(e)){var t=(0,Se.ZN)(e);(0,c.zH)(t,"error"),E(e)}})).then((function(e){if(e){var t=function(e,t){var r={};return null==e||e.forEach((function(e,n){if(e&&e.name&&t){var o={};t[n].forEach((function(t){o[t.name]=At(At({},t.content),{},{id:t.id,name:t.name,serviceName:e.name,serviceTitle:e.title||""})})),r[e.name]=o}})),r}(M,e.map((function(e){return e.data.entry})));P(t)}})).finally((function(){_.current&&g(!1)})),function(){t.abort()}}),[M,P]);var V=function(e){if(!(R&&R in e&&e[R])){P((function(t){return i()(t,Tt({},e.serviceName,Tt({},e.name,{__toggleShowSpinner:{$set:!0}})))}));var t=new URLSearchParams;t.append("disabled",String(!e.disabled)),(0,u.Y)({serviceName:"".concat(e.serviceName,"/").concat(e.name),body:t,customHeaders:{"Content-Type":"application/x-www-form-urlencoded"},method:"post",handleError:!0,callbackOnError:function(){P((function(t){return i()(t,Tt({},e.serviceName,Tt({},e.name,{__toggleShowSpinner:{$set:!1}})))}))}}).then((function(t){P((function(r){return i()(r,Tt({},e.serviceName,Tt({},e.name,{disabled:{$set:(0,_t.Hn)(t.data.entry[0].content.disabled)},__toggleShowSpinner:{$set:!1}})))}))}))}},U=(0,n.useCallback)((function(e){var t=[],r=[].concat(St((null==F?void 0:F.map((function(e){return e.field})))||[]),St((null==I?void 0:I.map((function(e){return e.field})))||[]));return Object.values(e).forEach((function(e){Object.entries(e).some((function(e){var t=Pt(e,2),n=t[0],o=t[1];return r.includes(n)&&"string"==typeof o&&o.toLowerCase().includes(C.toLowerCase().trim())}))&&t.push(e)})),t}),[F,I,C]);if(O)throw O;if(b)return n.createElement(l.Ku,{size:"medium"});var B=function(){var e,t=[];"all"===A?Object.keys(S).forEach((function(e){var r=C?U(S[e]):Object.keys(S[e]).map((function(t){return S[e][t]}));t=t.concat(r)})):t=U(S[A]),z&&(t=t.filter((function(e){return e.serviceName===r}))),L&&(t=t.filter((function(e){return!e[L]})));var n=(null==F||null===(e=F.find((function(e){return e.field===p})))||void 0===e?void 0:e.mapping)||{},o=t.sort((function(e,t){if("asc"===v)return(void 0===e[p]?"":n[String(e[p])]||e[p])>(void 0===t[p]?"":n[String(t[p])]||t[p])?1:-1;if("desc"===v){var r=void 0===e[p]?"":n[String(e[p])]||e[p];return(void 0===t[p]?"":n[String(t[p])]||t[p])>r?1:-1}return 0})),i=o.slice(x*k,(x+1)*k);return x>0&&!i.length&&(i=o.slice((x-1)*k,k)),{filteredData:i,totalElement:t.length,allFilteredData:t}}(),K=B.filteredData,W=B.totalElement,q=B.allFilteredData;return n.createElement(n.Fragment,null,n.createElement(wt,{page:t,services:M,totalElement:W,handleRequestModalOpen:o,changeToggleStatus:V,isTabs:z,allFilteredData:q,displayActionBtnAllRows:f}),n.createElement($e,{page:t,serviceName:r,data:K,handleToggleActionClick:function(e){return V(e)},handleSort:h,sortDir:v,sortKey:p,handleOpenPageStyleDialog:s,tableConfig:N}))};const Mt=(0,n.memo)(Dt)},90785:(e,t,r)=>{r.d(t,{K:()=>o,S:()=>n});var n="page",o="modal"},33563:(e,t,r)=>{r.d(t,{DJ:()=>a,F9:()=>o,UT:()=>n,rG:()=>i});var n="clone",o="create",i="edit",a="config"},40150:(e,t,r)=>{r.d(t,{kP:()=>o});var n=r(58813),o={url:{regex:/^(?:(?:https?|ftp|opc\.tcp):\/\/)?(?:\S+(?::\S*)?@)?(?:(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]+-?_?)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,}))?)(?::\d{2,5})?(?:\/[^\s]*)?$/,inputValueType:(0,n.CK)(111)},email:{regex:/^[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])?)*$/,inputValueType:(0,n.CK)(112)},ipv4:{regex:/^(?:(?:[0-1]?\d{1,2}|2[0-4]\d|25[0-5])(?:\.|$)){4}$/,inputValueType:(0,n.CK)(113)},date:{regex:/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,inputValueType:(0,n.CK)(114)}}},44798:(e,t,r)=>{r.d(t,{A:()=>s,r:()=>c});var n=r(96540),o=r(5556),i=r.n(o);function a(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,o,i,a,l=[],u=!0,c=!1;try{if(i=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;u=!1}else for(;!(u=(n=i.call(r)).done)&&(l.push(n.value),l.length!==t);u=!0);}catch(e){c=!0,o=e}finally{try{if(!u&&null!=r.return&&(a=r.return(),Object(a)!==a))return}finally{if(c)throw o}}return l}}(e,t)||function(e,t){if(e){if("string"==typeof e)return l(e,t);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?l(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function l(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r{r.d(t,{A:()=>o});var n=r(47767);const o=function(){return new URLSearchParams((0,n.zy)().search)}},13199:(e,t,r)=>{r.d(t,{WI:()=>c,qA:()=>s});var n,o,i,a=r(92568),l=r(78967);function u(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}var c=a.default.div.attrs({className:"pageTitle"})(n||(n=u(["\n font-size: ",";\n margin-bottom: 20px;\n display: flex;\n justify-content: space-between;\n"])),l.variables.fontSizeXXLarge),s=a.default.div.attrs({className:"pageSubtitle"})(o||(o=u(["\n font-size: ",";\n margin-bottom: 10px;\n"])),l.variables.fontSize);a.default.div(i||(i=u(["\n .table-caption-inner {\n text-align: left;\n }\n"])))},28754:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{__webpack_require__.d(__webpack_exports__,{A:()=>__WEBPACK_DEFAULT_EXPORT__,W:()=>SaveValidator});var lodash__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(9676),lodash__WEBPACK_IMPORTED_MODULE_0___default=__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_0__),_constants_preDefinedRegex__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(40150),_messageUtil__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__(58813);function _typeof(e){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},_typeof(e)}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _defineProperties(e,t){for(var r=0;r-1})))return{errorField:"name",errorMsg:(0,_messageUtil__WEBPACK_IMPORTED_MODULE_2__.CK)(3,[n])};if(r.length>=1024)return{errorField:"name",errorMsg:(0,_messageUtil__WEBPACK_IMPORTED_MODULE_2__.CK)(22,[n])}}var o,i,a;for(i=0;in.maxLength?{errorField:t,errorMsg:n.errorMsg?n.errorMsg:(0,_messageUtil__WEBPACK_IMPORTED_MODULE_2__.CK)(18,[r,n.maxLength])}:!!(e.checkIsFieldHasInput(o)&&o.lengthn.range[1]||a{r.d(t,{Y:()=>d});var n=r(71083),o=r(75602),i=r(69211),a=r(10670),l=r(58813);function u(e){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},u(e)}function c(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function s(e){for(var t=1;t{function n(e){return null==e||["0","FALSE","F","N","NO","NONE",""].includes(e.toString().toUpperCase())}function o(e){return null!=e&&["1","TRUE","T","Y","YES"].includes(e.toString().toUpperCase())}function i(e){return(n(e)?"0":o(e)&&"1")||e}r.d(t,{Hn:()=>o,Wu:()=>n,nF:()=>i})}}]); +//# sourceMappingURL=11.5f537ef2df4a1dddfa28.js.map \ No newline at end of file diff --git a/apps/TA-socradar-incidents/appserver/static/js/build/238.8e15410feb4dc7301333.js b/apps/TA-socradar-incidents/appserver/static/js/build/238.8e15410feb4dc7301333.js new file mode 100755 index 00000000..5088a650 --- /dev/null +++ b/apps/TA-socradar-incidents/appserver/static/js/build/238.8e15410feb4dc7301333.js @@ -0,0 +1,2 @@ +(self.webpackChunk_splunk_ucc_ui_lib=self.webpackChunk_splunk_ucc_ui_lib||[]).push([[238],{96791:(n,e,t)=>{"use strict";t.d(e,{A:()=>O});var r,i,a,o,s,l=t(96540),u=t(39643),c=t.n(u),d=t(20259),A=t(15759),_=t.n(A),p=t(68623),g=t.n(p),m=t(92568),f=t(78967),b=t(58813);function v(n){return v="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(n){return typeof n}:function(n){return n&&"function"==typeof Symbol&&n.constructor===Symbol&&n!==Symbol.prototype?"symbol":typeof n},v(n)}function h(n,e){for(var t=0;t{"use strict";t.r(e),t.d(e,{default:()=>gn});var r=t(96540),i=t(24379),a=t.n(i),o=t(84608),s=t.n(o),l=t(92568),u=t(68870),c=t(78967),d=t(96791),A=t(18925),_=t(3901),p=t(68203),g=t.n(p),m=t(90780);function f(n){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(n){return typeof n}:function(n){return n&&"function"==typeof Symbol&&n.constructor===Symbol&&n!==Symbol.prototype?"symbol":typeof n},f(n)}function b(n,e){(null==e||e>n.length)&&(e=n.length);for(var t=0,r=Array(e);ti||o()}),r)}()},h=function(n,e){var t=arguments.length>2&&void 0!==arguments[2]&&arguments[2];v(n,e,(function(){var r=document.querySelector(n),i=document.querySelector(e);r&&i&&(t?null==i||i.after(r):null==i||i.before(r),r.classList.remove("invisible_before_moving"))}),300,5e3)},y={"Source type":"st",Source:"s",Host:"h",Index:"idx",Account:"event_account",Input:"event_input"},C=function(n){return[r.createElement(m.RefreshButton,{key:"".concat(n,"_refresh")}),r.createElement(m.ExportButton,{key:"".concat(n,"_export")}),r.createElement(m.OpenSearchButton,{key:"".concat(n,"_opensearch"),onOpenSearchClick:function(n){var e,t;"string"==typeof(null==n||null===(e=n.options)||void 0===e?void 0:e.query)&&"object"===f(null==n||null===(t=n.options)||void 0===t?void 0:t.queryParameters)&&function(n,e){var t;if(n){var r=window.location.origin+window.location.pathname,i=r.lastIndexOf("/"),a=new URL("".concat(r.slice(0,i),"/search"));a.searchParams.append("q",n),Object.entries(e||{}).forEach((function(n){var e=function(n,e){return function(n){if(Array.isArray(n))return n}(n)||function(n,e){var t=null==n?null:"undefined"!=typeof Symbol&&n[Symbol.iterator]||n["@@iterator"];if(null!=t){var r,i,a,o,s=[],l=!0,u=!1;try{if(a=(t=t.call(n)).next,0===e){if(Object(t)!==t)return;l=!1}else for(;!(l=(r=a.call(t)).done)&&(s.push(r.value),s.length!==e);l=!0);}catch(n){u=!0,i=n}finally{try{if(!l&&null!=t.return&&(o=t.return(),Object(o)!==o))return}finally{if(u)throw i}}return s}}(n,e)||function(n,e){if(n){if("string"==typeof n)return b(n,e);var t={}.toString.call(n).slice(8,-1);return"Object"===t&&n.constructor&&(t=n.constructor.name),"Map"===t||"Set"===t?Array.from(n):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?b(n,e):void 0}}(n,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}(n,2),t=e[0],r=e[1];a.searchParams.append(t,r)})),null===(t=window.open(a,"_blank"))||void 0===t||t.focus()}else console.error("No search query provided - openSearchInNewTabWithQuery")}(n.options.query,n.options.queryParameters)}})]},I={Host:"Event metrics are not available.",Input:"Volume metrics are not available.",Account:"Volume metrics are not available."},w=function(n){var e=n.dashboardDefinition;return(0,r.useEffect)((function(){return h('[data-input-id="overview_input"]',"#overview_main_label_viz"),function(){}}),[]),e?r.createElement(_.DashboardContextProvider,{preset:g(),initialDefinition:e},r.createElement(A.DashboardCore,{width:"100%",height:"auto",actionMenus:C("overview")})):null},B=t(21973),j=t.n(B),x=t(57914),z=t.n(x),E=t(9676);function k(n,e){return function(n){if(Array.isArray(n))return n}(n)||function(n,e){var t=null==n?null:"undefined"!=typeof Symbol&&n[Symbol.iterator]||n["@@iterator"];if(null!=t){var r,i,a,o,s=[],l=!0,u=!1;try{if(a=(t=t.call(n)).next,0===e){if(Object(t)!==t)return;l=!1}else for(;!(l=(r=a.call(t)).done)&&(s.push(r.value),s.length!==e);l=!0);}catch(n){u=!0,i=n}finally{try{if(!l&&null!=t.return&&(o=t.return(),Object(o)!==o))return}finally{if(u)throw i}}return s}}(n,e)||function(n,e){if(n){if("string"==typeof n)return S(n,e);var t={}.toString.call(n).slice(8,-1);return"Object"===t&&n.constructor&&(t=n.constructor.name),"Map"===t||"Set"===t?Array.from(n):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?S(n,e):void 0}}(n,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function S(n,e){(null==e||e>n.length)&&(e=n.length);for(var t=0,r=Array(e);t0){var o,s,l=(null===(o=document)||void 0===o||null===(o=o.querySelector('[data-input-id="data_ingestion_table_input"] button'))||void 0===o?void 0:o.getAttribute("label"))||"Source type",u=function(n,e,t,r){var i=t.indexOf("|"),a=t.substring(0,i),o=t.substring(i),s=n?"".concat(y[r]||"st","=*").concat(n,"* "):"";return"".concat(a).concat(s).concat(o)}(n,0,a.inputs.data_ingestion_table_input.options.items.find((function(n){return n.label===l})).value,l);a.dataSources.data_ingestion_table_ds.options.query=u,null===(s=t.current)||void 0===s||s.updateDefinition(a)}}),1e3)}),[e]),b=P[l];return r.createElement(r.Fragment,null,r.createElement(_.DashboardContextProvider,{preset:g(),initialDefinition:e},r.createElement(r.Fragment,null,r.createElement(A.DashboardCore,{width:"100%",height:"auto",dashboardCoreApiRef:m,actionMenus:C("data_ingestion")}),r.createElement("div",{id:"data_ingestion_search",className:"invisible_before_moving"},r.createElement("p",{id:"data_ingestion_search_label"},"Search"),r.createElement(j(),{id:"data_ingestion_search_input",onChange:function(n,e){var t=e.value;o(t),f(t,d)},value:a,style:{minWidth:"150px",gridRow:"6",gridColumn:"1"}})),r.createElement("div",{id:"info_message_for_data_ingestion",className:"invisible_before_moving"},b?r.createElement(z(),{appearance:"fill",type:"info"},b):null))))},T=t(70181),R=t.n(T),q=t(15476),L=t(10670),Y=(0,l.default)(R())(O||(W=["\n max-width: fit-content;\n font-size: ",";\n align-content: flex-end;\n place-self: end;\n grid-column: 2;\n grid-row: 4;\n bottom: 8px;\n"],D||(D=W.slice(0)),O=Object.freeze(Object.defineProperties(W,{raw:{value:Object.freeze(D)}}))),c.variables.fontSize),X=function(n){var e=n.dashboardDefinition,t=r.useRef(),i=(0,L.Sb)(),a=r.useCallback((function(n){t.current=n}),[]);return(0,r.useEffect)((function(){h('[data-input-id="errors_tab_input"][data-input-type="input.timerange"]',"#errors_tab_description_viz"),h('[data-input-id="errors_type_input"][data-input-type="input.multiselect"]',"#errors_tab_errors_list_viz"),h("#open_search_error_events_tab_with_types","#errors_tab_errors_list_viz")}),[]),(0,r.useEffect)((function(){if(null==t||!t.current)return function(){};var n=q.default.create({search:"index=_internal source=*".concat(i.meta.restRoot,"* ERROR | dedup exc_l | table exc_l"),earliest_time:"0",latest_time:"now"},{cache:!0,cancelOnUnload:!0}).getResults().subscribe((function(n){var r;if(null!=n&&null!==(r=n.results)&&void 0!==r&&r.length){var i,a=JSON.parse(JSON.stringify(e));a.inputs.errors_type_input.options.items=[{label:"All",value:"*"}],n.results.sort((function(n,e){var t=n.exc_l.toUpperCase(),r=e.exc_l.toUpperCase();return tr?1:0})).forEach((function(n){return a.inputs.errors_type_input.options.items.push({label:n.exc_l,value:'"'.concat(n.exc_l,'"')})})),null===(i=t.current)||void 0===i||i.updateDefinition(a)}}));return function(){n.unsubscribe()}}),[e,i.meta.restRoot,t]),e?r.createElement(_.DashboardContextProvider,{preset:g(),initialDefinition:e},r.createElement(r.Fragment,null,r.createElement(Y,{id:"open_search_error_events_tab_with_types",label:"Open in Search",openInNewContext:!0,onClick:function(){var n;return null===(n=document.querySelector('#errors_tab_errors_list_viz [data-test="open-search-button"]'))||void 0===n?void 0:n.click()}}),r.createElement(A.DashboardCore,{width:"100%",height:"auto",actionMenus:C("error"),dashboardCoreApiRef:a}))):null},U=function(n){var e=n.dashboardDefinition;return(0,r.useEffect)((function(){h('[data-input-id="resource_tab_input"]',"#resource_tab_description_viz")}),[]),(0,r.useEffect)((function(){var n=function(n){var e=n.querySelector('[data-test="viz-waiting-for-input-message"]');"No search results returned"===(null==e?void 0:e.textContent)&&(e.textContent="No results found. Resource consumption may not be supported for your operating system.")},e={childList:!0,subtree:!0},t=new MutationObserver((function(e){e.forEach((function(e){"childList"===e.type&&e.addedNodes.length>0&&"viz-size-wrapper"===e.target.dataset.test&&n(e.target)}))}));return v("#resource_tab_cpu_consumption_viz","#resource_tab_memory_consumption_viz",(function(){var r=document.querySelector("#resource_tab_cpu_consumption_viz"),i=document.querySelector("#resource_tab_memory_consumption_viz");r&&(n(r),t.observe(r,e)),i&&(n(i),t.observe(i,e))}),400,4e3),function(){t.disconnect()}}),[e]),e?r.createElement(_.DashboardContextProvider,{preset:g(),initialDefinition:e},r.createElement(A.DashboardCore,{width:"100%",height:"auto",actionMenus:C("error")})):null},Q=function(n){var e=n.dashboardDefinition;return e?r.createElement(_.DashboardContextProvider,{preset:g(),initialDefinition:e},r.createElement(A.DashboardCore,{width:"100%",height:"auto"})):null},H=t(85072),M=t.n(H),J=t(97825),F=t.n(J),V=t(77659),Z=t.n(V),$=t(55056),G=t.n($),K=t(10540),nn=t.n(K),en=t(41113),tn=t.n(en),rn=t(8992),an={};an.styleTagTransform=tn(),an.setAttributes=G(),an.insert=Z().bind(null,"head"),an.domAPI=F(),an.insertStyleElement=nn(),M()(rn.A,an),rn.A&&rn.A.locals&&rn.A.locals;var on,sn,ln=t(66930);function un(n,e){return function(n){if(Array.isArray(n))return n}(n)||function(n,e){var t=null==n?null:"undefined"!=typeof Symbol&&n[Symbol.iterator]||n["@@iterator"];if(null!=t){var r,i,a,o,s=[],l=!0,u=!1;try{if(a=(t=t.call(n)).next,0===e){if(Object(t)!==t)return;l=!1}else for(;!(l=(r=a.call(t)).done)&&(s.push(r.value),s.length!==e);l=!0);}catch(n){u=!0,i=n}finally{try{if(!l&&null!=t.return&&(o=t.return(),Object(o)!==o))return}finally{if(u)throw i}}return s}}(n,e)||function(n,e){if(n){if("string"==typeof n)return cn(n,e);var t={}.toString.call(n).slice(8,-1);return"Object"===t&&n.constructor&&(t=n.constructor.name),"Map"===t||"Set"===t?Array.from(n):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?cn(n,e):void 0}}(n,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function cn(n,e){(null==e||e>n.length)&&(e=n.length);for(var t=0,r=Array(e);t{"use strict";t.d(e,{A:()=>s});var r=t(71354),i=t.n(r),a=t(76314),o=t.n(a)()(i());o.push([n.id,"/*\n * Copyright 2024 Splunk Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\n#dashboardTable [data-test='tab-bar'] {\n margin-bottom: 15px;\n\n button {\n min-width: 115px;\n }\n}\n\n[data-input-id='overview_input'] {\n grid-column: 5 / 5;\n grid-row: 3;\n}\n\n#overview_main_label_viz {\n grid-column: 1 / span 4;\n grid-row: 3;\n height: fit-content;\n}\n\n#main_page_description_viz {\n margin-top: 40px;\n}\n\n#overview_timerange_label_start_viz {\n grid-row: 3;\n margin-top: 28px;\n}\n\n#overview_timerange_label_end_viz {\n grid-row: 3;\n margin-left: 145px;\n margin-top: 28px;\n display: flex;\n}\n\n/* data ingestion */\n\n[data-input-id='data_ingestion_input'] {\n grid-column: 7 / 8;\n grid-row: 2;\n}\n\n#data_ingestion_description_viz {\n margin-top: 32px;\n width: 600px;\n}\n\n#data_ingestion_timerange_label_start_viz {\n grid-row: 2;\n margin-top: 12px;\n}\n\n#data_ingestion_timerange_label_end_viz {\n grid-row: 2;\n margin-left: 145px;\n display: flex;\n margin-top: 12px;\n}\n\n#data_ingestion_table_viz {\n grid-column: 1 / 8;\n height: 100%;\n max-height: 500px;\n grid-row: 6;\n margin-top: 100px;\n\n [data-test='viz-waiting-for-input'] {\n min-height: 100px;\n }\n}\n\n#data_ingestion_data_volume_viz {\n grid-row: 3 / 6;\n margin-top: 20px;\n}\n\n#data_ingestion_events_count_viz {\n grid-row: 3 / 6;\n margin-top: 20px;\n}\n\n#data_ingestion_search {\n grid-row: 6;\n width: 150px;\n grid-column: 1;\n margin-top: 16px;\n}\n\n#data_ingestion_search_label {\n margin-bottom: 4px;\n}\n\n[data-input-id='data_ingestion_table_input'] {\n width: 200px;\n margin-left: 150px;\n grid-row: 6;\n grid-column: 1;\n margin-top: 21px;\n [data-test='input-title'] {\n font-size: 14px;\n }\n}\n\n#switch_hide_no_traffic_wrapper {\n grid-column: 1;\n grid-row: 6;\n width: 200px;\n margin: 32px 350px;\n}\n\n/* error tab */\n\n[data-input-id='errors_tab_input'] {\n grid-column: 2;\n grid-row: 1;\n}\n\n#errors_tab_description_viz {\n grid-column: 1 / 3;\n grid-row: 1;\n height: 20px;\n margin-top: 32px;\n width: 600px;\n}\n\n#errors_tab_timerange_label_start_viz {\n grid-column: 1;\n grid-row: 1;\n margin-top: 37px;\n}\n\n#errors_tab_timerange_label_end_viz {\n grid-column: 1;\n grid-row: 1;\n margin-left: 145px;\n display: flex;\n margin-top: 37px;\n}\n\n[data-test='status-icon-container'] {\n z-index: 1;\n}\n\n.invisible_before_moving {\n display: none;\n}\n\n#errors_tab_errors_list_viz {\n margin-top: 8px;\n height: fit-content;\n grid-row: 5;\n grid-column: 1 / 3;\n}\n\n#errors_tab_errors_count_viz {\n grid-row: 2;\n height: 400px;\n grid-column: 1 / 3;\n margin-top: 16px;\n}\n\n[data-input-id='errors_type_input'] {\n grid-column: 1;\n grid-row: 4;\n}\n\n#errors_tab_errors_list_viz div {\n height: fit-content;\n}\n\n[data-test-panel-id='errorsTabPanel'] [data-test='grid-layout-canvas'] {\n grid-template-columns: 94.5% 5%;\n grid-template-rows: auto auto auto auto auto;\n height: fit-content;\n overflow-x: hidden;\n}\n\n#errors_tab_label_viz {\n grid-column: 1;\n grid-row: 1;\n}\n\n/* resource tab */\n\n#resource_tab_label_viz {\n min-width: 450px;\n}\n\n[data-input-id='resource_tab_input'] {\n grid-column: 6;\n grid-row: 1;\n margin-top: 32px;\n}\n\n#resource_tab_description_viz {\n margin-top: 32px;\n width: 600px;\n}\n\n#resource_tab_timerange_label_start_viz {\n grid-row: 1;\n margin-top: 35px;\n}\n\n#resource_tab_timerange_label_end_viz {\n grid-row: 1;\n margin-left: 145px;\n display: flex;\n margin-top: 35px;\n}\n\n#resource_tab_cpu_consumption_viz,\n#resource_tab_memory_consumption_viz {\n grid-row: 2 / 6;\n margin-top: 20px;\n height: 300px;\n}\n\n/* shared styles for time labels */\n#overview_timerange_label_start_viz,\n#overview_timerange_label_end_viz,\n#data_ingestion_timerange_label_start_viz,\n#data_ingestion_timerange_label_end_viz,\n#errors_tab_timerange_label_start_viz,\n#errors_tab_timerange_label_end_viz,\n#resource_tab_timerange_label_start_viz,\n#resource_tab_timerange_label_end_viz {\n inline-size: fit-content;\n grid-column: 1;\n width: 145px;\n\n [data-test='majorValue'] {\n font-size: 14px;\n line-height: 14px;\n font-family: 'Splunk Platform Sans', 'Splunk Platform Sans', 'Proxima Nova', Roboto, Droid,\n 'Helvetica Neue', Helvetica, Arial, sans-serif;\n font-weight: 400;\n color: var(--muted-text-color);\n }\n [data-test='action-menu-wrapper'] {\n display: none;\n }\n}\n\n/* shared styles page grid titles */\n#main_page_label_viz,\n#main_page_description_viz,\n#data_ingestion_description_viz,\n#data_ingestion_label_viz,\n#errors_tab_description_viz,\n#resource_tab_description_viz {\n grid-column: 1 / span 4;\n grid-row: 1;\n height: fit-content;\n}\n\n/* data input shared styles */\n[data-input-id='overview_input'],\n[data-input-id='data_ingestion_input'],\n[data-input-id='errors_tab_input'],\n[data-input-id='resource_tab_input'] {\n align-content: flex-end;\n place-self: end;\n\n [data-test='input-container'] {\n display: inline-flex;\n padding: 0;\n }\n [data-test='input-title-remove-container'] {\n margin: 5px;\n }\n [data-test='input-title'] {\n font-size: 14px;\n }\n}\n\n/* mark between dates */\n\n#overview_timerange_label_end_viz::before,\n#data_ingestion_timerange_label_end_viz::before,\n#errors_tab_timerange_label_end_viz::before,\n#resource_tab_timerange_label_end_viz::before {\n content: '- ';\n margin: auto;\n color: var(--muted-text-color);\n}\n\n#errors_tab_errors_list_viz svg[data-test='placeholder-icon'] {\n max-height: 400px;\n}\n\n/* muted color */\n#main_page_description_viz p,\n#data_ingestion_description_viz p,\n#errors_tab_description_viz p {\n color: var(--muted-text-color);\n}\n","",{version:3,sources:["webpack://./src/pages/Dashboard/dashboardStyle.css"],names:[],mappings:"AAAA;;;;;;;;;;;;;;;EAeE;;AAEF;IACI,mBAAmB;;IAEnB;QACI,gBAAgB;IACpB;AACJ;;AAEA;IACI,kBAAkB;IAClB,WAAW;AACf;;AAEA;IACI,uBAAuB;IACvB,WAAW;IACX,mBAAmB;AACvB;;AAEA;IACI,gBAAgB;AACpB;;AAEA;IACI,WAAW;IACX,gBAAgB;AACpB;;AAEA;IACI,WAAW;IACX,kBAAkB;IAClB,gBAAgB;IAChB,aAAa;AACjB;;AAEA,mBAAmB;;AAEnB;IACI,kBAAkB;IAClB,WAAW;AACf;;AAEA;IACI,gBAAgB;IAChB,YAAY;AAChB;;AAEA;IACI,WAAW;IACX,gBAAgB;AACpB;;AAEA;IACI,WAAW;IACX,kBAAkB;IAClB,aAAa;IACb,gBAAgB;AACpB;;AAEA;IACI,kBAAkB;IAClB,YAAY;IACZ,iBAAiB;IACjB,WAAW;IACX,iBAAiB;;IAEjB;QACI,iBAAiB;IACrB;AACJ;;AAEA;IACI,eAAe;IACf,gBAAgB;AACpB;;AAEA;IACI,eAAe;IACf,gBAAgB;AACpB;;AAEA;IACI,WAAW;IACX,YAAY;IACZ,cAAc;IACd,gBAAgB;AACpB;;AAEA;IACI,kBAAkB;AACtB;;AAEA;IACI,YAAY;IACZ,kBAAkB;IAClB,WAAW;IACX,cAAc;IACd,gBAAgB;IAChB;QACI,eAAe;IACnB;AACJ;;AAEA;IACI,cAAc;IACd,WAAW;IACX,YAAY;IACZ,kBAAkB;AACtB;;AAEA,cAAc;;AAEd;IACI,cAAc;IACd,WAAW;AACf;;AAEA;IACI,kBAAkB;IAClB,WAAW;IACX,YAAY;IACZ,gBAAgB;IAChB,YAAY;AAChB;;AAEA;IACI,cAAc;IACd,WAAW;IACX,gBAAgB;AACpB;;AAEA;IACI,cAAc;IACd,WAAW;IACX,kBAAkB;IAClB,aAAa;IACb,gBAAgB;AACpB;;AAEA;IACI,UAAU;AACd;;AAEA;IACI,aAAa;AACjB;;AAEA;IACI,eAAe;IACf,mBAAmB;IACnB,WAAW;IACX,kBAAkB;AACtB;;AAEA;IACI,WAAW;IACX,aAAa;IACb,kBAAkB;IAClB,gBAAgB;AACpB;;AAEA;IACI,cAAc;IACd,WAAW;AACf;;AAEA;IACI,mBAAmB;AACvB;;AAEA;IACI,+BAA+B;IAC/B,4CAA4C;IAC5C,mBAAmB;IACnB,kBAAkB;AACtB;;AAEA;IACI,cAAc;IACd,WAAW;AACf;;AAEA,iBAAiB;;AAEjB;IACI,gBAAgB;AACpB;;AAEA;IACI,cAAc;IACd,WAAW;IACX,gBAAgB;AACpB;;AAEA;IACI,gBAAgB;IAChB,YAAY;AAChB;;AAEA;IACI,WAAW;IACX,gBAAgB;AACpB;;AAEA;IACI,WAAW;IACX,kBAAkB;IAClB,aAAa;IACb,gBAAgB;AACpB;;AAEA;;IAEI,eAAe;IACf,gBAAgB;IAChB,aAAa;AACjB;;AAEA,kCAAkC;AAClC;;;;;;;;IAQI,wBAAwB;IACxB,cAAc;IACd,YAAY;;IAEZ;QACI,eAAe;QACf,iBAAiB;QACjB;0DACkD;QAClD,gBAAgB;QAChB,8BAA8B;IAClC;IACA;QACI,aAAa;IACjB;AACJ;;AAEA,mCAAmC;AACnC;;;;;;IAMI,uBAAuB;IACvB,WAAW;IACX,mBAAmB;AACvB;;AAEA,8BAA8B;AAC9B;;;;IAII,uBAAuB;IACvB,eAAe;;IAEf;QACI,oBAAoB;QACpB,UAAU;IACd;IACA;QACI,WAAW;IACf;IACA;QACI,eAAe;IACnB;AACJ;;AAEA,wBAAwB;;AAExB;;;;IAII,aAAa;IACb,YAAY;IACZ,8BAA8B;AAClC;;AAEA;IACI,iBAAiB;AACrB;;AAEA,gBAAgB;AAChB;;;IAGI,8BAA8B;AAClC",sourcesContent:["/*\n * Copyright 2024 Splunk Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\n#dashboardTable [data-test='tab-bar'] {\n margin-bottom: 15px;\n\n button {\n min-width: 115px;\n }\n}\n\n[data-input-id='overview_input'] {\n grid-column: 5 / 5;\n grid-row: 3;\n}\n\n#overview_main_label_viz {\n grid-column: 1 / span 4;\n grid-row: 3;\n height: fit-content;\n}\n\n#main_page_description_viz {\n margin-top: 40px;\n}\n\n#overview_timerange_label_start_viz {\n grid-row: 3;\n margin-top: 28px;\n}\n\n#overview_timerange_label_end_viz {\n grid-row: 3;\n margin-left: 145px;\n margin-top: 28px;\n display: flex;\n}\n\n/* data ingestion */\n\n[data-input-id='data_ingestion_input'] {\n grid-column: 7 / 8;\n grid-row: 2;\n}\n\n#data_ingestion_description_viz {\n margin-top: 32px;\n width: 600px;\n}\n\n#data_ingestion_timerange_label_start_viz {\n grid-row: 2;\n margin-top: 12px;\n}\n\n#data_ingestion_timerange_label_end_viz {\n grid-row: 2;\n margin-left: 145px;\n display: flex;\n margin-top: 12px;\n}\n\n#data_ingestion_table_viz {\n grid-column: 1 / 8;\n height: 100%;\n max-height: 500px;\n grid-row: 6;\n margin-top: 100px;\n\n [data-test='viz-waiting-for-input'] {\n min-height: 100px;\n }\n}\n\n#data_ingestion_data_volume_viz {\n grid-row: 3 / 6;\n margin-top: 20px;\n}\n\n#data_ingestion_events_count_viz {\n grid-row: 3 / 6;\n margin-top: 20px;\n}\n\n#data_ingestion_search {\n grid-row: 6;\n width: 150px;\n grid-column: 1;\n margin-top: 16px;\n}\n\n#data_ingestion_search_label {\n margin-bottom: 4px;\n}\n\n[data-input-id='data_ingestion_table_input'] {\n width: 200px;\n margin-left: 150px;\n grid-row: 6;\n grid-column: 1;\n margin-top: 21px;\n [data-test='input-title'] {\n font-size: 14px;\n }\n}\n\n#switch_hide_no_traffic_wrapper {\n grid-column: 1;\n grid-row: 6;\n width: 200px;\n margin: 32px 350px;\n}\n\n/* error tab */\n\n[data-input-id='errors_tab_input'] {\n grid-column: 2;\n grid-row: 1;\n}\n\n#errors_tab_description_viz {\n grid-column: 1 / 3;\n grid-row: 1;\n height: 20px;\n margin-top: 32px;\n width: 600px;\n}\n\n#errors_tab_timerange_label_start_viz {\n grid-column: 1;\n grid-row: 1;\n margin-top: 37px;\n}\n\n#errors_tab_timerange_label_end_viz {\n grid-column: 1;\n grid-row: 1;\n margin-left: 145px;\n display: flex;\n margin-top: 37px;\n}\n\n[data-test='status-icon-container'] {\n z-index: 1;\n}\n\n.invisible_before_moving {\n display: none;\n}\n\n#errors_tab_errors_list_viz {\n margin-top: 8px;\n height: fit-content;\n grid-row: 5;\n grid-column: 1 / 3;\n}\n\n#errors_tab_errors_count_viz {\n grid-row: 2;\n height: 400px;\n grid-column: 1 / 3;\n margin-top: 16px;\n}\n\n[data-input-id='errors_type_input'] {\n grid-column: 1;\n grid-row: 4;\n}\n\n#errors_tab_errors_list_viz div {\n height: fit-content;\n}\n\n[data-test-panel-id='errorsTabPanel'] [data-test='grid-layout-canvas'] {\n grid-template-columns: 94.5% 5%;\n grid-template-rows: auto auto auto auto auto;\n height: fit-content;\n overflow-x: hidden;\n}\n\n#errors_tab_label_viz {\n grid-column: 1;\n grid-row: 1;\n}\n\n/* resource tab */\n\n#resource_tab_label_viz {\n min-width: 450px;\n}\n\n[data-input-id='resource_tab_input'] {\n grid-column: 6;\n grid-row: 1;\n margin-top: 32px;\n}\n\n#resource_tab_description_viz {\n margin-top: 32px;\n width: 600px;\n}\n\n#resource_tab_timerange_label_start_viz {\n grid-row: 1;\n margin-top: 35px;\n}\n\n#resource_tab_timerange_label_end_viz {\n grid-row: 1;\n margin-left: 145px;\n display: flex;\n margin-top: 35px;\n}\n\n#resource_tab_cpu_consumption_viz,\n#resource_tab_memory_consumption_viz {\n grid-row: 2 / 6;\n margin-top: 20px;\n height: 300px;\n}\n\n/* shared styles for time labels */\n#overview_timerange_label_start_viz,\n#overview_timerange_label_end_viz,\n#data_ingestion_timerange_label_start_viz,\n#data_ingestion_timerange_label_end_viz,\n#errors_tab_timerange_label_start_viz,\n#errors_tab_timerange_label_end_viz,\n#resource_tab_timerange_label_start_viz,\n#resource_tab_timerange_label_end_viz {\n inline-size: fit-content;\n grid-column: 1;\n width: 145px;\n\n [data-test='majorValue'] {\n font-size: 14px;\n line-height: 14px;\n font-family: 'Splunk Platform Sans', 'Splunk Platform Sans', 'Proxima Nova', Roboto, Droid,\n 'Helvetica Neue', Helvetica, Arial, sans-serif;\n font-weight: 400;\n color: var(--muted-text-color);\n }\n [data-test='action-menu-wrapper'] {\n display: none;\n }\n}\n\n/* shared styles page grid titles */\n#main_page_label_viz,\n#main_page_description_viz,\n#data_ingestion_description_viz,\n#data_ingestion_label_viz,\n#errors_tab_description_viz,\n#resource_tab_description_viz {\n grid-column: 1 / span 4;\n grid-row: 1;\n height: fit-content;\n}\n\n/* data input shared styles */\n[data-input-id='overview_input'],\n[data-input-id='data_ingestion_input'],\n[data-input-id='errors_tab_input'],\n[data-input-id='resource_tab_input'] {\n align-content: flex-end;\n place-self: end;\n\n [data-test='input-container'] {\n display: inline-flex;\n padding: 0;\n }\n [data-test='input-title-remove-container'] {\n margin: 5px;\n }\n [data-test='input-title'] {\n font-size: 14px;\n }\n}\n\n/* mark between dates */\n\n#overview_timerange_label_end_viz::before,\n#data_ingestion_timerange_label_end_viz::before,\n#errors_tab_timerange_label_end_viz::before,\n#resource_tab_timerange_label_end_viz::before {\n content: '- ';\n margin: auto;\n color: var(--muted-text-color);\n}\n\n#errors_tab_errors_list_viz svg[data-test='placeholder-icon'] {\n max-height: 400px;\n}\n\n/* muted color */\n#main_page_description_viz p,\n#data_ingestion_description_viz p,\n#errors_tab_description_viz p {\n color: var(--muted-text-color);\n}\n"],sourceRoot:""}]);const s=o},35358:(n,e,t)=>{var r={"./af":25177,"./af.js":25177,"./ar":61509,"./ar-dz":41488,"./ar-dz.js":41488,"./ar-kw":58676,"./ar-kw.js":58676,"./ar-ly":42353,"./ar-ly.js":42353,"./ar-ma":24496,"./ar-ma.js":24496,"./ar-ps":6947,"./ar-ps.js":6947,"./ar-sa":82682,"./ar-sa.js":82682,"./ar-tn":89756,"./ar-tn.js":89756,"./ar.js":61509,"./az":95533,"./az.js":95533,"./be":28959,"./be.js":28959,"./bg":47777,"./bg.js":47777,"./bm":54903,"./bm.js":54903,"./bn":61290,"./bn-bd":17357,"./bn-bd.js":17357,"./bn.js":61290,"./bo":31545,"./bo.js":31545,"./br":11470,"./br.js":11470,"./bs":44429,"./bs.js":44429,"./ca":7306,"./ca.js":7306,"./cs":56464,"./cs.js":56464,"./cv":73635,"./cv.js":73635,"./cy":64226,"./cy.js":64226,"./da":93601,"./da.js":93601,"./de":77853,"./de-at":26111,"./de-at.js":26111,"./de-ch":54697,"./de-ch.js":54697,"./de.js":77853,"./dv":60708,"./dv.js":60708,"./el":54691,"./el.js":54691,"./en-au":53872,"./en-au.js":53872,"./en-ca":28298,"./en-ca.js":28298,"./en-gb":56195,"./en-gb.js":56195,"./en-ie":66584,"./en-ie.js":66584,"./en-il":65543,"./en-il.js":65543,"./en-in":9033,"./en-in.js":9033,"./en-nz":79402,"./en-nz.js":79402,"./en-sg":43004,"./en-sg.js":43004,"./eo":32934,"./eo.js":32934,"./es":97650,"./es-do":20838,"./es-do.js":20838,"./es-mx":17730,"./es-mx.js":17730,"./es-us":56575,"./es-us.js":56575,"./es.js":97650,"./et":3035,"./et.js":3035,"./eu":3508,"./eu.js":3508,"./fa":119,"./fa.js":119,"./fi":90527,"./fi.js":90527,"./fil":95995,"./fil.js":95995,"./fo":52477,"./fo.js":52477,"./fr":85498,"./fr-ca":26435,"./fr-ca.js":26435,"./fr-ch":37892,"./fr-ch.js":37892,"./fr.js":85498,"./fy":37071,"./fy.js":37071,"./ga":41734,"./ga.js":41734,"./gd":70217,"./gd.js":70217,"./gl":77329,"./gl.js":77329,"./gom-deva":32124,"./gom-deva.js":32124,"./gom-latn":93383,"./gom-latn.js":93383,"./gu":95050,"./gu.js":95050,"./he":11713,"./he.js":11713,"./hi":43861,"./hi.js":43861,"./hr":26308,"./hr.js":26308,"./hu":90609,"./hu.js":90609,"./hy-am":17160,"./hy-am.js":17160,"./id":74063,"./id.js":74063,"./is":89374,"./is.js":89374,"./it":88383,"./it-ch":21827,"./it-ch.js":21827,"./it.js":88383,"./ja":23827,"./ja.js":23827,"./jv":89722,"./jv.js":89722,"./ka":41794,"./ka.js":41794,"./kk":27088,"./kk.js":27088,"./km":96870,"./km.js":96870,"./kn":84451,"./kn.js":84451,"./ko":63164,"./ko.js":63164,"./ku":98174,"./ku-kmr":6181,"./ku-kmr.js":6181,"./ku.js":98174,"./ky":78474,"./ky.js":78474,"./lb":79680,"./lb.js":79680,"./lo":15867,"./lo.js":15867,"./lt":45766,"./lt.js":45766,"./lv":69532,"./lv.js":69532,"./me":58076,"./me.js":58076,"./mi":41848,"./mi.js":41848,"./mk":30306,"./mk.js":30306,"./ml":73739,"./ml.js":73739,"./mn":99053,"./mn.js":99053,"./mr":86169,"./mr.js":86169,"./ms":73386,"./ms-my":92297,"./ms-my.js":92297,"./ms.js":73386,"./mt":77075,"./mt.js":77075,"./my":72264,"./my.js":72264,"./nb":22274,"./nb.js":22274,"./ne":8235,"./ne.js":8235,"./nl":92572,"./nl-be":43784,"./nl-be.js":43784,"./nl.js":92572,"./nn":54566,"./nn.js":54566,"./oc-lnc":69330,"./oc-lnc.js":69330,"./pa-in":29849,"./pa-in.js":29849,"./pl":94418,"./pl.js":94418,"./pt":79834,"./pt-br":48303,"./pt-br.js":48303,"./pt.js":79834,"./ro":24457,"./ro.js":24457,"./ru":82271,"./ru.js":82271,"./sd":1221,"./sd.js":1221,"./se":33478,"./se.js":33478,"./si":17538,"./si.js":17538,"./sk":5784,"./sk.js":5784,"./sl":46637,"./sl.js":46637,"./sq":86794,"./sq.js":86794,"./sr":45719,"./sr-cyrl":48084,"./sr-cyrl.js":48084,"./sr.js":45719,"./ss":56e3,"./ss.js":56e3,"./sv":41011,"./sv.js":41011,"./sw":40748,"./sw.js":40748,"./ta":11025,"./ta.js":11025,"./te":11885,"./te.js":11885,"./tet":28861,"./tet.js":28861,"./tg":86571,"./tg.js":86571,"./th":55802,"./th.js":55802,"./tk":59527,"./tk.js":59527,"./tl-ph":29231,"./tl-ph.js":29231,"./tlh":31052,"./tlh.js":31052,"./tr":85096,"./tr.js":85096,"./tzl":79846,"./tzl.js":79846,"./tzm":81765,"./tzm-latn":97711,"./tzm-latn.js":97711,"./tzm.js":81765,"./ug-cn":48414,"./ug-cn.js":48414,"./uk":16618,"./uk.js":16618,"./ur":57777,"./ur.js":57777,"./uz":57609,"./uz-latn":72475,"./uz-latn.js":72475,"./uz.js":57609,"./vi":21135,"./vi.js":21135,"./x-pseudo":64051,"./x-pseudo.js":64051,"./yo":82218,"./yo.js":82218,"./zh-cn":52648,"./zh-cn.js":52648,"./zh-hk":1632,"./zh-hk.js":1632,"./zh-mo":31541,"./zh-mo.js":31541,"./zh-tw":50304,"./zh-tw.js":50304};function i(n){var e=a(n);return t(e)}function a(n){if(!t.o(r,n)){var e=new Error("Cannot find module '"+n+"'");throw e.code="MODULE_NOT_FOUND",e}return r[n]}i.keys=function(){return Object.keys(r)},i.resolve=a,n.exports=i,i.id=35358},50477:()=>{}}]); +//# sourceMappingURL=238.8e15410feb4dc7301333.js.map \ No newline at end of file diff --git a/apps/TA-socradar-incidents/appserver/static/js/build/313.77cc81cceb759a35a0be.js b/apps/TA-socradar-incidents/appserver/static/js/build/313.77cc81cceb759a35a0be.js new file mode 100755 index 00000000..bf5b823f --- /dev/null +++ b/apps/TA-socradar-incidents/appserver/static/js/build/313.77cc81cceb759a35a0be.js @@ -0,0 +1,1044 @@ +/*! For license information please see 313.77cc81cceb759a35a0be.js.LICENSE.txt */ +(self.webpackChunk_splunk_ucc_ui_lib=self.webpackChunk_splunk_ucc_ui_lib||[]).push([[313],{43627:(e,t,n)=>{"use strict";n.r(t),n.d(t,{SortableContext:()=>y,arrayMove:()=>a,arraySwap:()=>s,defaultAnimateLayoutChanges:()=>v,defaultNewIndexGetter:()=>_,hasSortableData:()=>A,horizontalListSortingStrategy:()=>d,rectSortingStrategy:()=>p,rectSwappingStrategy:()=>f,sortableKeyboardCoordinates:()=>T,useSortable:()=>O,verticalListSortingStrategy:()=>m});var r=n(96540),i=n(43375),o=n(74979);function a(e,t,n){const r=e.slice();return r.splice(n<0?r.length+n:n,0,r.splice(t,1)[0]),r}function s(e,t,n){const r=e.slice();return r[t]=e[n],r[n]=e[t],r}function l(e,t){return e.reduce(((e,n,r)=>{const i=t.get(n);return i&&(e[r]=i),e}),Array(e.length))}function c(e){return null!==e&&e>=0}const u={scaleX:1,scaleY:1},d=e=>{var t;let{rects:n,activeNodeRect:r,activeIndex:i,overIndex:o,index:a}=e;const s=null!=(t=n[i])?t:r;if(!s)return null;const l=function(e,t,n){const r=e[t],i=e[t-1],o=e[t+1];return r&&(i||o)?ni&&a<=o?{x:-s.width-l,y:0,...u}:a=o?{x:s.width+l,y:0,...u}:{x:0,y:0,...u}},p=e=>{let{rects:t,activeIndex:n,overIndex:r,index:i}=e;const o=a(t,r,n),s=t[i],l=o[i];return l&&s?{x:l.left-s.left,y:l.top-s.top,scaleX:l.width/s.width,scaleY:l.height/s.height}:null},f=e=>{let t,n,{activeIndex:r,index:i,rects:o,overIndex:a}=e;return i===r&&(t=o[i],n=o[a]),i===a&&(t=o[i],n=o[r]),n&&t?{x:n.left-t.left,y:n.top-t.top,scaleX:n.width/t.width,scaleY:n.height/t.height}:null},h={scaleX:1,scaleY:1},m=e=>{var t;let{activeIndex:n,activeNodeRect:r,index:i,rects:o,overIndex:a}=e;const s=null!=(t=o[n])?t:r;if(!s)return null;if(i===n){const e=o[a];return e?{x:0,y:nn&&i<=a?{x:0,y:-s.height-l,...h}:i=a?{x:0,y:s.height+l,...h}:{x:0,y:0,...h}},b="Sortable",g=r.createContext({activeIndex:-1,containerId:b,disableTransforms:!1,items:[],overIndex:-1,useDragOverlay:!1,sortedRects:[],strategy:p,disabled:{draggable:!1,droppable:!1}});function y(e){let{children:t,id:n,items:a,strategy:s=p,disabled:c=!1}=e;const{active:u,dragOverlay:d,droppableRects:f,over:h,measureDroppableContainers:m}=(0,i.useDndContext)(),y=(0,o.useUniqueId)(b,n),_=Boolean(null!==d.rect),v=(0,r.useMemo)((()=>a.map((e=>"object"==typeof e&&"id"in e?e.id:e))),[a]),M=null!=u,x=u?v.indexOf(u.id):-1,L=h?v.indexOf(h.id):-1,w=(0,r.useRef)(v),O=!function(e,t){if(e===t)return!0;if(e.length!==t.length)return!1;for(let n=0;n{O&&M&&m(v)}),[O,v,M,m]),(0,r.useEffect)((()=>{w.current=v}),[v]);const T=(0,r.useMemo)((()=>({activeIndex:x,containerId:y,disabled:S,disableTransforms:A,items:v,overIndex:L,useDragOverlay:_,sortedRects:l(v,f),strategy:s})),[x,y,S.draggable,S.droppable,A,v,L,f,_,s]);return r.createElement(g.Provider,{value:T},t)}const _=e=>{let{id:t,items:n,activeIndex:r,overIndex:i}=e;return a(n,r,i).indexOf(t)},v=e=>{let{containerId:t,isSorting:n,wasDragging:r,index:i,items:o,newIndex:a,previousItems:s,previousContainerId:l,transition:c}=e;return!(!c||!r||s!==o&&i===a||!n&&(a===i||t!==l))},M={duration:200,easing:"ease"},x="transform",L=o.CSS.Transition.toString({property:x,duration:0,easing:"linear"}),w={roleDescription:"sortable"};function O(e){let{animateLayoutChanges:t=v,attributes:n,disabled:a,data:s,getNewIndex:l=_,id:u,strategy:d,resizeObserverConfig:p,transition:f=M}=e;const{items:h,containerId:m,activeIndex:b,disabled:y,disableTransforms:O,sortedRects:A,overIndex:S,useDragOverlay:T,strategy:k}=(0,r.useContext)(g),C=function(e,t){var n,r;return"boolean"==typeof e?{draggable:e,droppable:!1}:{draggable:null!=(n=null==e?void 0:e.draggable)?n:t.draggable,droppable:null!=(r=null==e?void 0:e.droppable)?r:t.droppable}}(a,y),z=h.indexOf(u),D=(0,r.useMemo)((()=>({sortable:{containerId:m,index:z,items:h},...s})),[m,s,z,h]),P=(0,r.useMemo)((()=>h.slice(h.indexOf(u))),[h,u]),{rect:j,node:E,isOver:N,setNodeRef:Y}=(0,i.useDroppable)({id:u,data:D,disabled:C.droppable,resizeObserverConfig:{updateMeasurementsFor:P,...p}}),{active:R,activatorEvent:B,activeNodeRect:I,attributes:F,setNodeRef:q,listeners:W,isDragging:H,over:V,setActivatorNodeRef:X,transform:$}=(0,i.useDraggable)({id:u,data:D,attributes:{...w,...n},disabled:C.draggable}),U=(0,o.useCombinedRefs)(Y,q),G=Boolean(R),K=G&&!O&&c(b)&&c(S),J=!T&&H,Z=J&&K?$:null,Q=K?null!=Z?Z:(null!=d?d:k)({rects:A,activeNodeRect:I,activeIndex:b,overIndex:S,index:z}):null,ee=c(b)&&c(S)?l({id:u,items:h,activeIndex:b,overIndex:S}):z,te=null==R?void 0:R.id,ne=(0,r.useRef)({activeId:te,items:h,newIndex:ee,containerId:m}),re=h!==ne.current.items,ie=t({active:R,containerId:m,isDragging:H,isSorting:G,id:u,index:z,items:h,newIndex:ne.current.newIndex,previousItems:ne.current.items,previousContainerId:ne.current.containerId,transition:f,wasDragging:null!=ne.current.activeId}),oe=function(e){let{disabled:t,index:n,node:a,rect:s}=e;const[l,c]=(0,r.useState)(null),u=(0,r.useRef)(n);return(0,o.useIsomorphicLayoutEffect)((()=>{if(!t&&n!==u.current&&a.current){const e=s.current;if(e){const t=(0,i.getClientRect)(a.current,{ignoreTransform:!0}),n={x:e.left-t.left,y:e.top-t.top,scaleX:e.width/t.width,scaleY:e.height/t.height};(n.x||n.y)&&c(n)}}n!==u.current&&(u.current=n)}),[t,n,a,s]),(0,r.useEffect)((()=>{l&&c(null)}),[l]),l}({disabled:!ie,index:z,node:E,rect:j});return(0,r.useEffect)((()=>{G&&ne.current.newIndex!==ee&&(ne.current.newIndex=ee),m!==ne.current.containerId&&(ne.current.containerId=m),h!==ne.current.items&&(ne.current.items=h)}),[G,ee,m,h]),(0,r.useEffect)((()=>{if(te===ne.current.activeId)return;if(te&&!ne.current.activeId)return void(ne.current.activeId=te);const e=setTimeout((()=>{ne.current.activeId=te}),50);return()=>clearTimeout(e)}),[te]),{active:R,activeIndex:b,attributes:F,data:D,rect:j,index:z,newIndex:ee,items:h,isOver:N,isSorting:G,isDragging:H,listeners:W,node:E,overIndex:S,over:V,setNodeRef:U,setActivatorNodeRef:X,setDroppableNodeRef:Y,setDraggableNodeRef:q,transform:null!=oe?oe:Q,transition:oe||re&&ne.current.newIndex===z?L:J&&!(0,o.isKeyboardEvent)(B)||!f?void 0:G||ie?o.CSS.Transition.toString({...f,property:x}):void 0}}function A(e){if(!e)return!1;const t=e.data.current;return!!(t&&"sortable"in t&&"object"==typeof t.sortable&&"containerId"in t.sortable&&"items"in t.sortable&&"index"in t.sortable)}const S=[i.KeyboardCode.Down,i.KeyboardCode.Right,i.KeyboardCode.Up,i.KeyboardCode.Left],T=(e,t)=>{let{context:{active:n,collisionRect:r,droppableRects:a,droppableContainers:s,over:l,scrollableAncestors:c}}=t;if(S.includes(e.code)){if(e.preventDefault(),!n||!r)return;const t=[];s.getEnabled().forEach((n=>{if(!n||null!=n&&n.disabled)return;const o=a.get(n.id);if(o)switch(e.code){case i.KeyboardCode.Down:r.topo.top&&t.push(n);break;case i.KeyboardCode.Left:r.left>o.left&&t.push(n);break;case i.KeyboardCode.Right:r.left1&&(f=p[1].id),null!=f){const e=s.get(n.id),t=s.get(f),l=t?a.get(t.id):null,p=null==t?void 0:t.node.current;if(p&&l&&e&&t){const n=(0,i.getScrollableAncestors)(p).some(((e,t)=>c[t]!==e)),a=k(e,t),s=(d=t,!(!A(u=e)||!A(d))&&!!k(u,d)&&u.data.current.sortable.index{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.convertHexToRgb=void 0,t.convertHexToRgb=e=>{const t=e.replace("#","").toLowerCase();if(n(t)){const e=[...t];return[parseInt(e[0]+e[1],16),parseInt(e[2]+e[3],16),parseInt(e[4]+e[5],16)]}throw new Error("Invalid HEX input")};const n=e=>{const t=new RegExp(/[0-9a-f]{6}/);return!(6!==e.length&&!t.test(e))}},60423:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.convertRgbToHex=void 0,t.convertRgbToHex=(e,t,r)=>{if(n(e,t,r))return i(e)+i(t)+i(r);throw new Error("Invalid RGB input")};const n=(e,t,n)=>!!(r(e)&&r(t)&&r(n)),r=e=>!(e>255||e<0),i=e=>e<10?"0"+e.toString(16):e.toString(16)},73711:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.convertRgbToHex=t.convertHexToRgb=void 0;const r=n(75667);Object.defineProperty(t,"convertHexToRgb",{enumerable:!0,get:function(){return r.convertHexToRgb}});const i=n(60423);Object.defineProperty(t,"convertRgbToHex",{enumerable:!0,get:function(){return i.convertRgbToHex}})},29976:(e,t,n)=>{"use strict";function r(e){for(var t=arguments.length,n=Array(t>1?t-1:0),r=1;r3?t.i-4:t.i:Array.isArray(e)?1:p(e)?2:f(e)?3:0}function c(e,t){return 2===l(e)?e.has(t):Object.prototype.hasOwnProperty.call(e,t)}function u(e,t,n){var r=l(e);2===r?e.set(t,n):3===r?e.add(n):e[t]=n}function d(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t}function p(e){return I&&e instanceof Map}function f(e){return F&&e instanceof Set}function h(e){return e.o||e.t}function m(e){if(Array.isArray(e))return Array.prototype.slice.call(e);var t=U(e);delete t[V];for(var n=$(t),r=0;r1&&(e.set=e.add=e.clear=e.delete=g),Object.freeze(e),t&&s(e,(function(e,t){return b(t,!0)}),!0)),e}function g(){r(2)}function y(e){return null==e||"object"!=typeof e||Object.isFrozen(e)}function _(e){var t=G[e];return t||r(18,e),t}function v(){return R}function M(e,t){t&&(_("Patches"),e.u=[],e.s=[],e.v=t)}function x(e){L(e),e.p.forEach(O),e.p=null}function L(e){e===R&&(R=e.l)}function w(e){return R={p:[],l:R,h:e,m:!0,_:0}}function O(e){var t=e[V];0===t.i||1===t.i?t.j():t.g=!0}function A(e,t){t._=t.p.length;var n=t.p[0],i=void 0!==e&&e!==n;return t.h.O||_("ES5").S(t,e,i),i?(n[V].P&&(x(t),r(4)),o(e)&&(e=S(t,e),t.l||k(t,e)),t.u&&_("Patches").M(n[V].t,e,t.u,t.s)):e=S(t,n,[]),x(t),t.u&&t.v(t.u,t.s),e!==W?e:void 0}function S(e,t,n){if(y(t))return t;var r=t[V];if(!r)return s(t,(function(i,o){return T(e,r,t,i,o,n)}),!0),t;if(r.A!==e)return t;if(!r.P)return k(e,r.t,!0),r.t;if(!r.I){r.I=!0,r.A._--;var i=4===r.i||5===r.i?r.o=m(r.k):r.o,o=i,a=!1;3===r.i&&(o=new Set(i),i.clear(),a=!0),s(o,(function(t,o){return T(e,r,i,t,o,n,a)})),k(e,i,!1),n&&e.u&&_("Patches").N(r,n,e.u,e.s)}return r.o}function T(e,t,n,r,a,s,l){if(i(a)){var d=S(e,a,s&&t&&3!==t.i&&!c(t.R,r)?s.concat(r):void 0);if(u(n,r,d),!i(d))return;e.m=!1}else l&&n.add(a);if(o(a)&&!y(a)){if(!e.h.D&&e._<1)return;S(e,a),t&&t.A.l||k(e,a)}}function k(e,t,n){void 0===n&&(n=!1),!e.l&&e.h.D&&e.m&&b(t,n)}function C(e,t){var n=e[V];return(n?h(n):e)[t]}function z(e,t){if(t in e)for(var n=Object.getPrototypeOf(e);n;){var r=Object.getOwnPropertyDescriptor(n,t);if(r)return r;n=Object.getPrototypeOf(n)}}function D(e){e.P||(e.P=!0,e.l&&D(e.l))}function P(e){e.o||(e.o=m(e.t))}function j(e,t,n){var r=p(t)?_("MapSet").F(t,n):f(t)?_("MapSet").T(t,n):e.O?function(e,t){var n=Array.isArray(e),r={i:n?1:0,A:t?t.A:v(),P:!1,I:!1,R:{},l:t,t:e,k:null,o:null,j:null,C:!1},i=r,o=K;n&&(i=[r],o=J);var a=Proxy.revocable(i,o),s=a.revoke,l=a.proxy;return r.k=l,r.j=s,l}(t,n):_("ES5").J(t,n);return(n?n.A:v()).p.push(r),r}function E(e){return i(e)||r(22,e),function e(t){if(!o(t))return t;var n,r=t[V],i=l(t);if(r){if(!r.P&&(r.i<4||!_("ES5").K(r)))return r.t;r.I=!0,n=N(t,i),r.I=!1}else n=N(t,i);return s(n,(function(t,i){r&&function(e,t){return 2===l(e)?e.get(t):e[t]}(r.t,t)===i||u(n,t,e(i))})),3===i?new Set(n):n}(e)}function N(e,t){switch(t){case 2:return new Map(e);case 3:return Array.from(e)}return m(e)}n.r(t),n.d(t,{EnhancerArray:()=>Ke,MiddlewareArray:()=>Ge,SHOULD_AUTOBATCH:()=>fn,TaskAbortError:()=>Vt,__DO_NOT_USE__ActionTypes:()=>le,addListener:()=>sn,applyMiddleware:()=>me,autoBatchEnhancer:()=>yn,bindActionCreators:()=>fe,clearAllListeners:()=>ln,combineReducers:()=>de,compose:()=>he,configureStore:()=>at,createAction:()=>qe,createActionCreatorInvariantMiddleware:()=>Ue,createAsyncThunk:()=>Mt,createDraftSafeSelector:()=>Re,createEntityAdapter:()=>mt,createImmutableStateInvariantMiddleware:()=>Qe,createListenerMiddleware:()=>dn,createNextState:()=>te,createReducer:()=>lt,createSelector:()=>ve,createSerializableStateInvariantMiddleware:()=>rt,createSlice:()=>ct,createStore:()=>ce,current:()=>E,findNonSerializableValue:()=>tt,freeze:()=>b,getDefaultMiddleware:()=>it,getType:()=>$e,isAction:()=>We,isActionCreator:()=>He,isAllOf:()=>Ot,isAnyOf:()=>wt,isAsyncThunkAction:()=>Dt,isDraft:()=>i,isFluxStandardAction:()=>Ve,isFulfilled:()=>zt,isImmutableDefault:()=>Ze,isPending:()=>Tt,isPlain:()=>et,isPlainObject:()=>Ie,isRejected:()=>kt,isRejectedWithValue:()=>Ct,legacy_createStore:()=>ue,miniSerializeError:()=>vt,nanoid:()=>bt,original:()=>a,prepareAutoBatched:()=>hn,removeListener:()=>cn,unwrapResult:()=>xt});var Y,R,B="undefined"!=typeof Symbol&&"symbol"==typeof Symbol("x"),I="undefined"!=typeof Map,F="undefined"!=typeof Set,q="undefined"!=typeof Proxy&&void 0!==Proxy.revocable&&"undefined"!=typeof Reflect,W=B?Symbol.for("immer-nothing"):((Y={})["immer-nothing"]=!0,Y),H=B?Symbol.for("immer-draftable"):"__$immer_draftable",V=B?Symbol.for("immer-state"):"__$immer_state",X=("undefined"!=typeof Symbol&&Symbol.iterator,""+Object.prototype.constructor),$="undefined"!=typeof Reflect&&Reflect.ownKeys?Reflect.ownKeys:void 0!==Object.getOwnPropertySymbols?function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:Object.getOwnPropertyNames,U=Object.getOwnPropertyDescriptors||function(e){var t={};return $(e).forEach((function(n){t[n]=Object.getOwnPropertyDescriptor(e,n)})),t},G={},K={get:function(e,t){if(t===V)return e;var n=h(e);if(!c(n,t))return function(e,t,n){var r,i=z(t,n);return i?"value"in i?i.value:null===(r=i.get)||void 0===r?void 0:r.call(e.k):void 0}(e,n,t);var r=n[t];return e.I||!o(r)?r:r===C(e.t,t)?(P(e),e.o[t]=j(e.A.h,r,e)):r},has:function(e,t){return t in h(e)},ownKeys:function(e){return Reflect.ownKeys(h(e))},set:function(e,t,n){var r=z(h(e),t);if(null==r?void 0:r.set)return r.set.call(e.k,n),!0;if(!e.P){var i=C(h(e),t),o=null==i?void 0:i[V];if(o&&o.t===n)return e.o[t]=n,e.R[t]=!1,!0;if(d(n,i)&&(void 0!==n||c(e.t,t)))return!0;P(e),D(e)}return e.o[t]===n&&(void 0!==n||t in e.o)||Number.isNaN(n)&&Number.isNaN(e.o[t])||(e.o[t]=n,e.R[t]=!0),!0},deleteProperty:function(e,t){return void 0!==C(e.t,t)||t in e.t?(e.R[t]=!1,P(e),D(e)):delete e.R[t],e.o&&delete e.o[t],!0},getOwnPropertyDescriptor:function(e,t){var n=h(e),r=Reflect.getOwnPropertyDescriptor(n,t);return r?{writable:!0,configurable:1!==e.i||"length"!==t,enumerable:r.enumerable,value:n[t]}:r},defineProperty:function(){r(11)},getPrototypeOf:function(e){return Object.getPrototypeOf(e.t)},setPrototypeOf:function(){r(12)}},J={};s(K,(function(e,t){J[e]=function(){return arguments[0]=arguments[0][0],t.apply(this,arguments)}})),J.deleteProperty=function(e,t){return J.set.call(this,e,t,void 0)},J.set=function(e,t,n){return K.set.call(this,e[0],t,n,e[0])};var Z=function(){function e(e){var t=this;this.O=q,this.D=!0,this.produce=function(e,n,i){if("function"==typeof e&&"function"!=typeof n){var a=n;n=e;var s=t;return function(e){var t=this;void 0===e&&(e=a);for(var r=arguments.length,i=Array(r>1?r-1:0),o=1;o1?r-1:0),o=1;o=0;n--){var r=t[n];if(0===r.path.length&&"replace"===r.op){e=r.value;break}}n>-1&&(t=t.slice(n+1));var o=_("Patches").$;return i(e)?o(e,t):this.produce(e,(function(e){return o(e,t)}))},e}(),Q=new Z,ee=Q.produce;Q.produceWithPatches.bind(Q),Q.setAutoFreeze.bind(Q),Q.setUseProxies.bind(Q),Q.applyPatches.bind(Q),Q.createDraft.bind(Q),Q.finishDraft.bind(Q);const te=ee;var ne=n(64980);function re(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function ie(e){for(var t=1;t-1){var i=n[r];return r>0&&(n.splice(r,1),n.unshift(i)),i.value}return be}return{get:r,put:function(t,i){r(t)===be&&(n.unshift({key:t,value:i}),n.length>e&&n.pop())},getEntries:function(){return n},clear:function(){n=[]}}}(l,u);function p(){var t=d.get(arguments);if(t===be){if(t=e.apply(null,arguments),c){var n=d.getEntries().find((function(e){return c(e.value,t)}));n&&(t=n.value)}d.put(arguments,t)}return t}return p.clearCache=function(){return d.clear()},p}function _e(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r0&&i[i.length-1])||6!==o[0]&&2!==o[0])){a=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]-1}function $e(e){return""+e}function Ue(e){return void 0===e&&(e={}),function(){return function(e){return function(t){return e(t)}}}}var Ge=function(e){function t(){for(var n=[],r=0;r",value:e};if("object"!=typeof e||null===e)return!1;if(null==o?void 0:o.has(e))return!1;for(var s=null!=r?r(e):Object.entries(e),l=i.length>0,c=function(e,s){var c=t?t+"."+e:e;return l&&i.some((function(e){return e instanceof RegExp?e.test(c):c===e}))?"continue":n(s)?"object"==typeof s&&(a=tt(s,c,n,r,i,o))?{value:a}:void 0:{value:{keyPath:c,value:s}}},u=0,d=s;u0){var o=t.filter((function(t){return function(t,n,r){var i=r.entities[n.id],o=Object.assign({},i,n.changes),a=dt(o,e),s=a!==n.id;return s&&(t[n.id]=a,delete r.entities[n.id]),r.entities[a]=o,s}(r,t,n)})).length>0;o&&(n.ids=Object.keys(n.entities))}}function a(t,r){var i=ft(t,e,r),a=i[0];o(i[1],r),n(a,r)}return{removeAll:(s=function(e){Object.assign(e,{ids:[],entities:{}})},l=ut((function(e,t){return s(t)})),function(e){return l(e,void 0)}),addOne:ut(t),addMany:ut(n),setOne:ut(r),setMany:ut((function(e,t){for(var n=0,i=e=pt(e);n-1;return n&&r}function St(e){return"function"==typeof e[0]&&"pending"in e[0]&&"fulfilled"in e[0]&&"rejected"in e[0]}function Tt(){for(var e=[],t=0;t0)for(var p=e.getState(),f=Array.from(n.values()),h=0,m=f;h=0;t--){var i=e[t][V];if(!i.P)switch(i.i){case 5:r(i)&&D(i);break;case 4:n(i)&&D(i)}}}function n(e){for(var t=e.t,n=e.k,r=$(n),i=r.length-1;i>=0;i--){var o=r[i];if(o!==V){var a=t[o];if(void 0===a&&!c(t,o))return!0;var s=n[o],l=s&&s[V];if(l?l.t!==a:!d(s,a))return!0}}var u=!!t[V];return r.length!==$(t).length+(u?0:1)}function r(e){var t=e.k;if(t.length!==e.t.length)return!0;var n=Object.getOwnPropertyDescriptor(t,t.length-1);if(n&&!n.get)return!0;for(var r=0;r{e.exports=function(e){var t={};function n(r){if(t[r])return t[r].exports;var i=t[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)n.d(r,i,function(t){return e[t]}.bind(null,i));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=88)}({5:function(e,t){e.exports=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},e.exports.default=e.exports,e.exports.__esModule=!0},6:function(e,t){function n(e,t){for(var n=0;n true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray(\'abc\');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n\n\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/*** IMPORTS FROM imports-loader ***/\nvar define = false;\n\nvar baseGetTag = __webpack_require__(13),\n isObjectLike = __webpack_require__(39);\n\n/** `Object#toString` result references. */\nvar symbolTag = \'[object Symbol]\';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol(\'abc\');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == \'symbol\' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n\n\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/*** IMPORTS FROM imports-loader ***/\nvar define = false;\n\nvar root = __webpack_require__(8);\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n\n\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/*** IMPORTS FROM imports-loader ***/\nvar define = false;\n\nvar freeGlobal = __webpack_require__(36);\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == \'object\' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function(\'return this\')();\n\nmodule.exports = root;\n\n\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports) {\n\nfunction _setPrototypeOf(o, p) {\n module.exports = _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n module.exports["default"] = module.exports, module.exports.__esModule = true;\n return _setPrototypeOf(o, p);\n}\n\nmodule.exports = _setPrototypeOf;\nmodule.exports["default"] = module.exports, module.exports.__esModule = true;\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports) {\n\nfunction _getPrototypeOf(o) {\n module.exports = _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n module.exports["default"] = module.exports, module.exports.__esModule = true;\n return _getPrototypeOf(o);\n}\n\nmodule.exports = _getPrototypeOf;\nmodule.exports["default"] = module.exports, module.exports.__esModule = true;\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports) {\n\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n\n return arr2;\n}\n\nmodule.exports = _arrayLikeToArray;\nmodule.exports["default"] = module.exports, module.exports.__esModule = true;\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar arrayLikeToArray = __webpack_require__(11);\n\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === "string") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === "Object" && o.constructor) n = o.constructor.name;\n if (n === "Map" || n === "Set") return Array.from(o);\n if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}\n\nmodule.exports = _unsupportedIterableToArray;\nmodule.exports["default"] = module.exports, module.exports.__esModule = true;\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/*** IMPORTS FROM imports-loader ***/\nvar define = false;\n\nvar Symbol = __webpack_require__(7),\n getRawTag = __webpack_require__(37),\n objectToString = __webpack_require__(38);\n\n/** `Object#toString` result references. */\nvar nullTag = \'[object Null]\',\n undefinedTag = \'[object Undefined]\';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n\n\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/*** IMPORTS FROM imports-loader ***/\nvar define = false;\n\nvar baseIsNative = __webpack_require__(47),\n getValue = __webpack_require__(52);\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it\'s native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n\n\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports) {\n\n/*** IMPORTS FROM imports-loader ***/\nvar define = false;\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String(\'\')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == \'object\' || type == \'function\');\n}\n\nmodule.exports = isObject;\n\n\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar _typeof2 = __webpack_require__(0);\n/*!\n * Copyright © 2024 Splunk Inc.\n * SPLUNK CONFIDENTIAL – Use or disclosure of this material in whole or\n * in part without a valid written license from Splunk Inc. is PROHIBITED.\n */\n\n\nmodule.exports =\n/******/\nfunction (modules) {\n // webpackBootstrap\n\n /******/\n // The module cache\n\n /******/\n var installedModules = {};\n /******/\n\n /******/\n // The require function\n\n /******/\n\n function __webpack_require__(moduleId) {\n /******/\n\n /******/\n // Check if module is in cache\n\n /******/\n if (installedModules[moduleId]) {\n /******/\n return installedModules[moduleId].exports;\n /******/\n }\n /******/\n // Create a new module (and put it into the cache)\n\n /******/\n\n\n var module = installedModules[moduleId] = {\n /******/\n i: moduleId,\n\n /******/\n l: false,\n\n /******/\n exports: {}\n /******/\n\n };\n /******/\n\n /******/\n // Execute the module function\n\n /******/\n\n modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n /******/\n\n /******/\n // Flag the module as loaded\n\n /******/\n\n module.l = true;\n /******/\n\n /******/\n // Return the exports of the module\n\n /******/\n\n return module.exports;\n /******/\n }\n /******/\n\n /******/\n\n /******/\n // expose the modules object (__webpack_modules__)\n\n /******/\n\n\n __webpack_require__.m = modules;\n /******/\n\n /******/\n // expose the module cache\n\n /******/\n\n __webpack_require__.c = installedModules;\n /******/\n\n /******/\n // define getter function for harmony exports\n\n /******/\n\n __webpack_require__.d = function (exports, name, getter) {\n /******/\n if (!__webpack_require__.o(exports, name)) {\n /******/\n Object.defineProperty(exports, name, {\n enumerable: true,\n get: getter\n });\n /******/\n }\n /******/\n\n };\n /******/\n\n /******/\n // define __esModule on exports\n\n /******/\n\n\n __webpack_require__.r = function (exports) {\n /******/\n if (typeof Symbol !== \'undefined\' && Symbol.toStringTag) {\n /******/\n Object.defineProperty(exports, Symbol.toStringTag, {\n value: \'Module\'\n });\n /******/\n }\n /******/\n\n\n Object.defineProperty(exports, \'__esModule\', {\n value: true\n });\n /******/\n };\n /******/\n\n /******/\n // create a fake namespace object\n\n /******/\n // mode & 1: value is a module id, require it\n\n /******/\n // mode & 2: merge all properties of value into the ns\n\n /******/\n // mode & 4: return value when already ns object\n\n /******/\n // mode & 8|1: behave like require\n\n /******/\n\n\n __webpack_require__.t = function (value, mode) {\n /******/\n if (mode & 1) value = __webpack_require__(value);\n /******/\n\n if (mode & 8) return value;\n /******/\n\n if (mode & 4 && _typeof2(value) === \'object\' && value && value.__esModule) return value;\n /******/\n\n var ns = Object.create(null);\n /******/\n\n __webpack_require__.r(ns);\n /******/\n\n\n Object.defineProperty(ns, \'default\', {\n enumerable: true,\n value: value\n });\n /******/\n\n if (mode & 2 && typeof value != \'string\') for (var key in value) {\n __webpack_require__.d(ns, key, function (key) {\n return value[key];\n }.bind(null, key));\n }\n /******/\n\n return ns;\n /******/\n };\n /******/\n\n /******/\n // getDefaultExport function for compatibility with non-harmony modules\n\n /******/\n\n\n __webpack_require__.n = function (module) {\n /******/\n var getter = module && module.__esModule ?\n /******/\n function getDefault() {\n return module[\'default\'];\n } :\n /******/\n function getModuleExports() {\n return module;\n };\n /******/\n\n __webpack_require__.d(getter, \'a\', getter);\n /******/\n\n\n return getter;\n /******/\n };\n /******/\n\n /******/\n // Object.prototype.hasOwnProperty.call\n\n /******/\n\n\n __webpack_require__.o = function (object, property) {\n return Object.prototype.hasOwnProperty.call(object, property);\n };\n /******/\n\n /******/\n // __webpack_public_path__\n\n /******/\n\n\n __webpack_require__.p = "";\n /******/\n\n /******/\n\n /******/\n // Load entry module and return exports\n\n /******/\n\n return __webpack_require__(__webpack_require__.s = 51);\n /******/\n}(\n/************************************************************************/\n\n/******/\n[\n/* 0 */\n\n/***/\nfunction (module, exports) {\n module.exports = __webpack_require__(19);\n /***/\n},\n/* 1 */\n\n/***/\nfunction (module, exports) {\n module.exports = __webpack_require__(20);\n /***/\n},\n/* 2 */\n\n/***/\nfunction (module, exports, __webpack_require__) {\n "use strict";\n\n var _classCallCheck = __webpack_require__(0);\n\n var _createClass = __webpack_require__(1);\n\n Object.defineProperty(exports, "__esModule", {\n value: true\n });\n exports.DataPoint = void 0;\n\n var TypeSafeValue_1 = __webpack_require__(11);\n /**\n * Base DataPoint class and associated DataPoint selectors\n * @implements {DataPrimitive}\n * @implements {IDataPoint}\n */\n\n\n var DataPoint = /*#__PURE__*/function () {\n /**\n *\n * @param {string} field data field\n * @param {object} value data value + it\'s type (number, string, time, color, geojson)\n */\n function DataPoint(field, value) {\n _classCallCheck(this, DataPoint);\n\n this.field = field;\n this.setValue(value);\n }\n\n _createClass(DataPoint, [{\n key: "getValue",\n value: function getValue() {\n return this.value;\n }\n /**\n * Sets the data point\'s value to a static TypedValue.\n * @param {TypedValue} v\n */\n\n }, {\n key: "setValue",\n value: function setValue(v) {\n this.value = TypeSafeValue_1.TypeSafeValue.from(v);\n }\n /**\n * Get only value of the data point.\n * @returns {string|number|GeoJsonDataType|null}\n */\n\n }, {\n key: "getRawValue",\n value: function getRawValue() {\n return this.value.toRawValue();\n }\n /**\n * Get only the coerced value of the data point.\n * @returns {string|number|null}\n */\n\n }, {\n key: "getCoercedValue",\n value: function getCoercedValue() {\n return this.value.toRawCoercedValue();\n }\n /**\n * Returns the data field of the point.\n * @public\n * @returns {DataPoint<\'string\'>}\n */\n\n }, {\n key: "getField",\n value: function getField() {\n return DataPoint.fromRaw(this.field);\n }\n /**\n * Returns the data type of the point.\n * @public\n * @returns {string}\n */\n\n }, {\n key: "getType",\n value: function getType() {\n return this.value.type;\n }\n }], [{\n key: "isDataPoint",\n value: function isDataPoint(o) {\n return o instanceof DataPoint;\n }\n }, {\n key: "fromRaw",\n value: function fromRaw(value) {\n return new DataPoint(\'\', TypeSafeValue_1.TypeSafeValue.fromRaw(value));\n }\n }]);\n\n return DataPoint;\n }();\n\n exports.DataPoint = DataPoint;\n /***/\n},\n/* 3 */\n\n/***/\nfunction (module, exports, __webpack_require__) {\n "use strict";\n\n var _construct = __webpack_require__(26);\n\n var _toConsumableArray = __webpack_require__(13);\n\n var _classCallCheck = __webpack_require__(0);\n\n var _createClass = __webpack_require__(1);\n\n var __importDefault = this && this.__importDefault || function (mod) {\n return mod && mod.__esModule ? mod : {\n "default": mod\n };\n };\n\n Object.defineProperty(exports, "__esModule", {\n value: true\n });\n /* eslint-disable no-param-reassign */\n\n /* eslint-disable class-methods-use-this */\n\n var lodash_1 = __webpack_require__(5);\n\n var AST_1 = __webpack_require__(27);\n\n var FormatterPresets_1 = __webpack_require__(23);\n\n var DataPrimitive_1 = __webpack_require__(19);\n\n var TypeSafeValue_1 = __webpack_require__(11);\n\n var DataPoint_1 = __webpack_require__(2);\n\n var OptionScopes_1 = __webpack_require__(29);\n\n var DslParser_1 = __webpack_require__(20);\n\n var EncodingParser_1 = __importDefault(__webpack_require__(28));\n\n var Helper_1 = __webpack_require__(22);\n /**\n * Class with static methods used to execute DSL expressions\n */\n\n\n var EncodingExecutor = /*#__PURE__*/function () {\n function EncodingExecutor() {\n _classCallCheck(this, EncodingExecutor);\n }\n\n _createClass(EncodingExecutor, [{\n key: "executeOptions",\n value: function executeOptions(optionsStanza, frames, themeFunc) {\n var ret = (0, lodash_1.cloneDeep)(optionsStanza); // evaluate DSL expressions, in place, in ret object\n\n var scopes = new OptionScopes_1.OptionScopes(ret, frames, themeFunc);\n this.eval(ret, scopes);\n return EncodingExecutor.rawTree(ret.options);\n }\n /**\n * o is what we are evaluating. If it is an array or an object that its parts are recursively\n * evaluated. Any DSL expressions encountered are evaluated. The scopes object is uses by the\n * DSL expression to resolve any identifiers. The scope object\'s \'local\' scope is updated by\n * pushLocalScope as the eval method moves through the tree. The path array for a path "context.a.b.c"\n * will be [\'context\', \'a\', \'b\',\'c\']. As eval moves through the tree, the scopes add the current\n * path its visited list. If the current path is found in the visited list, then a circular reference\n * error is thrown.\n * current \'path\' in the\n * @param o\n * @param {OptionScopes} scopes\n * @param {string[]} path\n * @returns {any}\n */\n\n }, {\n key: "eval",\n value: function _eval(o, scopes) {\n var _this = this;\n\n var path = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n scopes.pushLocalScope(o);\n scopes.addToVisitedList(path); // evaluate array or option fields, and write the resulting value back into object o\n\n if (Array.isArray(o)) {\n // evaluate each array element\n o.forEach(function (v, i) {\n path.push(i.toString());\n o[i] = _this.eval(o[i], scopes, path);\n path.pop();\n });\n } else if ((0, lodash_1.isPlainObject)(o)) {\n // evaluate each object field\n Object.keys(o).forEach(function (k) {\n path.push(k);\n o[k] = _this.eval(o[k], scopes, path);\n path.pop();\n });\n } else if (EncodingParser_1.default.isDslString(o)) {\n scopes.popLocalScope();\n var tmp = this.evalDsl(o, scopes);\n scopes.removeFromVisitedList(path);\n return tmp;\n } // if here then o is js primitive value or DataPrimitive.\n\n\n scopes.popLocalScope();\n scopes.removeFromVisitedList(path);\n return o;\n }\n }, {\n key: "evalDsl",\n value: function evalDsl(dsl, scopes) {\n try {\n var parsedDsl = DslParser_1.DslParser.parse(EncodingParser_1.default.withoutArrow(dsl));\n return this.execOptionsPipeline(parsedDsl, scopes, scopes.frames.primary);\n } catch (e) {\n console.log("dsl error: ".concat(e.message));\n return undefined;\n }\n }\n /**\n * Takes anything that can have DSL embedded in it, such as tree or array, and insures\n * that all DataPrimitive have been converted to their \'raw\' equivalents\n * @param {object} o\n * @returns {any}\n */\n\n }, {\n key: "execOptionsPipeline",\n value:\n /**\n * Executes sequence of pipe delimited expressions that constitute a DSL\n * @param {Expr[]} pipeline\n * @param {OptionScopes} scopes\n * @param {DataPrimitive} origin\n * @param {ExecutedOptions} executedOptions\n * @returns {{location: string; val: Option | DataPrimitive}}\n */\n function execOptionsPipeline(pipeline, scopes, origin // meta fields default to the value DataPrimitve as origin. Value field default to frames.primary as their origin\n ) {\n var _this2 = this;\n\n var subject = origin; // process each expression in pipeline expr|expr|expr...\n\n pipeline.forEach(function (expr, i) {\n if (expr.type === \'method\') {\n if (subject) {\n subject = _this2.executeMethod(expr, subject, scopes.context);\n }\n } else if (expr.type === \'identifier\') {\n // When an identifier exists in the pipeline line like delta in \'delta|foo(bar)\' it can refer to\n // either a DataPrimitive or a SimpleOption.\n subject = scopes.resolve(expr.v.toString()).val;\n } else if (AST_1.LITERAL_TYPES.includes(expr.type)) {\n var tsv = TypeSafeValue_1.TypeSafeValue.from({\n type: expr.type,\n value: expr.v\n });\n subject = new DataPoint_1.DataPoint(\'\', tsv);\n }\n\n var isLastInPipeline = i === pipeline.length - 1; // if the subject will pass forward through another pipe, we must convert it to a DataPrimtive\n\n if (!isLastInPipeline && subject && !(0, DataPrimitive_1.isDataPrimitive)(subject)) {\n try {\n subject = Helper_1.Helper.dataPrimitiveFromRaw(subject);\n } catch (e) {\n // Expr is a union type of ParserSymbol and Method which has these types defined; however TS flags that these fields are not present, so we do explicit type assertions\n var exprStr = expr.v ? expr.v : expr.name;\n throw new Error("Output of \'".concat(exprStr, "\' cannot be piped because it is not a DataFrame, DataPoint, or DataSeries"));\n }\n }\n });\n return subject;\n }\n /**\n * Methods are either selector methods that built-ins such as\n * \'selectSeriesByPosition(...)",or they are formatter calls like \'rangeValue(...)\'\n * @param {Method} expr\n * @param {DataPrimitive} subject\n * @param {Scopes} scopes\n * @param {string} metaName\n * @returns {DataPrimitive}\n */\n\n }, {\n key: "executeMethod",\n value: function executeMethod(expr, subject, context) {\n var m = expr;\n var args = this.args(m.args, context);\n var method = subject[m.name];\n\n if (method) {\n subject = method.apply(subject, args); // \'built in\' DataPrimitive selectors like selectSeriesByPosition\n } else {\n subject = this.applyFormatter(subject, m.name, args);\n }\n\n return subject;\n }\n /**\n * Applies the Formatter to either metaData or value\n * @param {DataPrimitive} subject\n * @param {string} funcName\n * @param {ResolvedValue[]} args\n * @param {string} metaName\n */\n\n }, {\n key: "applyFormatter",\n value: function applyFormatter(subject, funcName, args) {\n var FormatterClass = FormatterPresets_1.formatterClasses[funcName];\n\n if (FormatterClass) {\n return _construct(FormatterClass, _toConsumableArray(args)).format(subject);\n }\n\n throw Error("No such method or formatter function: \'".concat(funcName, "\'"));\n }\n /**\n * Sometimes when invoking a pipeline we may find degenerate pipelines like\n * \'42\' that simply set the metadata to a literal. Or, we may perhaps in\n * a value pipeline, we set the value to \'hello\' after w perform selection\n * like "selectByPosition(0)|\'hello\'"\n * @param {DataPrimitive} subject\n * @param {LiteralSymbol} symbol\n */\n\n }, {\n key: "applyLiteral",\n value: function applyLiteral(subject, symbol) {\n var type = symbol.type,\n value = symbol.v;\n subject.setValue({\n type: type,\n value: value\n });\n }\n /**\n * reduces method call arguments (ParserSymbols) to actual values\n * @param {ParserSymbol[]} args\n * @param {Scopes} scopes\n * @returns {any[]}\n */\n\n }, {\n key: "args",\n value: function args(_args, context) {\n var _this3 = this;\n\n return _args.reduce(function (acc, cur) {\n var v = _this3.getArg(cur, context);\n\n acc.push(v);\n return acc;\n }, []);\n }\n /**\n * Returns either the literal value from the symbol, or a value from context.\n * Throws error if identifier not found in context.\n * @param {ParserSymbol} s\n * @param {object} context\n * @returns {any}\n */\n\n }, {\n key: "getArg",\n value: function getArg(s, context) {\n if (s.type === \'identifier\') {\n // fixme todo this should use a proper \'resolve\' not just look into context\n var val = context[s.v];\n\n if (!val) {\n throw Error("Could not resolve ".concat(s.v, " in context. Did you mean one of \'[").concat(Object.keys(context).toString(), "]\'"));\n }\n\n return val;\n }\n\n return s.v;\n }\n /**\n * Simple method to tell if the argument is an object or primitive.\n * @param opt\n * @returns {boolean}\n */\n\n }], [{\n key: "rawTree",\n value: function rawTree(o) {\n // evaluate array or option fields, and write the resulting value back into object o\n if (Array.isArray(o)) {\n // evaluate each array element\n o.forEach(function (v, i) {\n o[i] = EncodingExecutor.rawTree(o[i]);\n });\n return o;\n }\n\n if ((0, lodash_1.isPlainObject)(o)) {\n // use isPlainObject to avoid traversing fields of funky options like IconComponent that have methods and circular reference graph\n // evaluate each object field. Such objects would never expect to have DSL embedded in them and will cause a stack overflow due to cycles\n Object.keys(o).forEach(function (k) {\n o[k] = EncodingExecutor.rawTree(o[k]);\n });\n return o;\n }\n\n var tmp = (0, DataPrimitive_1.isDataPrimitive)(o) ? o.getRawValue() : o;\n return tmp;\n }\n }, {\n key: "isObject",\n value: function isObject(opt) {\n return Object(opt) === opt;\n }\n }]);\n\n return EncodingExecutor;\n }();\n\n exports.default = EncodingExecutor;\n /***/\n},\n/* 4 */\n\n/***/\nfunction (module, exports, __webpack_require__) {\n "use strict";\n\n var _typeof = __webpack_require__(18);\n\n var __importDefault = this && this.__importDefault || function (mod) {\n return mod && mod.__esModule ? mod : {\n "default": mod\n };\n };\n\n Object.defineProperty(exports, "__esModule", {\n value: true\n });\n exports.inferDataTypeFromData = exports.dataPointValues = exports.inferDataTypeFromDataPoints = exports.getDataTypeForMeta = exports.canInferTypeFromMeta = exports.getDataTypeForPoint = exports.isString = exports.isTime = exports.isGeoJsonObject = exports.isNumber = void 0;\n\n var moment_1 = __importDefault(__webpack_require__(15));\n\n var lodash_1 = __webpack_require__(5);\n\n var colorUtils_1 = __webpack_require__(16);\n\n var DataPoint_1 = __webpack_require__(2);\n /**\n * returns true if this dataPoint is a finite number\n * @param dataPoint\n * @returns {*}\n */\n\n\n function isNumber(dataPoint) {\n return dataPoint !== null && !(0, lodash_1.isBoolean)(dataPoint) && dataPoint !== \'\' && (0, lodash_1.isFinite)(+dataPoint) && (0, lodash_1.isNumber)(+dataPoint);\n }\n\n exports.isNumber = isNumber;\n\n function isGeoJsonObject(dataPoint) {\n if (!dataPoint) return false;\n var parsedDataPoint;\n\n try {\n parsedDataPoint = (0, lodash_1.isObject)(dataPoint) ? dataPoint : JSON.parse(dataPoint);\n } catch (_a) {\n // if JSON.parse fails or throws an error, return false\n return false;\n }\n\n if (parsedDataPoint == null) {\n // JSON.parse(\'null\'); returns null and does not throw an error\n return false;\n }\n\n return Object.prototype.hasOwnProperty.call(parsedDataPoint, \'coordinates\') && parsedDataPoint.coordinates != null && Array.isArray(parsedDataPoint.coordinates) && Object.prototype.hasOwnProperty.call(parsedDataPoint, \'type\') && parsedDataPoint.type === \'MultiPolygon\';\n }\n\n exports.isGeoJsonObject = isGeoJsonObject;\n /**\n *returns OK if data is time\n * @param dataPoint\n * @returns {boolean}\n */\n\n function isTime(dataPoint) {\n if (!dataPoint) {\n return false;\n } // only support time string in following format: https://www.w3.org/TR/NOTE-datetime\n\n\n var supportedDateFormats = [\'YYYY-MM-DD\', moment_1.default.ISO_8601, \'YYYY-MM-DDTHH:mm\', \'YYYY-MM-DDTHH:mm:ss.SSS\', \'YYYY-MM-DDTHH:mm:ss\', \'YYYY-MM-DD HH:MM\', \'YYYY-MM-DD HH:MM:SS\', \'YYYY-MM-DD HH:MM:SS.SSS\'];\n return typeof dataPoint === \'string\' ? (0, moment_1.default)(dataPoint, supportedDateFormats, true).isValid() : (0, moment_1.default)(dataPoint).isValid();\n }\n\n exports.isTime = isTime;\n /**\n * returns OK if data is string\n * @param dataPoint\n * @returns {boolean}\n */\n\n function isString(dataPoint) {\n return typeof dataPoint === \'string\' && dataPoint.length > 0;\n }\n\n exports.isString = isString;\n /**\n * getDataTypeForPoint\n * naive implementation of checking for the data type of a single data point\n * number > time > string > unknown\n * starting with number because a Date.parse(number) is a valid date\n *\n * @param {any} dataPoint\n * @param {object} metaData meta data about the data field\n * @return {string} type\n */\n\n var getDataTypeForPoint = function getDataTypeForPoint(dataPoint, metaData) {\n if ((0, exports.canInferTypeFromMeta)(metaData)) {\n return (0, exports.getDataTypeForMeta)(metaData);\n }\n\n return memoizedGetDataTypeForValue(dataPoint);\n };\n\n exports.getDataTypeForPoint = getDataTypeForPoint;\n\n var getDataTypeForValue = function getDataTypeForValue(dataPoint) {\n if (Array.isArray(dataPoint)) {\n if (dataPoint.length > 1 && dataPoint[0] === \'##__SPARKLINE__##\') {\n return \'sparkline\';\n }\n\n return \'array\';\n }\n\n if (isGeoJsonObject(dataPoint)) {\n return \'geojson\';\n }\n\n if ((0, lodash_1.isObject)(dataPoint)) {\n return \'unknown\';\n }\n\n if (isNumber(dataPoint)) {\n return \'number\';\n }\n\n if ((0, colorUtils_1.isColor)(dataPoint)) {\n return \'color\';\n }\n\n if (isTime(dataPoint)) {\n return \'time\';\n }\n\n if (isString(dataPoint)) {\n return \'string\';\n }\n\n if (dataPoint === null) {\n return \'null\';\n } // objects, etc\n\n\n return \'unknown\';\n };\n\n var memoizedGetDataTypeForValue = (0, lodash_1.memoize)(getDataTypeForValue);\n var splTypesToDSLDataTypes = {\n str: \'string\',\n num: \'number\'\n };\n /**\n * canInferTypeFromMeta\n * verifies whether a data type can be inferred from meta data\n * @param {object} metaData\n * @return {boolean} whether the data type can be inferred from meta\n */\n\n var canInferTypeFromMeta = function canInferTypeFromMeta() {\n var metaData = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var name = metaData.name,\n _metaData$type = metaData.type,\n type = _metaData$type === void 0 ? \'\' : _metaData$type;\n return splTypesToDSLDataTypes[type] !== undefined || name === \'_time\';\n };\n\n exports.canInferTypeFromMeta = canInferTypeFromMeta;\n /**\n * getDataTypeForMeta\n * returns a data type based on meta data\n * @param {object} metaData\n * @return {string} type\n */\n\n var getDataTypeForMeta = function getDataTypeForMeta() {\n var metaData = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var name = metaData.name,\n type = metaData.type;\n\n if (name === \'_time\') {\n return \'time\';\n }\n\n var typeMatch = splTypesToDSLDataTypes[type];\n\n if (typeMatch !== undefined) {\n return typeMatch;\n } // this case should never be reached\n\n\n return \'unknown\';\n };\n\n exports.getDataTypeForMeta = getDataTypeForMeta;\n /**\n * Apply the following prioritization rule as there could be mixed types in column data based on SPL cmd\n * Type priority :- geojson > sparkline > array > string > color > number > time > null > unknown\n * @param typeMatches\n * @returns type, the most applicable type for the datapoints\n */\n\n var applyTypePrioritization = function applyTypePrioritization(typeMatches) {\n var typesWithCount = Object.keys(typeMatches).filter(function (key) {\n return typeMatches[key] > 0;\n });\n\n if (typesWithCount.length === 0) {\n return \'unknown\';\n }\n\n if (typesWithCount.length === 1) {\n return typesWithCount[0];\n } // Type priority ordered from top to bottom\n\n\n var typeOrder = [\'geojson\', \'sparkline\', \'array\', \'string\', \'color\', \'number\', \'time\', \'null\', \'unknown\'];\n\n var _loop = function _loop(i) {\n var key = typeOrder[i];\n\n if (typesWithCount.find(function (k) {\n return k === key;\n })) {\n return {\n v: key\n };\n }\n };\n\n for (var i = 0; i < typeOrder.length; i += 1) {\n var _ret = _loop(i);\n\n if (_typeof(_ret) === "object") return _ret.v;\n }\n\n return \'unknown\';\n };\n /**\n * inferDataTypeFromDataPoints\n * based on the input data points this function determines a hashmap of type and its count\n * and returns type based on a type prioritization logic\n *\n * @param {Array} dataPoints an array of arbitrary size containing data points of any data type\n * @return {string} type, the most applicable type for the datapoints\n */\n\n\n var inferDataTypeFromDataPoints = function inferDataTypeFromDataPoints(dataPoints) {\n if (!dataPoints) {\n return \'unknown\';\n }\n\n var typeMatches = {\n time: 0,\n number: 0,\n string: 0,\n color: 0,\n unknown: 0,\n array: 0,\n sparkline: 0,\n null: 0,\n geojson: 0\n };\n dataPoints.forEach(function (point) {\n typeMatches[point.getType()] += 1;\n });\n return applyTypePrioritization(typeMatches);\n };\n\n exports.inferDataTypeFromDataPoints = inferDataTypeFromDataPoints;\n\n var dataPointValues = function dataPointValues(data) {\n return data.map(function (point) {\n return DataPoint_1.DataPoint.isDataPoint(point) ? point : DataPoint_1.DataPoint.fromRaw(point);\n });\n };\n\n exports.dataPointValues = dataPointValues;\n /**\n * inferDataTypeFromData\n * @param {*} data\n * @return {string} type of a data set\n */\n\n var inferDataTypeFromData = function inferDataTypeFromData(data) {\n return (0, exports.inferDataTypeFromDataPoints)((0, exports.dataPointValues)(data));\n };\n\n exports.inferDataTypeFromData = inferDataTypeFromData;\n /***/\n},\n/* 5 */\n\n/***/\nfunction (module, exports) {\n module.exports = __webpack_require__(21);\n /***/\n},\n/* 6 */\n\n/***/\nfunction (module, exports) {\n module.exports = __webpack_require__(23);\n /***/\n},\n/* 7 */\n\n/***/\nfunction (module, exports) {\n module.exports = __webpack_require__(24);\n /***/\n},\n/* 8 */\n\n/***/\nfunction (module, exports) {\n module.exports = __webpack_require__(10);\n /***/\n},\n/* 9 */\n\n/***/\nfunction (module, exports, __webpack_require__) {\n "use strict";\n\n var _classCallCheck = __webpack_require__(0);\n\n var _createClass = __webpack_require__(1);\n\n Object.defineProperty(exports, "__esModule", {\n value: true\n });\n exports.AbstractFormatter = void 0;\n\n var DataFrame_1 = __webpack_require__(12);\n\n var DataSeries_1 = __webpack_require__(10);\n\n var DataPoint_1 = __webpack_require__(2);\n\n var AbstractFormatter = /*#__PURE__*/function () {\n function AbstractFormatter() {\n _classCallCheck(this, AbstractFormatter);\n }\n\n _createClass(AbstractFormatter, [{\n key: "format",\n value: function format(dataPrimitive) {\n var _this = this;\n\n if (dataPrimitive instanceof DataFrame_1.DataFrame) {\n var newSeries = [];\n dataPrimitive.series.forEach(function (dataSeries, i) {\n newSeries.push(_this.formatSeries(dataSeries, i));\n });\n return new DataFrame_1.DataFrame(newSeries);\n }\n\n if (dataPrimitive instanceof DataSeries_1.DataSeries) {\n return this.formatSeries(dataPrimitive);\n }\n\n return this.formatPoint(dataPrimitive);\n }\n }, {\n key: "formatSeries",\n value: function formatSeries(s) {\n var _this2 = this;\n\n var i = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var newPoints = [];\n s.points.forEach(function (dataPoint, j) {\n newPoints.push(_this2.formatPoint(dataPoint, s, i, j));\n });\n return new DataSeries_1.DataSeries(newPoints); // new DataSeries must have the type of the formatter\'s output\n }\n }, {\n key: "formatPoint",\n value: function formatPoint(p, s) {\n var i = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n var j = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;\n var field = p.field;\n var dp = new DataPoint_1.DataPoint(field, {\n type: p.getValue().type,\n value: p.getValue().coercedValue\n });\n var tmp = this.formatTypedValue(dp, s, i, j);\n return new DataPoint_1.DataPoint(field, tmp);\n }\n }, {\n key: "makeArrays2D",\n value: function makeArrays2D(a) {\n if (Array.isArray(a)) {\n if (Array.isArray(a[0])) {\n return a;\n }\n\n return [a];\n }\n\n throw new Error("argument wasn\'t array");\n }\n }]);\n\n return AbstractFormatter;\n }();\n\n exports.AbstractFormatter = AbstractFormatter;\n /***/\n},\n/* 10 */\n\n/***/\nfunction (module, exports, __webpack_require__) {\n "use strict";\n\n var _classCallCheck = __webpack_require__(0);\n\n var _createClass = __webpack_require__(1);\n\n Object.defineProperty(exports, "__esModule", {\n value: true\n });\n exports.DataSeries = void 0;\n\n var DataPoint_1 = __webpack_require__(2);\n\n var types_1 = __webpack_require__(4);\n /**\n * DataSeries class and associated DataSeries selectors\n * @implements {DataPrimitive}\n */\n\n\n var DataSeries = /*#__PURE__*/function () {\n /**\n *\n * @param {array} points list of data points\n * @param {string} type user explicitly sets the data type\n */\n function DataSeries() {\n var points = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var type = arguments.length > 1 ? arguments[1] : undefined;\n\n _classCallCheck(this, DataSeries);\n\n this.points = points;\n\n if (points.length > 0) {\n this.field = points[0].field; // the field is an immutable property of the series\n }\n\n this.type = type;\n }\n /**\n * Return first dataPoint in series.\n * @public\n * @returns {DataPoint}\n */\n\n\n _createClass(DataSeries, [{\n key: "firstPoint",\n value: function firstPoint() {\n return this.points[0];\n }\n /**\n * Return last dataPoint in series.\n * @public\n * @returns {DataPoint}\n */\n\n }, {\n key: "lastPoint",\n value: function lastPoint() {\n return this.points.slice(-1)[0];\n }\n /**\n * Finds dataPoint(s) in DataSeries by index(es).\n * @public\n * @param {...number} indexes\n * @returns {DataSeries}\n */\n\n }, {\n key: "pointsByIndexes",\n value: function pointsByIndexes() {\n var _this = this;\n\n var indexedPoints = [];\n\n for (var _len = arguments.length, indexes = new Array(_len), _key = 0; _key < _len; _key++) {\n indexes[_key] = arguments[_key];\n }\n\n indexes.forEach(function (index) {\n var dp = _this.points[index]; // should we allow negative indexes?\n\n if (dp != null) {\n indexedPoints.push(dp);\n }\n });\n return new DataSeries(indexedPoints);\n }\n /**\n * Finds and returns the individual dataPoint at the given index.\n * @public\n * @param {number} index\n * @returns {DataPoint}\n */\n\n }, {\n key: "pointByIndex",\n value: function pointByIndex(indexIn) {\n var index = indexIn;\n\n if (index < 0) {\n index = this.points.length + index;\n }\n\n if (index < 0 || index >= this.points.length) {\n // will handle out-of-range indexes for the time being by returning null\n return null;\n }\n\n var dp = this.points[index];\n var field = dp.field;\n\n var _dp$getValue = dp.getValue(),\n type = _dp$getValue.type,\n value = _dp$getValue.value;\n\n return new DataPoint_1.DataPoint(field, {\n type: type,\n value: value\n });\n }\n /**\n * Finds the delta between the last point and point at the given index.\n * A negative index can be used, indicating an offset from the end of the sequence.\n * @public\n * @param {number} index\n * @returns {DataPoint}\n */\n\n }, {\n key: "delta",\n value: function delta(index) {\n var dp1 = this.lastPoint();\n\n if (dp1 === undefined) {\n return undefined;\n }\n\n var field = dp1.field;\n\n var _dp1$getValue = dp1.getValue(),\n type = _dp1$getValue.type,\n val1 = _dp1$getValue.value;\n\n if (type !== \'number\') {\n console.warn("DSL delta cannot be computed for non-numerical data series of type ".concat(type)); // Throw an error and catch in pipeline executor?\n }\n\n var dp2 = null; // use undefined as default, because null values will be coerced to 0 (thus invalid indexes return a delta of 0)\n // for aggregate SPL queries like `stats count`, we want no trend value rather than 0 as the trend value\n\n var delta;\n\n if (index >= 0) {\n dp2 = this.points[index];\n } else {\n dp2 = this.points.slice().reverse()[Math.abs(index) - 1];\n }\n\n if (dp2 == null) {\n console.warn(\'DSL delta cannot be computed, no data - invalid index\'); // Throw an error and catch in pipeline executor?\n } else {\n var _dp2$getValue = dp2.getValue(),\n val2 = _dp2$getValue.value;\n\n delta = val1 - val2;\n }\n\n return new DataPoint_1.DataPoint(field, {\n type: type,\n value: delta\n }); // create a new data point since we don\'t want meta data to carry over\n }\n /**\n * Sets all the values in the Data Series to a static TypedValue.\n * @param {TypedValue} v\n */\n\n }, {\n key: "setValue",\n value: function setValue(v) {\n this.points.forEach(function (p) {\n p.setValue(v);\n });\n this.type = this.points[0].getType();\n }\n /**\n * Gets all the values + their type in the Data Series.\n * @returns {TypedValue[]}\n */\n\n }, {\n key: "getValue",\n value: function getValue() {\n var values = [];\n this.points.forEach(function (p) {\n values.push(p.getValue());\n });\n return values;\n }\n /**\n * Gets all the values (only) in the Data Series.\n * @returns {array}\n */\n\n }, {\n key: "getRawValue",\n value: function getRawValue() {\n var values = [];\n this.points.forEach(function (p) {\n values.push(p.getRawValue());\n });\n return values;\n }\n /**\n * Returns the data source field which the series belongs to.\n * @public\n * @returns {DataPoint<\'string\'>}\n */\n\n }, {\n key: "getField",\n value: function getField() {\n var dp1 = this.lastPoint();\n return dp1.getField();\n }\n /**\n * Returns the inferred data type of the series.\n * @public\n * @returns {string}\n */\n\n }, {\n key: "getType",\n value: function getType() {\n if (this.type === undefined) {\n this.type = (0, types_1.inferDataTypeFromDataPoints)(this.points);\n }\n\n return this.type;\n }\n /**\n * Returns the minimum DataPoint in the series or undefined if no numbers in series.\n * @public\n * @returns {DataPoint}\n */\n\n }, {\n key: "min",\n value: function min() {\n return this.reduce(function (v1, v2) {\n return v1 < v2;\n });\n }\n /**\n * Returns the maximum DataPoint in the series.\n * @public\n * @returns {DataPoint}\n */\n\n }, {\n key: "max",\n value: function max() {\n return this.reduce(function (v1, v2) {\n return v1 > v2;\n });\n }\n }, {\n key: "reduce",\n value: function reduce(comparator) {\n return this.points.reduce(function (agg, cur) {\n // note: cannot use agg.getRawValue here instead of agg.value.value as that limits returned value to string|number\n return !agg || comparator(cur.getValue().coercedValue, agg.getValue().coercedValue) ? cur : agg;\n }, undefined);\n }\n }], [{\n key: "isDataSeries",\n value: function isDataSeries(o) {\n return o instanceof DataSeries;\n }\n }, {\n key: "fromRaw",\n value: function fromRaw(pts) {\n return new DataSeries(pts.map(function (p) {\n return DataPoint_1.DataPoint.fromRaw(p);\n }));\n }\n }]);\n\n return DataSeries;\n }();\n\n exports.DataSeries = DataSeries;\n /***/\n},\n/* 11 */\n\n/***/\nfunction (module, exports, __webpack_require__) {\n "use strict";\n\n var _slicedToArray = __webpack_require__(17);\n\n var _classCallCheck = __webpack_require__(0);\n\n var _createClass = __webpack_require__(1);\n\n Object.defineProperty(exports, "__esModule", {\n value: true\n });\n exports.TypeSafeValue = void 0;\n\n var types_1 = __webpack_require__(4);\n\n var formatterUtils_1 = __webpack_require__(14);\n /**\n * @implements {TypedValue}\n * TypeSafeValue implements the TypedValue interface, and adds additional methods\n */\n\n\n var TypeSafeValue = /*#__PURE__*/function () {\n // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n function TypeSafeValue(type, value, coercedValue) {\n _classCallCheck(this, TypeSafeValue);\n /**\n * isTypeSafe. This is a marker field. The presence of this field can be used at runtime to determine if TypedValue is rigorous,\n * loose. Loose TypedValue such as {type:\'number\', value:\'cat\'} are handy for testing, but can lie. Obviously \'cat\'\n * is not a number. If the isTypeSafe field is present then the instance is a TypeSafeValue\n * @type {boolean}\n */\n\n\n this.isTypeSafe = true;\n this.type = type;\n this.value = value;\n this.coercedValue = coercedValue;\n }\n /**\n * returns a TypeSafeValue, either by converting the non TypeSafeValue to\n * a TypeSafeValue, or by simply returning the passed-in TypeSafeValue\n * @param {TypedValue} typedValue\n * @returns {TypeSafeValue}\n */\n\n\n _createClass(TypeSafeValue, [{\n key: "toRawCoercedValue",\n value: function toRawCoercedValue() {\n switch (this.type) {\n case \'time\':\n case \'sparkline\':\n case \'array\':\n case \'number\':\n case \'string\':\n case \'color\':\n case \'geojson\':\n default:\n return this.coercedValue;\n }\n }\n }, {\n key: "toRawValue",\n value: function toRawValue() {\n switch (this.type) {\n case \'time\':\n case \'sparkline\':\n case \'array\':\n case \'number\':\n case \'string\':\n case \'color\':\n case \'geojson\':\n default:\n return this.value;\n }\n }\n }], [{\n key: "from",\n value: function from(typedValue) {\n if (typedValue.isTypeSafe) {\n return typedValue; // just return what was passed in since it is already TypeSafeValue\n }\n\n var value = typedValue.value,\n type = typedValue.type;\n\n var _TypeSafeValue$coerce = TypeSafeValue.coerceValue(typedValue),\n _TypeSafeValue$coerce2 = _slicedToArray(_TypeSafeValue$coerce, 1),\n coercedValue = _TypeSafeValue$coerce2[0];\n\n return new TypeSafeValue(type, value, coercedValue);\n }\n /**\n * Creates a TypeSafeValue from a raw value\n * @param value\n * @returns {TypeSafeValue}\n */\n\n }, {\n key: "fromRaw",\n value: function fromRaw(value) {\n var type = (0, types_1.getDataTypeForPoint)(value);\n return new TypeSafeValue(type, value, value);\n }\n /**\n * attempts to coerce the provided value to the provided type. Returns tuple\n * of the coerced value and a boolean telling if the coercion was clean (true)\n * or if the coercion was likely produced an unusable result, such as NaN for\n * a number, or \'\' for a color.\n * @param {TypedValue} typedValue\n * @returns {[any]}\n */\n\n }, {\n key: "coerceValue",\n value: function coerceValue(typedValue) {\n var type = typedValue.type,\n value = typedValue.value;\n var coercedValue = null;\n\n try {\n switch (type) {\n case \'number\':\n {\n coercedValue = Number(value);\n break;\n }\n\n case \'time\':\n {\n var isOk = (0, types_1.isTime)(value);\n\n if (value instanceof Date) {\n coercedValue = value;\n } else if (!isOk) {\n coercedValue = \'Invalid Date\';\n } else {\n // coercion to date would be lossy and result in losing time zone information\n var timeString = (0, formatterUtils_1.formatTimeWithTimezoneCorrection)(value);\n coercedValue = timeString;\n }\n\n break;\n }\n\n case \'string\':\n {\n coercedValue = value.toString();\n break;\n }\n\n case \'color\':\n {\n coercedValue = value;\n break;\n }\n\n case \'sparkline\':\n {\n coercedValue = value;\n break;\n }\n\n case \'array\':\n {\n coercedValue = value;\n break;\n }\n\n case \'null\':\n {\n coercedValue = value;\n break;\n }\n\n case \'geojson\':\n {\n coercedValue = value;\n break;\n }\n\n default:\n {\n coercedValue = \'\';\n }\n }\n } catch (e) {} // eslint-disable-line no-empty\n\n\n return [coercedValue];\n }\n }]);\n\n return TypeSafeValue;\n }();\n\n exports.TypeSafeValue = TypeSafeValue;\n /***/\n},\n/* 12 */\n\n/***/\nfunction (module, exports, __webpack_require__) {\n "use strict";\n\n var _classCallCheck = __webpack_require__(0);\n\n var _createClass = __webpack_require__(1);\n\n Object.defineProperty(exports, "__esModule", {\n value: true\n });\n exports.DataFrame = void 0;\n\n var DataPoint_1 = __webpack_require__(2);\n\n var DataSeries_1 = __webpack_require__(10);\n\n var types_1 = __webpack_require__(4);\n /**\n * Base DataFrame class and associated DataFrame selectors\n * @implements {DataPrimitive}\n */\n\n\n var DataFrame = /*#__PURE__*/function () {\n /**\n * @param {array} series list of data series\n */\n function DataFrame(series) {\n _classCallCheck(this, DataFrame);\n\n this.series = Array.isArray(series) ? series : [series];\n }\n /**\n * Loads ColumnarData into a DataFrame\n * @param {ColumnarData} columnarData\n * @returns {DataFrame}\n */\n\n\n _createClass(DataFrame, [{\n key: "frameBySeriesIndexes",\n value:\n /**\n * Filter a DataFrame by specifying the indexes of the DataSeries you would like to return.\n * For example, `frameBySeriesIndexes(first_index, second_index, ...)`, where at least one index is required.\n * @public\n * @param {number[]} indexes\n * @returns {DataFrame.}\n *\n * The following code sample shows how to use frameBySeriesIndexes to render a table that includes the first, second, and fourth DataSeries from the data source.\n *\n * ```\n * primary | frameBySeriesIndexes(0,1,3)\'\n * }},\n * dataSources={{\n * primary: {\n * data: {\n * fields: [\n * {\n * name: \'Name\'\n * },\n * {\n * name: \'UserID\'\n * },\n * {\n * name: \'Money Spent\'\n * },\n * {\n * name: \'Most Recent Game\'\n * }\n * ],\n * columns: [\n * [\n * \'Ms. Herman Beer\',\n * \'Crystal Ziemann\',\n * \'Phil Bartoletti\',\n * \'Janis Kiehn V\',\n * \'Angel Krajcik\',\n * \'Patti Hodkiewicz IV\',\n * \'Joanne Emmerich\',\n * \'Jay Renner\',\n * \'Ora Borer\',\n * \'Dr. Bradford Gulgowski\'\n * ],\n * [\n * \'Enrico98\',\n * \'Taylor_Parker83\',\n * \'Candice_Carroll\',\n * \'Yolanda_McLaughlin95\',\n * \'Modesto84\',\n * \'Elwin52\',\n * \'Francis8\',\n * \'Charley.Feeney85\',\n * \'Jensen_Jacobson74\',\n * \'Dora_Volkman\'\n * ],\n * [\n * 9740890.83,\n * 2107983.52,\n * 5467223.67,\n * 9529184.93,\n * 9692275.78,\n * 5692737.43,\n * 1001734.82,\n * 3848531.8,\n * 3848531.8\n * ],\n * [\n * \'2020-04-12T06:32:08-07:00\',\n * \'2020-06-06T16:14:04-07:00\',\n * \'2020-02-12T09:43:25-08:00\',\n * \'2020-07-25T13:19:49-07:00\',\n * \'2020-03-16T21:46:40-07:00\',\n * \'2020-08-21T08:38:55-07:00\',\n * \'2020-09-26T16:06:03-07:00\',\n * \'2020-08-10T14:54:16-07:00\',\n * \'2020-08-11T16:49:24-07:00\',\n * \'2020-09-29T03:52:51-07:00\'\n * ]\n * ]\n * },\n * meta: {\n * totalCount: 100\n * },\n * requestParams: {\n * count: 10,\n * offset: 0\n * }\n * }\n * }}\n * />\n */\n function frameBySeriesIndexes() {\n var _this = this;\n\n var indexedSeries = [];\n\n for (var _len = arguments.length, indexes = new Array(_len), _key = 0; _key < _len; _key++) {\n indexes[_key] = arguments[_key];\n }\n\n indexes.forEach(function (index) {\n var ds = _this.series[index]; // should we allow negative indexes?\n\n if (ds != null) {\n indexedSeries.push(ds);\n }\n });\n return new DataFrame(indexedSeries);\n }\n /**\n * Select a DataSeries by specifying the index of the series you want to return.\n * @public\n * @param {number} index\n * @returns {DataSeries}\n *\n * The following code sample shows how to use seriesByIndex to display the second series in a data source as a single value.\n *\n * ```\n * primary | seriesByIndex(1)\'\n * }}\n * dataSources={{\n * primary: {\n * data: {\n * fields: [\n * {\n * name: \'_time\',\n * },\n * {\n * name: \'count\',\n * },\n * ],\n * columns: [\n * [\n * \'2018-08-19T00:00:00.000+00:00\',\n * \'2018-08-20T00:00:00.000+00:00\',\n * \'2018-08-21T00:00:00.000+00:00\',\n * \'2018-08-22T00:00:00.000+00:00\',\n * \'2018-08-23T00:00:00.000+00:00\',\n * \'2018-08-24T00:00:00.000+00:00\',\n * \'2018-08-25T00:00:00.000+00:00\',\n * \'2018-08-26T00:00:00.000+00:00\',\n * ],\n * [\'1\', \'62\', \'103\', \'308\', \'587\', \'876\', \'930\', \'1320\'],\n * ],\n * },\n * meta: {},\n * },\n * }}\n * />\n *\n */\n // SCP-60632: added a second parameter - empty array as default fallback, hidden from user\n\n }, {\n key: "seriesByIndex",\n value: function seriesByIndex(index) {\n var defaultSeries = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n return this.series[index] || defaultSeries;\n }\n /**\n * Filter a DataFrame by specifying the index range [start, end) of the DataSeries you would like to return.\n * For example, `frameBySeriesIndexRange(start_index)` or `frameBySeriesIndexRange(start_index, end_index)`, where at least the starting index is required.\n * @public\n * @param {int} start (inclusive)\n * @param {int=} end (optional, exclusive)\n * @returns {DataFrame}\n *\n * The following code sample shows how to use frameBySeriesIndexRange to render a table that includes the first, second, and third series from the data source.\n *\n * ```\n * primary | frameBySeriesIndexRange(0,2)\'\n * }},\n * dataSources={{\n * primary: {\n * data: {\n * fields: [\n * {\n * name: \'Name\'\n * },\n * {\n * name: \'UserID\'\n * },\n * {\n * name: \'Money Spent\'\n * },\n * {\n * name: \'Most Recent Game\'\n * },\n * ],\n * columns: [\n * [\n * \'Ms. Herman Beer\',\n * \'Crystal Ziemann\',\n * \'Phil Bartoletti\',\n * \'Janis Kiehn V\',\n * \'Angel Krajcik\',\n * \'Patti Hodkiewicz IV\',\n * \'Joanne Emmerich\',\n * \'Jay Renner\',\n * \'Ora Borer\',\n * \'Dr. Bradford Gulgowski\'\n * ],\n * [\n * \'Enrico98\',\n * \'Taylor_Parker83\',\n * \'Candice_Carroll\',\n * \'Yolanda_McLaughlin95\',\n * \'Modesto84\',\n * \'Elwin52\',\n * \'Francis8\',\n * \'Charley.Feeney85\',\n * \'Jensen_Jacobson74\',\n * \'Dora_Volkman\'\n * ],\n * [\n * 9740890.83,\n * 2107983.52,\n * 5467223.67,\n * 9529184.93,\n * 9692275.78,\n * 9395814.7,\n * 5692737.43,\n * 1001734.82,\n * 3848531.8,\n * 1691776.38\n * ],\n * [\n * \'2020-04-12T06:32:08-07:00\',\n * \'2020-06-06T16:14:04-07:00\',\n * \'2020-02-12T09:43:25-08:00\',\n * \'2020-07-25T13:19:49-07:00\',\n * \'2020-03-16T21:46:40-07:00\',\n * \'2020-08-21T08:38:55-07:00\',\n * \'2020-09-26T16:06:03-07:00\',\n * \'2020-08-10T14:54:16-07:00\',\n * \'2020-08-11T16:49:24-07:00\',\n * \'2020-09-29T03:52:51-07:00\'\n * ]\n * ]\n * },\n * meta: {\n * totalCount: 100\n * },\n * requestParams: {\n * count: 10,\n * offset: 0\n * }\n * }\n * }}\n * />\n */\n\n }, {\n key: "frameBySeriesIndexRange",\n value: function frameBySeriesIndexRange(start, end) {\n return new DataFrame(this.series.slice(start, end));\n }\n /**\n * Filter a DataFrame by specifying the names of the DataSeries you would like to return.\n * For example, `frameBySeriesNames(first_name, second_name, ...)`, where at least one series name is required.\n * @public\n * @param {string[]} names\n * @returns {DataFrame}\n *\n * The following code sample shows how to use frameBySeriesNames to render a table with the Name and Money Spent columns in the data source.\n *\n * ```\n * primary | frameBySeriesNames("Name", "Money Spent")\'\n * }},\n * dataSources={{\n * primary: {\n * data: {\n * fields: [\n * {\n * name: \'Name\'\n * },\n * {\n * name: \'UserID\'\n * },\n * {\n * name: \'Money Spent\'\n * },\n * {\n * name: \'Most Recent Game\'\n * },\n * ],\n * columns: [\n * [\n * \'Ms. Herman Beer\',\n * \'Crystal Ziemann\',\n * \'Phil Bartoletti\',\n * \'Janis Kiehn V\',\n * \'Angel Krajcik\',\n * \'Patti Hodkiewicz IV\',\n * \'Joanne Emmerich\',\n * \'Jay Renner\',\n * \'Ora Borer\',\n * \'Dr. Bradford Gulgowski\'\n * ],\n * [\n * \'Enrico98\',\n * \'Taylor_Parker83\',\n * \'Candice_Carroll\',\n * \'Yolanda_McLaughlin95\',\n * \'Modesto84\',\n * \'Elwin52\',\n * \'Francis8\',\n * \'Charley.Feeney85\',\n * \'Jensen_Jacobson74\',\n * \'Dora_Volkman\'\n * ],\n * [\n * 9740890.83,\n * 2107983.52,\n * 5467223.67,\n * 9529184.93,\n * 9692275.78,\n * 9395814.7,\n * 5692737.43,\n * 1001734.82,\n * 3848531.8,\n * 1691776.38\n * ],\n * [\n * \'2020-04-12T06:32:08-07:00\',\n * \'2020-06-06T16:14:04-07:00\',\n * \'2020-02-12T09:43:25-08:00\',\n * \'2020-07-25T13:19:49-07:00\',\n * \'2020-03-16T21:46:40-07:00\',\n * \'2020-08-21T08:38:55-07:00\',\n * \'2020-09-26T16:06:03-07:00\',\n * \'2020-08-10T14:54:16-07:00\',\n * \'2020-08-11T16:49:24-07:00\',\n * \'2020-09-29T03:52:51-07:00\'\n * ]\n * ]\n * },\n * meta: {\n * totalCount: 100\n * },\n * requestParams {\n * count: 10,\n * offset: 0\n * }\n * }\n * }}\n * />\n */\n\n }, {\n key: "frameBySeriesNames",\n value: function frameBySeriesNames() {\n var _this2 = this;\n\n var namedSeries = [];\n\n for (var _len2 = arguments.length, names = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n names[_key2] = arguments[_key2];\n }\n\n names.forEach(function (name) {\n var series = _this2.seriesByName(name);\n\n var found = series && DataSeries_1.DataSeries.isDataSeries(series);\n\n if (found) {\n namedSeries.push(series);\n }\n });\n return new DataFrame(namedSeries);\n }\n /**\n * Filter a DataFrame by specifying the names of the DataSeries you would like to omit.\n * e.g. `frameWithoutSeriesNames(first_name, second_name, ...)`, where at least one series name is required.\n * Note: the data columns of internal fields are automatically excluded from the result.\n * @public\n * @param {string[]} names\n * @returns {DataFrame}\n */\n\n }, {\n key: "frameWithoutSeriesNames",\n value: function frameWithoutSeriesNames() {\n for (var _len3 = arguments.length, names = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n names[_key3] = arguments[_key3];\n }\n\n if (names == null) {\n return new DataFrame(this.series);\n }\n\n return new DataFrame(this.series.filter(function (s) {\n return !names.includes(s.field) && !s.field.startsWith(\'_\');\n }));\n }\n /**\n * Filter a DataFrame by removing all internal fields starting with underscore `_`.\n * For example, if you have a primary data source with the following fields: `_time, _span, date, count, cost, _raw`,\n * then DSL `> primary | frameWithoutInternalFields()` removes all the internal fields and returns the DataFrame with fields `date, count, cost`.\n * @public\n * @returns {DataFrame}\n *\n * The following code sample shows how to use `frameWithoutInternalFields()` to remove the internal fields from the data source.\n *\n * ```\n * primary | frameWithoutInternalFields()\'\n * }},\n * dataSources={{\n * primary: {\n * data: {\n * fields: [\n * {\n * name: \'Name\'\n * },\n * {\n * name: \'UserID\'\n * },\n * {\n * name: \'_time\'\n * },\n * {\n * name: \'_span\'\n * },\n * ],\n * columns: [\n * [\n * \'Ms. Herman Beer\',\n * \'Crystal Ziemann\',\n * \'Jay Renner\',\n * \'Ora Borer\',\n * \'Dr. Bradford Gulgowski\'\n * ],\n * [\n * \'Enrico98\',\n * \'Taylor_Parker83\',\n * \'Charley.Feeney85\',\n * \'Jensen_Jacobson74\',\n * \'Dora_Volkman\'\n * ],\n * [\n * \'2020-04-12T06:32:08-07:00\',\n * \'2020-06-06T16:14:04-07:00\',\n * \'2020-08-10T14:54:16-07:00\',\n * \'2020-08-11T16:49:24-07:00\',\n * \'2020-09-29T03:52:51-07:00\'\n * ],\n * [\n * \'1800\',\n * \'1800\',\n * \'1800\',\n * \'1800\',\n * \'1800\'\n * ]\n * ]\n * },\n * meta: {\n * totalCount: 100\n * },\n * requestParams {\n * count: 10,\n * offset: 0\n * }\n * }\n * }}\n * />\n * ```\n * This code sample will visualize a table with the `Name` and `UserID` columns,\n * and the columns of `_time` and `_span` (internal fields) will not be displayed.\n *\n * Another example of using `frameWithoutInternalFields()` in a chained DSL:\n *\n * ```\n * primary | frameWithoutInternalFields() | seriesByIndex(0) | lastPoint()"\n * }},\n * dataSources={{\n * primary: {\n * data: {\n * fields: [\n * {\n * name: \'_time\'\n * },\n * {\n * name: \'_span\'\n * },\n * {\n * name: \'Name\'\n * },\n * {\n * name: \'UserID\'\n * }\n * ],\n * columns: [\n * [\n * \'2020-04-12T06:32:08-07:00\',\n * \'2020-06-06T16:14:04-07:00\',\n * \'2020-08-10T14:54:16-07:00\',\n * \'2020-08-11T16:49:24-07:00\',\n * \'2020-09-29T03:52:51-07:00\'\n * ],\n * [\n * \'1800\',\n * \'1800\',\n * \'1800\',\n * \'1800\',\n * \'1800\'\n * ],\n * [\n * \'Patti Hodkiewicz IV\',\n * \'Joanne Emmerich\',\n * \'Jay Renner\',\n * \'Ora Borer\',\n * \'Dr. Bradford Gulgowski\'\n * ],\n * [\n * \'Elwin52\',\n * \'Francis8\',\n * \'Charley.Feeney85\',\n * \'Jensen_Jacobson74\',\n * \'Dora_Volkman\'\n * ]\n * ]\n * },\n * meta: {\n * totalCount: 100\n * },\n * requestParams {\n * count: 10,\n * offset: 0\n * }\n * }\n * }}\n * />\n * ```\n * This code sample will visualize `Dr. Bradford Gulgowski` as the major value,\n * because both internal fields (`_time` and `_span`) are removed and index `0` of the rest of the data frame corresponds to the `Name` column.\n */\n\n }, {\n key: "frameWithoutInternalFields",\n value: function frameWithoutInternalFields() {\n return new DataFrame(this.series.filter(function (s) {\n return !s.field.startsWith(\'_\');\n }));\n }\n /**\n * Filter a DataFrame by removing all internal fields starting with underscore `_`, except for the fields listed in `names`.\n * For example, if you have a primary data source with the following fields: `_time, _span, date, count, cost, _raw`,\n * then DSL `> primary | frameWithoutInternalFields(\'_time\')` removes all the internal fields except `_time` and returns the DataFrame with fields `_time, date, count, cost`.\n * If you want to remove all the internal fields, use `frameWithoutInternalFields()` instead.\n * If you pass any non-internal fields as parameters, they will be ignored.\n *\n * @public\n * @param {string[]} names\n * @returns {DataFrame}\n *\n * The following code sample shows how to use `frameWithoutInternalFieldsExcept(...names)` to remove some internal fields from the data source, but leaving specified internal fields by their field names.\n *\n * ```\n * primary | frameWithoutInternalFieldsExcept(\'_time\', \'_span\')\'\n * }},\n * dataSources={{\n * primary: {\n * data: {\n * fields: [\n * {\n * name: \'Name\'\n * },\n * {\n * name: \'UserID\'\n * },\n * {\n * name: \'_time\'\n * },\n * {\n * name: \'_span\'\n * },\n * {\n * name: \'_raw\'\n * },\n * ],\n * columns: [\n * [\n * \'Ms. Herman Beer\',\n * \'Joanne Emmerich\',\n * \'Jay Renner\',\n * \'Ora Borer\',\n * \'Dr. Bradford Gulgowski\'\n * ],\n * [\n * \'Enrico98\',\n * \'Francis8\',\n * \'Charley.Feeney85\',\n * \'Jensen_Jacobson74\',\n * \'Dora_Volkman\'\n * ],\n * [\n * \'2020-04-12T06:32:08-07:00\',\n * \'2020-09-26T16:06:03-07:00\',\n * \'2020-08-10T14:54:16-07:00\',\n * \'2020-08-11T16:49:24-07:00\',\n * \'2020-09-29T03:52:51-07:00\'\n * ],\n * [\n * \'1800\',\n * \'1800\',\n * \'1800\',\n * \'1800\',\n * \'1800\'\n * ],\n * [\n * \'2020-04-12T06:32:08-07:00\',\n * \'2020-09-26T16:06:03-07:00\',\n * \'2020-08-10T14:54:16-07:00\',\n * \'2020-08-11T16:49:24-07:00\',\n * \'2020-09-29T03:52:51-07:00\'\n * ]\n * ]\n * },\n * meta: {\n * totalCount: 100\n * },\n * requestParams {\n * count: 10,\n * offset: 0\n * }\n * }\n * }}\n * />\n * ```\n *\n * This code sample will visualize the table with the `Name`, `UserID`, `_time` and `_span` columns,\n * and the `_raw` columns will not be displayed.\n *\n * Another example of using `frameWithoutInternalFieldsExcept(...names)` in a chained DSL:\n *\n * ```\n * primary | frameWithoutInternalFieldsExcept(\'_time\') | seriesByIndex(1) | lastPoint()"\n * }},\n * dataSources={{\n * primary: {\n * data: {\n * fields: [\n * {\n * name: \'_time\'\n * },\n * {\n * name: \'_span\'\n * },\n * {\n * name: \'_raw\'\n * },\n * {\n * name: \'Name\'\n * },\n * {\n * name: \'UserID\'\n * }\n * ],\n * columns: [\n * [\n * \'2020-04-12T06:32:08-07:00\',\n * \'2020-09-26T16:06:03-07:00\',\n * \'2020-08-10T14:54:16-07:00\',\n * \'2020-08-11T16:49:24-07:00\',\n * \'2020-09-29T03:52:51-07:00\'\n * ],\n * [\n * \'1800\',\n * \'1800\',\n * \'1800\',\n * \'1800\',\n * \'1800\'\n * ],\n * [\n * \'2020-04-12T06:32:08-07:00\',\n * \'2020-06-06T16:14:04-07:00\',\n * \'2020-08-10T14:54:16-07:00\',\n * \'2020-08-11T16:49:24-07:00\',\n * \'2020-09-29T03:52:51-07:00\'\n * ],\n * [\n * \'Ms. Herman Beer\',\n * \'Crystal Ziemann\',\n * \'Angel Krajcik\',\n * \'Jay Renner\',\n * \'Dr. Bradford Gulgowski\'\n * ],\n * [\n * \'Candice_Carroll\',\n * \'Elwin52\',\n * \'Francis8\',\n * \'Charley.Feeney85\',\n * \'Dora_Volkman\'\n * ]\n * ]\n * },\n * meta: {\n * totalCount: 100\n * },\n * requestParams {\n * count: 10,\n * offset: 0\n * }\n * }\n * }}\n * />\n * ```\n *\n * This code sample will visualize `Dr. Bradford Gulgowski` as the major value, because the internal fields other than `_time` are excluded,\n * and index `1` of the rest of the data frame (`_time`, `Name`, `UserID`) corresponds to the `Name` column.\n */\n\n }, {\n key: "frameWithoutInternalFieldsExcept",\n value: function frameWithoutInternalFieldsExcept() {\n for (var _len4 = arguments.length, names = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n names[_key4] = arguments[_key4];\n }\n\n if (!names || names.length === 0) {\n return this.frameWithoutInternalFields();\n }\n\n var fields = this.series.map(function (s) {\n return s.field;\n });\n var validNames = names.filter(function (name) {\n return fields.includes(name);\n });\n return new DataFrame(this.series.filter(function (s) {\n return validNames.includes(s.field) || !s.field.startsWith(\'_\');\n }));\n }\n /**\n * Filter a DataFrame by specifying one or more names or indexes of DataSeries you would like to return.\n * For example,`frameBySeriesNames(first_name_or_index, second_name_or_index, ...)`, where at least one name or index is required.\n * @public\n * @param {...(string|number)} namesOrIndexes\n * @returns {DataFrame}\n *\n * The following code sample shows how to use frameBySeriesNamesOrIndexes to render a table with the Name DataSeries and the fourth DataSeries in the data source.\n *\n * ```\n * primary | frameBySeriesNamesOrIndexes("Name", 3)\'\n * }},\n * dataSources={{\n * primary: {\n * data: {\n * fields: [\n * {\n * name: \'Name\'\n * },\n * {\n * name: \'UserID\'\n * },\n * {\n * name: \'Money Spent\'\n * },\n * {\n * name: \'Most Recent Game\'\n * },\n * ],\n * columns: [\n * [\n * \'Ms. Herman Beer\',\n * \'Crystal Ziemann\',\n * \'Phil Bartoletti\',\n * \'Janis Kiehn V\',\n * \'Angel Krajcik\',\n * \'Patti Hodkiewicz IV\',\n * \'Joanne Emmerich\',\n * \'Jay Renner\',\n * \'Ora Borer\',\n * \'Dr. Bradford Gulgowski\'\n * ],\n * [\n * \'Enrico98\',\n * \'Taylor_Parker83\',\n * \'Candice_Carroll\',\n * \'Yolanda_McLaughlin95\',\n * \'Modesto84\',\n * \'Elwin52\',\n * \'Francis8\',\n * \'Charley.Feeney85\',\n * \'Jensen_Jacobson74\',\n * \'Dora_Volkman\'\n * ],\n * [\n * 9740890.83,\n * 2107983.52,\n * 5467223.67,\n * 9529184.93,\n * 9692275.78,\n * 9395814.7,\n * 5692737.43,\n * 1001734.82,\n * 3848531.8,\n * 1691776.38\n * ],\n * [\n * \'2020-04-12T06:32:08-07:00\',\n * \'2020-06-06T16:14:04-07:00\',\n * \'2020-02-12T09:43:25-08:00\',\n * \'2020-07-25T13:19:49-07:00\',\n * \'2020-03-16T21:46:40-07:00\',\n * \'2020-08-21T08:38:55-07:00\',\n * \'2020-09-26T16:06:03-07:00\',\n * \'2020-08-10T14:54:16-07:00\',\n * \'2020-08-11T16:49:24-07:00\',\n * \'2020-09-29T03:52:51-07:00\',\n * ]\n * ]\n * },\n * meta: {\n * totalCount: 100\n * },\n * requestParams: {\n * count: 10,\n * offset: 0\n * }\n * }\n * }}\n * />\n */\n\n }, {\n key: "frameBySeriesNamesOrIndexes",\n value: function frameBySeriesNamesOrIndexes() {\n var _this3 = this;\n\n var mixedSeries = [];\n\n for (var _len5 = arguments.length, mixed = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {\n mixed[_key5] = arguments[_key5];\n }\n\n mixed.forEach(function (nameOrIndex) {\n var asNumber = Number(nameOrIndex);\n\n if (Number.isNaN(asNumber)) {\n var found = _this3.seriesByName(nameOrIndex);\n\n if (found) {\n mixedSeries.push(found);\n }\n } else {\n var _found = _this3.series[asNumber];\n\n if (_found) {\n mixedSeries.push(_found);\n }\n }\n });\n return new DataFrame(mixedSeries);\n }\n /**\n * Filter a DataFrame by specifying one or more types of DataSeries you would like to return.\n * For example, `frameBySeriesNames(first_type, second_type, ...)`, where at least one type is required.\n * @public\n * @param {DataType[]} types\n * @returns {DataFrame}\n *\n * The following code sample shows how to use frameBySeriesTypes to render a table that contains only the string columns in the data source.\n *\n * ```\n * primary | frameBySeriesTypes("string")\'\n * }},\n * dataSources={{\n * primary: {\n * data: {\n * fields: [\n * {\n * name: \'Name\'\n * },\n * {\n * name: \'UserID\'\n * },\n * {\n * name: \'Money Spent\'\n * },\n * {\n * name: \'Most Recent Game\'\n * },\n * ],\n * columns: [\n * [\n * \'Ms. Herman Beer\',\n * \'Crystal Ziemann\',\n * \'Phil Bartoletti\',\n * \'Janis Kiehn V\',\n * \'Angel Krajcik\',\n * \'Patti Hodkiewicz IV\',\n * \'Joanne Emmerich\',\n * \'Jay Renner\',\n * \'Ora Borer\',\n * \'Dr. Bradford Gulgowski\'\n * ],\n * [\n * \'Enrico98\',\n * \'Taylor_Parker83\',\n * \'Candice_Carroll\',\n * \'Yolanda_McLaughlin95\',\n * \'Modesto84\',\n * \'Elwin52\',\n * \'Francis8\',\n * \'Charley.Feeney85\',\n * \'Jensen_Jacobson74\',\n * \'Dora_Volkman\'\n * ],\n * [\n * 9740890.83,\n * 2107983.52,\n * 5467223.67,\n * 9529184.93,\n * 9692275.78,\n * 9395814.7,\n * 5692737.43,\n * 1001734.82,\n * 3848531.8,\n * 1691776.38\n * ],\n * [\n * \'2020-04-12T06:32:08-07:00\',\n * \'2020-06-06T16:14:04-07:00\',\n * \'2020-02-12T09:43:25-08:00\',\n * \'2020-07-25T13:19:49-07:00\',\n * \'2020-03-16T21:46:40-07:00\',\n * \'2020-08-21T08:38:55-07:00\',\n * \'2020-09-26T16:06:03-07:00\',\n * \'2020-08-10T14:54:16-07:00\',\n * \'2020-08-11T16:49:24-07:00\',\n * \'2020-09-29T03:52:51-07:00\'\n * ]\n * ]\n * },\n * meta: {\n * totalCount: 100\n * },\n * requestParams: {\n * count: 10,\n * offset: 0\n * }\n * }\n * }}\n * />\n */\n\n }, {\n key: "frameBySeriesTypes",\n value: function frameBySeriesTypes() {\n for (var _len6 = arguments.length, types = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {\n types[_key6] = arguments[_key6];\n }\n\n return new DataFrame(this.series.filter(function (s) {\n return types.includes(s.getType());\n }));\n }\n /**\n * Select a DataSeries by specifying the name of the DataSeries you would like to return.\n * @public\n * @param {string} field\n * @returns {DataSeries}\n *\n * The following code sample shows how to use seriesByName to display the count series in a data source as a single value.\n *\n * ```\n * primary | seriesByName("count")\',\n * }}\n * dataSources={{\n * primary: {\n * data: {\n * fields: [\n * {\n * name: \'_time\',\n * },\n * {\n * name: \'count\',\n * },\n * ],\n * columns: [\n * [\n * \'2018-08-19T00:00:00.000+00:00\',\n * \'2018-08-20T00:00:00.000+00:00\',\n * \'2018-08-21T00:00:00.000+00:00\',\n * \'2018-08-22T00:00:00.000+00:00\',\n * \'2018-08-23T00:00:00.000+00:00\',\n * \'2018-08-24T00:00:00.000+00:00\',\n * \'2018-08-25T00:00:00.000+00:00\',\n * \'2018-08-26T00:00:00.000+00:00\',\n * ],\n * [\'1\', \'62\', \'103\', \'308\', \'587\', \'876\', \'930\', \'1320\'],\n * ],\n * },\n * meta: {},\n * },\n * }}\n * />\n */\n // SCP-60632: added a second parameter - empty array as default fallback, hidden from user\n\n }, {\n key: "seriesByName",\n value: function seriesByName(field) {\n var defaultSeries = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n\n var _a;\n\n return (_a = this.series.find(function (dataSeries) {\n return field === dataSeries.field;\n })) !== null && _a !== void 0 ? _a : defaultSeries;\n }\n /**\n * Select a DataSeries by specifying the type of the DataSeries you would like to return. The first DataSeries that matches the first type specified will be returned. If no DataSeries matches the first type specified, no DataSeries will be returned.\n * @public\n * @param {DataType} type\n * @returns {DataSeries}\n *\n * The following code sample shows how to use seriesByType to display the first numeric series in a data source as a single value.\n *\n * If no numeric series are found, return nothing and display N/A.\n *\n * ```\n * primary | seriesByType("number")\',\n * }}\n * dataSources: {{\n * primary: {\n * data: {\n * fields: [\n * {\n * name: \'_time",\n * },\n * {\n * name: \'count\',\n * },\n * ],\n * columns: [\n * [\n * \'2018-08-19T00:00:00.000+00:00\',\n * \'2018-08-20T00:00:00.000+00:00\',\n * \'2018-08-21T00:00:00.000+00:00\',\n * \'2018-08-22T00:00:00.000+00:00\',\n * \'2018-08-23T00:00:00.000+00:00\',\n * \'2018-08-24T00:00:00.000+00:00\',\n * \'2018-08-25T00:00:00.000+00:00\',\n * \'2018-08-26T00:00:00.000+00:00\',\n * ],\n * [ \'1\', \'62\', \'103\', \'308\', \'587\', \'876\', \'930\', \'1320\'],\n * ],\n * },\n * meta: {},\n * },\n * }}\n * />\n */\n\n }, {\n key: "seriesByType",\n value: function seriesByType(type) {\n return this.series.find(function (dataSeries) {\n var dataType = dataSeries.getType();\n return dataType === type;\n });\n }\n /**\n * Select a DataSeries by specifying any acceptable types of the DataSeries you would like to return. The first DataSeries that matches any of the types specified will be returned. If no DataSeries matches the type options specified, no DataSeries will be returned.\n * @public\n * @param {DataType[]} types\n * @returns {DataSeries}\n */\n\n }, {\n key: "seriesByTypes",\n value: function seriesByTypes() {\n for (var _len7 = arguments.length, types = new Array(_len7), _key7 = 0; _key7 < _len7; _key7++) {\n types[_key7] = arguments[_key7];\n }\n\n return this.series.find(function (dataSeries) {\n return types.some(function (type) {\n return dataSeries.getType() === type;\n });\n });\n }\n /**\n * Select a DataSeries by specifying the prioritized types of the DataSeries you would like to return. The first DataSeries that matches the first type specified will be returned. If no DataSeries matches the first type specified, the first DataSeries that matches the second type will be returned, and so on.\n * @public\n * @param {DataType[]} types\n * @returns {DataSeries}\n *\n * The following code sample shows how to use seriesByPrioritizedTypes to display the first numeric series in a data source as a single value.\n *\n * If no numeric series are found in the data, the first series of type string is displayed. If no string series are found, the first series of type time is displayed.\n *\n * ```\n * primary | seriesByPrioritizedTypes\'("number", "string", "time"),\n * }}\n * dataSources={{\n * primary: {\n * data: {\n * columns: [\n * [\n * \'2018-08-19T00:00:00.000+00:00\',\n * \'2018-08-20T00:00:00.000+00:00\',\n * \'2018-08-21T00:00:00.000+00:00\',\n * \'2018-08-22T00:00:00.000+00:00\',\n * \'2018-08-23T00:00:00.000+00:00\',\n * \'2018-08-24T00:00:00.000+00:00\',\n * \'2018-08-25T00:00:00.000+00:00\',\n * \'2018-08-26T00:00:00.000+00:00\',\n * ],\n * [ \'INFO\', \'ERROR\', \'WARN\', \'INFO\', \'ERROR\', \'WARN\', \'INFO\', \'WARN\'],\n * ],\n * fields: [\n * {\n * name: \'_time\',\n * },\n * {\n * name: \'status\',\n * },\n * ],\n * },\n * meta: {},\n * },\n * }}\n * />\n */\n\n }, {\n key: "seriesByPrioritizedTypes",\n value: function seriesByPrioritizedTypes() {\n var _a; // revisit this for of loop next time for performance issues (due to regenerator-runtime)\n // eslint-disable-next-line no-restricted-syntax\n\n\n for (var _len8 = arguments.length, types = new Array(_len8), _key8 = 0; _key8 < _len8; _key8++) {\n types[_key8] = arguments[_key8];\n }\n\n for (var _i = 0, _types = types; _i < _types.length; _i++) {\n var type = _types[_i];\n var matchedSeries = this.seriesByType(type);\n\n if (Array.isArray(matchedSeries === null || matchedSeries === void 0 ? void 0 : matchedSeries.points) && ((_a = matchedSeries === null || matchedSeries === void 0 ? void 0 : matchedSeries.points) === null || _a === void 0 ? void 0 : _a.length)) {\n return matchedSeries;\n }\n }\n\n return this.series[0];\n }\n /**\n * Set all values in the DataFrame to a static TypedValue.\n * @public\n * @param {TypedValue} v\n */\n\n }, {\n key: "setValue",\n value: function setValue(v) {\n this.series.forEach(function (s) {\n return s.setValue(v);\n });\n }\n /**\n * Get all values in the DataFrame. This excludes field names.\n * @public\n * @returns {array}\n */\n\n }, {\n key: "getRawValue",\n value: function getRawValue() {\n var values = [];\n this.series.forEach(function (s) {\n values.push(s.getRawValue());\n });\n return values;\n }\n /**\n * Get all values and their types in the DataFrame. This excludes field names.\n * @public\n * @returns {TypedValue[][]}\n */\n\n }, {\n key: "getValue",\n value: function getValue() {\n var values = [];\n this.series.forEach(function (s) {\n values.push(s.getValue());\n });\n return values;\n }\n /**\n * Get the names of each DataSeries in the DataFrame.\n * @public\n * @returns {DataSeries}\n *\n * ```\n * table | getField()\'\n * }},\n * dataSources={{\n * primary: {\n * data: {\n * fields: [\n * {\n * name: \'Name\'\n * },\n * {\n * name: \'UserID\'\n * },\n * {\n * name: \'Money Spent\'\n * },\n * {\n * name: \'Most Recent Game\'\n * },\n * ],\n * columns: [\n * [\n * \'Ms. Herman Beer\',\n * \'Crystal Ziemann\',\n * \'Phil Bartoletti\',\n * \'Janis Kiehn V\',\n * \'Angel Krajcik\',\n * \'Patti Hodkiewicz IV\',\n * \'Joanne Emmerich\',\n * \'Jay Renner\',\n * \'Ora Borer\',\n * \'Dr. Bradford Gulgowski\'\n * ],\n * [\n * \'Enrico98\',\n * \'Taylor_Parker83\',\n * \'Candice_Carroll\',\n * \'Yolanda_McLaughlin95\',\n * \'Modesto84\',\n * \'Elwin52\',\n * \'Francis8\',\n * \'Charley.Feeney85\',\n * \'Jensen_Jacobson74\',\n * \'Dore_Volkman\'\n * ],\n * [\n * 9740890.83,\n * 2107983.52,\n * 5467223.67,\n * 9529184.93,\n * 9692275.78,\n * 9395814.7,\n * 5692737.43,\n * 1001734.82,\n * 3848531.8,\n * 1691776.38\n * ],\n * [\n * \'2020-04-12T06:32:08-07:00\',\n * \'2020-06-06T16:14:04-07:00\',\n * \'2020-02-12T09:43:25-08:00\',\n * \'2020-07-25T13:19:49-07:00\',\n * \'2020-03-16T21:46:40-07:00\',\n * \'2020-08-21T08:38:55-07:00\',\n * \'2020-09-26T16:06:03-07:00\',\n * \'2020-08-10T14:54:16-07:00\',\n * \'2020-08-11T16:49:24-07:00\',\n * \'2020-09-29T03:52:51-07:00\'\n * ]\n * ]\n * },\n * meta: {\n * totalCount: 100\n * },\n * requestParams: {\n * count: 10,\n * offset: 0\n * }\n * }\n * }}\n * />\n *\n * Display the third and fourth DataSeries in a column chart as overlay fields.\n *\n * primary | frameBySeriesIndex(2,3) | getField()\'\n * }},\n * dataSources={{\n * primary: {\n * requestParams: { offset: 0, count: 20},\n * data: {\n * fields: [\n * { name: \'_time\' },\n * { name: \'splunkd\' },\n * { name: \'splunkd_web_access\' },\n * { name: \'mongod\' },\n * ],\n * columns: [\n * [\n * \'2018-05-02T18:15:46.000-07:00\',\n * \'2018-05-02T18:15:47.000-07:00\',\n * \'2018-05-02T18:15:48.000-07:00\',\n * \'2018-05-02T18:15:49.000-07:00\',\n * \'2018-05-02T18:15:50.000-07:00\',\n * ],\n * [\'67228\', \'83195\', \'3145\', \'19332\', \'29763\'],\n * [\'67228\', \'83195\', \'3145\', \'19332\', \'29763\'],\n * [\'14881\', \'17341\', \'18081\', \'19774\', \'10467\'],\n * ]\n * },\n * meta: {\n * totalCount: 100,\n * }\n * }\n * }}\n * />\n */\n\n }, {\n key: "getField",\n value: function getField() {\n var points = this.series.map(function (s) {\n return s.getField();\n });\n return new DataSeries_1.DataSeries(points);\n }\n /**\n * Get the data type of each DataSeries in the DataFrame.\n * @public\n * @returns {string[]}\n */\n\n }, {\n key: "getType",\n value: function getType() {\n return this.series.map(function (s) {\n return s.getType();\n });\n }\n /**\n * Get the global minimum value from all numeric DataSeries in the DataFrame.\n * @public\n * @returns {number}\n *\n * The following code sample shows how to use min to display the smallest data point in a data source as a single value.\n *\n * ```\n * primary | min()\',\n * trendDisplay: \'off\',\n * sparklineDisplay: \'off\'\n * }}\n * dataSources={{\n * primary: {\n * data: {\n * fields: [\n * {\n * name: \'_time\',\n * },\n * {\n * name: \'count\',\n * },\n * ],\n * columns: [\n * [\n * \'2018-08-19T00:00:00.000+00:00\',\n * \'2018-08-20T00:00:00.000+00:00\',\n * \'2018-08-21T00:00:00.000+00:00\',\n * \'2018-08-22T00:00:00.000+00:00\',\n * \'2018-08-23T00:00:00.000+00:00\',\n * \'2018-08-24T00:00:00.000+00:00\',\n * \'2018-08-25T00:00:00.000+00:00\',\n * \'2018-08-26T00:00:00.000+00:00\',\n * ],\n * [\'1\', \'62\', \'103\', \'308\', \'587\', \'876\', \'930\', \'1320\'],\n * ],\n * },\n * meta: {},\n * },\n * }}\n * />\n */\n\n }, {\n key: "min",\n value: function min() {\n return this.minOrMax(\'min\');\n }\n /**\n * Get the global maximum value from all numeric DataSeries in the DataFrame.\n * @public\n * @returns {number}\n *\n * The following code sample shows how to use max to display the largest data point in a data source as a single value.\n *\n * ```\n * primary | max()\',\n * trendDisplay: \'off\',\n * sparklineDisplay: \'off\',\n * }}\n * dataSources={{\n * primary: {\n * data: {\n * fields: [\n * {\n * name: \'_time\',\n * },\n * {\n * name: \'count\',\n * },\n * ],\n * columns: [\n * [\n * \'2018-08-19T00:00:00.000+00:00\',\n * \'2018-08-20T00:00:00.000+00:00\',\n * \'2018-08-21T00:00:00.000+00:00\',\n * \'2018-08-22T00:00:00.000+00:00\',\n * \'2018-08-23T00:00:00.000+00:00\',\n * \'2018-08-24T00:00:00.000+00:00\',\n * \'2018-08-25T00:00:00.000+00:00\',\n * \'2018-08-26T00:00:00.000+00:00\',\n * ],\n * [ \'1\', \'62\', \'103\', \'308\', \'587\', \'876\', \'930\', \'1320\' ],\n * ],\n * },\n * meta: {},\n * },\n * }}\n * />\n */\n\n }, {\n key: "max",\n value: function max() {\n return this.minOrMax(\'max\');\n }\n /**\n * runs result of min or max function over all the series and returns the data point\n * points\n * @param {string} aggName\n * @returns {DataPoint}\n */\n\n }, {\n key: "minOrMax",\n value: function minOrMax(funcName) {\n var overallSeries = new DataSeries_1.DataSeries();\n this.series.forEach(function (s) {\n var m = s[funcName]();\n\n if (m) {\n overallSeries.points.push(m);\n }\n });\n return overallSeries[funcName]();\n }\n }], [{\n key: "isDataFrame",\n value:\n /**\n * @param {any} o\n * @returns {boolean}\n */\n function isDataFrame(o) {\n return o instanceof DataFrame;\n }\n }, {\n key: "fromJsonCols",\n value: function fromJsonCols(columnarData) {\n if (!(columnarData === null || columnarData === void 0 ? void 0 : columnarData.data)) {\n return new DataFrame([]);\n } // fixme todo why do we expect an object like {data:{fields, columns}}? Why don\'t we just expect something like {fields, columns}? The nesting inside \'data\' feels useless\n\n\n var _columnarData$data = columnarData.data,\n _columnarData$data$fi = _columnarData$data.fields,\n fields = _columnarData$data$fi === void 0 ? [] : _columnarData$data$fi,\n _columnarData$data$co = _columnarData$data.columns,\n columns = _columnarData$data$co === void 0 ? [] : _columnarData$data$co;\n\n if (columns.length !== fields.length) {\n throw new Error("number of columns (".concat(columns.length, ") does not match number of fields (").concat(fields.length, ")"));\n }\n\n var dataSeries = [];\n columns.forEach(function (data, idx) {\n var dataPoints = [];\n var fieldInfo = fields[idx];\n var name = fieldInfo.name || fieldInfo;\n var type = fieldInfo === null || fieldInfo === void 0 ? void 0 : fieldInfo.type;\n data.forEach(function (value) {\n var dataType = (0, types_1.getDataTypeForPoint)(value, {\n name: name,\n type: type\n });\n dataPoints.push(new DataPoint_1.DataPoint(name, {\n value: value,\n type: dataType\n }));\n });\n dataSeries.push(new DataSeries_1.DataSeries(dataPoints));\n });\n return new DataFrame(dataSeries);\n }\n }, {\n key: "fromRaw",\n value: function fromRaw(f) {\n var series = [];\n f.forEach(function (s) {\n series.push(DataSeries_1.DataSeries.fromRaw(s));\n });\n return new DataFrame(series);\n } // eslint-disable-next-line consistent-return\n\n }, {\n key: "fromDataPrimitive",\n value: function fromDataPrimitive(dp) {\n if (DataFrame.isDataFrame(dp)) {\n return dp;\n }\n\n if (DataSeries_1.DataSeries.isDataSeries(dp)) {\n return new DataFrame([dp]);\n }\n\n if (DataPoint_1.DataPoint.isDataPoint(dp)) {\n return new DataFrame([new DataSeries_1.DataSeries([dp])]);\n }\n }\n }]);\n\n return DataFrame;\n }();\n\n exports.DataFrame = DataFrame;\n /***/\n},\n/* 13 */\n\n/***/\nfunction (module, exports) {\n module.exports = __webpack_require__(26);\n /***/\n},\n/* 14 */\n\n/***/\nfunction (module, exports, __webpack_require__) {\n "use strict";\n\n var __importDefault = this && this.__importDefault || function (mod) {\n return mod && mod.__esModule ? mod : {\n "default": mod\n };\n };\n\n Object.defineProperty(exports, "__esModule", {\n value: true\n });\n exports.formatTimeWithTimezoneCorrection = exports.setDefaultValue = void 0;\n\n var moment_1 = __importDefault(__webpack_require__(15));\n\n var types_1 = __webpack_require__(4);\n /*\n * @method setDefaultValue\n * @param {DataType} defaultValue\n * @returns {DataType} valid default value\n */\n\n\n var setDefaultValue = function setDefaultValue(defaultValue) {\n if ((0, types_1.isNumber)(defaultValue)) {\n return defaultValue;\n }\n\n return defaultValue || \'\';\n };\n\n exports.setDefaultValue = setDefaultValue;\n\n var timeToSplunkMoment = function timeToSplunkMoment(time) {\n // if splunk time zone is set, create time in splunk timezone and locale\n if (moment_1.default.getDefaultSplunkTimezone()) {\n return moment_1.default.newSplunkTime({\n time: time\n });\n } // fallback to moment default\n\n\n return (0, moment_1.default)(time);\n };\n\n var formatTimeWithTimezoneCorrection = function formatTimeWithTimezoneCorrection(time) {\n var format = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : moment_1.default.defaultFormat;\n var utcOffset = moment_1.default.parseZone(time).utcOffset();\n var momentTime = timeToSplunkMoment(time).utcOffset(utcOffset); // @TODO(pwied): splunkFormat would format based on splunk\'s locale.\n\n return momentTime.format(format);\n };\n\n exports.formatTimeWithTimezoneCorrection = formatTimeWithTimezoneCorrection;\n /***/\n},\n/* 15 */\n\n/***/\nfunction (module, exports) {\n module.exports = __webpack_require__(30);\n /***/\n},\n/* 16 */\n\n/***/\nfunction (module, exports) {\n module.exports = __webpack_require__(76);\n /***/\n},\n/* 17 */\n\n/***/\nfunction (module, exports) {\n module.exports = __webpack_require__(77);\n /***/\n},\n/* 18 */\n\n/***/\nfunction (module, exports) {\n module.exports = __webpack_require__(0);\n /***/\n},\n/* 19 */\n\n/***/\nfunction (module, exports, __webpack_require__) {\n "use strict";\n\n Object.defineProperty(exports, "__esModule", {\n value: true\n });\n exports.isDataPrimitive = void 0;\n\n var DataFrame_1 = __webpack_require__(12);\n\n var DataPoint_1 = __webpack_require__(2);\n\n var DataSeries_1 = __webpack_require__(10);\n\n function isDataPrimitive(o) {\n return DataFrame_1.DataFrame.isDataFrame(o) || DataSeries_1.DataSeries.isDataSeries(o) || DataPoint_1.DataPoint.isDataPoint(o);\n }\n\n exports.isDataPrimitive = isDataPrimitive;\n /***/\n},\n/* 20 */\n\n/***/\nfunction (module, exports, __webpack_require__) {\n "use strict";\n\n var _toConsumableArray = __webpack_require__(13);\n\n var _classCallCheck = __webpack_require__(0);\n\n var _createClass = __webpack_require__(1);\n\n Object.defineProperty(exports, "__esModule", {\n value: true\n });\n exports.DslParser = void 0;\n\n var nearley_1 = __webpack_require__(24);\n\n var grammar = __webpack_require__(25);\n\n var DslParser = /*#__PURE__*/function () {\n function DslParser() {\n _classCallCheck(this, DslParser);\n }\n\n _createClass(DslParser, null, [{\n key: "parse",\n value: function parse(dsl) {\n if (DslParser.cache[dsl]) {\n return _toConsumableArray(DslParser.cache[dsl]);\n }\n\n var parser = new nearley_1.Parser(grammar);\n parser.feed(dsl);\n\n if (parser.results.length > 1) {\n console.warn("Ambiguous parse of \'".concat(dsl, "\'"));\n }\n\n if (parser.results.length === 0) {\n console.warn("No parsed results for \'".concat(dsl, "\'"));\n }\n\n DslParser.cache[dsl] = _toConsumableArray(parser.results[0]);\n return parser.results[0];\n }\n }]);\n\n return DslParser;\n }();\n\n exports.DslParser = DslParser;\n DslParser.cache = {};\n /***/\n},\n/* 21 */\n\n/***/\nfunction (module, exports) {\n module.exports = __webpack_require__(81);\n /***/\n},\n/* 22 */\n\n/***/\nfunction (module, exports, __webpack_require__) {\n "use strict";\n\n var _classCallCheck = __webpack_require__(0);\n\n var _createClass = __webpack_require__(1);\n\n var __importDefault = this && this.__importDefault || function (mod) {\n return mod && mod.__esModule ? mod : {\n "default": mod\n };\n };\n\n Object.defineProperty(exports, "__esModule", {\n value: true\n });\n exports.Helper = void 0;\n\n var DataFrame_1 = __webpack_require__(12);\n\n var DataSeries_1 = __webpack_require__(10);\n\n var DataPoint_1 = __webpack_require__(2);\n\n var EncodingExecutor_1 = __importDefault(__webpack_require__(3));\n\n var Helper = /*#__PURE__*/function () {\n function Helper() {\n _classCallCheck(this, Helper);\n }\n\n _createClass(Helper, null, [{\n key: "isRawDataFrame",\n value: function isRawDataFrame(d) {\n return Array.isArray(d) && Helper.isRawDataSeries(d[0]);\n }\n }, {\n key: "isRawDataSeries",\n value: function isRawDataSeries(d) {\n return Array.isArray(d) && !EncodingExecutor_1.default.isObject(d[0]);\n }\n }, {\n key: "isRawDataPoint",\n value: function isRawDataPoint(d) {\n return !EncodingExecutor_1.default.isObject(d);\n }\n }, {\n key: "dataPrimitiveFromRaw",\n value: function dataPrimitiveFromRaw(d) {\n if (Helper.isRawDataFrame(d)) {\n return DataFrame_1.DataFrame.fromRaw(d);\n }\n\n if (Helper.isRawDataSeries(d)) {\n return DataSeries_1.DataSeries.fromRaw(d);\n }\n\n if (Helper.isRawDataPoint(d)) {\n return DataPoint_1.DataPoint.fromRaw(d);\n }\n\n throw new Error("raw value does not resemble DataFrame, DataSeries, or DataPoint");\n }\n }]);\n\n return Helper;\n }();\n\n exports.Helper = Helper;\n /***/\n},\n/* 23 */\n\n/***/\nfunction (module, exports, __webpack_require__) {\n "use strict";\n\n Object.defineProperty(exports, "__esModule", {\n value: true\n });\n exports.formatterClasses = void 0;\n\n var SetColorChannel_1 = __webpack_require__(30);\n\n var Prefix_1 = __webpack_require__(31);\n\n var MatchValue_1 = __webpack_require__(32);\n\n var RangeValue_1 = __webpack_require__(33);\n\n var Gradient_1 = __webpack_require__(34);\n\n var Pick_1 = __webpack_require__(35);\n\n var Type_1 = __webpack_require__(36);\n\n var FormatByType_1 = __webpack_require__(37);\n\n var Frame_1 = __webpack_require__(39);\n\n var Prepend_1 = __webpack_require__(40);\n\n var Objects_1 = __webpack_require__(41);\n\n var MultiFormat_1 = __webpack_require__(43);\n\n var MaxContrast_1 = __webpack_require__(44);\n\n var RenameSeries_1 = __webpack_require__(45);\n\n exports.formatterClasses = {\n gradient: Gradient_1.Gradient,\n matchValue: MatchValue_1.MatchValue,\n prefix: Prefix_1.Prefix,\n rangeValue: RangeValue_1.RangeValue,\n pick: Pick_1.Pick,\n multiFormat: MultiFormat_1.MultiFormat,\n type: Type_1.Type,\n formatByType: FormatByType_1.FormatByType,\n frame: Frame_1.Frame,\n prepend: Prepend_1.Prepend,\n objects: Objects_1.Objects,\n setColorChannel: SetColorChannel_1.SetColorChannel,\n maxContrast: MaxContrast_1.MaxContrast,\n renameSeries: RenameSeries_1.RenameSeries\n };\n /***/\n},\n/* 24 */\n\n/***/\nfunction (module, exports) {\n module.exports = __webpack_require__(82);\n /***/\n},\n/* 25 */\n\n/***/\nfunction (module, exports, __webpack_require__) {\n var _toConsumableArray = __webpack_require__(13);\n\n function _createForOfIteratorHelper(o, allowArrayLike) {\n var it;\n\n if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) {\n if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {\n if (it) o = it;\n var i = 0;\n\n var F = function F() {};\n\n return {\n s: F,\n n: function n() {\n if (i >= o.length) return {\n done: true\n };\n return {\n done: false,\n value: o[i++]\n };\n },\n e: function e(_e) {\n throw _e;\n },\n f: F\n };\n }\n\n throw new TypeError("Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");\n }\n\n var normalCompletion = true,\n didErr = false,\n err;\n return {\n s: function s() {\n it = o[Symbol.iterator]();\n },\n n: function n() {\n var step = it.next();\n normalCompletion = step.done;\n return step;\n },\n e: function e(_e2) {\n didErr = true;\n err = _e2;\n },\n f: function f() {\n try {\n if (!normalCompletion && it.return != null) it.return();\n } finally {\n if (didErr) throw err;\n }\n }\n };\n }\n\n function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === "string") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === "Object" && o.constructor) n = o.constructor.name;\n if (n === "Map" || n === "Set") return Array.from(o);\n if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n }\n\n function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n\n return arr2;\n } // Generated automatically by nearley, version 2.19.5\n // http://github.com/Hardmath123/nearley\n\n\n (function () {\n function id(x) {\n return x[0];\n }\n\n var grammar = {\n Lexer: undefined,\n ParserRules: [{\n name: \'_$ebnf$1\',\n symbols: []\n }, {\n name: \'_$ebnf$1\',\n symbols: [\'_$ebnf$1\', \'wschar\'],\n postprocess: function arrpush(d) {\n return d[0].concat([d[1]]);\n }\n }, {\n name: \'_\',\n symbols: [\'_$ebnf$1\'],\n postprocess: function postprocess(d) {\n return null;\n }\n }, {\n name: \'__$ebnf$1\',\n symbols: [\'wschar\']\n }, {\n name: \'__$ebnf$1\',\n symbols: [\'__$ebnf$1\', \'wschar\'],\n postprocess: function arrpush(d) {\n return d[0].concat([d[1]]);\n }\n }, {\n name: \'__\',\n symbols: [\'__$ebnf$1\'],\n postprocess: function postprocess(d) {\n return null;\n }\n }, {\n name: \'wschar\',\n symbols: [/[ \\t\\n\\v\\f]/],\n postprocess: id\n }, {\n name: \'dqstring$ebnf$1\',\n symbols: []\n }, {\n name: \'dqstring$ebnf$1\',\n symbols: [\'dqstring$ebnf$1\', \'dstrchar\'],\n postprocess: function arrpush(d) {\n return d[0].concat([d[1]]);\n }\n }, {\n name: \'dqstring\',\n symbols: [{\n literal: \'"\'\n }, \'dqstring$ebnf$1\', {\n literal: \'"\'\n }],\n postprocess: function postprocess(d) {\n return d[1].join(\'\');\n }\n }, {\n name: \'sqstring$ebnf$1\',\n symbols: []\n }, {\n name: \'sqstring$ebnf$1\',\n symbols: [\'sqstring$ebnf$1\', \'sstrchar\'],\n postprocess: function arrpush(d) {\n return d[0].concat([d[1]]);\n }\n }, {\n name: \'sqstring\',\n symbols: [{\n literal: "\'"\n }, \'sqstring$ebnf$1\', {\n literal: "\'"\n }],\n postprocess: function postprocess(d) {\n return d[1].join(\'\');\n }\n }, {\n name: \'btstring$ebnf$1\',\n symbols: []\n }, {\n name: \'btstring$ebnf$1\',\n symbols: [\'btstring$ebnf$1\', /[^`]/],\n postprocess: function arrpush(d) {\n return d[0].concat([d[1]]);\n }\n }, {\n name: \'btstring\',\n symbols: [{\n literal: \'`\'\n }, \'btstring$ebnf$1\', {\n literal: \'`\'\n }],\n postprocess: function postprocess(d) {\n return d[1].join(\'\');\n }\n }, {\n name: \'dstrchar\',\n symbols: [/[^\\\\"\\n]/],\n postprocess: id\n }, {\n name: \'dstrchar\',\n symbols: [{\n literal: \'\\\\\'\n }, \'strescape\'],\n postprocess: function postprocess(d) {\n return JSON.parse(\'"\' + d.join(\'\') + \'"\');\n }\n }, {\n name: \'sstrchar\',\n symbols: [/[^\\\\\'\\n]/],\n postprocess: id\n }, {\n name: \'sstrchar\',\n symbols: [{\n literal: \'\\\\\'\n }, \'strescape\'],\n postprocess: function postprocess(d) {\n return JSON.parse(\'"\' + d.join(\'\') + \'"\');\n }\n }, {\n name: \'sstrchar$string$1\',\n symbols: [{\n literal: \'\\\\\'\n }, {\n literal: "\'"\n }],\n postprocess: function joiner(d) {\n return d.join(\'\');\n }\n }, {\n name: \'sstrchar\',\n symbols: [\'sstrchar$string$1\'],\n postprocess: function postprocess(d) {\n return "\'";\n }\n }, {\n name: \'strescape\',\n symbols: [/["\\\\\\/bfnrt]/],\n postprocess: id\n }, {\n name: \'strescape\',\n symbols: [{\n literal: \'u\'\n }, /[a-fA-F0-9]/, /[a-fA-F0-9]/, /[a-fA-F0-9]/, /[a-fA-F0-9]/],\n postprocess: function postprocess(d) {\n return d.join(\'\');\n }\n }, {\n name: \'unsigned_int$ebnf$1\',\n symbols: [/[0-9]/]\n }, {\n name: \'unsigned_int$ebnf$1\',\n symbols: [\'unsigned_int$ebnf$1\', /[0-9]/],\n postprocess: function arrpush(d) {\n return d[0].concat([d[1]]);\n }\n }, {\n name: \'unsigned_int\',\n symbols: [\'unsigned_int$ebnf$1\'],\n postprocess: function postprocess(d) {\n return parseInt(d[0].join(\'\'));\n }\n }, {\n name: \'int$ebnf$1$subexpression$1\',\n symbols: [{\n literal: \'-\'\n }]\n }, {\n name: \'int$ebnf$1$subexpression$1\',\n symbols: [{\n literal: \'+\'\n }]\n }, {\n name: \'int$ebnf$1\',\n symbols: [\'int$ebnf$1$subexpression$1\'],\n postprocess: id\n }, {\n name: \'int$ebnf$1\',\n symbols: [],\n postprocess: function postprocess(d) {\n return null;\n }\n }, {\n name: \'int$ebnf$2\',\n symbols: [/[0-9]/]\n }, {\n name: \'int$ebnf$2\',\n symbols: [\'int$ebnf$2\', /[0-9]/],\n postprocess: function arrpush(d) {\n return d[0].concat([d[1]]);\n }\n }, {\n name: \'int\',\n symbols: [\'int$ebnf$1\', \'int$ebnf$2\'],\n postprocess: function postprocess(d) {\n if (d[0]) {\n return parseInt(d[0][0] + d[1].join(\'\'));\n } else {\n return parseInt(d[1].join(\'\'));\n }\n }\n }, {\n name: \'unsigned_decimal$ebnf$1\',\n symbols: [/[0-9]/]\n }, {\n name: \'unsigned_decimal$ebnf$1\',\n symbols: [\'unsigned_decimal$ebnf$1\', /[0-9]/],\n postprocess: function arrpush(d) {\n return d[0].concat([d[1]]);\n }\n }, {\n name: \'unsigned_decimal$ebnf$2$subexpression$1$ebnf$1\',\n symbols: [/[0-9]/]\n }, {\n name: \'unsigned_decimal$ebnf$2$subexpression$1$ebnf$1\',\n symbols: [\'unsigned_decimal$ebnf$2$subexpression$1$ebnf$1\', /[0-9]/],\n postprocess: function arrpush(d) {\n return d[0].concat([d[1]]);\n }\n }, {\n name: \'unsigned_decimal$ebnf$2$subexpression$1\',\n symbols: [{\n literal: \'.\'\n }, \'unsigned_decimal$ebnf$2$subexpression$1$ebnf$1\']\n }, {\n name: \'unsigned_decimal$ebnf$2\',\n symbols: [\'unsigned_decimal$ebnf$2$subexpression$1\'],\n postprocess: id\n }, {\n name: \'unsigned_decimal$ebnf$2\',\n symbols: [],\n postprocess: function postprocess(d) {\n return null;\n }\n }, {\n name: \'unsigned_decimal\',\n symbols: [\'unsigned_decimal$ebnf$1\', \'unsigned_decimal$ebnf$2\'],\n postprocess: function postprocess(d) {\n return parseFloat(d[0].join(\'\') + (d[1] ? \'.\' + d[1][1].join(\'\') : \'\'));\n }\n }, {\n name: \'decimal$ebnf$1\',\n symbols: [{\n literal: \'-\'\n }],\n postprocess: id\n }, {\n name: \'decimal$ebnf$1\',\n symbols: [],\n postprocess: function postprocess(d) {\n return null;\n }\n }, {\n name: \'decimal$ebnf$2\',\n symbols: [/[0-9]/]\n }, {\n name: \'decimal$ebnf$2\',\n symbols: [\'decimal$ebnf$2\', /[0-9]/],\n postprocess: function arrpush(d) {\n return d[0].concat([d[1]]);\n }\n }, {\n name: \'decimal$ebnf$3$subexpression$1$ebnf$1\',\n symbols: [/[0-9]/]\n }, {\n name: \'decimal$ebnf$3$subexpression$1$ebnf$1\',\n symbols: [\'decimal$ebnf$3$subexpression$1$ebnf$1\', /[0-9]/],\n postprocess: function arrpush(d) {\n return d[0].concat([d[1]]);\n }\n }, {\n name: \'decimal$ebnf$3$subexpression$1\',\n symbols: [{\n literal: \'.\'\n }, \'decimal$ebnf$3$subexpression$1$ebnf$1\']\n }, {\n name: \'decimal$ebnf$3\',\n symbols: [\'decimal$ebnf$3$subexpression$1\'],\n postprocess: id\n }, {\n name: \'decimal$ebnf$3\',\n symbols: [],\n postprocess: function postprocess(d) {\n return null;\n }\n }, {\n name: \'decimal\',\n symbols: [\'decimal$ebnf$1\', \'decimal$ebnf$2\', \'decimal$ebnf$3\'],\n postprocess: function postprocess(d) {\n return parseFloat((d[0] || \'\') + d[1].join(\'\') + (d[2] ? \'.\' + d[2][1].join(\'\') : \'\'));\n }\n }, {\n name: \'percentage\',\n symbols: [\'decimal\', {\n literal: \'%\'\n }],\n postprocess: function postprocess(d) {\n return d[0] / 100;\n }\n }, {\n name: \'jsonfloat$ebnf$1\',\n symbols: [{\n literal: \'-\'\n }],\n postprocess: id\n }, {\n name: \'jsonfloat$ebnf$1\',\n symbols: [],\n postprocess: function postprocess(d) {\n return null;\n }\n }, {\n name: \'jsonfloat$ebnf$2\',\n symbols: [/[0-9]/]\n }, {\n name: \'jsonfloat$ebnf$2\',\n symbols: [\'jsonfloat$ebnf$2\', /[0-9]/],\n postprocess: function arrpush(d) {\n return d[0].concat([d[1]]);\n }\n }, {\n name: \'jsonfloat$ebnf$3$subexpression$1$ebnf$1\',\n symbols: [/[0-9]/]\n }, {\n name: \'jsonfloat$ebnf$3$subexpression$1$ebnf$1\',\n symbols: [\'jsonfloat$ebnf$3$subexpression$1$ebnf$1\', /[0-9]/],\n postprocess: function arrpush(d) {\n return d[0].concat([d[1]]);\n }\n }, {\n name: \'jsonfloat$ebnf$3$subexpression$1\',\n symbols: [{\n literal: \'.\'\n }, \'jsonfloat$ebnf$3$subexpression$1$ebnf$1\']\n }, {\n name: \'jsonfloat$ebnf$3\',\n symbols: [\'jsonfloat$ebnf$3$subexpression$1\'],\n postprocess: id\n }, {\n name: \'jsonfloat$ebnf$3\',\n symbols: [],\n postprocess: function postprocess(d) {\n return null;\n }\n }, {\n name: \'jsonfloat$ebnf$4$subexpression$1$ebnf$1\',\n symbols: [/[+-]/],\n postprocess: id\n }, {\n name: \'jsonfloat$ebnf$4$subexpression$1$ebnf$1\',\n symbols: [],\n postprocess: function postprocess(d) {\n return null;\n }\n }, {\n name: \'jsonfloat$ebnf$4$subexpression$1$ebnf$2\',\n symbols: [/[0-9]/]\n }, {\n name: \'jsonfloat$ebnf$4$subexpression$1$ebnf$2\',\n symbols: [\'jsonfloat$ebnf$4$subexpression$1$ebnf$2\', /[0-9]/],\n postprocess: function arrpush(d) {\n return d[0].concat([d[1]]);\n }\n }, {\n name: \'jsonfloat$ebnf$4$subexpression$1\',\n symbols: [/[eE]/, \'jsonfloat$ebnf$4$subexpression$1$ebnf$1\', \'jsonfloat$ebnf$4$subexpression$1$ebnf$2\']\n }, {\n name: \'jsonfloat$ebnf$4\',\n symbols: [\'jsonfloat$ebnf$4$subexpression$1\'],\n postprocess: id\n }, {\n name: \'jsonfloat$ebnf$4\',\n symbols: [],\n postprocess: function postprocess(d) {\n return null;\n }\n }, {\n name: \'jsonfloat\',\n symbols: [\'jsonfloat$ebnf$1\', \'jsonfloat$ebnf$2\', \'jsonfloat$ebnf$3\', \'jsonfloat$ebnf$4\'],\n postprocess: function postprocess(d) {\n return parseFloat((d[0] || \'\') + d[1].join(\'\') + (d[2] ? \'.\' + d[2][1].join(\'\') : \'\') + (d[3] ? \'e\' + (d[3][1] || \'+\') + d[3][2].join(\'\') : \'\'));\n }\n }, {\n name: \'Pipeline$ebnf$1\',\n symbols: []\n }, {\n name: \'Pipeline$ebnf$1$subexpression$1\',\n symbols: [{\n literal: \'|\'\n }, \'Expr\']\n }, {\n name: \'Pipeline$ebnf$1\',\n symbols: [\'Pipeline$ebnf$1\', \'Pipeline$ebnf$1$subexpression$1\'],\n postprocess: function arrpush(d) {\n return d[0].concat([d[1]]);\n }\n }, {\n name: \'Pipeline\',\n symbols: [\'Expr\', \'Pipeline$ebnf$1\'],\n postprocess: function postprocess(d) {\n return [d[0]].concat(_toConsumableArray(d[1].map(function (e) {\n return e[1];\n })));\n }\n }, {\n name: \'Expr\',\n symbols: [\'_\', \'Identifier\', \'_\'],\n postprocess: function postprocess(d) {\n return d[1];\n }\n }, {\n name: \'Expr\',\n symbols: [\'_\', \'Method\', \'_\'],\n postprocess: function postprocess(d) {\n return d[1];\n }\n }, {\n name: \'Expr\',\n symbols: [\'_\', \'Literal\', \'_\'],\n postprocess: function postprocess(d) {\n return d[1];\n }\n }, {\n name: \'Method$ebnf$1\',\n symbols: [\'Arg\'],\n postprocess: id\n }, {\n name: \'Method$ebnf$1\',\n symbols: [],\n postprocess: function postprocess(d) {\n return null;\n }\n }, {\n name: \'Method$ebnf$2\',\n symbols: []\n }, {\n name: \'Method$ebnf$2$subexpression$1\',\n symbols: [\'_\', {\n literal: \',\'\n }, \'_\', \'Arg\']\n }, {\n name: \'Method$ebnf$2\',\n symbols: [\'Method$ebnf$2\', \'Method$ebnf$2$subexpression$1\'],\n postprocess: function arrpush(d) {\n return d[0].concat([d[1]]);\n }\n }, {\n name: \'Method\',\n symbols: [\'Identifier\', {\n literal: \'(\'\n }, \'_\', \'Method$ebnf$1\', \'Method$ebnf$2\', \'_\', {\n literal: \')\'\n }],\n postprocess: function postprocess(d) {\n var arg0 = d[3];\n var otherArgs = d[4];\n var args = [];\n arg0 && args.push(arg0);\n\n if (otherArgs) {\n args = args.concat(otherArgs.map(function (e) {\n return e[3];\n }));\n }\n\n var r = {\n type: \'method\',\n name: d[0].v,\n args: args\n };\n return r;\n }\n }, {\n name: \'Arg\',\n symbols: [\'Identifier\'],\n postprocess: function postprocess(d) {\n return d[0];\n }\n }, {\n name: \'Arg\',\n symbols: [\'Literal\'],\n postprocess: function postprocess(d) {\n return d[0];\n }\n }, {\n name: \'Identifier$ebnf$1\',\n symbols: []\n }, {\n name: \'Identifier$ebnf$1$subexpression$1\',\n symbols: [\'Letter\']\n }, {\n name: \'Identifier$ebnf$1$subexpression$1\',\n symbols: [\'Digit\']\n }, {\n name: \'Identifier$ebnf$1\',\n symbols: [\'Identifier$ebnf$1\', \'Identifier$ebnf$1$subexpression$1\'],\n postprocess: function arrpush(d) {\n return d[0].concat([d[1]]);\n }\n }, {\n name: \'Identifier\',\n symbols: [\'Letter\', \'Identifier$ebnf$1\'],\n postprocess: function postprocess(d) {\n return {\n type: \'identifier\',\n v: d[0] + d[1].join(\'\')\n };\n }\n }, {\n name: \'Identifier$ebnf$2\',\n symbols: []\n }, {\n name: \'Identifier$ebnf$2$subexpression$1\',\n symbols: [\'Letter\']\n }, {\n name: \'Identifier$ebnf$2$subexpression$1\',\n symbols: [\'Digit\']\n }, {\n name: \'Identifier$ebnf$2\',\n symbols: [\'Identifier$ebnf$2\', \'Identifier$ebnf$2$subexpression$1\'],\n postprocess: function arrpush(d) {\n return d[0].concat([d[1]]);\n }\n }, {\n name: \'Identifier$ebnf$3$subexpression$1$ebnf$1\',\n symbols: []\n }, {\n name: \'Identifier$ebnf$3$subexpression$1$ebnf$1$subexpression$1\',\n symbols: [\'Letter\']\n }, {\n name: \'Identifier$ebnf$3$subexpression$1$ebnf$1$subexpression$1\',\n symbols: [\'Digit\']\n }, {\n name: \'Identifier$ebnf$3$subexpression$1$ebnf$1\',\n symbols: [\'Identifier$ebnf$3$subexpression$1$ebnf$1\', \'Identifier$ebnf$3$subexpression$1$ebnf$1$subexpression$1\'],\n postprocess: function arrpush(d) {\n return d[0].concat([d[1]]);\n }\n }, {\n name: \'Identifier$ebnf$3$subexpression$1\',\n symbols: [\'Dot\', \'Letter\', \'Identifier$ebnf$3$subexpression$1$ebnf$1\']\n }, {\n name: \'Identifier$ebnf$3\',\n symbols: [\'Identifier$ebnf$3$subexpression$1\']\n }, {\n name: \'Identifier$ebnf$3$subexpression$2$ebnf$1\',\n symbols: []\n }, {\n name: \'Identifier$ebnf$3$subexpression$2$ebnf$1$subexpression$1\',\n symbols: [\'Letter\']\n }, {\n name: \'Identifier$ebnf$3$subexpression$2$ebnf$1$subexpression$1\',\n symbols: [\'Digit\']\n }, {\n name: \'Identifier$ebnf$3$subexpression$2$ebnf$1\',\n symbols: [\'Identifier$ebnf$3$subexpression$2$ebnf$1\', \'Identifier$ebnf$3$subexpression$2$ebnf$1$subexpression$1\'],\n postprocess: function arrpush(d) {\n return d[0].concat([d[1]]);\n }\n }, {\n name: \'Identifier$ebnf$3$subexpression$2\',\n symbols: [\'Dot\', \'Letter\', \'Identifier$ebnf$3$subexpression$2$ebnf$1\']\n }, {\n name: \'Identifier$ebnf$3\',\n symbols: [\'Identifier$ebnf$3\', \'Identifier$ebnf$3$subexpression$2\'],\n postprocess: function arrpush(d) {\n return d[0].concat([d[1]]);\n }\n }, {\n name: \'Identifier\',\n symbols: [\'Letter\', \'Identifier$ebnf$2\', \'Identifier$ebnf$3\'],\n postprocess: function postprocess(d) {\n function flat(input) {\n var depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n var stack = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n\n var _iterator = _createForOfIteratorHelper(input),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var item = _step.value;\n\n if (item instanceof Array && depth > 0) {\n flat(item, depth - 1, stack);\n } else {\n stack.push(item);\n }\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n return stack;\n }\n\n var r = flat(d, Infinity);\n return {\n type: \'identifier\',\n v: r.join(\'\')\n };\n }\n }, {\n name: \'Literal\',\n symbols: [\'jsonfloat\'],\n postprocess: function postprocess(d) {\n return {\n type: \'number\',\n v: d[0]\n };\n }\n }, {\n name: \'Literal\',\n symbols: [\'dqstring\'],\n postprocess: function postprocess(d) {\n return {\n type: \'string\',\n v: d[0]\n };\n }\n }, {\n name: \'Literal\',\n symbols: [\'sqstring\'],\n postprocess: function postprocess(d) {\n return {\n type: \'string\',\n v: d[0]\n };\n }\n }, {\n name: \'Literal\',\n symbols: [\'btstring\'],\n postprocess: function postprocess(d) {\n return {\n type: \'string\',\n v: d[0]\n };\n }\n }, {\n name: \'Letter\',\n symbols: [/[a-zA-Z_]/],\n postprocess: function postprocess(d) {\n return d[0];\n }\n }, {\n name: \'Digit\',\n symbols: [/[0-9]/],\n postprocess: function postprocess(d) {\n return d[0];\n }\n }, {\n name: \'Dot\',\n symbols: [/[\\.]/],\n postprocess: function postprocess(d) {\n return d[0];\n }\n }],\n ParserStart: \'Pipeline\'\n };\n\n if ( true && typeof module.exports !== \'undefined\') {\n module.exports = grammar;\n } else {\n window.grammar = grammar;\n }\n })();\n /***/\n\n},\n/* 26 */\n\n/***/\nfunction (module, exports) {\n module.exports = __webpack_require__(83);\n /***/\n},\n/* 27 */\n\n/***/\nfunction (module, exports, __webpack_require__) {\n "use strict";\n\n Object.defineProperty(exports, "__esModule", {\n value: true\n });\n exports.LITERAL_TYPES = void 0;\n exports.LITERAL_TYPES = [\'number\', \'string\'];\n /***/\n},\n/* 28 */\n\n/***/\nfunction (module, exports, __webpack_require__) {\n "use strict";\n\n var _classCallCheck = __webpack_require__(0);\n\n var _createClass = __webpack_require__(1);\n\n Object.defineProperty(exports, "__esModule", {\n value: true\n });\n\n var DslParser_1 = __webpack_require__(20);\n\n var EncodingParser = /*#__PURE__*/function () {\n function EncodingParser() {\n _classCallCheck(this, EncodingParser);\n }\n\n _createClass(EncodingParser, null, [{\n key: "parseOptions",\n value: function parseOptions(optionsStanza) {\n var optionsAST = {\n simpleOptions: {},\n expressions: {},\n context: optionsStanza.context\n }; // context is just passed along\n\n var options = optionsStanza.options;\n Object.keys(options).forEach(function (k) {\n var v = options[k];\n\n if (EncodingParser.isDslString(v)) {\n optionsAST.expressions[k] = DslParser_1.DslParser.parse(EncodingParser.withoutArrow(v));\n } else {\n optionsAST.simpleOptions[k] = v; // things that are not expressions just pass through\n }\n });\n return optionsAST;\n }\n }, {\n key: "isDslString",\n value: function isDslString(s) {\n return s ? s.toString().trim().startsWith(\'>\') : false;\n }\n }, {\n key: "withoutArrow",\n value: function withoutArrow(s) {\n return s.toString().match(/\\s*>\\s*(.+$)/)[1].trim();\n }\n }, {\n key: "parse",\n value: function parse(encoding) {\n var dslFields = encoding.dimensions,\n context = encoding.context;\n var ast = {\n dimensions: {},\n context: context\n }; // this is what we will populate and return\n\n Object.keys(dslFields).forEach(function (f) {\n var astDimension = {\n value: []\n };\n var value = null;\n\n if (typeof dslFields[f] === \'string\') {\n value = dslFields[f];\n } else {\n var dim = dslFields[f];\n value = dim.value;\n }\n\n astDimension.value = DslParser_1.DslParser.parse(value);\n ast.dimensions[f] = astDimension;\n });\n return ast;\n }\n }]);\n\n return EncodingParser;\n }();\n\n exports.default = EncodingParser;\n /***/\n},\n/* 29 */\n\n/***/\nfunction (module, exports, __webpack_require__) {\n "use strict";\n\n var _construct = __webpack_require__(26);\n\n var _toConsumableArray = __webpack_require__(13);\n\n var _classCallCheck = __webpack_require__(0);\n\n var _createClass = __webpack_require__(1);\n\n var __importDefault = this && this.__importDefault || function (mod) {\n return mod && mod.__esModule ? mod : {\n "default": mod\n };\n };\n\n Object.defineProperty(exports, "__esModule", {\n value: true\n });\n exports.OptionScopes = void 0;\n\n var lodash_1 = __webpack_require__(5);\n\n var EncodingExecutor_1 = __importDefault(__webpack_require__(3));\n\n var OptionScopes = /*#__PURE__*/function () {\n function OptionScopes(optionsStanza, frames, themeFunc) {\n _classCallCheck(this, OptionScopes);\n\n this.local = []; // unqualified identifiers can be resolved against local context. This is a stack of scopes.\n\n this.visitedPaths = new Set(); // Set of object paths we have visited (used for circular reference detection)\n\n this.context = optionsStanza.context;\n this.executedOptions = optionsStanza.options;\n this.frames = frames;\n this.themeFunc = themeFunc;\n this.local.push(this.executedOptions); // Stack. local starts off pointing to top level options\n }\n\n _createClass(OptionScopes, [{\n key: "resolve",\n value: function resolve(identifier) {\n var scopeParts = identifier.split(\'.\');\n var scopedValue = null;\n\n if (OptionScopes.isQualified(scopeParts)) {\n scopedValue = this.resolveQualifiedIdentifier(scopeParts);\n } else {\n scopedValue = this.resolveUnqualifiedIdentifier(scopeParts);\n }\n\n return (0, lodash_1.cloneDeep)(scopedValue); // return defensive copy. Prevents targets of identifiers from getting mutated\n }\n }, {\n key: "resolveUnqualifiedIdentifier",\n value: function resolveUnqualifiedIdentifier(scopeParts) {\n // no qualifier has been given so we create qualified identifiers from all\n // that point to all possible scopes\n var qualifiers = OptionScopes.SCOPES;\n var scopedValue;\n\n for (var i = 0; i < qualifiers.length; i += 1) {\n var qualifiedIdentifier = [qualifiers[i]].concat(_toConsumableArray(scopeParts));\n scopedValue = this.resolveQualifiedIdentifier(qualifiedIdentifier);\n\n if (scopedValue.val) {\n break; // found it\n }\n }\n\n return scopedValue;\n }\n }, {\n key: "resolveQualifiedIdentifier",\n value: function resolveQualifiedIdentifier(scopeParts) {\n var qualifiedTargets = {\n context: this.context,\n options: this.executedOptions,\n datasources: this.frames,\n local: this.local[this.local.length - 1]\n };\n var val = null;\n var location = scopeParts[0];\n\n if (location === \'themes\' && this.themeFunc) {\n // themes must be looked up in themeRegistry\n var themeKey = scopeParts[1];\n val = this.themeFunc(themeKey);\n } else {\n val = (0, lodash_1.get)(qualifiedTargets, scopeParts);\n\n if (val) {\n val = new EncodingExecutor_1.default().eval(val, this, scopeParts);\n }\n }\n\n return {\n location: location,\n val: val\n };\n }\n }, {\n key: "pushLocalScope",\n value: function pushLocalScope(o) {\n this.local.push(o);\n }\n }, {\n key: "popLocalScope",\n value: function popLocalScope() {\n this.local.pop();\n }\n }, {\n key: "addToVisitedList",\n value: function addToVisitedList(path) {\n var pathStr = path.join(\'.\');\n\n if (this.visitedPaths.has(pathStr)) {\n throw new Error("Circular reference ".concat(pathStr, ", path history: ").concat(_construct(Array, _toConsumableArray(this.visitedPaths)).toString()));\n }\n\n this.visitedPaths.add(pathStr);\n }\n }, {\n key: "removeFromVisitedList",\n value: function removeFromVisitedList(path) {\n this.visitedPaths.delete(path.join(\'.\'));\n }\n }], [{\n key: "isQualified",\n value: function isQualified(scopeParts) {\n var firstPart = scopeParts[0];\n return OptionScopes.SCOPES.includes(firstPart);\n }\n }]);\n\n return OptionScopes;\n }();\n\n exports.OptionScopes = OptionScopes;\n OptionScopes.SCOPES = [\'local\', \'context\', \'datasources\', \'options\', \'themes\'];\n /***/\n},\n/* 30 */\n\n/***/\nfunction (module, exports, __webpack_require__) {\n "use strict";\n\n var _classCallCheck = __webpack_require__(0);\n\n var _createClass = __webpack_require__(1);\n\n var _inherits = __webpack_require__(6);\n\n var _possibleConstructorReturn = __webpack_require__(7);\n\n var _getPrototypeOf = __webpack_require__(8);\n\n function _createSuper(Derived) {\n var hasNativeReflectConstruct = _isNativeReflectConstruct();\n\n return function _createSuperInternal() {\n var Super = _getPrototypeOf(Derived),\n result;\n\n if (hasNativeReflectConstruct) {\n var NewTarget = _getPrototypeOf(this).constructor;\n\n result = Reflect.construct(Super, arguments, NewTarget);\n } else {\n result = Super.apply(this, arguments);\n }\n\n return _possibleConstructorReturn(this, result);\n };\n }\n\n function _isNativeReflectConstruct() {\n if (typeof Reflect === "undefined" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === "function") return true;\n\n try {\n Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n }\n\n var __importDefault = this && this.__importDefault || function (mod) {\n return mod && mod.__esModule ? mod : {\n "default": mod\n };\n };\n\n Object.defineProperty(exports, "__esModule", {\n value: true\n });\n exports.SetColorChannel = void 0;\n\n var chroma_js_1 = __importDefault(__webpack_require__(21));\n\n var lodash_1 = __webpack_require__(5);\n\n var Formatter_1 = __webpack_require__(9);\n\n var EncodingExecutor_1 = __importDefault(__webpack_require__(3));\n /**\n * SetColorChannel can be used to modify a given color.\n *\n * ```js\n * backgroundColor | setColorChannel(rowBGConfig)\', // #330e00\n * headerColor: \'> backgroundColor | setColorChannel(headerColorConfig)\', // #a82e00\n * }}\n * dataSources={{\n * primary: {\n * data: {\n * fields: [{ name: \'foo\' }]\n * columns: [[100, 200]]\n * }\n * }\n * }}\n * />\n * ```\n * Leverages [Chromajs.set](https://gka.github.io/chroma.js/#color-set) to change the color\n *\n * ## Config Object\n * * **channel**: \'string\' refers to channel of the color. For ex: \'hsl.l\' or \'hsl.s\' or \'rgb.b\'\n * * **value**: \'string\' or \'number\'. Can be used to set absolute. For ex: setColorChannel({channel: \'hsl.h\', value: 0}). Can be used as relative. For ex: setColorChannel({channel: \'lab.l\', value: \'*0.5\'})\n \n *\n */\n\n\n var SetColorChannel = /*#__PURE__*/function (_Formatter_1$Abstract) {\n _inherits(SetColorChannel, _Formatter_1$Abstract);\n\n var _super = _createSuper(SetColorChannel);\n\n function SetColorChannel(config) {\n var _this;\n\n _classCallCheck(this, SetColorChannel);\n\n _this = _super.call(this);\n _this.config = EncodingExecutor_1.default.rawTree(config);\n return _this;\n }\n\n _createClass(SetColorChannel, [{\n key: "formatTypedValue",\n value: function formatTypedValue(p) {\n var _p$getValue = p.getValue(),\n value = _p$getValue.value,\n type = _p$getValue.type;\n\n if (type !== \'color\') {\n return {\n type: type,\n value: value\n };\n }\n\n var channel = (0, lodash_1.get)(this, \'config.channel\');\n var v = (0, lodash_1.get)(this, \'config.value\');\n\n if (!channel || value == null) {\n console.warn(\'SetColorChannel requires channel (ex: hsv.v, rgb.r) and value configuration to be set. It will return the same color when missing.\');\n }\n\n try {\n return {\n type: \'color\',\n value: (0, chroma_js_1.default)(value.toString()).set(channel, v).hex()\n };\n } catch (error) {\n console.warn(error);\n return {\n type: \'color\',\n value: value\n };\n }\n }\n }]);\n\n return SetColorChannel;\n }(Formatter_1.AbstractFormatter);\n\n exports.SetColorChannel = SetColorChannel;\n /***/\n},\n/* 31 */\n\n/***/\nfunction (module, exports, __webpack_require__) {\n "use strict";\n\n var _classCallCheck = __webpack_require__(0);\n\n var _createClass = __webpack_require__(1);\n\n var _inherits = __webpack_require__(6);\n\n var _possibleConstructorReturn = __webpack_require__(7);\n\n var _getPrototypeOf = __webpack_require__(8);\n\n function _createSuper(Derived) {\n var hasNativeReflectConstruct = _isNativeReflectConstruct();\n\n return function _createSuperInternal() {\n var Super = _getPrototypeOf(Derived),\n result;\n\n if (hasNativeReflectConstruct) {\n var NewTarget = _getPrototypeOf(this).constructor;\n\n result = Reflect.construct(Super, arguments, NewTarget);\n } else {\n result = Super.apply(this, arguments);\n }\n\n return _possibleConstructorReturn(this, result);\n };\n }\n\n function _isNativeReflectConstruct() {\n if (typeof Reflect === "undefined" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === "function") return true;\n\n try {\n Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n }\n\n var __importDefault = this && this.__importDefault || function (mod) {\n return mod && mod.__esModule ? mod : {\n "default": mod\n };\n };\n\n Object.defineProperty(exports, "__esModule", {\n value: true\n });\n exports.Prefix = void 0;\n\n var Formatter_1 = __webpack_require__(9);\n\n var EncodingExecutor_1 = __importDefault(__webpack_require__(3));\n /**\n * Prepends the given prefix (passed as a parameter) to the DataPoint.\n *\n * ```js\n * primary | seriesByName("foo") | lastPoint() | prefix("bar")\' // returns "bar100"\n * }}\n * dataSources={{\n * primary: {\n * data: {\n * fields: [{ name: \'foo\' }]\n * columns: [[100, 200]]\n * }\n * }\n * }}\n * />\n * ```\n */\n\n\n var Prefix = /*#__PURE__*/function (_Formatter_1$Abstract) {\n _inherits(Prefix, _Formatter_1$Abstract);\n\n var _super = _createSuper(Prefix);\n\n function Prefix(prefix) {\n var _this;\n\n _classCallCheck(this, Prefix);\n\n _this = _super.call(this);\n _this.prefix = EncodingExecutor_1.default.rawTree(prefix);\n return _this;\n }\n\n _createClass(Prefix, [{\n key: "formatTypedValue",\n value: function formatTypedValue(p) {\n var _p$getValue = p.getValue(),\n value = _p$getValue.value;\n\n var prefixedValue = this.prefix + value.toString();\n return {\n value: prefixedValue,\n type: \'string\'\n };\n }\n }]);\n\n return Prefix;\n }(Formatter_1.AbstractFormatter);\n\n exports.Prefix = Prefix;\n /***/\n},\n/* 32 */\n\n/***/\nfunction (module, exports, __webpack_require__) {\n "use strict";\n\n var _classCallCheck = __webpack_require__(0);\n\n var _createClass = __webpack_require__(1);\n\n var _inherits = __webpack_require__(6);\n\n var _possibleConstructorReturn = __webpack_require__(7);\n\n var _getPrototypeOf = __webpack_require__(8);\n\n function _createSuper(Derived) {\n var hasNativeReflectConstruct = _isNativeReflectConstruct();\n\n return function _createSuperInternal() {\n var Super = _getPrototypeOf(Derived),\n result;\n\n if (hasNativeReflectConstruct) {\n var NewTarget = _getPrototypeOf(this).constructor;\n\n result = Reflect.construct(Super, arguments, NewTarget);\n } else {\n result = Super.apply(this, arguments);\n }\n\n return _possibleConstructorReturn(this, result);\n };\n }\n\n function _isNativeReflectConstruct() {\n if (typeof Reflect === "undefined" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === "function") return true;\n\n try {\n Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n }\n\n var __importDefault = this && this.__importDefault || function (mod) {\n return mod && mod.__esModule ? mod : {\n "default": mod\n };\n };\n\n Object.defineProperty(exports, "__esModule", {\n value: true\n });\n exports.MatchValue = void 0;\n\n var lodash_1 = __webpack_require__(5);\n\n var types_1 = __webpack_require__(4);\n\n var formatterUtils_1 = __webpack_require__(14);\n\n var Formatter_1 = __webpack_require__(9);\n\n var EncodingExecutor_1 = __importDefault(__webpack_require__(3));\n /**\n * This formatter accepts a list of potential matches and a defaultValue (if no match is found) as the config.\n *\n * It maps each element in the DataSeries to find a corresponding matched value and returns the matched value if found, or the defaultValue if present.\n * Otherwise if neither are present, it returns the original value.\n *\n * ```js\n * primary | seriesByIndex(0) | lastPoint() | matchValue(colorMatches, "#0000FF")\' // returns #FF0000\n * colorOption2: \'> primary | seriesByIndex(1) | lastPoint() | matchValue(colorMatches, "#0000FF")\' // returns #0000FF\n * }}\n * dataSources={{\n * primary: {\n * data: {\n * columns: [[100, 200, 300, 400, 500], [600, 700, 800, 900, 1000]]\n * fields: [{ name: \'foo\' }, { name: \'bar\' }],\n * }\n * }\n * }}\n * />\n *\n *\n * @extends AbstractFormatter\n */\n\n\n var MatchValue = /*#__PURE__*/function (_Formatter_1$Abstract) {\n _inherits(MatchValue, _Formatter_1$Abstract);\n\n var _super = _createSuper(MatchValue);\n\n function MatchValue(matches) {\n var _this;\n\n var defaultValue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;\n\n _classCallCheck(this, MatchValue);\n\n _this = _super.call(this);\n _this.matches = EncodingExecutor_1.default.rawTree(matches);\n _this.defaultValue = defaultValue === undefined ? undefined : (0, formatterUtils_1.setDefaultValue)(defaultValue);\n return _this;\n }\n\n _createClass(MatchValue, [{\n key: "formatTypedValue",\n value: function formatTypedValue(input) {\n var _input$getValue = input.getValue(),\n value = _input$getValue.value; // if no match present, return defaultValue if present, otherwise return the original value if valid\n\n\n var defaultMatchValue = (0, lodash_1.isUndefined)(this.defaultValue) ? value || \'\' : this.defaultValue;\n\n var matchFunc = function matchFunc(m) {\n if (!m.match) {\n return false;\n }\n\n return (0, types_1.isNumber)(value) ? parseFloat(m.match) === parseFloat(value) : m.match === value; // If value is a number (either \'1\' or 1) match with the match config based on numeric value (either \'1\' or 1)\n };\n\n var matchResult = (0, lodash_1.find)(this.matches, matchFunc);\n var updatedValue = (0, lodash_1.isUndefined)(matchResult) ? defaultMatchValue : matchResult.value;\n var updatedType = (0, types_1.getDataTypeForPoint)(updatedValue);\n return {\n value: updatedValue,\n type: updatedType\n };\n }\n }]);\n\n return MatchValue;\n }(Formatter_1.AbstractFormatter);\n\n exports.MatchValue = MatchValue;\n /***/\n},\n/* 33 */\n\n/***/\nfunction (module, exports, __webpack_require__) {\n "use strict";\n\n var _classCallCheck = __webpack_require__(0);\n\n var _createClass = __webpack_require__(1);\n\n var _inherits = __webpack_require__(6);\n\n var _possibleConstructorReturn = __webpack_require__(7);\n\n var _getPrototypeOf = __webpack_require__(8);\n\n function _createSuper(Derived) {\n var hasNativeReflectConstruct = _isNativeReflectConstruct();\n\n return function _createSuperInternal() {\n var Super = _getPrototypeOf(Derived),\n result;\n\n if (hasNativeReflectConstruct) {\n var NewTarget = _getPrototypeOf(this).constructor;\n\n result = Reflect.construct(Super, arguments, NewTarget);\n } else {\n result = Super.apply(this, arguments);\n }\n\n return _possibleConstructorReturn(this, result);\n };\n }\n\n function _isNativeReflectConstruct() {\n if (typeof Reflect === "undefined" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === "function") return true;\n\n try {\n Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n }\n\n var __importDefault = this && this.__importDefault || function (mod) {\n return mod && mod.__esModule ? mod : {\n "default": mod\n };\n };\n\n Object.defineProperty(exports, "__esModule", {\n value: true\n });\n exports.RangeValue = void 0;\n\n var lodash_1 = __webpack_require__(5);\n\n var Formatter_1 = __webpack_require__(9);\n\n var types_1 = __webpack_require__(4);\n\n var formatterUtils_1 = __webpack_require__(14);\n\n var EncodingExecutor_1 = __importDefault(__webpack_require__(3));\n\n var hasOwnProperty = Object.prototype.hasOwnProperty;\n /**\n * Formatter function that takes the list of ranges and a defaultValue (if no range is found)\n * and returns a function that takes a value and returns the range value if found, or the defaultValue if present.\n *\n * If neither are present, it returns the original value.\n *\n * The range fitting follows this criteria: `range.from <= value < range.to`\n *\n * A range can be defined as either a closed bound range: `{ from: 10, to: 20, value: \'foo\' }`\n * or an open bound range:\n * `{ to: 20, value: \'bar\' }` (open lower bound)\n * `{ from: 100, value: \'oof\' }` (open upper bound)\n *\n * ```js\n * primary | seriesByIndex(0) | lastPoint()\', // returns 103\n * colorOption: \'> deltaValue | rangeValue(colorThresholds)\', // returns \'#FF00FF\'\n * }}\n * dataSources={{\n * primary: {\n * data: {\n * columns: [\n * [\'1\', \'103\'], [\'2018-08-19T00:00:00.000+00:00\', \'2018-08-20T00:00:00.000+00:00\'],\n * ],\n * fields: [{ name: \'foo\', }, { name: \'_time\' }],\n * }\n * },\n * }}\n * />\n * ```\n * @extends AbstractFormatter\n */\n\n var RangeValue = /*#__PURE__*/function (_Formatter_1$Abstract) {\n _inherits(RangeValue, _Formatter_1$Abstract);\n\n var _super = _createSuper(RangeValue);\n\n function RangeValue(ranges, defaultValue) {\n var _this;\n\n _classCallCheck(this, RangeValue);\n\n _this = _super.call(this);\n _this.ranges = EncodingExecutor_1.default.rawTree(ranges); // insure we can handle ranges that had DSL expressions shoved into them\n\n _this.defaultValue = (0, formatterUtils_1.setDefaultValue)(defaultValue);\n return _this;\n }\n\n _createClass(RangeValue, [{\n key: "formatTypedValue",\n value: function formatTypedValue(p) {\n var _p$getValue = p.getValue(),\n type = _p$getValue.type,\n value = _p$getValue.value;\n\n if (type !== \'number\') {\n console.warn("type \'".concat(type, "\' with value \'").concat(value, "\' is not a valid input to rangeValue"));\n }\n\n var rangeValueResult; // if no range is found and valid value, return defaultValue if present, otherwise return the original value\n\n var defaultRangeValue = (0, lodash_1.isUndefined)(this.defaultValue) && !(0, types_1.isNumber)(value) ? value : this.defaultValue;\n\n if ((0, types_1.isNumber)(value)) {\n var floatValue = parseFloat(value);\n\n for (var i = 0; i < this.ranges.length; i += 1) {\n if ( // open upper bound: value is bigger than or equal to open upper bound start (from)\n // if there are several \'from\'-only ranges, we look at the first one that satisfies the mapping criteria\n // if there is overlap between a \'from\'-only range and an inbetween range, this means that the ranges config is semantically invalid\n // TODO: figure out if we want to enforce a semantically valid config by sorting,\n // or by throwing an error if there are multiple \'from\'/\'to\'-only ranges\n hasOwnProperty.call(this.ranges[i], \'from\') && !hasOwnProperty.call(this.ranges[i], \'to\') && floatValue >= this.ranges[i].from || // inbetween: value falls into from (inclusive) - to (exclusive) range\n floatValue >= this.ranges[i].from && floatValue < this.ranges[i].to || hasOwnProperty.call(this.ranges[i], \'to\') && !hasOwnProperty.call(this.ranges[i], \'from\') && floatValue < this.ranges[i].to) {\n rangeValueResult = this.ranges[i].value;\n break;\n }\n }\n }\n\n var updatedValue = (0, lodash_1.isUndefined)(rangeValueResult) ? defaultRangeValue : rangeValueResult;\n var updatedType = (0, types_1.getDataTypeForPoint)(updatedValue);\n return {\n type: updatedType,\n value: updatedValue\n };\n }\n }]);\n\n return RangeValue;\n }(Formatter_1.AbstractFormatter);\n\n exports.RangeValue = RangeValue;\n /***/\n},\n/* 34 */\n\n/***/\nfunction (module, exports, __webpack_require__) {\n "use strict";\n\n var _toConsumableArray = __webpack_require__(13);\n\n var _classCallCheck = __webpack_require__(0);\n\n var _createClass = __webpack_require__(1);\n\n var _inherits = __webpack_require__(6);\n\n var _possibleConstructorReturn = __webpack_require__(7);\n\n var _getPrototypeOf = __webpack_require__(8);\n\n function _createSuper(Derived) {\n var hasNativeReflectConstruct = _isNativeReflectConstruct();\n\n return function _createSuperInternal() {\n var Super = _getPrototypeOf(Derived),\n result;\n\n if (hasNativeReflectConstruct) {\n var NewTarget = _getPrototypeOf(this).constructor;\n\n result = Reflect.construct(Super, arguments, NewTarget);\n } else {\n result = Super.apply(this, arguments);\n }\n\n return _possibleConstructorReturn(this, result);\n };\n }\n\n function _isNativeReflectConstruct() {\n if (typeof Reflect === "undefined" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === "function") return true;\n\n try {\n Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n }\n\n var __importDefault = this && this.__importDefault || function (mod) {\n return mod && mod.__esModule ? mod : {\n "default": mod\n };\n };\n\n Object.defineProperty(exports, "__esModule", {\n value: true\n });\n exports.Gradient = exports.DEFAULT_MAX_COLOR = exports.DEFAULT_MIN_COLOR = void 0;\n\n var chroma_js_1 = __importDefault(__webpack_require__(21));\n\n var colorUtils_1 = __webpack_require__(16);\n\n var Formatter_1 = __webpack_require__(9);\n\n var EncodingExecutor_1 = __importDefault(__webpack_require__(3));\n\n exports.DEFAULT_MIN_COLOR = \'rgba(123,86,219,0.4)\';\n exports.DEFAULT_MAX_COLOR = \'rgba(123,86,219,1)\';\n /**\n * Based on stops and colors, this formatter maps the value to an interpolated color.\n *\n * The `config` follows this criteria: `{ stops: [0, 100, 230], colors: [\'red\', \'green\', \'blue\'] }`\n *\n * If no config is specified, the default `colors` are `[\'rgba(123,86,219,0.4)\', \'rgba(123,86,219,1)\']`. The default `stops` are dependent on the DataSeries provided.\n *\n * Given a DataSeries with n values, the stops would consist of [min, ...(configured stops), max] if stops values are contained in [min, max] - recommended.\n * And min/max map to \'rgba(123,86,219,0.4)\'/\'rgba(123,86,219,1)\', respectively.\n *\n * For example, if 0 < value < 100, the corresponding interpolated color will be between red and green.\n *\n * ```js\n * primary | seriesByIndex(0) | gradient(gradientConfig)\' // it maps [0, 50, 230] to [\'#7B56DB66\', \'#FF0000\', \'#7B56DB\']\n * colorOption1: \'> primary | seriesByIndex(1) | gradient(gradientConfig)\' // it maps [50, 100, 150] to [\'red\', \'green\', \'blue\']\n * }}\n * dataSources={{\n * data: {\n * primary: {\n * columns: [[0, 50, 230], [50, 100, 150]],\n * fields: [{ name: \'foo\' }, { name: \'bar\' }]\n * }\n * }\n * }}\n * />\n * ```\n *\n * @extends AbstractFormatter\n */\n\n var Gradient = /*#__PURE__*/function (_Formatter_1$Abstract) {\n _inherits(Gradient, _Formatter_1$Abstract);\n\n var _super = _createSuper(Gradient);\n\n function Gradient(config) {\n var _this;\n\n _classCallCheck(this, Gradient);\n\n _this = _super.call(this);\n\n _this.sortArray = function (array) {\n array.sort(function (a, b) {\n return a - b;\n });\n };\n\n _this.addDefaultEndingColors = function (colors, n) {\n // add n ending purples to colors\n for (var i = 0; i < n; i += 1) {\n colors.push(exports.DEFAULT_MAX_COLOR);\n }\n };\n\n _this.ignoreMinMaxWhenNeeded = function (min, max, stops, newStops, newColors) {\n if (min >= stops[0]) {\n // ignore "min" stop and color\n newStops.shift();\n newColors.shift();\n }\n\n if (max <= stops[stops.length - 1]) {\n // ignore "max" stop and color\n newStops.pop();\n newColors.pop();\n }\n };\n\n _this.config = EncodingExecutor_1.default.rawTree(config) || {};\n _this.colors = _this.config.colors || [];\n _this.stops = _this.config.stops || [];\n\n if (!Array.isArray(_this.colors) || !Array.isArray(_this.stops)) {\n throw new Error("Gradient config: both \'colors\' and \'stops\' in should be 1D array.");\n }\n\n _this.colors.forEach(function (c) {\n if (!(0, colorUtils_1.isColor)(c)) {\n throw new Error("Gradient config: every element in \'colors\' should be a color.");\n }\n });\n\n _this.sortArray(_this.stops);\n\n return _this;\n }\n\n _createClass(Gradient, [{\n key: "prepareColorsAndStopsSeries",\n value: function prepareColorsAndStopsSeries(series) {\n var colorsLength = this.colors.length;\n var stopsLength = this.stops.length;\n var min = Number(series.min().getRawValue());\n var max = Number(series.max().getRawValue());\n var newColors = [exports.DEFAULT_MIN_COLOR, exports.DEFAULT_MAX_COLOR]; // case-0: no stops configured\n // if colors configured -- use stops, otherwise use default purples\n\n if (stopsLength === 0) {\n if (colorsLength > 2) {\n // evenly distribute colors inbetween [min, max]\n var _newStops = [];\n\n for (var i = 0; i < colorsLength; i += 1) {\n _newStops.push(min + (max - min) * i / (colorsLength - 1));\n }\n\n return {\n newStops: _newStops,\n newColors: this.colors\n };\n }\n\n this.colors.forEach(function (c, i) {\n newColors[i] = c;\n });\n return {\n newStops: [min, max],\n newColors: newColors\n };\n } // cases-1: configured stops length > 0\n\n\n var newStops = _toConsumableArray(this.stops); // always add min max stops first\n\n\n newStops.unshift(min);\n newStops.push(max); // case-1-0: no colors configured\n\n if (colorsLength === 0) {\n // cases-1-0-1: two special cases where colors not configured and stops length <= 2\n if (stopsLength === 1) {\n newColors = [exports.DEFAULT_MIN_COLOR, exports.DEFAULT_MAX_COLOR, exports.DEFAULT_MAX_COLOR];\n } else if (stopsLength === 2) {\n newColors = [exports.DEFAULT_MIN_COLOR, exports.DEFAULT_MIN_COLOR, exports.DEFAULT_MAX_COLOR, exports.DEFAULT_MAX_COLOR];\n } else {\n throw new Error(\'Gradient config: provide at most two stops when colors is empty.\');\n }\n\n this.ignoreMinMaxWhenNeeded(min, max, this.stops, newStops, newColors);\n return {\n newStops: newStops,\n newColors: newColors\n };\n } // case-1-1: both colors and stops configured, and having proper lengths\n\n\n if (stopsLength + 2 >= colorsLength) {\n // prepend default color for "min" stop\n newColors = _toConsumableArray(this.colors);\n\n if (stopsLength >= colorsLength) {\n newColors.unshift(exports.DEFAULT_MIN_COLOR);\n } // append default color(s) for "max" stop\n\n\n this.addDefaultEndingColors(newColors, stopsLength + 2 - newColors.length);\n this.ignoreMinMaxWhenNeeded(min, max, this.stops, newStops, newColors);\n\n if (newStops.length !== newColors.length) {\n throw new Error(\'Gradient config: not equal length of stops and colors.\');\n }\n\n return {\n newStops: newStops,\n newColors: newColors\n };\n }\n\n throw new Error(\'Gradient config: too many colors set for the given stops.\');\n }\n }, {\n key: "prepareColorsAndStopsPoint",\n value: function prepareColorsAndStopsPoint(value) {\n var newStops = this.stops;\n var newColors = this.colors;\n\n if (this.stops.length === 0) {\n newStops = [0, 1];\n }\n\n if (this.colors.length === 0) {\n newColors = [exports.DEFAULT_MIN_COLOR, exports.DEFAULT_MAX_COLOR];\n }\n\n if (this.stops.length === this.colors.length && this.stops.length === 1 && value < this.stops[0]) {\n newColors = [exports.DEFAULT_MIN_COLOR].concat(_toConsumableArray(this.colors));\n }\n\n return {\n newStops: newStops,\n newColors: newColors\n };\n }\n }, {\n key: "formatTypedValue",\n value: function formatTypedValue(p, series) {\n var input = p.getValue();\n var type = input.type,\n value = input.value;\n\n if (type !== \'number\') {\n throw new Error("Type \'".concat(type, "\' with value \'").concat(value, "\' is not a valid input to gradient"));\n }\n\n var isDataSeries = series && series.points && series.points.length;\n\n var _ref = isDataSeries ? this.prepareColorsAndStopsSeries(series) : this.prepareColorsAndStopsPoint(value),\n newStops = _ref.newStops,\n newColors = _ref.newColors;\n\n var interpolateColor;\n var isBeyondUpperBound = value > newStops[newStops.length - 1];\n var isBeyondLowerBound = value < newStops[0];\n\n if (isBeyondUpperBound || isBeyondLowerBound) {\n var index = isBeyondUpperBound ? newColors.length - 1 : 0;\n interpolateColor = (0, chroma_js_1.default)(newColors[index]).hex().toUpperCase();\n return {\n type: \'color\',\n value: interpolateColor\n };\n }\n\n for (var i = 1; i < newStops.length; i += 1) {\n if (Number.isNaN(Number(newStops[i]))) {\n // eslint-disable-next-line\n console.warn(\'Could not format gradient color: stops are required to be numbers. Falling back to first color.\');\n interpolateColor = (0, chroma_js_1.default)(newColors[0]).hex().toUpperCase() || \'#000\';\n return {\n type: \'color\',\n value: interpolateColor\n };\n }\n\n var upperVal = newStops[i];\n\n if (value <= upperVal) {\n var lowerVal = newStops[i - 1];\n var tau = 0; // deal with special case when the upper and lower bounds of the colors are equal\n\n if (upperVal === lowerVal) {\n // user prolly expects lower end of color stops if value is zero\n // otherwise use the upper bound\n tau = value === 0 ? 0 : 1;\n } else {\n tau = (value - lowerVal) / (upperVal - lowerVal);\n }\n\n interpolateColor = chroma_js_1.default.scale([newColors[i - 1], newColors[i]])(tau).hex().toUpperCase();\n return {\n type: \'color\',\n value: interpolateColor\n };\n }\n } // eslint-disable-next-line\n\n\n console.warn("Could not format value for gradient: ".concat(value));\n interpolateColor = (0, chroma_js_1.default)(newColors[0]).hex().toUpperCase() || \'#000\';\n return {\n type: \'color\',\n value: interpolateColor\n };\n }\n }]);\n\n return Gradient;\n }(Formatter_1.AbstractFormatter);\n\n exports.Gradient = Gradient;\n /***/\n},\n/* 35 */\n\n/***/\nfunction (module, exports, __webpack_require__) {\n "use strict";\n\n var _classCallCheck = __webpack_require__(0);\n\n var _createClass = __webpack_require__(1);\n\n var _inherits = __webpack_require__(6);\n\n var _possibleConstructorReturn = __webpack_require__(7);\n\n var _getPrototypeOf = __webpack_require__(8);\n\n function _createSuper(Derived) {\n var hasNativeReflectConstruct = _isNativeReflectConstruct();\n\n return function _createSuperInternal() {\n var Super = _getPrototypeOf(Derived),\n result;\n\n if (hasNativeReflectConstruct) {\n var NewTarget = _getPrototypeOf(this).constructor;\n\n result = Reflect.construct(Super, arguments, NewTarget);\n } else {\n result = Super.apply(this, arguments);\n }\n\n return _possibleConstructorReturn(this, result);\n };\n }\n\n function _isNativeReflectConstruct() {\n if (typeof Reflect === "undefined" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === "function") return true;\n\n try {\n Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n }\n\n var __importDefault = this && this.__importDefault || function (mod) {\n return mod && mod.__esModule ? mod : {\n "default": mod\n };\n };\n\n Object.defineProperty(exports, "__esModule", {\n value: true\n });\n exports.Pick = void 0;\n\n var Formatter_1 = __webpack_require__(9);\n\n var TypeSafeValue_1 = __webpack_require__(11);\n\n var EncodingExecutor_1 = __importDefault(__webpack_require__(3));\n /**\n * Formatter which can accept a map or array config.\n *\n * If a map is provided, it will use the DataPoint\'s field name to pick the corresponding entry in the config.\n *\n * If an array is provided, it cycles through the array of values passed in via the config n times (where n = DataSeries.length) and returns this as the output.\n *\n * For example, if the config contains 2 elements and the DataSeries contains 10 elements, it will loop through the config 5 times, alternating between which element is appended to the output.\n *\n * ```js\n * primary | seriesByIndex(0) | pick(rowBackgroundColors)\', // returns [\'#FF0000\', \'#00FF00\', \'#0000FF\', \'#FF0000\', \'#0000FF\']\n * rowTextColor: \'> primary | seriesByIndex(0) | pick(rowTextColors)\', // returns [\'#110000\', \'#000011\', \'#110000\', \'#000011\', \'#110000\']\n * barOption: \'> primary | seriesByIndex(1) | lastPoint() | pick(mapConfig)\', // returns \'barLabel\'\n * fooOption: \'> primary | seriesByIndex(0) | lastPoint() | pick(mapConfig)\', // returns \'fooLabel\'\n * }}\n * dataSources={{\n * primary: {\n * data: {\n * columns: [[100, 200, 300, 400, 500], [600, 700, 800, 900, 1000]]\n * fields: [{ name: \'foo\' }, { name: \'bar\' }],\n * }\n * }\n * }}\n * />\n * ```\n */\n\n\n var Pick = /*#__PURE__*/function (_Formatter_1$Abstract) {\n _inherits(Pick, _Formatter_1$Abstract);\n\n var _super = _createSuper(Pick);\n\n function Pick(formatConfig) {\n var _this;\n\n _classCallCheck(this, Pick);\n\n _this = _super.call(this); // insure that the config is plain old JS objects (does not have DataPrimitives inside it)\n\n _this.config = EncodingExecutor_1.default.rawTree(formatConfig);\n return _this;\n } // eslint-disable-next-line @typescript-eslint/no-unused-vars\n\n\n _createClass(Pick, [{\n key: "formatTypedValue",\n value: function formatTypedValue(p, s) {\n var i = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n var j = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;\n var val;\n\n if (Array.isArray(this.config)) {\n val = this.config[j % this.config.length];\n } else {\n val = this.config[s.field];\n }\n\n return TypeSafeValue_1.TypeSafeValue.fromRaw(val);\n }\n }]);\n\n return Pick;\n }(Formatter_1.AbstractFormatter);\n\n exports.Pick = Pick;\n /***/\n},\n/* 36 */\n\n/***/\nfunction (module, exports, __webpack_require__) {\n "use strict";\n\n var _classCallCheck = __webpack_require__(0);\n\n var _createClass = __webpack_require__(1);\n\n var _inherits = __webpack_require__(6);\n\n var _possibleConstructorReturn = __webpack_require__(7);\n\n var _getPrototypeOf = __webpack_require__(8);\n\n function _createSuper(Derived) {\n var hasNativeReflectConstruct = _isNativeReflectConstruct();\n\n return function _createSuperInternal() {\n var Super = _getPrototypeOf(Derived),\n result;\n\n if (hasNativeReflectConstruct) {\n var NewTarget = _getPrototypeOf(this).constructor;\n\n result = Reflect.construct(Super, arguments, NewTarget);\n } else {\n result = Super.apply(this, arguments);\n }\n\n return _possibleConstructorReturn(this, result);\n };\n }\n\n function _isNativeReflectConstruct() {\n if (typeof Reflect === "undefined" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === "function") return true;\n\n try {\n Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n }\n\n Object.defineProperty(exports, "__esModule", {\n value: true\n });\n exports.Type = void 0;\n /* eslint-disable class-methods-use-this */\n\n var Formatter_1 = __webpack_require__(9);\n\n var TypeSafeValue_1 = __webpack_require__(11);\n /**\n * Formatter that returns the DataType for each element within the given DataSeries.\n *\n * ```js\n * primary | seriesByIndex(0) | type()\' // returns [\'number\', \'number\', \'number\']\n * option2: \'> primary | seriesByIndex(1) | type()\' // returns [\'string\', \'string\', \'string\']\n * }}\n * dataSources={{\n * data: {\n * primary: {\n * columns: [[100, 200, 300], [\'string1\', \'string2\', \'string3\']]\n * fields: [{ name: \'foo\' }, { name: \'bar\' }]\n * }\n * }\n * }}\n * />\n * ```\n */\n\n\n var Type = /*#__PURE__*/function (_Formatter_1$Abstract) {\n _inherits(Type, _Formatter_1$Abstract);\n\n var _super = _createSuper(Type);\n\n function Type() {\n _classCallCheck(this, Type);\n\n return _super.apply(this, arguments);\n }\n\n _createClass(Type, [{\n key: "formatTypedValue",\n value: function formatTypedValue(p) {\n if (p && p.getRawValue() === null) {\n // For null datapoint value return \'null\' type\n return TypeSafeValue_1.TypeSafeValue.from({\n type: \'string\',\n value: \'null\'\n });\n }\n\n return TypeSafeValue_1.TypeSafeValue.fromRaw(p.getType());\n }\n }]);\n\n return Type;\n }(Formatter_1.AbstractFormatter);\n\n exports.Type = Type;\n /***/\n},\n/* 37 */\n\n/***/\nfunction (module, exports, __webpack_require__) {\n "use strict";\n\n var _classCallCheck = __webpack_require__(0);\n\n var _createClass = __webpack_require__(1);\n\n var _inherits = __webpack_require__(6);\n\n var _possibleConstructorReturn = __webpack_require__(7);\n\n var _getPrototypeOf = __webpack_require__(8);\n\n function _createSuper(Derived) {\n var hasNativeReflectConstruct = _isNativeReflectConstruct();\n\n return function _createSuperInternal() {\n var Super = _getPrototypeOf(Derived),\n result;\n\n if (hasNativeReflectConstruct) {\n var NewTarget = _getPrototypeOf(this).constructor;\n\n result = Reflect.construct(Super, arguments, NewTarget);\n } else {\n result = Super.apply(this, arguments);\n }\n\n return _possibleConstructorReturn(this, result);\n };\n }\n\n function _isNativeReflectConstruct() {\n if (typeof Reflect === "undefined" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === "function") return true;\n\n try {\n Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n }\n\n var __importDefault = this && this.__importDefault || function (mod) {\n return mod && mod.__esModule ? mod : {\n "default": mod\n };\n };\n\n Object.defineProperty(exports, "__esModule", {\n value: true\n });\n exports.FormatByType = void 0;\n\n var lodash_1 = __webpack_require__(5);\n\n var numbro_1 = __importDefault(__webpack_require__(38));\n\n var formatterUtils_1 = __webpack_require__(14);\n\n var Formatter_1 = __webpack_require__(9);\n\n var TypeSafeValue_1 = __webpack_require__(11);\n\n var validUnitPositions = [\'before\', \'after\'];\n\n var formatNumber = function formatNumber(number, config) {\n var mappedConfig = {\n prefix: !(0, lodash_1.isEmpty)(config.unit) && config.unitPosition === \'before\' ? "".concat(config.unit, " ") : undefined,\n postfix: !(0, lodash_1.isEmpty)(config.unit) && config.unitPosition !== \'before\' ? " ".concat(config.unit) : undefined,\n mantissa: typeof config.precision === \'number\' ? config.precision : undefined\n };\n var c = (0, lodash_1.defaultsDeep)({}, (0, lodash_1.omitBy)(mappedConfig, lodash_1.isUndefined), (0, lodash_1.omit)(config, [\'unit\', \'unitPosition\', \'precision\']));\n return (0, numbro_1.default)(number).format(c);\n };\n\n var formatString = function formatString(string, config) {\n if (!(0, lodash_1.isEmpty)(config.unit)) {\n return config.unitPosition === \'before\' ? "".concat(config.unit, " ").concat(string) : "".concat(string, " ").concat(config.unit);\n }\n\n return "".concat(string);\n };\n\n var formatTime = function formatTime(dateString, defaultValue, config) {\n if (typeof config.format === \'string\' && !(0, lodash_1.isEmpty)(config.format)) {\n // this preserves the timezone when formatting\n return (0, formatterUtils_1.formatTimeWithTimezoneCorrection)(dateString, config.format);\n }\n\n return defaultValue.toString();\n };\n /**\n * @class FormatByType\n *\n * Formats the value based on the value type and the provided config. For example\n *\n * ```js\n table | seriesByName("formatted") | formatByType(formattedConfig)\',\n },\n },\n }}\n \n dataSources = {{\n primary: {\n requestParams: { offset: 0, count: 20 },\n data: {\n fields: [\n { name: \'number\' },\n { name: \'formatted\' },\n ],\n columns: [\n [-927916.96, -924916.9, -654089.75],\n [-927916.96, -924916.9, -654089.75],\n ],\n },\n meta: { totalCount: 100 },\n },\n }}\n />\n * ```\n *\n * ## Config Object\n *\n * ### number\n *\n * * **unit?**: `string` to be appended or prepended to the value\n * * **unitPosition?**: `{"before" | "after"}` where should the `unit` be placed. Maps to numbro `prefix` or `postfix`\n * * **numberPrecision?**: `number` maps to numbro `mantissa`\n * * **mantissa?**: `number` number of decimal points to show\n * * **trimMantissa?**: `boolean` ending 0s in decimal points will be trimmed\n * * **thousandSeparated?**: `boolean` should show `,` for thousands\n * * **output?**: `"currency" | "percent" | "byte" | "time" | "ordinal" | "number"` value will be converted to one of thse formats\n * * **base?**: `"decimal" | "binary" | "general"` used for converting value to bytes\n * * **prefix?**: `string` string to be added in front of the value\n * * **postfix?**: `string` string to be appended to the value\n * * **forceAverage?**: `"trillion" | "billion" | "million" | "thousand"` can be used to force one the selected average\n * * **average?**: `boolean` rounds up the value to the closed average\n * * **totalLength?**: `number` used only for `average`. The number length to format data in\n * * **spaceSeparated?**: `boolean` used with `average` to introduce space between number and average\n * * **abbreviations?**: `{\n thousand?: string;\n million?: string;\n billion?: string;\n trillion?: string;\n }` abbreviation values for averages.\n * * **negative?**: `"sign" | "parenthesis"` display sign or parenthesis for negative numbers\n * * **forceSign?**: `boolean` always show + or - sign\n *\n *\n * * For examples, refer [Numbro](https://numbrojs.com/format.html#format)\n *\n * #### time\n *\n * * **format**: valid moment format string. Refer - [moment display](https://momentjs.com/docs/#/displaying/)\n *\n *\n *\n \n */\n\n\n var FormatByType = /*#__PURE__*/function (_Formatter_1$Abstract) {\n _inherits(FormatByType, _Formatter_1$Abstract);\n\n var _super = _createSuper(FormatByType);\n\n function FormatByType(config) {\n var _this;\n\n _classCallCheck(this, FormatByType);\n\n _this = _super.call(this);\n _this.config = {\n number: {},\n string: {},\n time: {\n format: \'\'\n }\n };\n _this.config = (0, lodash_1.defaultsDeep)({}, config, _this.config);\n return _this;\n }\n\n _createClass(FormatByType, [{\n key: "formatTypedValue",\n value: function formatTypedValue(p) {\n var _this$config = this.config,\n numberConfig = _this$config.number,\n stringConfig = _this$config.string,\n timeConfig = _this$config.time;\n var value = p.getValue();\n\n switch (value.type) {\n case \'number\':\n return new TypeSafeValue_1.TypeSafeValue(\'string\', formatNumber(p.getRawValue(), numberConfig), value.value);\n\n case \'string\':\n return new TypeSafeValue_1.TypeSafeValue(\'string\', formatString(value.value, stringConfig), value.value);\n\n case \'time\':\n return new TypeSafeValue_1.TypeSafeValue(\'string\', formatTime(value.coercedValue, value.value, timeConfig), value.value);\n\n default:\n return p.getValue();\n }\n }\n }]);\n\n return FormatByType;\n }(Formatter_1.AbstractFormatter);\n\n exports.FormatByType = FormatByType;\n /***/\n},\n/* 38 */\n\n/***/\nfunction (module, exports) {\n module.exports = __webpack_require__(85);\n /***/\n},\n/* 39 */\n\n/***/\nfunction (module, exports, __webpack_require__) {\n "use strict";\n\n var _classCallCheck = __webpack_require__(0);\n\n var _createClass = __webpack_require__(1);\n\n var __importDefault = this && this.__importDefault || function (mod) {\n return mod && mod.__esModule ? mod : {\n "default": mod\n };\n };\n\n Object.defineProperty(exports, "__esModule", {\n value: true\n });\n exports.Frame = void 0;\n\n var DataFrame_1 = __webpack_require__(12);\n\n var DataSeries_1 = __webpack_require__(10);\n\n var DataPrimitive_1 = __webpack_require__(19);\n\n var DataPoint_1 = __webpack_require__(2);\n\n var Helper_1 = __webpack_require__(22);\n\n var EncodingExecutor_1 = __importDefault(__webpack_require__(3));\n /**\n * This formatter returns a new DataFrame made by combining its arguments.\n *\n * Example: frame(series1, series2, frame1). It is also possible to pass\n * DataPoint as argument, in which case the DataPoint is wrapped in DataSeries.\n *\n * ```js\n * primary | seriesByName("users")\',\n * ids: \'> primary | seriesByName("ids")\'\n * }}\n * options={{\n * frameOption1: \'> frame(users, ids)\' // returns [[\'Maurine\', \'Jennings\', \'Giuseppe\'], [\'1\', \'2\', \'3\']]\n * frameOption2: \'> frame(frameOption1, ids)\' // returns [[\'Maurine\', \'Jennings\', \'Giuseppe\'], [\'1\', \'2\', \'3\'], [\'1\', \'2\', \'3\']]\n * }}\n * dataSources={{\n * primary: {\n * data: {\n * columns: [[\'Maurine\', \'Jennings\', \'Giuseppe\'], [\'1\', \'2\', \'3\']],\n * fields: [{ name: \'users\' }, { name: \'ids\' }]\n * }\n * }\n * }}\n * />\n * ```\n */\n\n\n var Frame = /*#__PURE__*/function () {\n function Frame() {\n _classCallCheck(this, Frame);\n\n this.args = []; // frame formatter must also support \'raw\' coming form context so we rawTree as needed\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n this.args = args.map(function (a) {\n return (0, DataPrimitive_1.isDataPrimitive)(a) ? a : Helper_1.Helper.dataPrimitiveFromRaw(EncodingExecutor_1.default.rawTree(a));\n });\n } // eslint-disable-next-line @typescript-eslint/no-unused-vars\n\n\n _createClass(Frame, [{\n key: "format",\n value: function format(ignored) {\n var series = [];\n this.args.forEach(function (dataPrim) {\n if (DataSeries_1.DataSeries.isDataSeries(dataPrim)) {\n series.push(dataPrim);\n } else if (DataFrame_1.DataFrame.isDataFrame(dataPrim)) {\n series = series.concat(dataPrim.series);\n } else if (DataPoint_1.DataPoint.isDataPoint(dataPrim)) {\n series.push(new DataSeries_1.DataSeries([dataPrim]));\n } else {\n throw new Error("frame formatter args incorrect");\n }\n });\n return new DataFrame_1.DataFrame(series);\n }\n }]);\n\n return Frame;\n }();\n\n exports.Frame = Frame;\n /***/\n},\n/* 40 */\n\n/***/\nfunction (module, exports, __webpack_require__) {\n "use strict";\n\n var _toConsumableArray = __webpack_require__(13);\n\n var _classCallCheck = __webpack_require__(0);\n\n var _createClass = __webpack_require__(1);\n\n var __importDefault = this && this.__importDefault || function (mod) {\n return mod && mod.__esModule ? mod : {\n "default": mod\n };\n };\n\n Object.defineProperty(exports, "__esModule", {\n value: true\n });\n exports.Prepend = void 0;\n\n var DataPoint_1 = __webpack_require__(2);\n\n var DataPrimitive_1 = __webpack_require__(19);\n\n var DataSeries_1 = __webpack_require__(10);\n\n var DataFrame_1 = __webpack_require__(12);\n\n var Helper_1 = __webpack_require__(22);\n\n var EncodingExecutor_1 = __importDefault(__webpack_require__(3));\n /**\n * Formatter that prepends a DataFrame, DataSeries, or DataPoint to a pre-existing DataFrame or DataSeries with compatible types.\n *\n * If prepending a DataFrame to another DataFrame, the DataFrames must have the same number of DataSeries.\n * For example, a DataFrame with 3 series such as `[[1, 2], [3, 4], [5, 6]]` cannot be prepended to a DataFrame with 2 series such as `[[7, 8], [9, 10]]`.\n *\n * Only the same DataPrimitive type or a DataPrimitive\'s composite DataPrimitives\n * (e.g. DataSeries or DataPoint for DataFrame, or a DataPoint for a DataSeries) can be prepended to the pre-existing DataPrimitive.\n *\n * ```js\n * primary | seriesByName("users") | prepend(staticUser)\', // returns [\'All users\', \'Maurine\', \'Jennings\']\n * ids: \'> primary | seriesByName("ids") | prepend(staticId)\' // returns [\'*\', \'1\', \'2\', \'3\']\n * pathologicalIds: \'> primary | seriesByName("idsAsNumbers") | prepend(staticId)\' // throws an error, since `staticId` is a string, while the pre-existing series is composed of numbers\n * }}\n * options={{\n * consolidatedUsers: \'> primary | seriesByName("users") | prepend(additionalUsers)\', // returns [\'Andrew\', \'Chanelle\', \'Maurine\', \'Jennings\']\n * // returns {\n * // columns: [[\'Maurine\', \'Jennings\', \'Maurine\', \'Jennings\'], [\'1\', \'2\', \'1\', \'2\']]\n * // fields: [{ name: \'users\' }, { name: \'ids\' }]\n * // }\n * prependingFrames: \'> primary | prepend(primary)\'\n * }}\n * dataSources={{\n * primary: {\n * data: {\n * columns: [[\'Maurine\', \'Jennings\'], [\'1\', \'2\']],\n * fields: [{ name: \'users\' }, { name: \'ids\' }]\n * }\n * }\n * }}\n * />\n * ```\n */\n\n\n var Prepend = /*#__PURE__*/function () {\n function Prepend(d) {\n _classCallCheck(this, Prepend); // needs to be able to prepend DataPrimitive and raw\n\n\n this.prependMe = (0, DataPrimitive_1.isDataPrimitive)(d) ? d : Helper_1.Helper.dataPrimitiveFromRaw(EncodingExecutor_1.default.rawTree(d));\n }\n\n _createClass(Prepend, [{\n key: "format",\n value: function format(subject) {\n if (DataFrame_1.DataFrame.isDataFrame(subject)) {\n return this.prependToFrame(subject);\n }\n\n if (DataSeries_1.DataSeries.isDataSeries(subject)) {\n return this.prependToSeries(subject);\n }\n\n throw new Error("Can only prepend to DataFrame or DataSeries");\n }\n }, {\n key: "prependToFrame",\n value: function prependToFrame(subject) {\n if (DataFrame_1.DataFrame.isDataFrame(this.prependMe)) {\n return this.prependFrameToFrame(subject);\n }\n\n if (DataSeries_1.DataSeries.isDataSeries(this.prependMe)) {\n return this.prependASeriesToEachSeriesOfFrame(subject);\n }\n\n if (DataPoint_1.DataPoint.isDataPoint(this.prependMe)) {\n return this.prependAPointToEachSeriesOfFrame(subject);\n }\n\n throw new Error("\'prepend\' formatter only accepts DataFrame, DataSeries, or DataPoint as argument");\n }\n }, {\n key: "prependToSeries",\n value: function prependToSeries(subject) {\n if (DataFrame_1.DataFrame.isDataFrame(this.prependMe)) {\n throw new Error(\'cannot prepend a DataFrame to a DataSeries\');\n } else if (DataSeries_1.DataSeries.isDataSeries(this.prependMe)) {\n return this.prependSeriesToSeries(subject, this.prependMe);\n } else if (DataPoint_1.DataPoint.isDataPoint(this.prependMe)) {\n return this.prependPointToSeries(subject);\n }\n\n throw new Error("\'prepend\' to series formatter only DataSeries, or DataPoint as argument");\n }\n }, {\n key: "prependAPointToEachSeriesOfFrame",\n value: function prependAPointToEachSeriesOfFrame(dp) {\n var _this = this;\n\n return new DataFrame_1.DataFrame(dp.series.map(function (s) {\n return _this.prependPointToSeries(s);\n }));\n }\n }, {\n key: "prependASeriesToEachSeriesOfFrame",\n value: function prependASeriesToEachSeriesOfFrame(frame) {\n var _this2 = this;\n\n return new DataFrame_1.DataFrame(frame.series.map(function (s) {\n return _this2.prependSeriesToSeries(s, _this2.prependMe);\n }));\n }\n }, {\n key: "prependFrameToFrame",\n value: function prependFrameToFrame(frame) {\n var _this3 = this;\n\n var numSeries1 = this.prependMe.series.length;\n var numSeries2 = frame.series.length;\n\n if (numSeries1 !== numSeries2) {\n throw new Error("can\'t prepend a frame with ".concat(numSeries1, " columns to a field with ").concat(numSeries2, " columns"));\n }\n\n return new DataFrame_1.DataFrame(frame.series.map(function (s, i) {\n return _this3.prependSeriesToSeries(s, _this3.prependMe.seriesByIndex(i));\n }));\n }\n }, {\n key: "prependSeriesToSeries",\n value: function prependSeriesToSeries(series, prependMe) {\n var field = series.field; // we will use this to insure the prepended series has the same field\n\n var type1 = series.points.length > 0 ? series.points[0].getValue().type : undefined;\n var type2 = prependMe.points.length > 0 ? prependMe.points[0].getValue().type : undefined;\n\n if (type1 && type2 && type1 !== type2) {\n throw new Error("cannot prepend ".concat(type2, " to ").concat(type1));\n }\n\n return new DataSeries_1.DataSeries(prependMe.points.map(function (p) {\n return new DataPoint_1.DataPoint(field, p.getValue());\n }).concat(series.points));\n }\n }, {\n key: "prependPointToSeries",\n value: function prependPointToSeries(s) {\n var field = s.field;\n var typedValue = s.firstPoint().getValue(); // we must use the existing series type for the prepended point\n\n var type1 = typedValue.type;\n var typedValue2 = this.prependMe.getValue();\n var type2 = typedValue2.type;\n\n if (type1 !== type2) {\n throw new Error("cannot prepend point of type ".concat(type2, " to series of type ").concat(type1));\n }\n\n var newPoint = new DataPoint_1.DataPoint(field, typedValue2);\n return new DataSeries_1.DataSeries([newPoint].concat(_toConsumableArray(s.points)));\n }\n }]);\n\n return Prepend;\n }();\n\n exports.Prepend = Prepend;\n /***/\n},\n/* 41 */\n\n/***/\nfunction (module, exports, __webpack_require__) {\n "use strict";\n\n var _defineProperty = __webpack_require__(42);\n\n var _classCallCheck = __webpack_require__(0);\n\n var _createClass = __webpack_require__(1);\n\n var __importDefault = this && this.__importDefault || function (mod) {\n return mod && mod.__esModule ? mod : {\n "default": mod\n };\n };\n\n Object.defineProperty(exports, "__esModule", {\n value: true\n });\n exports.Objects = void 0;\n\n var lodash_1 = __webpack_require__(5);\n\n var DataPoint_1 = __webpack_require__(2);\n\n var DataSeries_1 = __webpack_require__(10);\n\n var DataFrame_1 = __webpack_require__(12);\n\n var EncodingExecutor_1 = __importDefault(__webpack_require__(3));\n /**\n * Formatter which converts a DataPrimitive into an array of objects. This is typically used in conjunction with UDF inputs.\n *\n * ```js\n * // UDF inputs\n * {\n * "inputs": {\n * "input1": {\n * "context": {\n * "staticOptions": [["All Users"], ["*"]],\n * "field1": "> primary | seriesByName(\\"users\\") | renameSeries(\\"label\\")",\n * "field2": "> primary | seriesByName(\\"ids\\") | renameSeries(\\"value\\")"",\n * },\n * "type": "input.multiselect",\n * "options": {\n * "items": "> frame(field1, field2) | prepend(staticOptions) | objects()"\n * // returns [\n * // { label: \'All users\', value: \'*\' },\n * // { label: \'jane doe\', value: \'jdoe\' },\n * // { label: \'joe schmo\', value: \'jschmo\' },\n * // { label: \'jack schmidt\', value: \'jschmidt\' },\n * // ]\n * ]\n * },\n * "dataSources": {\n * "primary": {\n * "data": {\n * "fields": [{ "name": \'users\' } , { "name": "ids" } ],\n * "columns": [[ "jane doe", "joe schmo", "jack schmidt"], ["jdoe", "jschmo", "jschmidt"]]\n * }\n * }\n * },\n * }\n * }\n * }\n * ```\n */\n\n\n var Objects = /*#__PURE__*/function () {\n function Objects(objectConfig) {\n _classCallCheck(this, Objects);\n\n this.config = EncodingExecutor_1.default.rawTree(objectConfig);\n }\n\n _createClass(Objects, [{\n key: "format",\n value: function format(dp) {\n if (DataFrame_1.DataFrame.isDataFrame(dp)) {\n var mergedObjectSeries = this.seriesToObjects(dp.series[0]);\n\n for (var i = 1; i < dp.series.length; i += 1) {\n var mergeMeIn = this.seriesToObjects(dp.series[i]);\n\n for (var j = 0; j < mergedObjectSeries.length; j += 1) {\n mergedObjectSeries[j] = (0, lodash_1.merge)(mergedObjectSeries[j], mergeMeIn[j]);\n }\n }\n\n return mergedObjectSeries;\n }\n\n if (DataSeries_1.DataSeries.isDataSeries(dp)) {\n return this.seriesToObjects(dp);\n }\n\n if (DataPoint_1.DataPoint.isDataPoint(dp)) {\n return [_defineProperty({}, dp.field, dp.getRawValue())];\n }\n\n throw new Error("\'objects\' formatter only allowed on DataFrame, DataPoint, or DataSeries");\n }\n }, {\n key: "seriesToObjects",\n value: function seriesToObjects(s) {\n var _this = this;\n\n return s.points.reduce(function (acc, pt) {\n var key = pt.field;\n\n if (_this.config && _this.config.rename) {\n key = _this.config.rename[key] || key;\n }\n\n acc.push(_defineProperty({}, key, pt.getRawValue()));\n return acc;\n }, []);\n }\n }]);\n\n return Objects;\n }();\n\n exports.Objects = Objects;\n /***/\n},\n/* 42 */\n\n/***/\nfunction (module, exports) {\n module.exports = __webpack_require__(86);\n /***/\n},\n/* 43 */\n\n/***/\nfunction (module, exports, __webpack_require__) {\n "use strict";\n\n var _classCallCheck = __webpack_require__(0);\n\n var _createClass = __webpack_require__(1);\n\n var __importDefault = this && this.__importDefault || function (mod) {\n return mod && mod.__esModule ? mod : {\n "default": mod\n };\n };\n\n Object.defineProperty(exports, "__esModule", {\n value: true\n });\n exports.MultiFormat = void 0;\n\n var FormatterPresets_1 = __webpack_require__(23);\n\n var EncodingExecutor_1 = __importDefault(__webpack_require__(3));\n /**\n * Formatter which accepts a config object containing a map of field-specific formatters.\n * The field-specific formatter is used to evaluate each fields\' corresponding values.\n *\n * The three required fields are as follows:\n *\n * - `nameField`, which denotes the list of keys with custom formatters to be applied against\n *\n * - `valueField`, which denotes the field to derive the values from\n *\n * - `formatter1. which is an object that requires the `type` of formatter and the specific required for the specified formatter.\n *\n * ```js\n * primary | seriesByName("pathIds")\', // returns [\'id1\', \'id2\']\n * areaValues: \'> primary | seriesByName("values")\', // returns [100, 200]\n * areaColors: \'> primary | multiFormat(areaColorsFormat)\' // returns [\'#FF0000\', \'#0000FF\']\n * }}\n * dataSources={{\n * primary: {\n * data: {\n * columns: [[\'id1\', \'id2\'], [100, 200]]\n * fields: [{ name: \'pathIds\' }, { name: \'values\' }]\n * }\n * }\n * }}\n * />\n * ```\n *\n */\n\n\n var MultiFormat = /*#__PURE__*/function () {\n function MultiFormat(formatConfig) {\n _classCallCheck(this, MultiFormat);\n\n this.config = EncodingExecutor_1.default.rawTree(formatConfig);\n }\n\n _createClass(MultiFormat, [{\n key: "format",\n value: function format(f) {\n var _this = this;\n\n var namesDataSeries = f.seriesByName(this.config.nameField);\n var valuesDataSeries = f.seriesByName(this.config.valueField); // choroplethSVG expects that the names and values are of the same length\n // otherwise there would be no way to map an areaId with an areaValue\n\n return namesDataSeries.points.map(function (name, i) {\n var _this$config$formatte = _this.config.formatters[name.getRawValue()],\n type = _this$config$formatte.type,\n config = _this$config$formatte.config;\n\n var FormatterClass = FormatterPresets_1.formatterClasses[type];\n var value = valuesDataSeries.pointByIndex(i);\n\n if (!FormatterClass) {\n throw new Error("unknown formatter type \\"".concat(type, "\\" was specified"));\n }\n\n return new FormatterClass(config).format(value, valuesDataSeries);\n });\n }\n }]);\n\n return MultiFormat;\n }();\n\n exports.MultiFormat = MultiFormat;\n /***/\n},\n/* 44 */\n\n/***/\nfunction (module, exports, __webpack_require__) {\n "use strict";\n\n var _classCallCheck = __webpack_require__(0);\n\n var _createClass = __webpack_require__(1);\n\n var _inherits = __webpack_require__(6);\n\n var _possibleConstructorReturn = __webpack_require__(7);\n\n var _getPrototypeOf = __webpack_require__(8);\n\n function _createSuper(Derived) {\n var hasNativeReflectConstruct = _isNativeReflectConstruct();\n\n return function _createSuperInternal() {\n var Super = _getPrototypeOf(Derived),\n result;\n\n if (hasNativeReflectConstruct) {\n var NewTarget = _getPrototypeOf(this).constructor;\n\n result = Reflect.construct(Super, arguments, NewTarget);\n } else {\n result = Super.apply(this, arguments);\n }\n\n return _possibleConstructorReturn(this, result);\n };\n }\n\n function _isNativeReflectConstruct() {\n if (typeof Reflect === "undefined" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === "function") return true;\n\n try {\n Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n }\n\n var __createBinding = this && this.__createBinding || (Object.create ? function (o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n\n if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = {\n enumerable: true,\n get: function get() {\n return m[k];\n }\n };\n }\n\n Object.defineProperty(o, k2, desc);\n } : function (o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n });\n\n var __setModuleDefault = this && this.__setModuleDefault || (Object.create ? function (o, v) {\n Object.defineProperty(o, "default", {\n enumerable: true,\n value: v\n });\n } : function (o, v) {\n o["default"] = v;\n });\n\n var __importStar = this && this.__importStar || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) {\n if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n }\n\n __setModuleDefault(result, mod);\n\n return result;\n };\n\n var __importDefault = this && this.__importDefault || function (mod) {\n return mod && mod.__esModule ? mod : {\n "default": mod\n };\n };\n\n Object.defineProperty(exports, "__esModule", {\n value: true\n });\n exports.MaxContrast = void 0;\n\n var chroma = __importStar(__webpack_require__(21));\n\n var lodash_1 = __webpack_require__(5);\n\n var colorUtils_1 = __webpack_require__(16);\n\n var Formatter_1 = __webpack_require__(9);\n\n var EncodingExecutor_1 = __importDefault(__webpack_require__(3));\n /**\n * MaxContrast can be used to pick the color with maxContrast.\n *\n * ```js\n * color1 | maxContrast(contrastConfig)\', // white\n * color2: \'gray\'\n * maxContrastOfColor2: \'> color2 | maxContrast(contrastConfig)\', // black\n * }}\n * dataSources={{\n * primary: {\n * data: {\n * fields: [{ name: \'foo\' }]\n * columns: [[100, 200]]\n * }\n * }\n * }}\n * />\n * ```\n * Leverages [Chromajs.contrast](https://gka.github.io/chroma.js/#chroma-contrast) to determine contrast between color and values\n *\n * ## Config Object\n * * **colors**: \'string[]\' array of colors to compare contrast against\n * * **default**: \'string\' default color if no colors or the contrast is not found\n *\n */\n\n\n var MaxContrast = /*#__PURE__*/function (_Formatter_1$Abstract) {\n _inherits(MaxContrast, _Formatter_1$Abstract);\n\n var _super = _createSuper(MaxContrast);\n\n function MaxContrast(config) {\n var _this;\n\n _classCallCheck(this, MaxContrast);\n\n _this = _super.call(this);\n _this.config = EncodingExecutor_1.default.rawTree(config);\n return _this;\n }\n\n _createClass(MaxContrast, [{\n key: "formatTypedValue",\n value: function formatTypedValue(p) {\n var _p$getValue = p.getValue(),\n value = _p$getValue.value,\n type = _p$getValue.type;\n\n if (type !== \'color\' || !(0, colorUtils_1.isColor)(value)) {\n return {\n type: type,\n value: value\n };\n }\n\n var colorConfig = (0, lodash_1.get)(this, \'config.colors\');\n var defaultColor = (0, lodash_1.get)(this, \'config.default\');\n\n if (!Array.isArray(colorConfig) || colorConfig.length === 0) {\n return (0, colorUtils_1.isColor)(defaultColor) ? {\n type: \'color\',\n value: defaultColor\n } : {\n type: type,\n value: value\n };\n }\n\n if (value === \'transparent\' && (0, colorUtils_1.isColor)(defaultColor)) {\n return {\n type: \'color\',\n value: defaultColor\n };\n }\n\n try {\n return {\n type: \'color\',\n value: (0, lodash_1.chain)(colorConfig).map(function (c) {\n return {\n color: c,\n contrast: chroma.contrast(value, c)\n };\n }).maxBy(\'contrast\').value().color\n };\n } catch (error) {\n console.warn(error);\n return {\n type: \'color\',\n value: defaultColor || value\n };\n }\n }\n }]);\n\n return MaxContrast;\n }(Formatter_1.AbstractFormatter);\n\n exports.MaxContrast = MaxContrast;\n /***/\n},\n/* 45 */\n\n/***/\nfunction (module, exports, __webpack_require__) {\n "use strict";\n\n var _classCallCheck = __webpack_require__(0);\n\n var _createClass = __webpack_require__(1);\n\n var _get = __webpack_require__(46);\n\n var _inherits = __webpack_require__(6);\n\n var _possibleConstructorReturn = __webpack_require__(7);\n\n var _getPrototypeOf = __webpack_require__(8);\n\n function _createSuper(Derived) {\n var hasNativeReflectConstruct = _isNativeReflectConstruct();\n\n return function _createSuperInternal() {\n var Super = _getPrototypeOf(Derived),\n result;\n\n if (hasNativeReflectConstruct) {\n var NewTarget = _getPrototypeOf(this).constructor;\n\n result = Reflect.construct(Super, arguments, NewTarget);\n } else {\n result = Super.apply(this, arguments);\n }\n\n return _possibleConstructorReturn(this, result);\n };\n }\n\n function _isNativeReflectConstruct() {\n if (typeof Reflect === "undefined" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === "function") return true;\n\n try {\n Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n }\n\n Object.defineProperty(exports, "__esModule", {\n value: true\n });\n exports.RenameSeries = void 0;\n\n var DataPoint_1 = __webpack_require__(2);\n\n var Default_1 = __webpack_require__(47);\n /**\n * This formatter can be used to rename a series name\n *\n * Example: renameSeries("username").\n *\n * ```js\n * primary | getField()\' // [\'users\', \'ids\']\n * dataframe: \'> primary | renameSeries("username") | getField()\' // [\'username\', \'ids\']\n * dataSeries: \'> primary | seriesByName("users") | renameSeries("username") | getField()\' // \'username\'\n * dataPoint: \'> primary | seriesByName("users") | lastPoint() | renameSeries("username") | getField()\' // \'username\'\n * }}\n * dataSources={{\n * primary: {\n * data: {\n * columns: [[\'Maurine\', \'Jennings\', \'Giuseppe\'], [\'1\', \'2\', \'3\']],\n * fields: [{ name: \'users\' }, { name: \'ids\' }]\n * }\n * }\n * }}\n * />\n * ```\n * ## Arguments\n * * **fieldName**: \'string\' new field name for the series\n */\n\n\n var RenameSeries = /*#__PURE__*/function (_Default_1$Default) {\n _inherits(RenameSeries, _Default_1$Default);\n\n var _super = _createSuper(RenameSeries);\n\n function RenameSeries(name) {\n var _this;\n\n _classCallCheck(this, RenameSeries);\n\n _this = _super.call(this, name);\n _this.newFieldName = name;\n return _this;\n }\n\n _createClass(RenameSeries, [{\n key: "formatPoint",\n value: function formatPoint(p, s) {\n var i = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n var j = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;\n return i === 0 && typeof this.newFieldName === \'string\' && this.newFieldName.length > 0 ? new DataPoint_1.DataPoint(this.newFieldName, this.formatTypedValue(p, s, i, j)) : _get(_getPrototypeOf(RenameSeries.prototype), "formatPoint", this).call(this, p, s, i, j);\n }\n }]);\n\n return RenameSeries;\n }(Default_1.Default);\n\n exports.RenameSeries = RenameSeries;\n /***/\n},\n/* 46 */\n\n/***/\nfunction (module, exports) {\n module.exports = __webpack_require__(87);\n /***/\n},\n/* 47 */\n\n/***/\nfunction (module, exports, __webpack_require__) {\n "use strict";\n\n var _classCallCheck = __webpack_require__(0);\n\n var _createClass = __webpack_require__(1);\n\n var _inherits = __webpack_require__(6);\n\n var _possibleConstructorReturn = __webpack_require__(7);\n\n var _getPrototypeOf = __webpack_require__(8);\n\n function _createSuper(Derived) {\n var hasNativeReflectConstruct = _isNativeReflectConstruct();\n\n return function _createSuperInternal() {\n var Super = _getPrototypeOf(Derived),\n result;\n\n if (hasNativeReflectConstruct) {\n var NewTarget = _getPrototypeOf(this).constructor;\n\n result = Reflect.construct(Super, arguments, NewTarget);\n } else {\n result = Super.apply(this, arguments);\n }\n\n return _possibleConstructorReturn(this, result);\n };\n }\n\n function _isNativeReflectConstruct() {\n if (typeof Reflect === "undefined" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === "function") return true;\n\n try {\n Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n }\n\n var __importDefault = this && this.__importDefault || function (mod) {\n return mod && mod.__esModule ? mod : {\n "default": mod\n };\n };\n\n Object.defineProperty(exports, "__esModule", {\n value: true\n });\n exports.Default = void 0;\n\n var Formatter_1 = __webpack_require__(9);\n\n var EncodingExecutor_1 = __importDefault(__webpack_require__(3));\n\n var TypeSafeValue_1 = __webpack_require__(11);\n\n var Default = /*#__PURE__*/function (_Formatter_1$Abstract) {\n _inherits(Default, _Formatter_1$Abstract);\n\n var _super = _createSuper(Default);\n\n function Default(val) {\n var _this;\n\n _classCallCheck(this, Default);\n\n _this = _super.call(this);\n _this.defaultVal = EncodingExecutor_1.default.rawTree(val);\n return _this;\n } // eslint-disable-next-line @typescript-eslint/no-unused-vars\n\n\n _createClass(Default, [{\n key: "formatTypedValue",\n value: function formatTypedValue(p, s) {\n var i = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n var j = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;\n\n if (p.getRawValue() === undefined) {\n return TypeSafeValue_1.TypeSafeValue.fromRaw(this.defaultVal);\n }\n\n return p.getValue();\n }\n }]);\n\n return Default;\n }(Formatter_1.AbstractFormatter);\n\n exports.Default = Default;\n /***/\n},,,,\n/* 48 */\n\n/* 49 */\n\n/* 50 */\n\n/* 51 */\n\n/***/\nfunction (module, exports, __webpack_require__) {\n "use strict";\n\n var _classCallCheck = __webpack_require__(0);\n\n var _createClass = __webpack_require__(1);\n\n var __importDefault = this && this.__importDefault || function (mod) {\n return mod && mod.__esModule ? mod : {\n "default": mod\n };\n };\n\n Object.defineProperty(exports, "__esModule", {\n value: true\n });\n exports.Options = void 0;\n\n var lodash_1 = __webpack_require__(5);\n\n var DataFrame_1 = __webpack_require__(12);\n\n var EncodingExecutor_1 = __importDefault(__webpack_require__(3));\n\n var Options = /*#__PURE__*/function () {\n function Options() {\n _classCallCheck(this, Options);\n }\n\n _createClass(Options, null, [{\n key: "evaluate",\n value:\n /**\n * Takes the options stanza and the dataSources, and returns a simple properties object. Any options\n * that were expressions are evaluated. The resulting object is suitable to pass to a pure viz as props.\n * @param {OptionsStanza} options\n * @param dataSources\n * @param themeFunc\n * @returns {object}\n */\n function evaluate(options, dataSources, themeFunc, dataFramesIn) {\n var dataFrames;\n\n if (dataFramesIn) {\n dataFrames = dataFramesIn;\n } else {\n dataFrames = Options.dataFrameFromDataSource(dataSources);\n }\n\n return new EncodingExecutor_1.default().executeOptions(options, dataFrames, themeFunc);\n }\n }, {\n key: "dataFrameFromDataSource",\n value: function dataFrameFromDataSource(dataSources) {\n return Object.freeze((0, lodash_1.mapValues)(dataSources, function (ds) {\n return DataFrame_1.DataFrame.fromJsonCols(ds);\n }));\n }\n }]);\n\n return Options;\n }();\n\n exports.Options = Options;\n /***/\n}\n/******/\n]);\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports, __webpack_require__) {\n\n"use strict";\n\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { "default": mod };\n};\nObject.defineProperty(exports, "__esModule", { value: true });\nconst HandleMessage_1 = __importDefault(__webpack_require__(18));\n// eslint-disable-next-line no-restricted-globals\nconst ctx = self;\nctx.addEventListener(\'message\', (event) => __awaiter(void 0, void 0, void 0, function* () {\n ctx.postMessage((0, HandleMessage_1.default)(event));\n}));\nexports.default = ctx;\n\n\n/***/ }),\n/* 18 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _splunk_visualization_encoding_Options__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(16);\n/* harmony import */ var _splunk_visualization_encoding_Options__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_splunk_visualization_encoding_Options__WEBPACK_IMPORTED_MODULE_0__);\n\n/**\n *\n * @param {event} MessageEvent\n * @returns {\n * visualizationID: string,\n * results: ...return value of Options.evaluate\n * }\n */\n\nvar handleMessage = function handleMessage(event) {\n var _event$data;\n\n if ((event === null || event === void 0 ? void 0 : (_event$data = event.data) === null || _event$data === void 0 ? void 0 : _event$data.message) === \'evaluate\') {\n var _event$data2, _event$data3, _event$data4, _event$data5, _event$data6;\n\n var props = event === null || event === void 0 ? void 0 : (_event$data2 = event.data) === null || _event$data2 === void 0 ? void 0 : _event$data2.props;\n var options = event === null || event === void 0 ? void 0 : (_event$data3 = event.data) === null || _event$data3 === void 0 ? void 0 : _event$data3.options;\n var dataSources = event === null || event === void 0 ? void 0 : (_event$data4 = event.data) === null || _event$data4 === void 0 ? void 0 : _event$data4.dataSources;\n var themeFuncUnresolved = {};\n var themeFuncResolved = event === null || event === void 0 ? void 0 : (_event$data5 = event.data) === null || _event$data5 === void 0 ? void 0 : _event$data5.themeFuncResolved;\n Object.keys(themeFuncResolved).forEach(function (key) {\n var func = function func() {\n return themeFuncResolved[key];\n };\n\n themeFuncUnresolved[key] = func;\n });\n\n var themeFunc = function themeFunc(themeVar) {\n var _themeFuncUnresolved$;\n\n return (_themeFuncUnresolved$ = themeFuncUnresolved[themeVar]) === null || _themeFuncUnresolved$ === void 0 ? void 0 : _themeFuncUnresolved$.call(themeFuncUnresolved, props);\n };\n\n var results = _splunk_visualization_encoding_Options__WEBPACK_IMPORTED_MODULE_0__["Options"].evaluate(options, dataSources, themeFunc);\n return {\n visualizationID: event === null || event === void 0 ? void 0 : (_event$data6 = event.data) === null || _event$data6 === void 0 ? void 0 : _event$data6.visualizationID,\n results: results\n };\n }\n\n return {};\n};\n\n/* harmony default export */ __webpack_exports__["default"] = (handleMessage);\n\n/***/ }),\n/* 19 */\n/***/ (function(module, exports) {\n\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError("Cannot call a class as a function");\n }\n}\n\nmodule.exports = _classCallCheck;\nmodule.exports["default"] = module.exports, module.exports.__esModule = true;\n\n/***/ }),\n/* 20 */\n/***/ (function(module, exports) {\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if ("value" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nmodule.exports = _createClass;\nmodule.exports["default"] = module.exports, module.exports.__esModule = true;\n\n/***/ }),\n/* 21 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(global, module) {/*** IMPORTS FROM imports-loader ***/\nvar define = false;\n\n/**\n * @license\n * Lodash \n * Copyright OpenJS Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n;(function() {\n\n /** Used as a safe reference for `undefined` in pre-ES5 environments. */\n var undefined;\n\n /** Used as the semantic version number. */\n var VERSION = \'4.17.21\';\n\n /** Used as the size to enable large array optimizations. */\n var LARGE_ARRAY_SIZE = 200;\n\n /** Error message constants. */\n var CORE_ERROR_TEXT = \'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.\',\n FUNC_ERROR_TEXT = \'Expected a function\',\n INVALID_TEMPL_VAR_ERROR_TEXT = \'Invalid `variable` option passed into `_.template`\';\n\n /** Used to stand-in for `undefined` hash values. */\n var HASH_UNDEFINED = \'__lodash_hash_undefined__\';\n\n /** Used as the maximum memoize cache size. */\n var MAX_MEMOIZE_SIZE = 500;\n\n /** Used as the internal argument placeholder. */\n var PLACEHOLDER = \'__lodash_placeholder__\';\n\n /** Used to compose bitmasks for cloning. */\n var CLONE_DEEP_FLAG = 1,\n CLONE_FLAT_FLAG = 2,\n CLONE_SYMBOLS_FLAG = 4;\n\n /** Used to compose bitmasks for value comparisons. */\n var COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n /** Used to compose bitmasks for function metadata. */\n var WRAP_BIND_FLAG = 1,\n WRAP_BIND_KEY_FLAG = 2,\n WRAP_CURRY_BOUND_FLAG = 4,\n WRAP_CURRY_FLAG = 8,\n WRAP_CURRY_RIGHT_FLAG = 16,\n WRAP_PARTIAL_FLAG = 32,\n WRAP_PARTIAL_RIGHT_FLAG = 64,\n WRAP_ARY_FLAG = 128,\n WRAP_REARG_FLAG = 256,\n WRAP_FLIP_FLAG = 512;\n\n /** Used as default options for `_.truncate`. */\n var DEFAULT_TRUNC_LENGTH = 30,\n DEFAULT_TRUNC_OMISSION = \'...\';\n\n /** Used to detect hot functions by number of calls within a span of milliseconds. */\n var HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n /** Used to indicate the type of lazy iteratees. */\n var LAZY_FILTER_FLAG = 1,\n LAZY_MAP_FLAG = 2,\n LAZY_WHILE_FLAG = 3;\n\n /** Used as references for various `Number` constants. */\n var INFINITY = 1 / 0,\n MAX_SAFE_INTEGER = 9007199254740991,\n MAX_INTEGER = 1.7976931348623157e+308,\n NAN = 0 / 0;\n\n /** Used as references for the maximum length and index of an array. */\n var MAX_ARRAY_LENGTH = 4294967295,\n MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,\n HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;\n\n /** Used to associate wrap methods with their bit flags. */\n var wrapFlags = [\n [\'ary\', WRAP_ARY_FLAG],\n [\'bind\', WRAP_BIND_FLAG],\n [\'bindKey\', WRAP_BIND_KEY_FLAG],\n [\'curry\', WRAP_CURRY_FLAG],\n [\'curryRight\', WRAP_CURRY_RIGHT_FLAG],\n [\'flip\', WRAP_FLIP_FLAG],\n [\'partial\', WRAP_PARTIAL_FLAG],\n [\'partialRight\', WRAP_PARTIAL_RIGHT_FLAG],\n [\'rearg\', WRAP_REARG_FLAG]\n ];\n\n /** `Object#toString` result references. */\n var argsTag = \'[object Arguments]\',\n arrayTag = \'[object Array]\',\n asyncTag = \'[object AsyncFunction]\',\n boolTag = \'[object Boolean]\',\n dateTag = \'[object Date]\',\n domExcTag = \'[object DOMException]\',\n errorTag = \'[object Error]\',\n funcTag = \'[object Function]\',\n genTag = \'[object GeneratorFunction]\',\n mapTag = \'[object Map]\',\n numberTag = \'[object Number]\',\n nullTag = \'[object Null]\',\n objectTag = \'[object Object]\',\n promiseTag = \'[object Promise]\',\n proxyTag = \'[object Proxy]\',\n regexpTag = \'[object RegExp]\',\n setTag = \'[object Set]\',\n stringTag = \'[object String]\',\n symbolTag = \'[object Symbol]\',\n undefinedTag = \'[object Undefined]\',\n weakMapTag = \'[object WeakMap]\',\n weakSetTag = \'[object WeakSet]\';\n\n var arrayBufferTag = \'[object ArrayBuffer]\',\n dataViewTag = \'[object DataView]\',\n float32Tag = \'[object Float32Array]\',\n float64Tag = \'[object Float64Array]\',\n int8Tag = \'[object Int8Array]\',\n int16Tag = \'[object Int16Array]\',\n int32Tag = \'[object Int32Array]\',\n uint8Tag = \'[object Uint8Array]\',\n uint8ClampedTag = \'[object Uint8ClampedArray]\',\n uint16Tag = \'[object Uint16Array]\',\n uint32Tag = \'[object Uint32Array]\';\n\n /** Used to match empty string literals in compiled template source. */\n var reEmptyStringLeading = /\\b__p \\+= \'\';/g,\n reEmptyStringMiddle = /\\b(__p \\+=) \'\' \\+/g,\n reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n\'\';/g;\n\n /** Used to match HTML entities and HTML characters. */\n var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,\n reUnescapedHtml = /[&<>"\']/g,\n reHasEscapedHtml = RegExp(reEscapedHtml.source),\n reHasUnescapedHtml = RegExp(reUnescapedHtml.source);\n\n /** Used to match template delimiters. */\n var reEscape = /<%-([\\s\\S]+?)%>/g,\n reEvaluate = /<%([\\s\\S]+?)%>/g,\n reInterpolate = /<%=([\\s\\S]+?)%>/g;\n\n /** Used to match property names within property paths. */\n var reIsDeepProp = /\\.|\\[(?:[^[\\]]*|(["\'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/,\n rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|(["\'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n /**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\n var reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g,\n reHasRegExpChar = RegExp(reRegExpChar.source);\n\n /** Used to match leading whitespace. */\n var reTrimStart = /^\\s+/;\n\n /** Used to match a single whitespace character. */\n var reWhitespace = /\\s/;\n\n /** Used to match wrap detail comments. */\n var reWrapComment = /\\{(?:\\n\\/\\* \\[wrapped with .+\\] \\*\\/)?\\n?/,\n reWrapDetails = /\\{\\n\\/\\* \\[wrapped with (.+)\\] \\*/,\n reSplitDetails = /,? & /;\n\n /** Used to match words composed of alphanumeric characters. */\n var reAsciiWord = /[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;\n\n /**\n * Used to validate the `validate` option in `_.template` variable.\n *\n * Forbids characters which could potentially change the meaning of the function argument definition:\n * - "()," (modification of function parameters)\n * - "=" (default value)\n * - "[]{}" (destructuring of function parameters)\n * - "/" (beginning of a comment)\n * - whitespace\n */\n var reForbiddenIdentifierChars = /[()=,{}\\[\\]\\/\\s]/;\n\n /** Used to match backslashes in property paths. */\n var reEscapeChar = /\\\\(\\\\)?/g;\n\n /**\n * Used to match\n * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).\n */\n var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\n\n /** Used to match `RegExp` flags from their coerced string values. */\n var reFlags = /\\w*$/;\n\n /** Used to detect bad signed hexadecimal string values. */\n var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n /** Used to detect binary string values. */\n var reIsBinary = /^0b[01]+$/i;\n\n /** Used to detect host constructors (Safari). */\n var reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n /** Used to detect octal string values. */\n var reIsOctal = /^0o[0-7]+$/i;\n\n /** Used to detect unsigned integer values. */\n var reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n /** Used to match Latin Unicode letters (excluding mathematical operators). */\n var reLatin = /[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g;\n\n /** Used to ensure capturing order of template delimiters. */\n var reNoMatch = /($^)/;\n\n /** Used to match unescaped characters in compiled string literals. */\n var reUnescapedString = /[\'\\n\\r\\u2028\\u2029\\\\]/g;\n\n /** Used to compose unicode character classes. */\n var rsAstralRange = \'\\\\ud800-\\\\udfff\',\n rsComboMarksRange = \'\\\\u0300-\\\\u036f\',\n reComboHalfMarksRange = \'\\\\ufe20-\\\\ufe2f\',\n rsComboSymbolsRange = \'\\\\u20d0-\\\\u20ff\',\n rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n rsDingbatRange = \'\\\\u2700-\\\\u27bf\',\n rsLowerRange = \'a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff\',\n rsMathOpRange = \'\\\\xac\\\\xb1\\\\xd7\\\\xf7\',\n rsNonCharRange = \'\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf\',\n rsPunctuationRange = \'\\\\u2000-\\\\u206f\',\n rsSpaceRange = \' \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000\',\n rsUpperRange = \'A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde\',\n rsVarRange = \'\\\\ufe0e\\\\ufe0f\',\n rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;\n\n /** Used to compose unicode capture groups. */\n var rsApos = "[\'\\u2019]",\n rsAstral = \'[\' + rsAstralRange + \']\',\n rsBreak = \'[\' + rsBreakRange + \']\',\n rsCombo = \'[\' + rsComboRange + \']\',\n rsDigits = \'\\\\d+\',\n rsDingbat = \'[\' + rsDingbatRange + \']\',\n rsLower = \'[\' + rsLowerRange + \']\',\n rsMisc = \'[^\' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + \']\',\n rsFitz = \'\\\\ud83c[\\\\udffb-\\\\udfff]\',\n rsModifier = \'(?:\' + rsCombo + \'|\' + rsFitz + \')\',\n rsNonAstral = \'[^\' + rsAstralRange + \']\',\n rsRegional = \'(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}\',\n rsSurrPair = \'[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]\',\n rsUpper = \'[\' + rsUpperRange + \']\',\n rsZWJ = \'\\\\u200d\';\n\n /** Used to compose unicode regexes. */\n var rsMiscLower = \'(?:\' + rsLower + \'|\' + rsMisc + \')\',\n rsMiscUpper = \'(?:\' + rsUpper + \'|\' + rsMisc + \')\',\n rsOptContrLower = \'(?:\' + rsApos + \'(?:d|ll|m|re|s|t|ve))?\',\n rsOptContrUpper = \'(?:\' + rsApos + \'(?:D|LL|M|RE|S|T|VE))?\',\n reOptMod = rsModifier + \'?\',\n rsOptVar = \'[\' + rsVarRange + \']?\',\n rsOptJoin = \'(?:\' + rsZWJ + \'(?:\' + [rsNonAstral, rsRegional, rsSurrPair].join(\'|\') + \')\' + rsOptVar + reOptMod + \')*\',\n rsOrdLower = \'\\\\d*(?:1st|2nd|3rd|(?![123])\\\\dth)(?=\\\\b|[A-Z_])\',\n rsOrdUpper = \'\\\\d*(?:1ST|2ND|3RD|(?![123])\\\\dTH)(?=\\\\b|[a-z_])\',\n rsSeq = rsOptVar + reOptMod + rsOptJoin,\n rsEmoji = \'(?:\' + [rsDingbat, rsRegional, rsSurrPair].join(\'|\') + \')\' + rsSeq,\n rsSymbol = \'(?:\' + [rsNonAstral + rsCombo + \'?\', rsCombo, rsRegional, rsSurrPair, rsAstral].join(\'|\') + \')\';\n\n /** Used to match apostrophes. */\n var reApos = RegExp(rsApos, \'g\');\n\n /**\n * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and\n * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).\n */\n var reComboMark = RegExp(rsCombo, \'g\');\n\n /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\n var reUnicode = RegExp(rsFitz + \'(?=\' + rsFitz + \')|\' + rsSymbol + rsSeq, \'g\');\n\n /** Used to match complex or compound words. */\n var reUnicodeWord = RegExp([\n rsUpper + \'?\' + rsLower + \'+\' + rsOptContrLower + \'(?=\' + [rsBreak, rsUpper, \'$\'].join(\'|\') + \')\',\n rsMiscUpper + \'+\' + rsOptContrUpper + \'(?=\' + [rsBreak, rsUpper + rsMiscLower, \'$\'].join(\'|\') + \')\',\n rsUpper + \'?\' + rsMiscLower + \'+\' + rsOptContrLower,\n rsUpper + \'+\' + rsOptContrUpper,\n rsOrdUpper,\n rsOrdLower,\n rsDigits,\n rsEmoji\n ].join(\'|\'), \'g\');\n\n /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\n var reHasUnicode = RegExp(\'[\' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + \']\');\n\n /** Used to detect strings that need a more robust regexp to match words. */\n var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;\n\n /** Used to assign default `context` object properties. */\n var contextProps = [\n \'Array\', \'Buffer\', \'DataView\', \'Date\', \'Error\', \'Float32Array\', \'Float64Array\',\n \'Function\', \'Int8Array\', \'Int16Array\', \'Int32Array\', \'Map\', \'Math\', \'Object\',\n \'Promise\', \'RegExp\', \'Set\', \'String\', \'Symbol\', \'TypeError\', \'Uint8Array\',\n \'Uint8ClampedArray\', \'Uint16Array\', \'Uint32Array\', \'WeakMap\',\n \'_\', \'clearTimeout\', \'isFinite\', \'parseInt\', \'setTimeout\'\n ];\n\n /** Used to make template sourceURLs easier to identify. */\n var templateCounter = -1;\n\n /** Used to identify `toStringTag` values of typed arrays. */\n var typedArrayTags = {};\n typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\n typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\n typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\n typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\n typedArrayTags[uint32Tag] = true;\n typedArrayTags[argsTag] = typedArrayTags[arrayTag] =\n typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\n typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\n typedArrayTags[errorTag] = typedArrayTags[funcTag] =\n typedArrayTags[mapTag] = typedArrayTags[numberTag] =\n typedArrayTags[objectTag] = typedArrayTags[regexpTag] =\n typedArrayTags[setTag] = typedArrayTags[stringTag] =\n typedArrayTags[weakMapTag] = false;\n\n /** Used to identify `toStringTag` values supported by `_.clone`. */\n var cloneableTags = {};\n cloneableTags[argsTag] = cloneableTags[arrayTag] =\n cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\n cloneableTags[boolTag] = cloneableTags[dateTag] =\n cloneableTags[float32Tag] = cloneableTags[float64Tag] =\n cloneableTags[int8Tag] = cloneableTags[int16Tag] =\n cloneableTags[int32Tag] = cloneableTags[mapTag] =\n cloneableTags[numberTag] = cloneableTags[objectTag] =\n cloneableTags[regexpTag] = cloneableTags[setTag] =\n cloneableTags[stringTag] = cloneableTags[symbolTag] =\n cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\n cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\n cloneableTags[errorTag] = cloneableTags[funcTag] =\n cloneableTags[weakMapTag] = false;\n\n /** Used to map Latin Unicode letters to basic Latin letters. */\n var deburredLetters = {\n // Latin-1 Supplement block.\n \'\\xc0\': \'A\', \'\\xc1\': \'A\', \'\\xc2\': \'A\', \'\\xc3\': \'A\', \'\\xc4\': \'A\', \'\\xc5\': \'A\',\n \'\\xe0\': \'a\', \'\\xe1\': \'a\', \'\\xe2\': \'a\', \'\\xe3\': \'a\', \'\\xe4\': \'a\', \'\\xe5\': \'a\',\n \'\\xc7\': \'C\', \'\\xe7\': \'c\',\n \'\\xd0\': \'D\', \'\\xf0\': \'d\',\n \'\\xc8\': \'E\', \'\\xc9\': \'E\', \'\\xca\': \'E\', \'\\xcb\': \'E\',\n \'\\xe8\': \'e\', \'\\xe9\': \'e\', \'\\xea\': \'e\', \'\\xeb\': \'e\',\n \'\\xcc\': \'I\', \'\\xcd\': \'I\', \'\\xce\': \'I\', \'\\xcf\': \'I\',\n \'\\xec\': \'i\', \'\\xed\': \'i\', \'\\xee\': \'i\', \'\\xef\': \'i\',\n \'\\xd1\': \'N\', \'\\xf1\': \'n\',\n \'\\xd2\': \'O\', \'\\xd3\': \'O\', \'\\xd4\': \'O\', \'\\xd5\': \'O\', \'\\xd6\': \'O\', \'\\xd8\': \'O\',\n \'\\xf2\': \'o\', \'\\xf3\': \'o\', \'\\xf4\': \'o\', \'\\xf5\': \'o\', \'\\xf6\': \'o\', \'\\xf8\': \'o\',\n \'\\xd9\': \'U\', \'\\xda\': \'U\', \'\\xdb\': \'U\', \'\\xdc\': \'U\',\n \'\\xf9\': \'u\', \'\\xfa\': \'u\', \'\\xfb\': \'u\', \'\\xfc\': \'u\',\n \'\\xdd\': \'Y\', \'\\xfd\': \'y\', \'\\xff\': \'y\',\n \'\\xc6\': \'Ae\', \'\\xe6\': \'ae\',\n \'\\xde\': \'Th\', \'\\xfe\': \'th\',\n \'\\xdf\': \'ss\',\n // Latin Extended-A block.\n \'\\u0100\': \'A\', \'\\u0102\': \'A\', \'\\u0104\': \'A\',\n \'\\u0101\': \'a\', \'\\u0103\': \'a\', \'\\u0105\': \'a\',\n \'\\u0106\': \'C\', \'\\u0108\': \'C\', \'\\u010a\': \'C\', \'\\u010c\': \'C\',\n \'\\u0107\': \'c\', \'\\u0109\': \'c\', \'\\u010b\': \'c\', \'\\u010d\': \'c\',\n \'\\u010e\': \'D\', \'\\u0110\': \'D\', \'\\u010f\': \'d\', \'\\u0111\': \'d\',\n \'\\u0112\': \'E\', \'\\u0114\': \'E\', \'\\u0116\': \'E\', \'\\u0118\': \'E\', \'\\u011a\': \'E\',\n \'\\u0113\': \'e\', \'\\u0115\': \'e\', \'\\u0117\': \'e\', \'\\u0119\': \'e\', \'\\u011b\': \'e\',\n \'\\u011c\': \'G\', \'\\u011e\': \'G\', \'\\u0120\': \'G\', \'\\u0122\': \'G\',\n \'\\u011d\': \'g\', \'\\u011f\': \'g\', \'\\u0121\': \'g\', \'\\u0123\': \'g\',\n \'\\u0124\': \'H\', \'\\u0126\': \'H\', \'\\u0125\': \'h\', \'\\u0127\': \'h\',\n \'\\u0128\': \'I\', \'\\u012a\': \'I\', \'\\u012c\': \'I\', \'\\u012e\': \'I\', \'\\u0130\': \'I\',\n \'\\u0129\': \'i\', \'\\u012b\': \'i\', \'\\u012d\': \'i\', \'\\u012f\': \'i\', \'\\u0131\': \'i\',\n \'\\u0134\': \'J\', \'\\u0135\': \'j\',\n \'\\u0136\': \'K\', \'\\u0137\': \'k\', \'\\u0138\': \'k\',\n \'\\u0139\': \'L\', \'\\u013b\': \'L\', \'\\u013d\': \'L\', \'\\u013f\': \'L\', \'\\u0141\': \'L\',\n \'\\u013a\': \'l\', \'\\u013c\': \'l\', \'\\u013e\': \'l\', \'\\u0140\': \'l\', \'\\u0142\': \'l\',\n \'\\u0143\': \'N\', \'\\u0145\': \'N\', \'\\u0147\': \'N\', \'\\u014a\': \'N\',\n \'\\u0144\': \'n\', \'\\u0146\': \'n\', \'\\u0148\': \'n\', \'\\u014b\': \'n\',\n \'\\u014c\': \'O\', \'\\u014e\': \'O\', \'\\u0150\': \'O\',\n \'\\u014d\': \'o\', \'\\u014f\': \'o\', \'\\u0151\': \'o\',\n \'\\u0154\': \'R\', \'\\u0156\': \'R\', \'\\u0158\': \'R\',\n \'\\u0155\': \'r\', \'\\u0157\': \'r\', \'\\u0159\': \'r\',\n \'\\u015a\': \'S\', \'\\u015c\': \'S\', \'\\u015e\': \'S\', \'\\u0160\': \'S\',\n \'\\u015b\': \'s\', \'\\u015d\': \'s\', \'\\u015f\': \'s\', \'\\u0161\': \'s\',\n \'\\u0162\': \'T\', \'\\u0164\': \'T\', \'\\u0166\': \'T\',\n \'\\u0163\': \'t\', \'\\u0165\': \'t\', \'\\u0167\': \'t\',\n \'\\u0168\': \'U\', \'\\u016a\': \'U\', \'\\u016c\': \'U\', \'\\u016e\': \'U\', \'\\u0170\': \'U\', \'\\u0172\': \'U\',\n \'\\u0169\': \'u\', \'\\u016b\': \'u\', \'\\u016d\': \'u\', \'\\u016f\': \'u\', \'\\u0171\': \'u\', \'\\u0173\': \'u\',\n \'\\u0174\': \'W\', \'\\u0175\': \'w\',\n \'\\u0176\': \'Y\', \'\\u0177\': \'y\', \'\\u0178\': \'Y\',\n \'\\u0179\': \'Z\', \'\\u017b\': \'Z\', \'\\u017d\': \'Z\',\n \'\\u017a\': \'z\', \'\\u017c\': \'z\', \'\\u017e\': \'z\',\n \'\\u0132\': \'IJ\', \'\\u0133\': \'ij\',\n \'\\u0152\': \'Oe\', \'\\u0153\': \'oe\',\n \'\\u0149\': "\'n", \'\\u017f\': \'s\'\n };\n\n /** Used to map characters to HTML entities. */\n var htmlEscapes = {\n \'&\': \'&\',\n \'<\': \'<\',\n \'>\': \'>\',\n \'"\': \'"\',\n "\'": \''\'\n };\n\n /** Used to map HTML entities to characters. */\n var htmlUnescapes = {\n \'&\': \'&\',\n \'<\': \'<\',\n \'>\': \'>\',\n \'"\': \'"\',\n \''\': "\'"\n };\n\n /** Used to escape characters for inclusion in compiled string literals. */\n var stringEscapes = {\n \'\\\\\': \'\\\\\',\n "\'": "\'",\n \'\\n\': \'n\',\n \'\\r\': \'r\',\n \'\\u2028\': \'u2028\',\n \'\\u2029\': \'u2029\'\n };\n\n /** Built-in method references without a dependency on `root`. */\n var freeParseFloat = parseFloat,\n freeParseInt = parseInt;\n\n /** Detect free variable `global` from Node.js. */\n var freeGlobal = typeof global == \'object\' && global && global.Object === Object && global;\n\n /** Detect free variable `self`. */\n var freeSelf = typeof self == \'object\' && self && self.Object === Object && self;\n\n /** Used as a reference to the global object. */\n var root = freeGlobal || freeSelf || Function(\'return this\')();\n\n /** Detect free variable `exports`. */\n var freeExports = true && exports && !exports.nodeType && exports;\n\n /** Detect free variable `module`. */\n var freeModule = freeExports && typeof module == \'object\' && module && !module.nodeType && module;\n\n /** Detect the popular CommonJS extension `module.exports`. */\n var moduleExports = freeModule && freeModule.exports === freeExports;\n\n /** Detect free variable `process` from Node.js. */\n var freeProcess = moduleExports && freeGlobal.process;\n\n /** Used to access faster Node.js helpers. */\n var nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require(\'util\').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding(\'util\')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding(\'util\');\n } catch (e) {}\n }());\n\n /* Node.js helper references. */\n var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,\n nodeIsDate = nodeUtil && nodeUtil.isDate,\n nodeIsMap = nodeUtil && nodeUtil.isMap,\n nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,\n nodeIsSet = nodeUtil && nodeUtil.isSet,\n nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n /*--------------------------------------------------------------------------*/\n\n /**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\n function apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n }\n\n /**\n * A specialized version of `baseAggregator` for arrays.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform keys.\n * @param {Object} accumulator The initial aggregated object.\n * @returns {Function} Returns `accumulator`.\n */\n function arrayAggregator(array, setter, iteratee, accumulator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n var value = array[index];\n setter(accumulator, value, iteratee(value), array);\n }\n return accumulator;\n }\n\n /**\n * A specialized version of `_.forEach` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\n function arrayEach(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (iteratee(array[index], index, array) === false) {\n break;\n }\n }\n return array;\n }\n\n /**\n * A specialized version of `_.forEachRight` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\n function arrayEachRight(array, iteratee) {\n var length = array == null ? 0 : array.length;\n\n while (length--) {\n if (iteratee(array[length], length, array) === false) {\n break;\n }\n }\n return array;\n }\n\n /**\n * A specialized version of `_.every` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`.\n */\n function arrayEvery(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (!predicate(array[index], index, array)) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\n function arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n }\n\n /**\n * A specialized version of `_.includes` for arrays without support for\n * specifying an index to search from.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\n function arrayIncludes(array, value) {\n var length = array == null ? 0 : array.length;\n return !!length && baseIndexOf(array, value, 0) > -1;\n }\n\n /**\n * This function is like `arrayIncludes` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\n function arrayIncludesWith(array, value, comparator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (comparator(value, array[index])) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\n function arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n }\n\n /**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\n function arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n }\n\n /**\n * A specialized version of `_.reduce` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the first element of `array` as\n * the initial value.\n * @returns {*} Returns the accumulated value.\n */\n function arrayReduce(array, iteratee, accumulator, initAccum) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n if (initAccum && length) {\n accumulator = array[++index];\n }\n while (++index < length) {\n accumulator = iteratee(accumulator, array[index], index, array);\n }\n return accumulator;\n }\n\n /**\n * A specialized version of `_.reduceRight` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the last element of `array` as\n * the initial value.\n * @returns {*} Returns the accumulated value.\n */\n function arrayReduceRight(array, iteratee, accumulator, initAccum) {\n var length = array == null ? 0 : array.length;\n if (initAccum && length) {\n accumulator = array[--length];\n }\n while (length--) {\n accumulator = iteratee(accumulator, array[length], length, array);\n }\n return accumulator;\n }\n\n /**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\n function arraySome(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Gets the size of an ASCII `string`.\n *\n * @private\n * @param {string} string The string inspect.\n * @returns {number} Returns the string size.\n */\n var asciiSize = baseProperty(\'length\');\n\n /**\n * Converts an ASCII `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\n function asciiToArray(string) {\n return string.split(\'\');\n }\n\n /**\n * Splits an ASCII `string` into an array of its words.\n *\n * @private\n * @param {string} The string to inspect.\n * @returns {Array} Returns the words of `string`.\n */\n function asciiWords(string) {\n return string.match(reAsciiWord) || [];\n }\n\n /**\n * The base implementation of methods like `_.findKey` and `_.findLastKey`,\n * without support for iteratee shorthands, which iterates over `collection`\n * using `eachFunc`.\n *\n * @private\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {Function} eachFunc The function to iterate over `collection`.\n * @returns {*} Returns the found element or its key, else `undefined`.\n */\n function baseFindKey(collection, predicate, eachFunc) {\n var result;\n eachFunc(collection, function(value, key, collection) {\n if (predicate(value, key, collection)) {\n result = key;\n return false;\n }\n });\n return result;\n }\n\n /**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function baseFindIndex(array, predicate, fromIndex, fromRight) {\n var length = array.length,\n index = fromIndex + (fromRight ? 1 : -1);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (predicate(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function baseIndexOf(array, value, fromIndex) {\n return value === value\n ? strictIndexOf(array, value, fromIndex)\n : baseFindIndex(array, baseIsNaN, fromIndex);\n }\n\n /**\n * This function is like `baseIndexOf` except that it accepts a comparator.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function baseIndexOfWith(array, value, fromIndex, comparator) {\n var index = fromIndex - 1,\n length = array.length;\n\n while (++index < length) {\n if (comparator(array[index], value)) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * The base implementation of `_.isNaN` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n */\n function baseIsNaN(value) {\n return value !== value;\n }\n\n /**\n * The base implementation of `_.mean` and `_.meanBy` without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {number} Returns the mean.\n */\n function baseMean(array, iteratee) {\n var length = array == null ? 0 : array.length;\n return length ? (baseSum(array, iteratee) / length) : NAN;\n }\n\n /**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\n function baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n }\n\n /**\n * The base implementation of `_.propertyOf` without support for deep paths.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Function} Returns the new accessor function.\n */\n function basePropertyOf(object) {\n return function(key) {\n return object == null ? undefined : object[key];\n };\n }\n\n /**\n * The base implementation of `_.reduce` and `_.reduceRight`, without support\n * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} accumulator The initial value.\n * @param {boolean} initAccum Specify using the first or last element of\n * `collection` as the initial value.\n * @param {Function} eachFunc The function to iterate over `collection`.\n * @returns {*} Returns the accumulated value.\n */\n function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\n eachFunc(collection, function(value, index, collection) {\n accumulator = initAccum\n ? (initAccum = false, value)\n : iteratee(accumulator, value, index, collection);\n });\n return accumulator;\n }\n\n /**\n * The base implementation of `_.sortBy` which uses `comparer` to define the\n * sort order of `array` and replaces criteria objects with their corresponding\n * values.\n *\n * @private\n * @param {Array} array The array to sort.\n * @param {Function} comparer The function to define sort order.\n * @returns {Array} Returns `array`.\n */\n function baseSortBy(array, comparer) {\n var length = array.length;\n\n array.sort(comparer);\n while (length--) {\n array[length] = array[length].value;\n }\n return array;\n }\n\n /**\n * The base implementation of `_.sum` and `_.sumBy` without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {number} Returns the sum.\n */\n function baseSum(array, iteratee) {\n var result,\n index = -1,\n length = array.length;\n\n while (++index < length) {\n var current = iteratee(array[index]);\n if (current !== undefined) {\n result = result === undefined ? current : (result + current);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\n function baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n }\n\n /**\n * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array\n * of key-value pairs for `object` corresponding to the property names of `props`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} props The property names to get values for.\n * @returns {Object} Returns the key-value pairs.\n */\n function baseToPairs(object, props) {\n return arrayMap(props, function(key) {\n return [key, object[key]];\n });\n }\n\n /**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\n function baseTrim(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, \'\')\n : string;\n }\n\n /**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\n function baseUnary(func) {\n return function(value) {\n return func(value);\n };\n }\n\n /**\n * The base implementation of `_.values` and `_.valuesIn` which creates an\n * array of `object` property values corresponding to the property names\n * of `props`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} props The property names to get values for.\n * @returns {Object} Returns the array of property values.\n */\n function baseValues(object, props) {\n return arrayMap(props, function(key) {\n return object[key];\n });\n }\n\n /**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function cacheHas(cache, key) {\n return cache.has(key);\n }\n\n /**\n * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol\n * that is not found in the character symbols.\n *\n * @private\n * @param {Array} strSymbols The string symbols to inspect.\n * @param {Array} chrSymbols The character symbols to find.\n * @returns {number} Returns the index of the first unmatched string symbol.\n */\n function charsStartIndex(strSymbols, chrSymbols) {\n var index = -1,\n length = strSymbols.length;\n\n while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n return index;\n }\n\n /**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol\n * that is not found in the character symbols.\n *\n * @private\n * @param {Array} strSymbols The string symbols to inspect.\n * @param {Array} chrSymbols The character symbols to find.\n * @returns {number} Returns the index of the last unmatched string symbol.\n */\n function charsEndIndex(strSymbols, chrSymbols) {\n var index = strSymbols.length;\n\n while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n return index;\n }\n\n /**\n * Gets the number of `placeholder` occurrences in `array`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} placeholder The placeholder to search for.\n * @returns {number} Returns the placeholder count.\n */\n function countHolders(array, placeholder) {\n var length = array.length,\n result = 0;\n\n while (length--) {\n if (array[length] === placeholder) {\n ++result;\n }\n }\n return result;\n }\n\n /**\n * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A\n * letters to basic Latin letters.\n *\n * @private\n * @param {string} letter The matched letter to deburr.\n * @returns {string} Returns the deburred letter.\n */\n var deburrLetter = basePropertyOf(deburredLetters);\n\n /**\n * Used by `_.escape` to convert characters to HTML entities.\n *\n * @private\n * @param {string} chr The matched character to escape.\n * @returns {string} Returns the escaped character.\n */\n var escapeHtmlChar = basePropertyOf(htmlEscapes);\n\n /**\n * Used by `_.template` to escape characters for inclusion in compiled string literals.\n *\n * @private\n * @param {string} chr The matched character to escape.\n * @returns {string} Returns the escaped character.\n */\n function escapeStringChar(chr) {\n return \'\\\\\' + stringEscapes[chr];\n }\n\n /**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\n function getValue(object, key) {\n return object == null ? undefined : object[key];\n }\n\n /**\n * Checks if `string` contains Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n */\n function hasUnicode(string) {\n return reHasUnicode.test(string);\n }\n\n /**\n * Checks if `string` contains a word composed of Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a word is found, else `false`.\n */\n function hasUnicodeWord(string) {\n return reHasUnicodeWord.test(string);\n }\n\n /**\n * Converts `iterator` to an array.\n *\n * @private\n * @param {Object} iterator The iterator to convert.\n * @returns {Array} Returns the converted array.\n */\n function iteratorToArray(iterator) {\n var data,\n result = [];\n\n while (!(data = iterator.next()).done) {\n result.push(data.value);\n }\n return result;\n }\n\n /**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\n function mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n\n map.forEach(function(value, key) {\n result[++index] = [key, value];\n });\n return result;\n }\n\n /**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\n function overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n }\n\n /**\n * Replaces all `placeholder` elements in `array` with an internal placeholder\n * and returns an array of their indexes.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {*} placeholder The placeholder to replace.\n * @returns {Array} Returns the new array of placeholder indexes.\n */\n function replaceHolders(array, placeholder) {\n var index = -1,\n length = array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (value === placeholder || value === PLACEHOLDER) {\n array[index] = PLACEHOLDER;\n result[resIndex++] = index;\n }\n }\n return result;\n }\n\n /**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\n function setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n }\n\n /**\n * Converts `set` to its value-value pairs.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the value-value pairs.\n */\n function setToPairs(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = [value, value];\n });\n return result;\n }\n\n /**\n * A specialized version of `_.indexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function strictIndexOf(array, value, fromIndex) {\n var index = fromIndex - 1,\n length = array.length;\n\n while (++index < length) {\n if (array[index] === value) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * A specialized version of `_.lastIndexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function strictLastIndexOf(array, value, fromIndex) {\n var index = fromIndex + 1;\n while (index--) {\n if (array[index] === value) {\n return index;\n }\n }\n return index;\n }\n\n /**\n * Gets the number of symbols in `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the string size.\n */\n function stringSize(string) {\n return hasUnicode(string)\n ? unicodeSize(string)\n : asciiSize(string);\n }\n\n /**\n * Converts `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\n function stringToArray(string) {\n return hasUnicode(string)\n ? unicodeToArray(string)\n : asciiToArray(string);\n }\n\n /**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\n function trimmedEndIndex(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n }\n\n /**\n * Used by `_.unescape` to convert HTML entities to characters.\n *\n * @private\n * @param {string} chr The matched character to unescape.\n * @returns {string} Returns the unescaped character.\n */\n var unescapeHtmlChar = basePropertyOf(htmlUnescapes);\n\n /**\n * Gets the size of a Unicode `string`.\n *\n * @private\n * @param {string} string The string inspect.\n * @returns {number} Returns the string size.\n */\n function unicodeSize(string) {\n var result = reUnicode.lastIndex = 0;\n while (reUnicode.test(string)) {\n ++result;\n }\n return result;\n }\n\n /**\n * Converts a Unicode `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\n function unicodeToArray(string) {\n return string.match(reUnicode) || [];\n }\n\n /**\n * Splits a Unicode `string` into an array of its words.\n *\n * @private\n * @param {string} The string to inspect.\n * @returns {Array} Returns the words of `string`.\n */\n function unicodeWords(string) {\n return string.match(reUnicodeWord) || [];\n }\n\n /*--------------------------------------------------------------------------*/\n\n /**\n * Create a new pristine `lodash` function using the `context` object.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Util\n * @param {Object} [context=root] The context object.\n * @returns {Function} Returns a new `lodash` function.\n * @example\n *\n * _.mixin({ \'foo\': _.constant(\'foo\') });\n *\n * var lodash = _.runInContext();\n * lodash.mixin({ \'bar\': lodash.constant(\'bar\') });\n *\n * _.isFunction(_.foo);\n * // => true\n * _.isFunction(_.bar);\n * // => false\n *\n * lodash.isFunction(lodash.foo);\n * // => false\n * lodash.isFunction(lodash.bar);\n * // => true\n *\n * // Create a suped-up `defer` in Node.js.\n * var defer = _.runInContext({ \'setTimeout\': setImmediate }).defer;\n */\n var runInContext = (function runInContext(context) {\n context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));\n\n /** Built-in constructor references. */\n var Array = context.Array,\n Date = context.Date,\n Error = context.Error,\n Function = context.Function,\n Math = context.Math,\n Object = context.Object,\n RegExp = context.RegExp,\n String = context.String,\n TypeError = context.TypeError;\n\n /** Used for built-in method references. */\n var arrayProto = Array.prototype,\n funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n /** Used to detect overreaching core-js shims. */\n var coreJsData = context[\'__core-js_shared__\'];\n\n /** Used to resolve the decompiled source of functions. */\n var funcToString = funcProto.toString;\n\n /** Used to check objects for own properties. */\n var hasOwnProperty = objectProto.hasOwnProperty;\n\n /** Used to generate unique IDs. */\n var idCounter = 0;\n\n /** Used to detect methods masquerading as native. */\n var maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || \'\');\n return uid ? (\'Symbol(src)_1.\' + uid) : \'\';\n }());\n\n /**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\n var nativeObjectToString = objectProto.toString;\n\n /** Used to infer the `Object` constructor. */\n var objectCtorString = funcToString.call(Object);\n\n /** Used to restore the original `_` reference in `_.noConflict`. */\n var oldDash = root._;\n\n /** Used to detect if a method is native. */\n var reIsNative = RegExp(\'^\' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, \'\\\\$&\')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, \'$1.*?\') + \'$\'\n );\n\n /** Built-in value references. */\n var Buffer = moduleExports ? context.Buffer : undefined,\n Symbol = context.Symbol,\n Uint8Array = context.Uint8Array,\n allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,\n getPrototype = overArg(Object.getPrototypeOf, Object),\n objectCreate = Object.create,\n propertyIsEnumerable = objectProto.propertyIsEnumerable,\n splice = arrayProto.splice,\n spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined,\n symIterator = Symbol ? Symbol.iterator : undefined,\n symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n var defineProperty = (function() {\n try {\n var func = getNative(Object, \'defineProperty\');\n func({}, \'\', {});\n return func;\n } catch (e) {}\n }());\n\n /** Mocked built-ins. */\n var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,\n ctxNow = Date && Date.now !== root.Date.now && Date.now,\n ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;\n\n /* Built-in method references for those with the same name as other `lodash` methods. */\n var nativeCeil = Math.ceil,\n nativeFloor = Math.floor,\n nativeGetSymbols = Object.getOwnPropertySymbols,\n nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\n nativeIsFinite = context.isFinite,\n nativeJoin = arrayProto.join,\n nativeKeys = overArg(Object.keys, Object),\n nativeMax = Math.max,\n nativeMin = Math.min,\n nativeNow = Date.now,\n nativeParseInt = context.parseInt,\n nativeRandom = Math.random,\n nativeReverse = arrayProto.reverse;\n\n /* Built-in method references that are verified to be native. */\n var DataView = getNative(context, \'DataView\'),\n Map = getNative(context, \'Map\'),\n Promise = getNative(context, \'Promise\'),\n Set = getNative(context, \'Set\'),\n WeakMap = getNative(context, \'WeakMap\'),\n nativeCreate = getNative(Object, \'create\');\n\n /** Used to store function metadata. */\n var metaMap = WeakMap && new WeakMap;\n\n /** Used to lookup unminified function names. */\n var realNames = {};\n\n /** Used to detect maps, sets, and weakmaps. */\n var dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n /** Used to convert symbols to primitives and strings. */\n var symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a `lodash` object which wraps `value` to enable implicit method\n * chain sequences. Methods that operate on and return arrays, collections,\n * and functions can be chained together. Methods that retrieve a single value\n * or may return a primitive value will automatically end the chain sequence\n * and return the unwrapped value. Otherwise, the value must be unwrapped\n * with `_#value`.\n *\n * Explicit chain sequences, which must be unwrapped with `_#value`, may be\n * enabled using `_.chain`.\n *\n * The execution of chained methods is lazy, that is, it\'s deferred until\n * `_#value` is implicitly or explicitly called.\n *\n * Lazy evaluation allows several methods to support shortcut fusion.\n * Shortcut fusion is an optimization to merge iteratee calls; this avoids\n * the creation of intermediate arrays and can greatly reduce the number of\n * iteratee executions. Sections of a chain sequence qualify for shortcut\n * fusion if the section is applied to an array and iteratees accept only\n * one argument. The heuristic for whether a section qualifies for shortcut\n * fusion is subject to change.\n *\n * Chaining is supported in custom builds as long as the `_#value` method is\n * directly or indirectly included in the build.\n *\n * In addition to lodash methods, wrappers have `Array` and `String` methods.\n *\n * The wrapper `Array` methods are:\n * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`\n *\n * The wrapper `String` methods are:\n * `replace` and `split`\n *\n * The wrapper methods that support shortcut fusion are:\n * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,\n * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,\n * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`\n *\n * The chainable wrapper methods are:\n * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,\n * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,\n * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,\n * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,\n * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,\n * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,\n * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,\n * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,\n * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,\n * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,\n * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\n * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,\n * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,\n * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,\n * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,\n * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,\n * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,\n * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,\n * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,\n * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,\n * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,\n * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,\n * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,\n * `zipObject`, `zipObjectDeep`, and `zipWith`\n *\n * The wrapper methods that are **not** chainable by default are:\n * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,\n * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,\n * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,\n * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,\n * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,\n * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,\n * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,\n * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,\n * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,\n * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,\n * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,\n * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,\n * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,\n * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,\n * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,\n * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,\n * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,\n * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,\n * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,\n * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,\n * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,\n * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,\n * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,\n * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,\n * `upperFirst`, `value`, and `words`\n *\n * @name _\n * @constructor\n * @category Seq\n * @param {*} value The value to wrap in a `lodash` instance.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var wrapped = _([1, 2, 3]);\n *\n * // Returns an unwrapped value.\n * wrapped.reduce(_.add);\n * // => 6\n *\n * // Returns a wrapped value.\n * var squares = wrapped.map(square);\n *\n * _.isArray(squares);\n * // => false\n *\n * _.isArray(squares.value());\n * // => true\n */\n function lodash(value) {\n if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {\n if (value instanceof LodashWrapper) {\n return value;\n }\n if (hasOwnProperty.call(value, \'__wrapped__\')) {\n return wrapperClone(value);\n }\n }\n return new LodashWrapper(value);\n }\n\n /**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\n var baseCreate = (function() {\n function object() {}\n return function(proto) {\n if (!isObject(proto)) {\n return {};\n }\n if (objectCreate) {\n return objectCreate(proto);\n }\n object.prototype = proto;\n var result = new object;\n object.prototype = undefined;\n return result;\n };\n }());\n\n /**\n * The function whose prototype chain sequence wrappers inherit from.\n *\n * @private\n */\n function baseLodash() {\n // No operation performed.\n }\n\n /**\n * The base constructor for creating `lodash` wrapper objects.\n *\n * @private\n * @param {*} value The value to wrap.\n * @param {boolean} [chainAll] Enable explicit method chain sequences.\n */\n function LodashWrapper(value, chainAll) {\n this.__wrapped__ = value;\n this.__actions__ = [];\n this.__chain__ = !!chainAll;\n this.__index__ = 0;\n this.__values__ = undefined;\n }\n\n /**\n * By default, the template delimiters used by lodash are like those in\n * embedded Ruby (ERB) as well as ES2015 template strings. Change the\n * following template settings to use alternative delimiters.\n *\n * @static\n * @memberOf _\n * @type {Object}\n */\n lodash.templateSettings = {\n\n /**\n * Used to detect `data` property values to be HTML-escaped.\n *\n * @memberOf _.templateSettings\n * @type {RegExp}\n */\n \'escape\': reEscape,\n\n /**\n * Used to detect code to be evaluated.\n *\n * @memberOf _.templateSettings\n * @type {RegExp}\n */\n \'evaluate\': reEvaluate,\n\n /**\n * Used to detect `data` property values to inject.\n *\n * @memberOf _.templateSettings\n * @type {RegExp}\n */\n \'interpolate\': reInterpolate,\n\n /**\n * Used to reference the data object in the template text.\n *\n * @memberOf _.templateSettings\n * @type {string}\n */\n \'variable\': \'\',\n\n /**\n * Used to import variables into the compiled template.\n *\n * @memberOf _.templateSettings\n * @type {Object}\n */\n \'imports\': {\n\n /**\n * A reference to the `lodash` function.\n *\n * @memberOf _.templateSettings.imports\n * @type {Function}\n */\n \'_\': lodash\n }\n };\n\n // Ensure wrappers are instances of `baseLodash`.\n lodash.prototype = baseLodash.prototype;\n lodash.prototype.constructor = lodash;\n\n LodashWrapper.prototype = baseCreate(baseLodash.prototype);\n LodashWrapper.prototype.constructor = LodashWrapper;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\n *\n * @private\n * @constructor\n * @param {*} value The value to wrap.\n */\n function LazyWrapper(value) {\n this.__wrapped__ = value;\n this.__actions__ = [];\n this.__dir__ = 1;\n this.__filtered__ = false;\n this.__iteratees__ = [];\n this.__takeCount__ = MAX_ARRAY_LENGTH;\n this.__views__ = [];\n }\n\n /**\n * Creates a clone of the lazy wrapper object.\n *\n * @private\n * @name clone\n * @memberOf LazyWrapper\n * @returns {Object} Returns the cloned `LazyWrapper` object.\n */\n function lazyClone() {\n var result = new LazyWrapper(this.__wrapped__);\n result.__actions__ = copyArray(this.__actions__);\n result.__dir__ = this.__dir__;\n result.__filtered__ = this.__filtered__;\n result.__iteratees__ = copyArray(this.__iteratees__);\n result.__takeCount__ = this.__takeCount__;\n result.__views__ = copyArray(this.__views__);\n return result;\n }\n\n /**\n * Reverses the direction of lazy iteration.\n *\n * @private\n * @name reverse\n * @memberOf LazyWrapper\n * @returns {Object} Returns the new reversed `LazyWrapper` object.\n */\n function lazyReverse() {\n if (this.__filtered__) {\n var result = new LazyWrapper(this);\n result.__dir__ = -1;\n result.__filtered__ = true;\n } else {\n result = this.clone();\n result.__dir__ *= -1;\n }\n return result;\n }\n\n /**\n * Extracts the unwrapped value from its lazy wrapper.\n *\n * @private\n * @name value\n * @memberOf LazyWrapper\n * @returns {*} Returns the unwrapped value.\n */\n function lazyValue() {\n var array = this.__wrapped__.value(),\n dir = this.__dir__,\n isArr = isArray(array),\n isRight = dir < 0,\n arrLength = isArr ? array.length : 0,\n view = getView(0, arrLength, this.__views__),\n start = view.start,\n end = view.end,\n length = end - start,\n index = isRight ? end : (start - 1),\n iteratees = this.__iteratees__,\n iterLength = iteratees.length,\n resIndex = 0,\n takeCount = nativeMin(length, this.__takeCount__);\n\n if (!isArr || (!isRight && arrLength == length && takeCount == length)) {\n return baseWrapperValue(array, this.__actions__);\n }\n var result = [];\n\n outer:\n while (length-- && resIndex < takeCount) {\n index += dir;\n\n var iterIndex = -1,\n value = array[index];\n\n while (++iterIndex < iterLength) {\n var data = iteratees[iterIndex],\n iteratee = data.iteratee,\n type = data.type,\n computed = iteratee(value);\n\n if (type == LAZY_MAP_FLAG) {\n value = computed;\n } else if (!computed) {\n if (type == LAZY_FILTER_FLAG) {\n continue outer;\n } else {\n break outer;\n }\n }\n }\n result[resIndex++] = value;\n }\n return result;\n }\n\n // Ensure `LazyWrapper` is an instance of `baseLodash`.\n LazyWrapper.prototype = baseCreate(baseLodash.prototype);\n LazyWrapper.prototype.constructor = LazyWrapper;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n function Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n }\n\n /**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\n function hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n }\n\n /**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\n function hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n }\n\n /**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\n function hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n }\n\n /**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n }\n\n /**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\n function hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n }\n\n // Add methods to `Hash`.\n Hash.prototype.clear = hashClear;\n Hash.prototype[\'delete\'] = hashDelete;\n Hash.prototype.get = hashGet;\n Hash.prototype.has = hashHas;\n Hash.prototype.set = hashSet;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n function ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n }\n\n /**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\n function listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n }\n\n /**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\n function listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n }\n\n /**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\n function listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n }\n\n /**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n }\n\n /**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\n function listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n }\n\n // Add methods to `ListCache`.\n ListCache.prototype.clear = listCacheClear;\n ListCache.prototype[\'delete\'] = listCacheDelete;\n ListCache.prototype.get = listCacheGet;\n ListCache.prototype.has = listCacheHas;\n ListCache.prototype.set = listCacheSet;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n function MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n }\n\n /**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\n function mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n \'hash\': new Hash,\n \'map\': new (Map || ListCache),\n \'string\': new Hash\n };\n }\n\n /**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\n function mapCacheDelete(key) {\n var result = getMapData(this, key)[\'delete\'](key);\n this.size -= result ? 1 : 0;\n return result;\n }\n\n /**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\n function mapCacheGet(key) {\n return getMapData(this, key).get(key);\n }\n\n /**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function mapCacheHas(key) {\n return getMapData(this, key).has(key);\n }\n\n /**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\n function mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n }\n\n // Add methods to `MapCache`.\n MapCache.prototype.clear = mapCacheClear;\n MapCache.prototype[\'delete\'] = mapCacheDelete;\n MapCache.prototype.get = mapCacheGet;\n MapCache.prototype.has = mapCacheHas;\n MapCache.prototype.set = mapCacheSet;\n\n /*------------------------------------------------------------------------*/\n\n /**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\n function SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n }\n\n /**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\n function setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n }\n\n /**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\n function setCacheHas(value) {\n return this.__data__.has(value);\n }\n\n // Add methods to `SetCache`.\n SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\n SetCache.prototype.has = setCacheHas;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n function Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n }\n\n /**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\n function stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n }\n\n /**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\n function stackDelete(key) {\n var data = this.__data__,\n result = data[\'delete\'](key);\n\n this.size = data.size;\n return result;\n }\n\n /**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\n function stackGet(key) {\n return this.__data__.get(key);\n }\n\n /**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function stackHas(key) {\n return this.__data__.has(key);\n }\n\n /**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\n function stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n }\n\n // Add methods to `Stack`.\n Stack.prototype.clear = stackClear;\n Stack.prototype[\'delete\'] = stackDelete;\n Stack.prototype.get = stackGet;\n Stack.prototype.has = stackHas;\n Stack.prototype.set = stackSet;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\n function arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == \'length\' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == \'offset\' || key == \'parent\')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == \'buffer\' || key == \'byteLength\' || key == \'byteOffset\')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n }\n\n /**\n * A specialized version of `_.sample` for arrays.\n *\n * @private\n * @param {Array} array The array to sample.\n * @returns {*} Returns the random element.\n */\n function arraySample(array) {\n var length = array.length;\n return length ? array[baseRandom(0, length - 1)] : undefined;\n }\n\n /**\n * A specialized version of `_.sampleSize` for arrays.\n *\n * @private\n * @param {Array} array The array to sample.\n * @param {number} n The number of elements to sample.\n * @returns {Array} Returns the random elements.\n */\n function arraySampleSize(array, n) {\n return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));\n }\n\n /**\n * A specialized version of `_.shuffle` for arrays.\n *\n * @private\n * @param {Array} array The array to shuffle.\n * @returns {Array} Returns the new shuffled array.\n */\n function arrayShuffle(array) {\n return shuffleSelf(copyArray(array));\n }\n\n /**\n * This function is like `assignValue` except that it doesn\'t assign\n * `undefined` values.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\n function assignMergeValue(object, key, value) {\n if ((value !== undefined && !eq(object[key], value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n }\n\n /**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\n function assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n }\n\n /**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n }\n\n /**\n * Aggregates elements of `collection` on `accumulator` with keys transformed\n * by `iteratee` and values set by `setter`.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform keys.\n * @param {Object} accumulator The initial aggregated object.\n * @returns {Function} Returns `accumulator`.\n */\n function baseAggregator(collection, setter, iteratee, accumulator) {\n baseEach(collection, function(value, key, collection) {\n setter(accumulator, value, iteratee(value), collection);\n });\n return accumulator;\n }\n\n /**\n * The base implementation of `_.assign` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\n function baseAssign(object, source) {\n return object && copyObject(source, keys(source), object);\n }\n\n /**\n * The base implementation of `_.assignIn` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\n function baseAssignIn(object, source) {\n return object && copyObject(source, keysIn(source), object);\n }\n\n /**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\n function baseAssignValue(object, key, value) {\n if (key == \'__proto__\' && defineProperty) {\n defineProperty(object, key, {\n \'configurable\': true,\n \'enumerable\': true,\n \'value\': value,\n \'writable\': true\n });\n } else {\n object[key] = value;\n }\n }\n\n /**\n * The base implementation of `_.at` without support for individual paths.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {string[]} paths The property paths to pick.\n * @returns {Array} Returns the picked elements.\n */\n function baseAt(object, paths) {\n var index = -1,\n length = paths.length,\n result = Array(length),\n skip = object == null;\n\n while (++index < length) {\n result[index] = skip ? undefined : get(object, paths[index]);\n }\n return result;\n }\n\n /**\n * The base implementation of `_.clamp` which doesn\'t coerce arguments.\n *\n * @private\n * @param {number} number The number to clamp.\n * @param {number} [lower] The lower bound.\n * @param {number} upper The upper bound.\n * @returns {number} Returns the clamped number.\n */\n function baseClamp(number, lower, upper) {\n if (number === number) {\n if (upper !== undefined) {\n number = number <= upper ? number : upper;\n }\n if (lower !== undefined) {\n number = number >= lower ? number : lower;\n }\n }\n return number;\n }\n\n /**\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n * traversed objects.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Deep clone\n * 2 - Flatten inherited properties\n * 4 - Clone symbols\n * @param {Function} [customizer] The function to customize cloning.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The parent object of `value`.\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n * @returns {*} Returns the cloned value.\n */\n function baseClone(value, bitmask, customizer, key, object, stack) {\n var result,\n isDeep = bitmask & CLONE_DEEP_FLAG,\n isFlat = bitmask & CLONE_FLAT_FLAG,\n isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n if (customizer) {\n result = object ? customizer(value, key, object, stack) : customizer(value);\n }\n if (result !== undefined) {\n return result;\n }\n if (!isObject(value)) {\n return value;\n }\n var isArr = isArray(value);\n if (isArr) {\n result = initCloneArray(value);\n if (!isDeep) {\n return copyArray(value, result);\n }\n } else {\n var tag = getTag(value),\n isFunc = tag == funcTag || tag == genTag;\n\n if (isBuffer(value)) {\n return cloneBuffer(value, isDeep);\n }\n if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n result = (isFlat || isFunc) ? {} : initCloneObject(value);\n if (!isDeep) {\n return isFlat\n ? copySymbolsIn(value, baseAssignIn(result, value))\n : copySymbols(value, baseAssign(result, value));\n }\n } else {\n if (!cloneableTags[tag]) {\n return object ? value : {};\n }\n result = initCloneByTag(value, tag, isDeep);\n }\n }\n // Check for circular references and return its corresponding clone.\n stack || (stack = new Stack);\n var stacked = stack.get(value);\n if (stacked) {\n return stacked;\n }\n stack.set(value, result);\n\n if (isSet(value)) {\n value.forEach(function(subValue) {\n result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n });\n } else if (isMap(value)) {\n value.forEach(function(subValue, key) {\n result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n }\n\n var keysFunc = isFull\n ? (isFlat ? getAllKeysIn : getAllKeys)\n : (isFlat ? keysIn : keys);\n\n var props = isArr ? undefined : keysFunc(value);\n arrayEach(props || value, function(subValue, key) {\n if (props) {\n key = subValue;\n subValue = value[key];\n }\n // Recursively populate clone (susceptible to call stack limits).\n assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n return result;\n }\n\n /**\n * The base implementation of `_.conforms` which doesn\'t clone `source`.\n *\n * @private\n * @param {Object} source The object of property predicates to conform to.\n * @returns {Function} Returns the new spec function.\n */\n function baseConforms(source) {\n var props = keys(source);\n return function(object) {\n return baseConformsTo(object, source, props);\n };\n }\n\n /**\n * The base implementation of `_.conformsTo` which accepts `props` to check.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property predicates to conform to.\n * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n */\n function baseConformsTo(object, source, props) {\n var length = props.length;\n if (object == null) {\n return !length;\n }\n object = Object(object);\n while (length--) {\n var key = props[length],\n predicate = source[key],\n value = object[key];\n\n if ((value === undefined && !(key in object)) || !predicate(value)) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * The base implementation of `_.delay` and `_.defer` which accepts `args`\n * to provide to `func`.\n *\n * @private\n * @param {Function} func The function to delay.\n * @param {number} wait The number of milliseconds to delay invocation.\n * @param {Array} args The arguments to provide to `func`.\n * @returns {number|Object} Returns the timer id or timeout object.\n */\n function baseDelay(func, wait, args) {\n if (typeof func != \'function\') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n return setTimeout(function() { func.apply(undefined, args); }, wait);\n }\n\n /**\n * The base implementation of methods like `_.difference` without support\n * for excluding multiple arrays or iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Array} values The values to exclude.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n */\n function baseDifference(array, values, iteratee, comparator) {\n var index = -1,\n includes = arrayIncludes,\n isCommon = true,\n length = array.length,\n result = [],\n valuesLength = values.length;\n\n if (!length) {\n return result;\n }\n if (iteratee) {\n values = arrayMap(values, baseUnary(iteratee));\n }\n if (comparator) {\n includes = arrayIncludesWith;\n isCommon = false;\n }\n else if (values.length >= LARGE_ARRAY_SIZE) {\n includes = cacheHas;\n isCommon = false;\n values = new SetCache(values);\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee == null ? value : iteratee(value);\n\n value = (comparator || value !== 0) ? value : 0;\n if (isCommon && computed === computed) {\n var valuesIndex = valuesLength;\n while (valuesIndex--) {\n if (values[valuesIndex] === computed) {\n continue outer;\n }\n }\n result.push(value);\n }\n else if (!includes(values, computed, comparator)) {\n result.push(value);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.forEach` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\n var baseEach = createBaseEach(baseForOwn);\n\n /**\n * The base implementation of `_.forEachRight` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\n var baseEachRight = createBaseEach(baseForOwnRight, true);\n\n /**\n * The base implementation of `_.every` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`\n */\n function baseEvery(collection, predicate) {\n var result = true;\n baseEach(collection, function(value, index, collection) {\n result = !!predicate(value, index, collection);\n return result;\n });\n return result;\n }\n\n /**\n * The base implementation of methods like `_.max` and `_.min` which accepts a\n * `comparator` to determine the extremum value.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The iteratee invoked per iteration.\n * @param {Function} comparator The comparator used to compare values.\n * @returns {*} Returns the extremum value.\n */\n function baseExtremum(array, iteratee, comparator) {\n var index = -1,\n length = array.length;\n\n while (++index < length) {\n var value = array[index],\n current = iteratee(value);\n\n if (current != null && (computed === undefined\n ? (current === current && !isSymbol(current))\n : comparator(current, computed)\n )) {\n var computed = current,\n result = value;\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.fill` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to fill.\n * @param {*} value The value to fill `array` with.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns `array`.\n */\n function baseFill(array, value, start, end) {\n var length = array.length;\n\n start = toInteger(start);\n if (start < 0) {\n start = -start > length ? 0 : (length + start);\n }\n end = (end === undefined || end > length) ? length : toInteger(end);\n if (end < 0) {\n end += length;\n }\n end = start > end ? 0 : toLength(end);\n while (start < end) {\n array[start++] = value;\n }\n return array;\n }\n\n /**\n * The base implementation of `_.filter` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\n function baseFilter(collection, predicate) {\n var result = [];\n baseEach(collection, function(value, index, collection) {\n if (predicate(value, index, collection)) {\n result.push(value);\n }\n });\n return result;\n }\n\n /**\n * The base implementation of `_.flatten` with support for restricting flattening.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {number} depth The maximum recursion depth.\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\n function baseFlatten(array, depth, predicate, isStrict, result) {\n var index = -1,\n length = array.length;\n\n predicate || (predicate = isFlattenable);\n result || (result = []);\n\n while (++index < length) {\n var value = array[index];\n if (depth > 0 && predicate(value)) {\n if (depth > 1) {\n // Recursively flatten arrays (susceptible to call stack limits).\n baseFlatten(value, depth - 1, predicate, isStrict, result);\n } else {\n arrayPush(result, value);\n }\n } else if (!isStrict) {\n result[result.length] = value;\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\n var baseFor = createBaseFor();\n\n /**\n * This function is like `baseFor` except that it iterates over properties\n * in the opposite order.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\n var baseForRight = createBaseFor(true);\n\n /**\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\n function baseForOwn(object, iteratee) {\n return object && baseFor(object, iteratee, keys);\n }\n\n /**\n * The base implementation of `_.forOwnRight` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\n function baseForOwnRight(object, iteratee) {\n return object && baseForRight(object, iteratee, keys);\n }\n\n /**\n * The base implementation of `_.functions` which creates an array of\n * `object` function property names filtered from `props`.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Array} props The property names to filter.\n * @returns {Array} Returns the function names.\n */\n function baseFunctions(object, props) {\n return arrayFilter(props, function(key) {\n return isFunction(object[key]);\n });\n }\n\n /**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\n function baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n }\n\n /**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\n function baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n }\n\n /**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\n function baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n }\n\n /**\n * The base implementation of `_.gt` which doesn\'t coerce arguments.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than `other`,\n * else `false`.\n */\n function baseGt(value, other) {\n return value > other;\n }\n\n /**\n * The base implementation of `_.has` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\n function baseHas(object, key) {\n return object != null && hasOwnProperty.call(object, key);\n }\n\n /**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\n function baseHasIn(object, key) {\n return object != null && key in Object(object);\n }\n\n /**\n * The base implementation of `_.inRange` which doesn\'t coerce arguments.\n *\n * @private\n * @param {number} number The number to check.\n * @param {number} start The start of the range.\n * @param {number} end The end of the range.\n * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n */\n function baseInRange(number, start, end) {\n return number >= nativeMin(start, end) && number < nativeMax(start, end);\n }\n\n /**\n * The base implementation of methods like `_.intersection`, without support\n * for iteratee shorthands, that accepts an array of arrays to inspect.\n *\n * @private\n * @param {Array} arrays The arrays to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of shared values.\n */\n function baseIntersection(arrays, iteratee, comparator) {\n var includes = comparator ? arrayIncludesWith : arrayIncludes,\n length = arrays[0].length,\n othLength = arrays.length,\n othIndex = othLength,\n caches = Array(othLength),\n maxLength = Infinity,\n result = [];\n\n while (othIndex--) {\n var array = arrays[othIndex];\n if (othIndex && iteratee) {\n array = arrayMap(array, baseUnary(iteratee));\n }\n maxLength = nativeMin(array.length, maxLength);\n caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))\n ? new SetCache(othIndex && array)\n : undefined;\n }\n array = arrays[0];\n\n var index = -1,\n seen = caches[0];\n\n outer:\n while (++index < length && result.length < maxLength) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n value = (comparator || value !== 0) ? value : 0;\n if (!(seen\n ? cacheHas(seen, computed)\n : includes(result, computed, comparator)\n )) {\n othIndex = othLength;\n while (--othIndex) {\n var cache = caches[othIndex];\n if (!(cache\n ? cacheHas(cache, computed)\n : includes(arrays[othIndex], computed, comparator))\n ) {\n continue outer;\n }\n }\n if (seen) {\n seen.push(computed);\n }\n result.push(value);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.invert` and `_.invertBy` which inverts\n * `object` with values transformed by `iteratee` and set by `setter`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform values.\n * @param {Object} accumulator The initial inverted object.\n * @returns {Function} Returns `accumulator`.\n */\n function baseInverter(object, setter, iteratee, accumulator) {\n baseForOwn(object, function(value, key, object) {\n setter(accumulator, iteratee(value), key, object);\n });\n return accumulator;\n }\n\n /**\n * The base implementation of `_.invoke` without support for individual\n * method arguments.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the method to invoke.\n * @param {Array} args The arguments to invoke the method with.\n * @returns {*} Returns the result of the invoked method.\n */\n function baseInvoke(object, path, args) {\n path = castPath(path, object);\n object = parent(object, path);\n var func = object == null ? object : object[toKey(last(path))];\n return func == null ? undefined : apply(func, object, args);\n }\n\n /**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\n function baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n }\n\n /**\n * The base implementation of `_.isArrayBuffer` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n */\n function baseIsArrayBuffer(value) {\n return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;\n }\n\n /**\n * The base implementation of `_.isDate` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n */\n function baseIsDate(value) {\n return isObjectLike(value) && baseGetTag(value) == dateTag;\n }\n\n /**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\n function baseIsEqual(value, other, bitmask, customizer, stack) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n }\n\n /**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\n function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = objIsArr ? arrayTag : getTag(object),\n othTag = othIsArr ? arrayTag : getTag(other);\n\n objTag = objTag == argsTag ? objectTag : objTag;\n othTag = othTag == argsTag ? objectTag : othTag;\n\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && isBuffer(object)) {\n if (!isBuffer(other)) {\n return false;\n }\n objIsArr = true;\n objIsObj = false;\n }\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack);\n return (objIsArr || isTypedArray(object))\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n }\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, \'__wrapped__\'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, \'__wrapped__\');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n\n stack || (stack = new Stack);\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack);\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n }\n\n /**\n * The base implementation of `_.isMap` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n */\n function baseIsMap(value) {\n return isObjectLike(value) && getTag(value) == mapTag;\n }\n\n /**\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\n function baseIsMatch(object, source, matchData, customizer) {\n var index = matchData.length,\n length = index,\n noCustomizer = !customizer;\n\n if (object == null) {\n return !length;\n }\n object = Object(object);\n while (index--) {\n var data = matchData[index];\n if ((noCustomizer && data[2])\n ? data[1] !== object[data[0]]\n : !(data[0] in object)\n ) {\n return false;\n }\n }\n while (++index < length) {\n data = matchData[index];\n var key = data[0],\n objValue = object[key],\n srcValue = data[1];\n\n if (noCustomizer && data[2]) {\n if (objValue === undefined && !(key in object)) {\n return false;\n }\n } else {\n var stack = new Stack;\n if (customizer) {\n var result = customizer(objValue, srcValue, key, object, source, stack);\n }\n if (!(result === undefined\n ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n : result\n )) {\n return false;\n }\n }\n }\n return true;\n }\n\n /**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\n function baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n }\n\n /**\n * The base implementation of `_.isRegExp` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n */\n function baseIsRegExp(value) {\n return isObjectLike(value) && baseGetTag(value) == regexpTag;\n }\n\n /**\n * The base implementation of `_.isSet` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n */\n function baseIsSet(value) {\n return isObjectLike(value) && getTag(value) == setTag;\n }\n\n /**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\n function baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n }\n\n /**\n * The base implementation of `_.iteratee`.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\n function baseIteratee(value) {\n // Don\'t store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n if (typeof value == \'function\') {\n return value;\n }\n if (value == null) {\n return identity;\n }\n if (typeof value == \'object\') {\n return isArray(value)\n ? baseMatchesProperty(value[0], value[1])\n : baseMatches(value);\n }\n return property(value);\n }\n\n /**\n * The base implementation of `_.keys` which doesn\'t treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\n function baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != \'constructor\') {\n result.push(key);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.keysIn` which doesn\'t treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\n function baseKeysIn(object) {\n if (!isObject(object)) {\n return nativeKeysIn(object);\n }\n var isProto = isPrototype(object),\n result = [];\n\n for (var key in object) {\n if (!(key == \'constructor\' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.lt` which doesn\'t coerce arguments.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than `other`,\n * else `false`.\n */\n function baseLt(value, other) {\n return value < other;\n }\n\n /**\n * The base implementation of `_.map` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\n function baseMap(collection, iteratee) {\n var index = -1,\n result = isArrayLike(collection) ? Array(collection.length) : [];\n\n baseEach(collection, function(value, key, collection) {\n result[++index] = iteratee(value, key, collection);\n });\n return result;\n }\n\n /**\n * The base implementation of `_.matches` which doesn\'t clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */\n function baseMatches(source) {\n var matchData = getMatchData(source);\n if (matchData.length == 1 && matchData[0][2]) {\n return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n }\n return function(object) {\n return object === source || baseIsMatch(object, source, matchData);\n };\n }\n\n /**\n * The base implementation of `_.matchesProperty` which doesn\'t clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\n function baseMatchesProperty(path, srcValue) {\n if (isKey(path) && isStrictComparable(srcValue)) {\n return matchesStrictComparable(toKey(path), srcValue);\n }\n return function(object) {\n var objValue = get(object, path);\n return (objValue === undefined && objValue === srcValue)\n ? hasIn(object, path)\n : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n };\n }\n\n /**\n * The base implementation of `_.merge` without support for multiple sources.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} [customizer] The function to customize merged values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\n function baseMerge(object, source, srcIndex, customizer, stack) {\n if (object === source) {\n return;\n }\n baseFor(source, function(srcValue, key) {\n stack || (stack = new Stack);\n if (isObject(srcValue)) {\n baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n }\n else {\n var newValue = customizer\n ? customizer(safeGet(object, key), srcValue, (key + \'\'), object, source, stack)\n : undefined;\n\n if (newValue === undefined) {\n newValue = srcValue;\n }\n assignMergeValue(object, key, newValue);\n }\n }, keysIn);\n }\n\n /**\n * A specialized version of `baseMerge` for arrays and objects which performs\n * deep merges and tracks traversed objects enabling objects with circular\n * references to be merged.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {string} key The key of the value to merge.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} mergeFunc The function to merge values.\n * @param {Function} [customizer] The function to customize assigned values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\n function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n var objValue = safeGet(object, key),\n srcValue = safeGet(source, key),\n stacked = stack.get(srcValue);\n\n if (stacked) {\n assignMergeValue(object, key, stacked);\n return;\n }\n var newValue = customizer\n ? customizer(objValue, srcValue, (key + \'\'), object, source, stack)\n : undefined;\n\n var isCommon = newValue === undefined;\n\n if (isCommon) {\n var isArr = isArray(srcValue),\n isBuff = !isArr && isBuffer(srcValue),\n isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n newValue = srcValue;\n if (isArr || isBuff || isTyped) {\n if (isArray(objValue)) {\n newValue = objValue;\n }\n else if (isArrayLikeObject(objValue)) {\n newValue = copyArray(objValue);\n }\n else if (isBuff) {\n isCommon = false;\n newValue = cloneBuffer(srcValue, true);\n }\n else if (isTyped) {\n isCommon = false;\n newValue = cloneTypedArray(srcValue, true);\n }\n else {\n newValue = [];\n }\n }\n else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n newValue = objValue;\n if (isArguments(objValue)) {\n newValue = toPlainObject(objValue);\n }\n else if (!isObject(objValue) || isFunction(objValue)) {\n newValue = initCloneObject(srcValue);\n }\n }\n else {\n isCommon = false;\n }\n }\n if (isCommon) {\n // Recursively merge objects and arrays (susceptible to call stack limits).\n stack.set(srcValue, newValue);\n mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n stack[\'delete\'](srcValue);\n }\n assignMergeValue(object, key, newValue);\n }\n\n /**\n * The base implementation of `_.nth` which doesn\'t coerce arguments.\n *\n * @private\n * @param {Array} array The array to query.\n * @param {number} n The index of the element to return.\n * @returns {*} Returns the nth element of `array`.\n */\n function baseNth(array, n) {\n var length = array.length;\n if (!length) {\n return;\n }\n n += n < 0 ? length : 0;\n return isIndex(n, length) ? array[n] : undefined;\n }\n\n /**\n * The base implementation of `_.orderBy` without param guards.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n * @param {string[]} orders The sort orders of `iteratees`.\n * @returns {Array} Returns the new sorted array.\n */\n function baseOrderBy(collection, iteratees, orders) {\n if (iteratees.length) {\n iteratees = arrayMap(iteratees, function(iteratee) {\n if (isArray(iteratee)) {\n return function(value) {\n return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee);\n }\n }\n return iteratee;\n });\n } else {\n iteratees = [identity];\n }\n\n var index = -1;\n iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\n\n var result = baseMap(collection, function(value, key, collection) {\n var criteria = arrayMap(iteratees, function(iteratee) {\n return iteratee(value);\n });\n return { \'criteria\': criteria, \'index\': ++index, \'value\': value };\n });\n\n return baseSortBy(result, function(object, other) {\n return compareMultiple(object, other, orders);\n });\n }\n\n /**\n * The base implementation of `_.pick` without support for individual\n * property identifiers.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @returns {Object} Returns the new object.\n */\n function basePick(object, paths) {\n return basePickBy(object, paths, function(value, path) {\n return hasIn(object, path);\n });\n }\n\n /**\n * The base implementation of `_.pickBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @param {Function} predicate The function invoked per property.\n * @returns {Object} Returns the new object.\n */\n function basePickBy(object, paths, predicate) {\n var index = -1,\n length = paths.length,\n result = {};\n\n while (++index < length) {\n var path = paths[index],\n value = baseGet(object, path);\n\n if (predicate(value, path)) {\n baseSet(result, castPath(path, object), value);\n }\n }\n return result;\n }\n\n /**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\n function basePropertyDeep(path) {\n return function(object) {\n return baseGet(object, path);\n };\n }\n\n /**\n * The base implementation of `_.pullAllBy` without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to remove.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns `array`.\n */\n function basePullAll(array, values, iteratee, comparator) {\n var indexOf = comparator ? baseIndexOfWith : baseIndexOf,\n index = -1,\n length = values.length,\n seen = array;\n\n if (array === values) {\n values = copyArray(values);\n }\n if (iteratee) {\n seen = arrayMap(array, baseUnary(iteratee));\n }\n while (++index < length) {\n var fromIndex = 0,\n value = values[index],\n computed = iteratee ? iteratee(value) : value;\n\n while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {\n if (seen !== array) {\n splice.call(seen, fromIndex, 1);\n }\n splice.call(array, fromIndex, 1);\n }\n }\n return array;\n }\n\n /**\n * The base implementation of `_.pullAt` without support for individual\n * indexes or capturing the removed elements.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {number[]} indexes The indexes of elements to remove.\n * @returns {Array} Returns `array`.\n */\n function basePullAt(array, indexes) {\n var length = array ? indexes.length : 0,\n lastIndex = length - 1;\n\n while (length--) {\n var index = indexes[length];\n if (length == lastIndex || index !== previous) {\n var previous = index;\n if (isIndex(index)) {\n splice.call(array, index, 1);\n } else {\n baseUnset(array, index);\n }\n }\n }\n return array;\n }\n\n /**\n * The base implementation of `_.random` without support for returning\n * floating-point numbers.\n *\n * @private\n * @param {number} lower The lower bound.\n * @param {number} upper The upper bound.\n * @returns {number} Returns the random number.\n */\n function baseRandom(lower, upper) {\n return lower + nativeFloor(nativeRandom() * (upper - lower + 1));\n }\n\n /**\n * The base implementation of `_.range` and `_.rangeRight` which doesn\'t\n * coerce arguments.\n *\n * @private\n * @param {number} start The start of the range.\n * @param {number} end The end of the range.\n * @param {number} step The value to increment or decrement by.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Array} Returns the range of numbers.\n */\n function baseRange(start, end, step, fromRight) {\n var index = -1,\n length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),\n result = Array(length);\n\n while (length--) {\n result[fromRight ? length : ++index] = start;\n start += step;\n }\n return result;\n }\n\n /**\n * The base implementation of `_.repeat` which doesn\'t coerce arguments.\n *\n * @private\n * @param {string} string The string to repeat.\n * @param {number} n The number of times to repeat the string.\n * @returns {string} Returns the repeated string.\n */\n function baseRepeat(string, n) {\n var result = \'\';\n if (!string || n < 1 || n > MAX_SAFE_INTEGER) {\n return result;\n }\n // Leverage the exponentiation by squaring algorithm for a faster repeat.\n // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.\n do {\n if (n % 2) {\n result += string;\n }\n n = nativeFloor(n / 2);\n if (n) {\n string += string;\n }\n } while (n);\n\n return result;\n }\n\n /**\n * The base implementation of `_.rest` which doesn\'t validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\n function baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + \'\');\n }\n\n /**\n * The base implementation of `_.sample`.\n *\n * @private\n * @param {Array|Object} collection The collection to sample.\n * @returns {*} Returns the random element.\n */\n function baseSample(collection) {\n return arraySample(values(collection));\n }\n\n /**\n * The base implementation of `_.sampleSize` without param guards.\n *\n * @private\n * @param {Array|Object} collection The collection to sample.\n * @param {number} n The number of elements to sample.\n * @returns {Array} Returns the random elements.\n */\n function baseSampleSize(collection, n) {\n var array = values(collection);\n return shuffleSelf(array, baseClamp(n, 0, array.length));\n }\n\n /**\n * The base implementation of `_.set`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @param {Function} [customizer] The function to customize path creation.\n * @returns {Object} Returns `object`.\n */\n function baseSet(object, path, value, customizer) {\n if (!isObject(object)) {\n return object;\n }\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n lastIndex = length - 1,\n nested = object;\n\n while (nested != null && ++index < length) {\n var key = toKey(path[index]),\n newValue = value;\n\n if (key === \'__proto__\' || key === \'constructor\' || key === \'prototype\') {\n return object;\n }\n\n if (index != lastIndex) {\n var objValue = nested[key];\n newValue = customizer ? customizer(objValue, key, nested) : undefined;\n if (newValue === undefined) {\n newValue = isObject(objValue)\n ? objValue\n : (isIndex(path[index + 1]) ? [] : {});\n }\n }\n assignValue(nested, key, newValue);\n nested = nested[key];\n }\n return object;\n }\n\n /**\n * The base implementation of `setData` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to associate metadata with.\n * @param {*} data The metadata.\n * @returns {Function} Returns `func`.\n */\n var baseSetData = !metaMap ? identity : function(func, data) {\n metaMap.set(func, data);\n return func;\n };\n\n /**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\n var baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, \'toString\', {\n \'configurable\': true,\n \'enumerable\': false,\n \'value\': constant(string),\n \'writable\': true\n });\n };\n\n /**\n * The base implementation of `_.shuffle`.\n *\n * @private\n * @param {Array|Object} collection The collection to shuffle.\n * @returns {Array} Returns the new shuffled array.\n */\n function baseShuffle(collection) {\n return shuffleSelf(values(collection));\n }\n\n /**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\n function baseSlice(array, start, end) {\n var index = -1,\n length = array.length;\n\n if (start < 0) {\n start = -start > length ? 0 : (length + start);\n }\n end = end > length ? length : end;\n if (end < 0) {\n end += length;\n }\n length = start > end ? 0 : ((end - start) >>> 0);\n start >>>= 0;\n\n var result = Array(length);\n while (++index < length) {\n result[index] = array[index + start];\n }\n return result;\n }\n\n /**\n * The base implementation of `_.some` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\n function baseSome(collection, predicate) {\n var result;\n\n baseEach(collection, function(value, index, collection) {\n result = predicate(value, index, collection);\n return !result;\n });\n return !!result;\n }\n\n /**\n * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which\n * performs a binary search of `array` to determine the index at which `value`\n * should be inserted into `array` in order to maintain its sort order.\n *\n * @private\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {boolean} [retHighest] Specify returning the highest qualified index.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n */\n function baseSortedIndex(array, value, retHighest) {\n var low = 0,\n high = array == null ? low : array.length;\n\n if (typeof value == \'number\' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {\n while (low < high) {\n var mid = (low + high) >>> 1,\n computed = array[mid];\n\n if (computed !== null && !isSymbol(computed) &&\n (retHighest ? (computed <= value) : (computed < value))) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n return high;\n }\n return baseSortedIndexBy(array, value, identity, retHighest);\n }\n\n /**\n * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`\n * which invokes `iteratee` for `value` and each element of `array` to compute\n * their sort ranking. The iteratee is invoked with one argument; (value).\n *\n * @private\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function} iteratee The iteratee invoked per element.\n * @param {boolean} [retHighest] Specify returning the highest qualified index.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n */\n function baseSortedIndexBy(array, value, iteratee, retHighest) {\n var low = 0,\n high = array == null ? 0 : array.length;\n if (high === 0) {\n return 0;\n }\n\n value = iteratee(value);\n var valIsNaN = value !== value,\n valIsNull = value === null,\n valIsSymbol = isSymbol(value),\n valIsUndefined = value === undefined;\n\n while (low < high) {\n var mid = nativeFloor((low + high) / 2),\n computed = iteratee(array[mid]),\n othIsDefined = computed !== undefined,\n othIsNull = computed === null,\n othIsReflexive = computed === computed,\n othIsSymbol = isSymbol(computed);\n\n if (valIsNaN) {\n var setLow = retHighest || othIsReflexive;\n } else if (valIsUndefined) {\n setLow = othIsReflexive && (retHighest || othIsDefined);\n } else if (valIsNull) {\n setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);\n } else if (valIsSymbol) {\n setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);\n } else if (othIsNull || othIsSymbol) {\n setLow = false;\n } else {\n setLow = retHighest ? (computed <= value) : (computed < value);\n }\n if (setLow) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n return nativeMin(high, MAX_ARRAY_INDEX);\n }\n\n /**\n * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\n function baseSortedUniq(array, iteratee) {\n var index = -1,\n length = array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n if (!index || !eq(computed, seen)) {\n var seen = computed;\n result[resIndex++] = value === 0 ? 0 : value;\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.toNumber` which doesn\'t ensure correct\n * conversions of binary, hexadecimal, or octal string values.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n */\n function baseToNumber(value) {\n if (typeof value == \'number\') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n return +value;\n }\n\n /**\n * The base implementation of `_.toString` which doesn\'t convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\n function baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == \'string\') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + \'\';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : \'\';\n }\n var result = (value + \'\');\n return (result == \'0\' && (1 / value) == -INFINITY) ? \'-0\' : result;\n }\n\n /**\n * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\n function baseUniq(array, iteratee, comparator) {\n var index = -1,\n includes = arrayIncludes,\n length = array.length,\n isCommon = true,\n result = [],\n seen = result;\n\n if (comparator) {\n isCommon = false;\n includes = arrayIncludesWith;\n }\n else if (length >= LARGE_ARRAY_SIZE) {\n var set = iteratee ? null : createSet(array);\n if (set) {\n return setToArray(set);\n }\n isCommon = false;\n includes = cacheHas;\n seen = new SetCache;\n }\n else {\n seen = iteratee ? [] : result;\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n value = (comparator || value !== 0) ? value : 0;\n if (isCommon && computed === computed) {\n var seenIndex = seen.length;\n while (seenIndex--) {\n if (seen[seenIndex] === computed) {\n continue outer;\n }\n }\n if (iteratee) {\n seen.push(computed);\n }\n result.push(value);\n }\n else if (!includes(seen, computed, comparator)) {\n if (seen !== result) {\n seen.push(computed);\n }\n result.push(value);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.unset`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The property path to unset.\n * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n */\n function baseUnset(object, path) {\n path = castPath(path, object);\n object = parent(object, path);\n return object == null || delete object[toKey(last(path))];\n }\n\n /**\n * The base implementation of `_.update`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to update.\n * @param {Function} updater The function to produce the updated value.\n * @param {Function} [customizer] The function to customize path creation.\n * @returns {Object} Returns `object`.\n */\n function baseUpdate(object, path, updater, customizer) {\n return baseSet(object, path, updater(baseGet(object, path)), customizer);\n }\n\n /**\n * The base implementation of methods like `_.dropWhile` and `_.takeWhile`\n * without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to query.\n * @param {Function} predicate The function invoked per iteration.\n * @param {boolean} [isDrop] Specify dropping elements instead of taking them.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Array} Returns the slice of `array`.\n */\n function baseWhile(array, predicate, isDrop, fromRight) {\n var length = array.length,\n index = fromRight ? length : -1;\n\n while ((fromRight ? index-- : ++index < length) &&\n predicate(array[index], index, array)) {}\n\n return isDrop\n ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))\n : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));\n }\n\n /**\n * The base implementation of `wrapperValue` which returns the result of\n * performing a sequence of actions on the unwrapped `value`, where each\n * successive action is supplied the return value of the previous.\n *\n * @private\n * @param {*} value The unwrapped value.\n * @param {Array} actions Actions to perform to resolve the unwrapped value.\n * @returns {*} Returns the resolved value.\n */\n function baseWrapperValue(value, actions) {\n var result = value;\n if (result instanceof LazyWrapper) {\n result = result.value();\n }\n return arrayReduce(actions, function(result, action) {\n return action.func.apply(action.thisArg, arrayPush([result], action.args));\n }, result);\n }\n\n /**\n * The base implementation of methods like `_.xor`, without support for\n * iteratee shorthands, that accepts an array of arrays to inspect.\n *\n * @private\n * @param {Array} arrays The arrays to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of values.\n */\n function baseXor(arrays, iteratee, comparator) {\n var length = arrays.length;\n if (length < 2) {\n return length ? baseUniq(arrays[0]) : [];\n }\n var index = -1,\n result = Array(length);\n\n while (++index < length) {\n var array = arrays[index],\n othIndex = -1;\n\n while (++othIndex < length) {\n if (othIndex != index) {\n result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);\n }\n }\n }\n return baseUniq(baseFlatten(result, 1), iteratee, comparator);\n }\n\n /**\n * This base implementation of `_.zipObject` which assigns values using `assignFunc`.\n *\n * @private\n * @param {Array} props The property identifiers.\n * @param {Array} values The property values.\n * @param {Function} assignFunc The function to assign values.\n * @returns {Object} Returns the new object.\n */\n function baseZipObject(props, values, assignFunc) {\n var index = -1,\n length = props.length,\n valsLength = values.length,\n result = {};\n\n while (++index < length) {\n var value = index < valsLength ? values[index] : undefined;\n assignFunc(result, props[index], value);\n }\n return result;\n }\n\n /**\n * Casts `value` to an empty array if it\'s not an array like object.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Array|Object} Returns the cast array-like object.\n */\n function castArrayLikeObject(value) {\n return isArrayLikeObject(value) ? value : [];\n }\n\n /**\n * Casts `value` to `identity` if it\'s not a function.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Function} Returns cast function.\n */\n function castFunction(value) {\n return typeof value == \'function\' ? value : identity;\n }\n\n /**\n * Casts `value` to a path array if it\'s not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\n function castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n }\n\n /**\n * A `baseRest` alias which can be replaced with `identity` by module\n * replacement plugins.\n *\n * @private\n * @type {Function}\n * @param {Function} func The function to apply a rest parameter to.\n * @returns {Function} Returns the new function.\n */\n var castRest = baseRest;\n\n /**\n * Casts `array` to a slice if it\'s needed.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {number} start The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the cast slice.\n */\n function castSlice(array, start, end) {\n var length = array.length;\n end = end === undefined ? length : end;\n return (!start && end >= length) ? array : baseSlice(array, start, end);\n }\n\n /**\n * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).\n *\n * @private\n * @param {number|Object} id The timer id or timeout object of the timer to clear.\n */\n var clearTimeout = ctxClearTimeout || function(id) {\n return root.clearTimeout(id);\n };\n\n /**\n * Creates a clone of `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\n function cloneBuffer(buffer, isDeep) {\n if (isDeep) {\n return buffer.slice();\n }\n var length = buffer.length,\n result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n buffer.copy(result);\n return result;\n }\n\n /**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\n function cloneArrayBuffer(arrayBuffer) {\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n return result;\n }\n\n /**\n * Creates a clone of `dataView`.\n *\n * @private\n * @param {Object} dataView The data view to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned data view.\n */\n function cloneDataView(dataView, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n }\n\n /**\n * Creates a clone of `regexp`.\n *\n * @private\n * @param {Object} regexp The regexp to clone.\n * @returns {Object} Returns the cloned regexp.\n */\n function cloneRegExp(regexp) {\n var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n result.lastIndex = regexp.lastIndex;\n return result;\n }\n\n /**\n * Creates a clone of the `symbol` object.\n *\n * @private\n * @param {Object} symbol The symbol object to clone.\n * @returns {Object} Returns the cloned symbol object.\n */\n function cloneSymbol(symbol) {\n return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n }\n\n /**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\n function cloneTypedArray(typedArray, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n }\n\n /**\n * Compares values to sort them in ascending order.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {number} Returns the sort order indicator for `value`.\n */\n function compareAscending(value, other) {\n if (value !== other) {\n var valIsDefined = value !== undefined,\n valIsNull = value === null,\n valIsReflexive = value === value,\n valIsSymbol = isSymbol(value);\n\n var othIsDefined = other !== undefined,\n othIsNull = other === null,\n othIsReflexive = other === other,\n othIsSymbol = isSymbol(other);\n\n if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\n (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\n (valIsNull && othIsDefined && othIsReflexive) ||\n (!valIsDefined && othIsReflexive) ||\n !valIsReflexive) {\n return 1;\n }\n if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\n (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\n (othIsNull && valIsDefined && valIsReflexive) ||\n (!othIsDefined && valIsReflexive) ||\n !othIsReflexive) {\n return -1;\n }\n }\n return 0;\n }\n\n /**\n * Used by `_.orderBy` to compare multiple properties of a value to another\n * and stable sort them.\n *\n * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,\n * specify an order of "desc" for descending or "asc" for ascending sort order\n * of corresponding values.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {boolean[]|string[]} orders The order to sort by for each property.\n * @returns {number} Returns the sort order indicator for `object`.\n */\n function compareMultiple(object, other, orders) {\n var index = -1,\n objCriteria = object.criteria,\n othCriteria = other.criteria,\n length = objCriteria.length,\n ordersLength = orders.length;\n\n while (++index < length) {\n var result = compareAscending(objCriteria[index], othCriteria[index]);\n if (result) {\n if (index >= ordersLength) {\n return result;\n }\n var order = orders[index];\n return result * (order == \'desc\' ? -1 : 1);\n }\n }\n // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n // that causes it, under certain circumstances, to provide the same value for\n // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\n // for more details.\n //\n // This also ensures a stable sort in V8 and other engines.\n // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\n return object.index - other.index;\n }\n\n /**\n * Creates an array that is the composition of partially applied arguments,\n * placeholders, and provided arguments into a single array of arguments.\n *\n * @private\n * @param {Array} args The provided arguments.\n * @param {Array} partials The arguments to prepend to those provided.\n * @param {Array} holders The `partials` placeholder indexes.\n * @params {boolean} [isCurried] Specify composing for a curried function.\n * @returns {Array} Returns the new array of composed arguments.\n */\n function composeArgs(args, partials, holders, isCurried) {\n var argsIndex = -1,\n argsLength = args.length,\n holdersLength = holders.length,\n leftIndex = -1,\n leftLength = partials.length,\n rangeLength = nativeMax(argsLength - holdersLength, 0),\n result = Array(leftLength + rangeLength),\n isUncurried = !isCurried;\n\n while (++leftIndex < leftLength) {\n result[leftIndex] = partials[leftIndex];\n }\n while (++argsIndex < holdersLength) {\n if (isUncurried || argsIndex < argsLength) {\n result[holders[argsIndex]] = args[argsIndex];\n }\n }\n while (rangeLength--) {\n result[leftIndex++] = args[argsIndex++];\n }\n return result;\n }\n\n /**\n * This function is like `composeArgs` except that the arguments composition\n * is tailored for `_.partialRight`.\n *\n * @private\n * @param {Array} args The provided arguments.\n * @param {Array} partials The arguments to append to those provided.\n * @param {Array} holders The `partials` placeholder indexes.\n * @params {boolean} [isCurried] Specify composing for a curried function.\n * @returns {Array} Returns the new array of composed arguments.\n */\n function composeArgsRight(args, partials, holders, isCurried) {\n var argsIndex = -1,\n argsLength = args.length,\n holdersIndex = -1,\n holdersLength = holders.length,\n rightIndex = -1,\n rightLength = partials.length,\n rangeLength = nativeMax(argsLength - holdersLength, 0),\n result = Array(rangeLength + rightLength),\n isUncurried = !isCurried;\n\n while (++argsIndex < rangeLength) {\n result[argsIndex] = args[argsIndex];\n }\n var offset = argsIndex;\n while (++rightIndex < rightLength) {\n result[offset + rightIndex] = partials[rightIndex];\n }\n while (++holdersIndex < holdersLength) {\n if (isUncurried || argsIndex < argsLength) {\n result[offset + holders[holdersIndex]] = args[argsIndex++];\n }\n }\n return result;\n }\n\n /**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\n function copyArray(source, array) {\n var index = -1,\n length = source.length;\n\n array || (array = Array(length));\n while (++index < length) {\n array[index] = source[index];\n }\n return array;\n }\n\n /**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\n function copyObject(source, props, object, customizer) {\n var isNew = !object;\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n\n var newValue = customizer\n ? customizer(object[key], source[key], key, object, source)\n : undefined;\n\n if (newValue === undefined) {\n newValue = source[key];\n }\n if (isNew) {\n baseAssignValue(object, key, newValue);\n } else {\n assignValue(object, key, newValue);\n }\n }\n return object;\n }\n\n /**\n * Copies own symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\n function copySymbols(source, object) {\n return copyObject(source, getSymbols(source), object);\n }\n\n /**\n * Copies own and inherited symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\n function copySymbolsIn(source, object) {\n return copyObject(source, getSymbolsIn(source), object);\n }\n\n /**\n * Creates a function like `_.groupBy`.\n *\n * @private\n * @param {Function} setter The function to set accumulator values.\n * @param {Function} [initializer] The accumulator object initializer.\n * @returns {Function} Returns the new aggregator function.\n */\n function createAggregator(setter, initializer) {\n return function(collection, iteratee) {\n var func = isArray(collection) ? arrayAggregator : baseAggregator,\n accumulator = initializer ? initializer() : {};\n\n return func(collection, setter, getIteratee(iteratee, 2), accumulator);\n };\n }\n\n /**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\n function createAssigner(assigner) {\n return baseRest(function(object, sources) {\n var index = -1,\n length = sources.length,\n customizer = length > 1 ? sources[length - 1] : undefined,\n guard = length > 2 ? sources[2] : undefined;\n\n customizer = (assigner.length > 3 && typeof customizer == \'function\')\n ? (length--, customizer)\n : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n customizer = length < 3 ? undefined : customizer;\n length = 1;\n }\n object = Object(object);\n while (++index < length) {\n var source = sources[index];\n if (source) {\n assigner(object, source, index, customizer);\n }\n }\n return object;\n });\n }\n\n /**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\n function createBaseEach(eachFunc, fromRight) {\n return function(collection, iteratee) {\n if (collection == null) {\n return collection;\n }\n if (!isArrayLike(collection)) {\n return eachFunc(collection, iteratee);\n }\n var length = collection.length,\n index = fromRight ? length : -1,\n iterable = Object(collection);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (iteratee(iterable[index], index, iterable) === false) {\n break;\n }\n }\n return collection;\n };\n }\n\n /**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\n function createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var index = -1,\n iterable = Object(object),\n props = keysFunc(object),\n length = props.length;\n\n while (length--) {\n var key = props[fromRight ? length : ++index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n }\n\n /**\n * Creates a function that wraps `func` to invoke it with the optional `this`\n * binding of `thisArg`.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\n function createBind(func, bitmask, thisArg) {\n var isBind = bitmask & WRAP_BIND_FLAG,\n Ctor = createCtor(func);\n\n function wrapper() {\n var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n return fn.apply(isBind ? thisArg : this, arguments);\n }\n return wrapper;\n }\n\n /**\n * Creates a function like `_.lowerFirst`.\n *\n * @private\n * @param {string} methodName The name of the `String` case method to use.\n * @returns {Function} Returns the new case function.\n */\n function createCaseFirst(methodName) {\n return function(string) {\n string = toString(string);\n\n var strSymbols = hasUnicode(string)\n ? stringToArray(string)\n : undefined;\n\n var chr = strSymbols\n ? strSymbols[0]\n : string.charAt(0);\n\n var trailing = strSymbols\n ? castSlice(strSymbols, 1).join(\'\')\n : string.slice(1);\n\n return chr[methodName]() + trailing;\n };\n }\n\n /**\n * Creates a function like `_.camelCase`.\n *\n * @private\n * @param {Function} callback The function to combine each word.\n * @returns {Function} Returns the new compounder function.\n */\n function createCompounder(callback) {\n return function(string) {\n return arrayReduce(words(deburr(string).replace(reApos, \'\')), callback, \'\');\n };\n }\n\n /**\n * Creates a function that produces an instance of `Ctor` regardless of\n * whether it was invoked as part of a `new` expression or by `call` or `apply`.\n *\n * @private\n * @param {Function} Ctor The constructor to wrap.\n * @returns {Function} Returns the new wrapped function.\n */\n function createCtor(Ctor) {\n return function() {\n // Use a `switch` statement to work with class constructors. See\n // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist\n // for more details.\n var args = arguments;\n switch (args.length) {\n case 0: return new Ctor;\n case 1: return new Ctor(args[0]);\n case 2: return new Ctor(args[0], args[1]);\n case 3: return new Ctor(args[0], args[1], args[2]);\n case 4: return new Ctor(args[0], args[1], args[2], args[3]);\n case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);\n case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);\n case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);\n }\n var thisBinding = baseCreate(Ctor.prototype),\n result = Ctor.apply(thisBinding, args);\n\n // Mimic the constructor\'s `return` behavior.\n // See https://es5.github.io/#x13.2.2 for more details.\n return isObject(result) ? result : thisBinding;\n };\n }\n\n /**\n * Creates a function that wraps `func` to enable currying.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {number} arity The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\n function createCurry(func, bitmask, arity) {\n var Ctor = createCtor(func);\n\n function wrapper() {\n var length = arguments.length,\n args = Array(length),\n index = length,\n placeholder = getHolder(wrapper);\n\n while (index--) {\n args[index] = arguments[index];\n }\n var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)\n ? []\n : replaceHolders(args, placeholder);\n\n length -= holders.length;\n if (length < arity) {\n return createRecurry(\n func, bitmask, createHybrid, wrapper.placeholder, undefined,\n args, holders, undefined, undefined, arity - length);\n }\n var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n return apply(fn, this, args);\n }\n return wrapper;\n }\n\n /**\n * Creates a `_.find` or `_.findLast` function.\n *\n * @private\n * @param {Function} findIndexFunc The function to find the collection index.\n * @returns {Function} Returns the new find function.\n */\n function createFind(findIndexFunc) {\n return function(collection, predicate, fromIndex) {\n var iterable = Object(collection);\n if (!isArrayLike(collection)) {\n var iteratee = getIteratee(predicate, 3);\n collection = keys(collection);\n predicate = function(key) { return iteratee(iterable[key], key, iterable); };\n }\n var index = findIndexFunc(collection, predicate, fromIndex);\n return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\n };\n }\n\n /**\n * Creates a `_.flow` or `_.flowRight` function.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new flow function.\n */\n function createFlow(fromRight) {\n return flatRest(function(funcs) {\n var length = funcs.length,\n index = length,\n prereq = LodashWrapper.prototype.thru;\n\n if (fromRight) {\n funcs.reverse();\n }\n while (index--) {\n var func = funcs[index];\n if (typeof func != \'function\') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (prereq && !wrapper && getFuncName(func) == \'wrapper\') {\n var wrapper = new LodashWrapper([], true);\n }\n }\n index = wrapper ? index : length;\n while (++index < length) {\n func = funcs[index];\n\n var funcName = getFuncName(func),\n data = funcName == \'wrapper\' ? getData(func) : undefined;\n\n if (data && isLaziable(data[0]) &&\n data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&\n !data[4].length && data[9] == 1\n ) {\n wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);\n } else {\n wrapper = (func.length == 1 && isLaziable(func))\n ? wrapper[funcName]()\n : wrapper.thru(func);\n }\n }\n return function() {\n var args = arguments,\n value = args[0];\n\n if (wrapper && args.length == 1 && isArray(value)) {\n return wrapper.plant(value).value();\n }\n var index = 0,\n result = length ? funcs[index].apply(this, args) : value;\n\n while (++index < length) {\n result = funcs[index].call(this, result);\n }\n return result;\n };\n });\n }\n\n /**\n * Creates a function that wraps `func` to invoke it with optional `this`\n * binding of `thisArg`, partial application, and currying.\n *\n * @private\n * @param {Function|string} func The function or method name to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to prepend to those provided to\n * the new function.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [partialsRight] The arguments to append to those provided\n * to the new function.\n * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\n function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {\n var isAry = bitmask & WRAP_ARY_FLAG,\n isBind = bitmask & WRAP_BIND_FLAG,\n isBindKey = bitmask & WRAP_BIND_KEY_FLAG,\n isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),\n isFlip = bitmask & WRAP_FLIP_FLAG,\n Ctor = isBindKey ? undefined : createCtor(func);\n\n function wrapper() {\n var length = arguments.length,\n args = Array(length),\n index = length;\n\n while (index--) {\n args[index] = arguments[index];\n }\n if (isCurried) {\n var placeholder = getHolder(wrapper),\n holdersCount = countHolders(args, placeholder);\n }\n if (partials) {\n args = composeArgs(args, partials, holders, isCurried);\n }\n if (partialsRight) {\n args = composeArgsRight(args, partialsRight, holdersRight, isCurried);\n }\n length -= holdersCount;\n if (isCurried && length < arity) {\n var newHolders = replaceHolders(args, placeholder);\n return createRecurry(\n func, bitmask, createHybrid, wrapper.placeholder, thisArg,\n args, newHolders, argPos, ary, arity - length\n );\n }\n var thisBinding = isBind ? thisArg : this,\n fn = isBindKey ? thisBinding[func] : func;\n\n length = args.length;\n if (argPos) {\n args = reorder(args, argPos);\n } else if (isFlip && length > 1) {\n args.reverse();\n }\n if (isAry && ary < length) {\n args.length = ary;\n }\n if (this && this !== root && this instanceof wrapper) {\n fn = Ctor || createCtor(fn);\n }\n return fn.apply(thisBinding, args);\n }\n return wrapper;\n }\n\n /**\n * Creates a function like `_.invertBy`.\n *\n * @private\n * @param {Function} setter The function to set accumulator values.\n * @param {Function} toIteratee The function to resolve iteratees.\n * @returns {Function} Returns the new inverter function.\n */\n function createInverter(setter, toIteratee) {\n return function(object, iteratee) {\n return baseInverter(object, setter, toIteratee(iteratee), {});\n };\n }\n\n /**\n * Creates a function that performs a mathematical operation on two values.\n *\n * @private\n * @param {Function} operator The function to perform the operation.\n * @param {number} [defaultValue] The value used for `undefined` arguments.\n * @returns {Function} Returns the new mathematical operation function.\n */\n function createMathOperation(operator, defaultValue) {\n return function(value, other) {\n var result;\n if (value === undefined && other === undefined) {\n return defaultValue;\n }\n if (value !== undefined) {\n result = value;\n }\n if (other !== undefined) {\n if (result === undefined) {\n return other;\n }\n if (typeof value == \'string\' || typeof other == \'string\') {\n value = baseToString(value);\n other = baseToString(other);\n } else {\n value = baseToNumber(value);\n other = baseToNumber(other);\n }\n result = operator(value, other);\n }\n return result;\n };\n }\n\n /**\n * Creates a function like `_.over`.\n *\n * @private\n * @param {Function} arrayFunc The function to iterate over iteratees.\n * @returns {Function} Returns the new over function.\n */\n function createOver(arrayFunc) {\n return flatRest(function(iteratees) {\n iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\n return baseRest(function(args) {\n var thisArg = this;\n return arrayFunc(iteratees, function(iteratee) {\n return apply(iteratee, thisArg, args);\n });\n });\n });\n }\n\n /**\n * Creates the padding for `string` based on `length`. The `chars` string\n * is truncated if the number of characters exceeds `length`.\n *\n * @private\n * @param {number} length The padding length.\n * @param {string} [chars=\' \'] The string used as padding.\n * @returns {string} Returns the padding for `string`.\n */\n function createPadding(length, chars) {\n chars = chars === undefined ? \' \' : baseToString(chars);\n\n var charsLength = chars.length;\n if (charsLength < 2) {\n return charsLength ? baseRepeat(chars, length) : chars;\n }\n var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));\n return hasUnicode(chars)\n ? castSlice(stringToArray(result), 0, length).join(\'\')\n : result.slice(0, length);\n }\n\n /**\n * Creates a function that wraps `func` to invoke it with the `this` binding\n * of `thisArg` and `partials` prepended to the arguments it receives.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} partials The arguments to prepend to those provided to\n * the new function.\n * @returns {Function} Returns the new wrapped function.\n */\n function createPartial(func, bitmask, thisArg, partials) {\n var isBind = bitmask & WRAP_BIND_FLAG,\n Ctor = createCtor(func);\n\n function wrapper() {\n var argsIndex = -1,\n argsLength = arguments.length,\n leftIndex = -1,\n leftLength = partials.length,\n args = Array(leftLength + argsLength),\n fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n\n while (++leftIndex < leftLength) {\n args[leftIndex] = partials[leftIndex];\n }\n while (argsLength--) {\n args[leftIndex++] = arguments[++argsIndex];\n }\n return apply(fn, isBind ? thisArg : this, args);\n }\n return wrapper;\n }\n\n /**\n * Creates a `_.range` or `_.rangeRight` function.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new range function.\n */\n function createRange(fromRight) {\n return function(start, end, step) {\n if (step && typeof step != \'number\' && isIterateeCall(start, end, step)) {\n end = step = undefined;\n }\n // Ensure the sign of `-0` is preserved.\n start = toFinite(start);\n if (end === undefined) {\n end = start;\n start = 0;\n } else {\n end = toFinite(end);\n }\n step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);\n return baseRange(start, end, step, fromRight);\n };\n }\n\n /**\n * Creates a function that performs a relational operation on two values.\n *\n * @private\n * @param {Function} operator The function to perform the operation.\n * @returns {Function} Returns the new relational operation function.\n */\n function createRelationalOperation(operator) {\n return function(value, other) {\n if (!(typeof value == \'string\' && typeof other == \'string\')) {\n value = toNumber(value);\n other = toNumber(other);\n }\n return operator(value, other);\n };\n }\n\n /**\n * Creates a function that wraps `func` to continue currying.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {Function} wrapFunc The function to create the `func` wrapper.\n * @param {*} placeholder The placeholder value.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to prepend to those provided to\n * the new function.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\n function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {\n var isCurry = bitmask & WRAP_CURRY_FLAG,\n newHolders = isCurry ? holders : undefined,\n newHoldersRight = isCurry ? undefined : holders,\n newPartials = isCurry ? partials : undefined,\n newPartialsRight = isCurry ? undefined : partials;\n\n bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);\n bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);\n\n if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {\n bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);\n }\n var newData = [\n func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,\n newHoldersRight, argPos, ary, arity\n ];\n\n var result = wrapFunc.apply(undefined, newData);\n if (isLaziable(func)) {\n setData(result, newData);\n }\n result.placeholder = placeholder;\n return setWrapToString(result, func, bitmask);\n }\n\n /**\n * Creates a function like `_.round`.\n *\n * @private\n * @param {string} methodName The name of the `Math` method to use when rounding.\n * @returns {Function} Returns the new round function.\n */\n function createRound(methodName) {\n var func = Math[methodName];\n return function(number, precision) {\n number = toNumber(number);\n precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);\n if (precision && nativeIsFinite(number)) {\n // Shift with exponential notation to avoid floating-point issues.\n // See [MDN](https://mdn.io/round#Examples) for more details.\n var pair = (toString(number) + \'e\').split(\'e\'),\n value = func(pair[0] + \'e\' + (+pair[1] + precision));\n\n pair = (toString(value) + \'e\').split(\'e\');\n return +(pair[0] + \'e\' + (+pair[1] - precision));\n }\n return func(number);\n };\n }\n\n /**\n * Creates a set object of `values`.\n *\n * @private\n * @param {Array} values The values to add to the set.\n * @returns {Object} Returns the new set.\n */\n var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n return new Set(values);\n };\n\n /**\n * Creates a `_.toPairs` or `_.toPairsIn` function.\n *\n * @private\n * @param {Function} keysFunc The function to get the keys of a given object.\n * @returns {Function} Returns the new pairs function.\n */\n function createToPairs(keysFunc) {\n return function(object) {\n var tag = getTag(object);\n if (tag == mapTag) {\n return mapToArray(object);\n }\n if (tag == setTag) {\n return setToPairs(object);\n }\n return baseToPairs(object, keysFunc(object));\n };\n }\n\n /**\n * Creates a function that either curries or invokes `func` with optional\n * `this` binding and partially applied arguments.\n *\n * @private\n * @param {Function|string} func The function or method name to wrap.\n * @param {number} bitmask The bitmask flags.\n * 1 - `_.bind`\n * 2 - `_.bindKey`\n * 4 - `_.curry` or `_.curryRight` of a bound function\n * 8 - `_.curry`\n * 16 - `_.curryRight`\n * 32 - `_.partial`\n * 64 - `_.partialRight`\n * 128 - `_.rearg`\n * 256 - `_.ary`\n * 512 - `_.flip`\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to be partially applied.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\n function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {\n var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;\n if (!isBindKey && typeof func != \'function\') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var length = partials ? partials.length : 0;\n if (!length) {\n bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);\n partials = holders = undefined;\n }\n ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);\n arity = arity === undefined ? arity : toInteger(arity);\n length -= holders ? holders.length : 0;\n\n if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {\n var partialsRight = partials,\n holdersRight = holders;\n\n partials = holders = undefined;\n }\n var data = isBindKey ? undefined : getData(func);\n\n var newData = [\n func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,\n argPos, ary, arity\n ];\n\n if (data) {\n mergeData(newData, data);\n }\n func = newData[0];\n bitmask = newData[1];\n thisArg = newData[2];\n partials = newData[3];\n holders = newData[4];\n arity = newData[9] = newData[9] === undefined\n ? (isBindKey ? 0 : func.length)\n : nativeMax(newData[9] - length, 0);\n\n if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {\n bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);\n }\n if (!bitmask || bitmask == WRAP_BIND_FLAG) {\n var result = createBind(func, bitmask, thisArg);\n } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {\n result = createCurry(func, bitmask, arity);\n } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {\n result = createPartial(func, bitmask, thisArg, partials);\n } else {\n result = createHybrid.apply(undefined, newData);\n }\n var setter = data ? baseSetData : setData;\n return setWrapToString(setter(result, newData), func, bitmask);\n }\n\n /**\n * Used by `_.defaults` to customize its `_.assignIn` use to assign properties\n * of source objects to the destination object for all destination properties\n * that resolve to `undefined`.\n *\n * @private\n * @param {*} objValue The destination value.\n * @param {*} srcValue The source value.\n * @param {string} key The key of the property to assign.\n * @param {Object} object The parent object of `objValue`.\n * @returns {*} Returns the value to assign.\n */\n function customDefaultsAssignIn(objValue, srcValue, key, object) {\n if (objValue === undefined ||\n (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n return srcValue;\n }\n return objValue;\n }\n\n /**\n * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source\n * objects into destination objects that are passed thru.\n *\n * @private\n * @param {*} objValue The destination value.\n * @param {*} srcValue The source value.\n * @param {string} key The key of the property to merge.\n * @param {Object} object The parent object of `objValue`.\n * @param {Object} source The parent object of `srcValue`.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n * @returns {*} Returns the value to assign.\n */\n function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {\n if (isObject(objValue) && isObject(srcValue)) {\n // Recursively merge objects and arrays (susceptible to call stack limits).\n stack.set(srcValue, objValue);\n baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);\n stack[\'delete\'](srcValue);\n }\n return objValue;\n }\n\n /**\n * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain\n * objects.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {string} key The key of the property to inspect.\n * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.\n */\n function customOmitClone(value) {\n return isPlainObject(value) ? undefined : value;\n }\n\n /**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\n function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n return false;\n }\n // Check that cyclic values are equal.\n var arrStacked = stack.get(array);\n var othStacked = stack.get(other);\n if (arrStacked && othStacked) {\n return arrStacked == other && othStacked == array;\n }\n var index = -1,\n result = true,\n seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n stack.set(array, other);\n stack.set(other, array);\n\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, arrValue, index, other, array, stack)\n : customizer(arrValue, othValue, index, array, other, stack);\n }\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n result = false;\n break;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (seen) {\n if (!arraySome(other, function(othValue, othIndex) {\n if (!cacheHas(seen, othIndex) &&\n (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n return seen.push(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(\n arrValue === othValue ||\n equalFunc(arrValue, othValue, bitmask, customizer, stack)\n )) {\n result = false;\n break;\n }\n }\n stack[\'delete\'](array);\n stack[\'delete\'](other);\n return result;\n }\n\n /**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\n function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n switch (tag) {\n case dataViewTag:\n if ((object.byteLength != other.byteLength) ||\n (object.byteOffset != other.byteOffset)) {\n return false;\n }\n object = object.buffer;\n other = other.buffer;\n\n case arrayBufferTag:\n if ((object.byteLength != other.byteLength) ||\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\n return true;\n\n case boolTag:\n case dateTag:\n case numberTag:\n // Coerce booleans to `1` or `0` and dates to milliseconds.\n // Invalid dates are coerced to `NaN`.\n return eq(+object, +other);\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings, primitives and objects,\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n // for more details.\n return object == (other + \'\');\n\n case mapTag:\n var convert = mapToArray;\n\n case setTag:\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n convert || (convert = setToArray);\n\n if (object.size != other.size && !isPartial) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked) {\n return stacked == other;\n }\n bitmask |= COMPARE_UNORDERED_FLAG;\n\n // Recursively compare objects (susceptible to call stack limits).\n stack.set(object, other);\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n stack[\'delete\'](object);\n return result;\n\n case symbolTag:\n if (symbolValueOf) {\n return symbolValueOf.call(object) == symbolValueOf.call(other);\n }\n }\n return false;\n }\n\n /**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\n function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n objProps = getAllKeys(object),\n objLength = objProps.length,\n othProps = getAllKeys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isPartial) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n // Check that cyclic values are equal.\n var objStacked = stack.get(object);\n var othStacked = stack.get(other);\n if (objStacked && othStacked) {\n return objStacked == other && othStacked == object;\n }\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n\n var skipCtor = isPartial;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, objValue, key, other, object, stack)\n : customizer(objValue, othValue, key, object, other, stack);\n }\n // Recursively compare objects (susceptible to call stack limits).\n if (!(compared === undefined\n ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n : compared\n )) {\n result = false;\n break;\n }\n skipCtor || (skipCtor = key == \'constructor\');\n }\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n (\'constructor\' in object && \'constructor\' in other) &&\n !(typeof objCtor == \'function\' && objCtor instanceof objCtor &&\n typeof othCtor == \'function\' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n stack[\'delete\'](object);\n stack[\'delete\'](other);\n return result;\n }\n\n /**\n * A specialized version of `baseRest` which flattens the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @returns {Function} Returns the new function.\n */\n function flatRest(func) {\n return setToString(overRest(func, undefined, flatten), func + \'\');\n }\n\n /**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\n function getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n }\n\n /**\n * Creates an array of own and inherited enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\n function getAllKeysIn(object) {\n return baseGetAllKeys(object, keysIn, getSymbolsIn);\n }\n\n /**\n * Gets metadata for `func`.\n *\n * @private\n * @param {Function} func The function to query.\n * @returns {*} Returns the metadata for `func`.\n */\n var getData = !metaMap ? noop : function(func) {\n return metaMap.get(func);\n };\n\n /**\n * Gets the name of `func`.\n *\n * @private\n * @param {Function} func The function to query.\n * @returns {string} Returns the function name.\n */\n function getFuncName(func) {\n var result = (func.name + \'\'),\n array = realNames[result],\n length = hasOwnProperty.call(realNames, result) ? array.length : 0;\n\n while (length--) {\n var data = array[length],\n otherFunc = data.func;\n if (otherFunc == null || otherFunc == func) {\n return data.name;\n }\n }\n return result;\n }\n\n /**\n * Gets the argument placeholder value for `func`.\n *\n * @private\n * @param {Function} func The function to inspect.\n * @returns {*} Returns the placeholder value.\n */\n function getHolder(func) {\n var object = hasOwnProperty.call(lodash, \'placeholder\') ? lodash : func;\n return object.placeholder;\n }\n\n /**\n * Gets the appropriate "iteratee" function. If `_.iteratee` is customized,\n * this function returns the custom method, otherwise it returns `baseIteratee`.\n * If arguments are provided, the chosen function is invoked with them and\n * its result is returned.\n *\n * @private\n * @param {*} [value] The value to convert to an iteratee.\n * @param {number} [arity] The arity of the created iteratee.\n * @returns {Function} Returns the chosen function or its result.\n */\n function getIteratee() {\n var result = lodash.iteratee || iteratee;\n result = result === iteratee ? baseIteratee : result;\n return arguments.length ? result(arguments[0], arguments[1]) : result;\n }\n\n /**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\n function getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == \'string\' ? \'string\' : \'hash\']\n : data.map;\n }\n\n /**\n * Gets the property names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\n function getMatchData(object) {\n var result = keys(object),\n length = result.length;\n\n while (length--) {\n var key = result[length],\n value = object[key];\n\n result[length] = [key, value, isStrictComparable(value)];\n }\n return result;\n }\n\n /**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it\'s native, else `undefined`.\n */\n function getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n }\n\n /**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\n function getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n }\n\n /**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\n var getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n if (object == null) {\n return [];\n }\n object = Object(object);\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\n return propertyIsEnumerable.call(object, symbol);\n });\n };\n\n /**\n * Creates an array of the own and inherited enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\n var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n var result = [];\n while (object) {\n arrayPush(result, getSymbols(object));\n object = getPrototype(object);\n }\n return result;\n };\n\n /**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\n var getTag = baseGetTag;\n\n // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\n if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : \'\';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n }\n\n /**\n * Gets the view, applying any `transforms` to the `start` and `end` positions.\n *\n * @private\n * @param {number} start The start of the view.\n * @param {number} end The end of the view.\n * @param {Array} transforms The transformations to apply to the view.\n * @returns {Object} Returns an object containing the `start` and `end`\n * positions of the view.\n */\n function getView(start, end, transforms) {\n var index = -1,\n length = transforms.length;\n\n while (++index < length) {\n var data = transforms[index],\n size = data.size;\n\n switch (data.type) {\n case \'drop\': start += size; break;\n case \'dropRight\': end -= size; break;\n case \'take\': end = nativeMin(end, start + size); break;\n case \'takeRight\': start = nativeMax(start, end - size); break;\n }\n }\n return { \'start\': start, \'end\': end };\n }\n\n /**\n * Extracts wrapper details from the `source` body comment.\n *\n * @private\n * @param {string} source The source to inspect.\n * @returns {Array} Returns the wrapper details.\n */\n function getWrapDetails(source) {\n var match = source.match(reWrapDetails);\n return match ? match[1].split(reSplitDetails) : [];\n }\n\n /**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\n function hasPath(object, path, hasFunc) {\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n result = false;\n\n while (++index < length) {\n var key = toKey(path[index]);\n if (!(result = object != null && hasFunc(object, key))) {\n break;\n }\n object = object[key];\n }\n if (result || ++index != length) {\n return result;\n }\n length = object == null ? 0 : object.length;\n return !!length && isLength(length) && isIndex(key, length) &&\n (isArray(object) || isArguments(object));\n }\n\n /**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\n function initCloneArray(array) {\n var length = array.length,\n result = new array.constructor(length);\n\n // Add properties assigned by `RegExp#exec`.\n if (length && typeof array[0] == \'string\' && hasOwnProperty.call(array, \'index\')) {\n result.index = array.index;\n result.input = array.input;\n }\n return result;\n }\n\n /**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\n function initCloneObject(object) {\n return (typeof object.constructor == \'function\' && !isPrototype(object))\n ? baseCreate(getPrototype(object))\n : {};\n }\n\n /**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\n function initCloneByTag(object, tag, isDeep) {\n var Ctor = object.constructor;\n switch (tag) {\n case arrayBufferTag:\n return cloneArrayBuffer(object);\n\n case boolTag:\n case dateTag:\n return new Ctor(+object);\n\n case dataViewTag:\n return cloneDataView(object, isDeep);\n\n case float32Tag: case float64Tag:\n case int8Tag: case int16Tag: case int32Tag:\n case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n return cloneTypedArray(object, isDeep);\n\n case mapTag:\n return new Ctor;\n\n case numberTag:\n case stringTag:\n return new Ctor(object);\n\n case regexpTag:\n return cloneRegExp(object);\n\n case setTag:\n return new Ctor;\n\n case symbolTag:\n return cloneSymbol(object);\n }\n }\n\n /**\n * Inserts wrapper `details` in a comment at the top of the `source` body.\n *\n * @private\n * @param {string} source The source to modify.\n * @returns {Array} details The details to insert.\n * @returns {string} Returns the modified source.\n */\n function insertWrapDetails(source, details) {\n var length = details.length;\n if (!length) {\n return source;\n }\n var lastIndex = length - 1;\n details[lastIndex] = (length > 1 ? \'& \' : \'\') + details[lastIndex];\n details = details.join(length > 2 ? \', \' : \' \');\n return source.replace(reWrapComment, \'{\\n/* [wrapped with \' + details + \'] */\\n\');\n }\n\n /**\n * Checks if `value` is a flattenable `arguments` object or array.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n */\n function isFlattenable(value) {\n return isArray(value) || isArguments(value) ||\n !!(spreadableSymbol && value && value[spreadableSymbol]);\n }\n\n /**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\n function isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == \'number\' ||\n (type != \'symbol\' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n }\n\n /**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\n function isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == \'number\'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == \'string\' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n }\n\n /**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\n function isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == \'number\' || type == \'symbol\' || type == \'boolean\' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n }\n\n /**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\n function isKeyable(value) {\n var type = typeof value;\n return (type == \'string\' || type == \'number\' || type == \'symbol\' || type == \'boolean\')\n ? (value !== \'__proto__\')\n : (value === null);\n }\n\n /**\n * Checks if `func` has a lazy counterpart.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` has a lazy counterpart,\n * else `false`.\n */\n function isLaziable(func) {\n var funcName = getFuncName(func),\n other = lodash[funcName];\n\n if (typeof other != \'function\' || !(funcName in LazyWrapper.prototype)) {\n return false;\n }\n if (func === other) {\n return true;\n }\n var data = getData(other);\n return !!data && func === data[0];\n }\n\n /**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\n function isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n }\n\n /**\n * Checks if `func` is capable of being masked.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `func` is maskable, else `false`.\n */\n var isMaskable = coreJsData ? isFunction : stubFalse;\n\n /**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\n function isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == \'function\' && Ctor.prototype) || objectProto;\n\n return value === proto;\n }\n\n /**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n * equality comparisons, else `false`.\n */\n function isStrictComparable(value) {\n return value === value && !isObject(value);\n }\n\n /**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\n function matchesStrictComparable(key, srcValue) {\n return function(object) {\n if (object == null) {\n return false;\n }\n return object[key] === srcValue &&\n (srcValue !== undefined || (key in Object(object)));\n };\n }\n\n /**\n * A specialized version of `_.memoize` which clears the memoized function\'s\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\n function memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n }\n\n /**\n * Merges the function metadata of `source` into `data`.\n *\n * Merging metadata reduces the number of wrappers used to invoke a function.\n * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`\n * may be applied regardless of execution order. Methods like `_.ary` and\n * `_.rearg` modify function arguments, making the order in which they are\n * executed important, preventing the merging of metadata. However, we make\n * an exception for a safe combined case where curried functions have `_.ary`\n * and or `_.rearg` applied.\n *\n * @private\n * @param {Array} data The destination metadata.\n * @param {Array} source The source metadata.\n * @returns {Array} Returns `data`.\n */\n function mergeData(data, source) {\n var bitmask = data[1],\n srcBitmask = source[1],\n newBitmask = bitmask | srcBitmask,\n isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);\n\n var isCombo =\n ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||\n ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||\n ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));\n\n // Exit early if metadata can\'t be merged.\n if (!(isCommon || isCombo)) {\n return data;\n }\n // Use source `thisArg` if available.\n if (srcBitmask & WRAP_BIND_FLAG) {\n data[2] = source[2];\n // Set when currying a bound function.\n newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;\n }\n // Compose partial arguments.\n var value = source[3];\n if (value) {\n var partials = data[3];\n data[3] = partials ? composeArgs(partials, value, source[4]) : value;\n data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];\n }\n // Compose partial right arguments.\n value = source[5];\n if (value) {\n partials = data[5];\n data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;\n data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];\n }\n // Use source `argPos` if available.\n value = source[7];\n if (value) {\n data[7] = value;\n }\n // Use source `ary` if it\'s smaller.\n if (srcBitmask & WRAP_ARY_FLAG) {\n data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);\n }\n // Use source `arity` if one is not provided.\n if (data[9] == null) {\n data[9] = source[9];\n }\n // Use source `func` and merge bitmasks.\n data[0] = source[0];\n data[1] = newBitmask;\n\n return data;\n }\n\n /**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\n function nativeKeysIn(object) {\n var result = [];\n if (object != null) {\n for (var key in Object(object)) {\n result.push(key);\n }\n }\n return result;\n }\n\n /**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\n function objectToString(value) {\n return nativeObjectToString.call(value);\n }\n\n /**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\n function overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n }\n\n /**\n * Gets the parent value at `path` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} path The path to get the parent value of.\n * @returns {*} Returns the parent value.\n */\n function parent(object, path) {\n return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));\n }\n\n /**\n * Reorder `array` according to the specified indexes where the element at\n * the first index is assigned as the first element, the element at\n * the second index is assigned as the second element, and so on.\n *\n * @private\n * @param {Array} array The array to reorder.\n * @param {Array} indexes The arranged array indexes.\n * @returns {Array} Returns `array`.\n */\n function reorder(array, indexes) {\n var arrLength = array.length,\n length = nativeMin(indexes.length, arrLength),\n oldArray = copyArray(array);\n\n while (length--) {\n var index = indexes[length];\n array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;\n }\n return array;\n }\n\n /**\n * Gets the value at `key`, unless `key` is "__proto__" or "constructor".\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\n function safeGet(object, key) {\n if (key === \'constructor\' && typeof object[key] === \'function\') {\n return;\n }\n\n if (key == \'__proto__\') {\n return;\n }\n\n return object[key];\n }\n\n /**\n * Sets metadata for `func`.\n *\n * **Note:** If this function becomes hot, i.e. is invoked a lot in a short\n * period of time, it will trip its breaker and transition to an identity\n * function to avoid garbage collection pauses in V8. See\n * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)\n * for more details.\n *\n * @private\n * @param {Function} func The function to associate metadata with.\n * @param {*} data The metadata.\n * @returns {Function} Returns `func`.\n */\n var setData = shortOut(baseSetData);\n\n /**\n * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).\n *\n * @private\n * @param {Function} func The function to delay.\n * @param {number} wait The number of milliseconds to delay invocation.\n * @returns {number|Object} Returns the timer id or timeout object.\n */\n var setTimeout = ctxSetTimeout || function(func, wait) {\n return root.setTimeout(func, wait);\n };\n\n /**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\n var setToString = shortOut(baseSetToString);\n\n /**\n * Sets the `toString` method of `wrapper` to mimic the source of `reference`\n * with wrapper details in a comment at the top of the source body.\n *\n * @private\n * @param {Function} wrapper The function to modify.\n * @param {Function} reference The reference function.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @returns {Function} Returns `wrapper`.\n */\n function setWrapToString(wrapper, reference, bitmask) {\n var source = (reference + \'\');\n return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));\n }\n\n /**\n * Creates a function that\'ll short out and invoke `identity` instead\n * of `func` when it\'s called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\n function shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n }\n\n /**\n * A specialized version of `_.shuffle` which mutates and sets the size of `array`.\n *\n * @private\n * @param {Array} array The array to shuffle.\n * @param {number} [size=array.length] The size of `array`.\n * @returns {Array} Returns `array`.\n */\n function shuffleSelf(array, size) {\n var index = -1,\n length = array.length,\n lastIndex = length - 1;\n\n size = size === undefined ? length : size;\n while (++index < size) {\n var rand = baseRandom(index, lastIndex),\n value = array[rand];\n\n array[rand] = array[index];\n array[index] = value;\n }\n array.length = size;\n return array;\n }\n\n /**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\n var stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (string.charCodeAt(0) === 46 /* . */) {\n result.push(\'\');\n }\n string.replace(rePropName, function(match, number, quote, subString) {\n result.push(quote ? subString.replace(reEscapeChar, \'$1\') : (number || match));\n });\n return result;\n });\n\n /**\n * Converts `value` to a string key if it\'s not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\n function toKey(value) {\n if (typeof value == \'string\' || isSymbol(value)) {\n return value;\n }\n var result = (value + \'\');\n return (result == \'0\' && (1 / value) == -INFINITY) ? \'-0\' : result;\n }\n\n /**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\n function toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + \'\');\n } catch (e) {}\n }\n return \'\';\n }\n\n /**\n * Updates wrapper `details` based on `bitmask` flags.\n *\n * @private\n * @returns {Array} details The details to modify.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @returns {Array} Returns `details`.\n */\n function updateWrapDetails(details, bitmask) {\n arrayEach(wrapFlags, function(pair) {\n var value = \'_.\' + pair[0];\n if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {\n details.push(value);\n }\n });\n return details.sort();\n }\n\n /**\n * Creates a clone of `wrapper`.\n *\n * @private\n * @param {Object} wrapper The wrapper to clone.\n * @returns {Object} Returns the cloned wrapper.\n */\n function wrapperClone(wrapper) {\n if (wrapper instanceof LazyWrapper) {\n return wrapper.clone();\n }\n var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);\n result.__actions__ = copyArray(wrapper.__actions__);\n result.__index__ = wrapper.__index__;\n result.__values__ = wrapper.__values__;\n return result;\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates an array of elements split into groups the length of `size`.\n * If `array` can\'t be split evenly, the final chunk will be the remaining\n * elements.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to process.\n * @param {number} [size=1] The length of each chunk\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the new array of chunks.\n * @example\n *\n * _.chunk([\'a\', \'b\', \'c\', \'d\'], 2);\n * // => [[\'a\', \'b\'], [\'c\', \'d\']]\n *\n * _.chunk([\'a\', \'b\', \'c\', \'d\'], 3);\n * // => [[\'a\', \'b\', \'c\'], [\'d\']]\n */\n function chunk(array, size, guard) {\n if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {\n size = 1;\n } else {\n size = nativeMax(toInteger(size), 0);\n }\n var length = array == null ? 0 : array.length;\n if (!length || size < 1) {\n return [];\n }\n var index = 0,\n resIndex = 0,\n result = Array(nativeCeil(length / size));\n\n while (index < length) {\n result[resIndex++] = baseSlice(array, index, (index += size));\n }\n return result;\n }\n\n /**\n * Creates an array with all falsey values removed. The values `false`, `null`,\n * `0`, `""`, `undefined`, and `NaN` are falsey.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to compact.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.compact([0, 1, false, 2, \'\', 3]);\n * // => [1, 2, 3]\n */\n function compact(array) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (value) {\n result[resIndex++] = value;\n }\n }\n return result;\n }\n\n /**\n * Creates a new array concatenating `array` with any additional arrays\n * and/or values.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to concatenate.\n * @param {...*} [values] The values to concatenate.\n * @returns {Array} Returns the new concatenated array.\n * @example\n *\n * var array = [1];\n * var other = _.concat(array, 2, [3], [[4]]);\n *\n * console.log(other);\n * // => [1, 2, 3, [4]]\n *\n * console.log(array);\n * // => [1]\n */\n function concat() {\n var length = arguments.length;\n if (!length) {\n return [];\n }\n var args = Array(length - 1),\n array = arguments[0],\n index = length;\n\n while (index--) {\n args[index - 1] = arguments[index];\n }\n return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));\n }\n\n /**\n * Creates an array of `array` values not included in the other given arrays\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. The order and references of result values are\n * determined by the first array.\n *\n * **Note:** Unlike `_.pullAll`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.without, _.xor\n * @example\n *\n * _.difference([2, 1], [2, 3]);\n * // => [1]\n */\n var difference = baseRest(function(array, values) {\n return isArrayLikeObject(array)\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))\n : [];\n });\n\n /**\n * This method is like `_.difference` except that it accepts `iteratee` which\n * is invoked for each element of `array` and `values` to generate the criterion\n * by which they\'re compared. The order and references of result values are\n * determined by the first array. The iteratee is invoked with one argument:\n * (value).\n *\n * **Note:** Unlike `_.pullAllBy`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The values to exclude.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n * // => [1.2]\n *\n * // The `_.property` iteratee shorthand.\n * _.differenceBy([{ \'x\': 2 }, { \'x\': 1 }], [{ \'x\': 1 }], \'x\');\n * // => [{ \'x\': 2 }]\n */\n var differenceBy = baseRest(function(array, values) {\n var iteratee = last(values);\n if (isArrayLikeObject(iteratee)) {\n iteratee = undefined;\n }\n return isArrayLikeObject(array)\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2))\n : [];\n });\n\n /**\n * This method is like `_.difference` except that it accepts `comparator`\n * which is invoked to compare elements of `array` to `values`. The order and\n * references of result values are determined by the first array. The comparator\n * is invoked with two arguments: (arrVal, othVal).\n *\n * **Note:** Unlike `_.pullAllWith`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The values to exclude.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * var objects = [{ \'x\': 1, \'y\': 2 }, { \'x\': 2, \'y\': 1 }];\n *\n * _.differenceWith(objects, [{ \'x\': 1, \'y\': 2 }], _.isEqual);\n * // => [{ \'x\': 2, \'y\': 1 }]\n */\n var differenceWith = baseRest(function(array, values) {\n var comparator = last(values);\n if (isArrayLikeObject(comparator)) {\n comparator = undefined;\n }\n return isArrayLikeObject(array)\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)\n : [];\n });\n\n /**\n * Creates a slice of `array` with `n` elements dropped from the beginning.\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to drop.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.drop([1, 2, 3]);\n * // => [2, 3]\n *\n * _.drop([1, 2, 3], 2);\n * // => [3]\n *\n * _.drop([1, 2, 3], 5);\n * // => []\n *\n * _.drop([1, 2, 3], 0);\n * // => [1, 2, 3]\n */\n function drop(array, n, guard) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n n = (guard || n === undefined) ? 1 : toInteger(n);\n return baseSlice(array, n < 0 ? 0 : n, length);\n }\n\n /**\n * Creates a slice of `array` with `n` elements dropped from the end.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to drop.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.dropRight([1, 2, 3]);\n * // => [1, 2]\n *\n * _.dropRight([1, 2, 3], 2);\n * // => [1]\n *\n * _.dropRight([1, 2, 3], 5);\n * // => []\n *\n * _.dropRight([1, 2, 3], 0);\n * // => [1, 2, 3]\n */\n function dropRight(array, n, guard) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n n = (guard || n === undefined) ? 1 : toInteger(n);\n n = length - n;\n return baseSlice(array, 0, n < 0 ? 0 : n);\n }\n\n /**\n * Creates a slice of `array` excluding elements dropped from the end.\n * Elements are dropped until `predicate` returns falsey. The predicate is\n * invoked with three arguments: (value, index, array).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * var users = [\n * { \'user\': \'barney\', \'active\': true },\n * { \'user\': \'fred\', \'active\': false },\n * { \'user\': \'pebbles\', \'active\': false }\n * ];\n *\n * _.dropRightWhile(users, function(o) { return !o.active; });\n * // => objects for [\'barney\']\n *\n * // The `_.matches` iteratee shorthand.\n * _.dropRightWhile(users, { \'user\': \'pebbles\', \'active\': false });\n * // => objects for [\'barney\', \'fred\']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.dropRightWhile(users, [\'active\', false]);\n * // => objects for [\'barney\']\n *\n * // The `_.property` iteratee shorthand.\n * _.dropRightWhile(users, \'active\');\n * // => objects for [\'barney\', \'fred\', \'pebbles\']\n */\n function dropRightWhile(array, predicate) {\n return (array && array.length)\n ? baseWhile(array, getIteratee(predicate, 3), true, true)\n : [];\n }\n\n /**\n * Creates a slice of `array` excluding elements dropped from the beginning.\n * Elements are dropped until `predicate` returns falsey. The predicate is\n * invoked with three arguments: (value, index, array).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * var users = [\n * { \'user\': \'barney\', \'active\': false },\n * { \'user\': \'fred\', \'active\': false },\n * { \'user\': \'pebbles\', \'active\': true }\n * ];\n *\n * _.dropWhile(users, function(o) { return !o.active; });\n * // => objects for [\'pebbles\']\n *\n * // The `_.matches` iteratee shorthand.\n * _.dropWhile(users, { \'user\': \'barney\', \'active\': false });\n * // => objects for [\'fred\', \'pebbles\']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.dropWhile(users, [\'active\', false]);\n * // => objects for [\'pebbles\']\n *\n * // The `_.property` iteratee shorthand.\n * _.dropWhile(users, \'active\');\n * // => objects for [\'barney\', \'fred\', \'pebbles\']\n */\n function dropWhile(array, predicate) {\n return (array && array.length)\n ? baseWhile(array, getIteratee(predicate, 3), true)\n : [];\n }\n\n /**\n * Fills elements of `array` with `value` from `start` up to, but not\n * including, `end`.\n *\n * **Note:** This method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 3.2.0\n * @category Array\n * @param {Array} array The array to fill.\n * @param {*} value The value to fill `array` with.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [1, 2, 3];\n *\n * _.fill(array, \'a\');\n * console.log(array);\n * // => [\'a\', \'a\', \'a\']\n *\n * _.fill(Array(3), 2);\n * // => [2, 2, 2]\n *\n * _.fill([4, 6, 8, 10], \'*\', 1, 3);\n * // => [4, \'*\', \'*\', 10]\n */\n function fill(array, value, start, end) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n if (start && typeof start != \'number\' && isIterateeCall(array, value, start)) {\n start = 0;\n end = length;\n }\n return baseFill(array, value, start, end);\n }\n\n /**\n * This method is like `_.find` except that it returns the index of the first\n * element `predicate` returns truthy for instead of the element itself.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {number} Returns the index of the found element, else `-1`.\n * @example\n *\n * var users = [\n * { \'user\': \'barney\', \'active\': false },\n * { \'user\': \'fred\', \'active\': false },\n * { \'user\': \'pebbles\', \'active\': true }\n * ];\n *\n * _.findIndex(users, function(o) { return o.user == \'barney\'; });\n * // => 0\n *\n * // The `_.matches` iteratee shorthand.\n * _.findIndex(users, { \'user\': \'fred\', \'active\': false });\n * // => 1\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findIndex(users, [\'active\', false]);\n * // => 0\n *\n * // The `_.property` iteratee shorthand.\n * _.findIndex(users, \'active\');\n * // => 2\n */\n function findIndex(array, predicate, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = fromIndex == null ? 0 : toInteger(fromIndex);\n if (index < 0) {\n index = nativeMax(length + index, 0);\n }\n return baseFindIndex(array, getIteratee(predicate, 3), index);\n }\n\n /**\n * This method is like `_.findIndex` except that it iterates over elements\n * of `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=array.length-1] The index to search from.\n * @returns {number} Returns the index of the found element, else `-1`.\n * @example\n *\n * var users = [\n * { \'user\': \'barney\', \'active\': true },\n * { \'user\': \'fred\', \'active\': false },\n * { \'user\': \'pebbles\', \'active\': false }\n * ];\n *\n * _.findLastIndex(users, function(o) { return o.user == \'pebbles\'; });\n * // => 2\n *\n * // The `_.matches` iteratee shorthand.\n * _.findLastIndex(users, { \'user\': \'barney\', \'active\': true });\n * // => 0\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findLastIndex(users, [\'active\', false]);\n * // => 2\n *\n * // The `_.property` iteratee shorthand.\n * _.findLastIndex(users, \'active\');\n * // => 0\n */\n function findLastIndex(array, predicate, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = length - 1;\n if (fromIndex !== undefined) {\n index = toInteger(fromIndex);\n index = fromIndex < 0\n ? nativeMax(length + index, 0)\n : nativeMin(index, length - 1);\n }\n return baseFindIndex(array, getIteratee(predicate, 3), index, true);\n }\n\n /**\n * Flattens `array` a single level deep.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flatten([1, [2, [3, [4]], 5]]);\n * // => [1, 2, [3, [4]], 5]\n */\n function flatten(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseFlatten(array, 1) : [];\n }\n\n /**\n * Recursively flattens `array`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flattenDeep([1, [2, [3, [4]], 5]]);\n * // => [1, 2, 3, 4, 5]\n */\n function flattenDeep(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseFlatten(array, INFINITY) : [];\n }\n\n /**\n * Recursively flatten `array` up to `depth` times.\n *\n * @static\n * @memberOf _\n * @since 4.4.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @param {number} [depth=1] The maximum recursion depth.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * var array = [1, [2, [3, [4]], 5]];\n *\n * _.flattenDepth(array, 1);\n * // => [1, 2, [3, [4]], 5]\n *\n * _.flattenDepth(array, 2);\n * // => [1, 2, 3, [4], 5]\n */\n function flattenDepth(array, depth) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n depth = depth === undefined ? 1 : toInteger(depth);\n return baseFlatten(array, depth);\n }\n\n /**\n * The inverse of `_.toPairs`; this method returns an object composed\n * from key-value `pairs`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} pairs The key-value pairs.\n * @returns {Object} Returns the new object.\n * @example\n *\n * _.fromPairs([[\'a\', 1], [\'b\', 2]]);\n * // => { \'a\': 1, \'b\': 2 }\n */\n function fromPairs(pairs) {\n var index = -1,\n length = pairs == null ? 0 : pairs.length,\n result = {};\n\n while (++index < length) {\n var pair = pairs[index];\n result[pair[0]] = pair[1];\n }\n return result;\n }\n\n /**\n * Gets the first element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @alias first\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the first element of `array`.\n * @example\n *\n * _.head([1, 2, 3]);\n * // => 1\n *\n * _.head([]);\n * // => undefined\n */\n function head(array) {\n return (array && array.length) ? array[0] : undefined;\n }\n\n /**\n * Gets the index at which the first occurrence of `value` is found in `array`\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. If `fromIndex` is negative, it\'s used as the\n * offset from the end of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.indexOf([1, 2, 1, 2], 2);\n * // => 1\n *\n * // Search from the `fromIndex`.\n * _.indexOf([1, 2, 1, 2], 2, 2);\n * // => 3\n */\n function indexOf(array, value, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = fromIndex == null ? 0 : toInteger(fromIndex);\n if (index < 0) {\n index = nativeMax(length + index, 0);\n }\n return baseIndexOf(array, value, index);\n }\n\n /**\n * Gets all but the last element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.initial([1, 2, 3]);\n * // => [1, 2]\n */\n function initial(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseSlice(array, 0, -1) : [];\n }\n\n /**\n * Creates an array of unique values that are included in all given arrays\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. The order and references of result values are\n * determined by the first array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of intersecting values.\n * @example\n *\n * _.intersection([2, 1], [2, 3]);\n * // => [2]\n */\n var intersection = baseRest(function(arrays) {\n var mapped = arrayMap(arrays, castArrayLikeObject);\n return (mapped.length && mapped[0] === arrays[0])\n ? baseIntersection(mapped)\n : [];\n });\n\n /**\n * This method is like `_.intersection` except that it accepts `iteratee`\n * which is invoked for each element of each `arrays` to generate the criterion\n * by which they\'re compared. The order and references of result values are\n * determined by the first array. The iteratee is invoked with one argument:\n * (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new array of intersecting values.\n * @example\n *\n * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n * // => [2.1]\n *\n * // The `_.property` iteratee shorthand.\n * _.intersectionBy([{ \'x\': 1 }], [{ \'x\': 2 }, { \'x\': 1 }], \'x\');\n * // => [{ \'x\': 1 }]\n */\n var intersectionBy = baseRest(function(arrays) {\n var iteratee = last(arrays),\n mapped = arrayMap(arrays, castArrayLikeObject);\n\n if (iteratee === last(mapped)) {\n iteratee = undefined;\n } else {\n mapped.pop();\n }\n return (mapped.length && mapped[0] === arrays[0])\n ? baseIntersection(mapped, getIteratee(iteratee, 2))\n : [];\n });\n\n /**\n * This method is like `_.intersection` except that it accepts `comparator`\n * which is invoked to compare elements of `arrays`. The order and references\n * of result values are determined by the first array. The comparator is\n * invoked with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of intersecting values.\n * @example\n *\n * var objects = [{ \'x\': 1, \'y\': 2 }, { \'x\': 2, \'y\': 1 }];\n * var others = [{ \'x\': 1, \'y\': 1 }, { \'x\': 1, \'y\': 2 }];\n *\n * _.intersectionWith(objects, others, _.isEqual);\n * // => [{ \'x\': 1, \'y\': 2 }]\n */\n var intersectionWith = baseRest(function(arrays) {\n var comparator = last(arrays),\n mapped = arrayMap(arrays, castArrayLikeObject);\n\n comparator = typeof comparator == \'function\' ? comparator : undefined;\n if (comparator) {\n mapped.pop();\n }\n return (mapped.length && mapped[0] === arrays[0])\n ? baseIntersection(mapped, undefined, comparator)\n : [];\n });\n\n /**\n * Converts all elements in `array` into a string separated by `separator`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to convert.\n * @param {string} [separator=\',\'] The element separator.\n * @returns {string} Returns the joined string.\n * @example\n *\n * _.join([\'a\', \'b\', \'c\'], \'~\');\n * // => \'a~b~c\'\n */\n function join(array, separator) {\n return array == null ? \'\' : nativeJoin.call(array, separator);\n }\n\n /**\n * Gets the last element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the last element of `array`.\n * @example\n *\n * _.last([1, 2, 3]);\n * // => 3\n */\n function last(array) {\n var length = array == null ? 0 : array.length;\n return length ? array[length - 1] : undefined;\n }\n\n /**\n * This method is like `_.indexOf` except that it iterates over elements of\n * `array` from right to left.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} [fromIndex=array.length-1] The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.lastIndexOf([1, 2, 1, 2], 2);\n * // => 3\n *\n * // Search from the `fromIndex`.\n * _.lastIndexOf([1, 2, 1, 2], 2, 2);\n * // => 1\n */\n function lastIndexOf(array, value, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = length;\n if (fromIndex !== undefined) {\n index = toInteger(fromIndex);\n index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);\n }\n return value === value\n ? strictLastIndexOf(array, value, index)\n : baseFindIndex(array, baseIsNaN, index, true);\n }\n\n /**\n * Gets the element at index `n` of `array`. If `n` is negative, the nth\n * element from the end is returned.\n *\n * @static\n * @memberOf _\n * @since 4.11.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=0] The index of the element to return.\n * @returns {*} Returns the nth element of `array`.\n * @example\n *\n * var array = [\'a\', \'b\', \'c\', \'d\'];\n *\n * _.nth(array, 1);\n * // => \'b\'\n *\n * _.nth(array, -2);\n * // => \'c\';\n */\n function nth(array, n) {\n return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;\n }\n\n /**\n * Removes all given values from `array` using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`\n * to remove elements from an array by predicate.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {...*} [values] The values to remove.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [\'a\', \'b\', \'c\', \'a\', \'b\', \'c\'];\n *\n * _.pull(array, \'a\', \'c\');\n * console.log(array);\n * // => [\'b\', \'b\']\n */\n var pull = baseRest(pullAll);\n\n /**\n * This method is like `_.pull` except that it accepts an array of values to remove.\n *\n * **Note:** Unlike `_.difference`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Array} values The values to remove.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [\'a\', \'b\', \'c\', \'a\', \'b\', \'c\'];\n *\n * _.pullAll(array, [\'a\', \'c\']);\n * console.log(array);\n * // => [\'b\', \'b\']\n */\n function pullAll(array, values) {\n return (array && array.length && values && values.length)\n ? basePullAll(array, values)\n : array;\n }\n\n /**\n * This method is like `_.pullAll` except that it accepts `iteratee` which is\n * invoked for each element of `array` and `values` to generate the criterion\n * by which they\'re compared. The iteratee is invoked with one argument: (value).\n *\n * **Note:** Unlike `_.differenceBy`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Array} values The values to remove.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [{ \'x\': 1 }, { \'x\': 2 }, { \'x\': 3 }, { \'x\': 1 }];\n *\n * _.pullAllBy(array, [{ \'x\': 1 }, { \'x\': 3 }], \'x\');\n * console.log(array);\n * // => [{ \'x\': 2 }]\n */\n function pullAllBy(array, values, iteratee) {\n return (array && array.length && values && values.length)\n ? basePullAll(array, values, getIteratee(iteratee, 2))\n : array;\n }\n\n /**\n * This method is like `_.pullAll` except that it accepts `comparator` which\n * is invoked to compare elements of `array` to `values`. The comparator is\n * invoked with two arguments: (arrVal, othVal).\n *\n * **Note:** Unlike `_.differenceWith`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 4.6.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Array} values The values to remove.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [{ \'x\': 1, \'y\': 2 }, { \'x\': 3, \'y\': 4 }, { \'x\': 5, \'y\': 6 }];\n *\n * _.pullAllWith(array, [{ \'x\': 3, \'y\': 4 }], _.isEqual);\n * console.log(array);\n * // => [{ \'x\': 1, \'y\': 2 }, { \'x\': 5, \'y\': 6 }]\n */\n function pullAllWith(array, values, comparator) {\n return (array && array.length && values && values.length)\n ? basePullAll(array, values, undefined, comparator)\n : array;\n }\n\n /**\n * Removes elements from `array` corresponding to `indexes` and returns an\n * array of removed elements.\n *\n * **Note:** Unlike `_.at`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {...(number|number[])} [indexes] The indexes of elements to remove.\n * @returns {Array} Returns the new array of removed elements.\n * @example\n *\n * var array = [\'a\', \'b\', \'c\', \'d\'];\n * var pulled = _.pullAt(array, [1, 3]);\n *\n * console.log(array);\n * // => [\'a\', \'c\']\n *\n * console.log(pulled);\n * // => [\'b\', \'d\']\n */\n var pullAt = flatRest(function(array, indexes) {\n var length = array == null ? 0 : array.length,\n result = baseAt(array, indexes);\n\n basePullAt(array, arrayMap(indexes, function(index) {\n return isIndex(index, length) ? +index : index;\n }).sort(compareAscending));\n\n return result;\n });\n\n /**\n * Removes all elements from `array` that `predicate` returns truthy for\n * and returns an array of the removed elements. The predicate is invoked\n * with three arguments: (value, index, array).\n *\n * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`\n * to pull elements from an array by value.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new array of removed elements.\n * @example\n *\n * var array = [1, 2, 3, 4];\n * var evens = _.remove(array, function(n) {\n * return n % 2 == 0;\n * });\n *\n * console.log(array);\n * // => [1, 3]\n *\n * console.log(evens);\n * // => [2, 4]\n */\n function remove(array, predicate) {\n var result = [];\n if (!(array && array.length)) {\n return result;\n }\n var index = -1,\n indexes = [],\n length = array.length;\n\n predicate = getIteratee(predicate, 3);\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result.push(value);\n indexes.push(index);\n }\n }\n basePullAt(array, indexes);\n return result;\n }\n\n /**\n * Reverses `array` so that the first element becomes the last, the second\n * element becomes the second to last, and so on.\n *\n * **Note:** This method mutates `array` and is based on\n * [`Array#reverse`](https://mdn.io/Array/reverse).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [1, 2, 3];\n *\n * _.reverse(array);\n * // => [3, 2, 1]\n *\n * console.log(array);\n * // => [3, 2, 1]\n */\n function reverse(array) {\n return array == null ? array : nativeReverse.call(array);\n }\n\n /**\n * Creates a slice of `array` from `start` up to, but not including, `end`.\n *\n * **Note:** This method is used instead of\n * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are\n * returned.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\n function slice(array, start, end) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n if (end && typeof end != \'number\' && isIterateeCall(array, start, end)) {\n start = 0;\n end = length;\n }\n else {\n start = start == null ? 0 : toInteger(start);\n end = end === undefined ? length : toInteger(end);\n }\n return baseSlice(array, start, end);\n }\n\n /**\n * Uses a binary search to determine the lowest index at which `value`\n * should be inserted into `array` in order to maintain its sort order.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * _.sortedIndex([30, 50], 40);\n * // => 1\n */\n function sortedIndex(array, value) {\n return baseSortedIndex(array, value);\n }\n\n /**\n * This method is like `_.sortedIndex` except that it accepts `iteratee`\n * which is invoked for `value` and each element of `array` to compute their\n * sort ranking. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * var objects = [{ \'x\': 4 }, { \'x\': 5 }];\n *\n * _.sortedIndexBy(objects, { \'x\': 4 }, function(o) { return o.x; });\n * // => 0\n *\n * // The `_.property` iteratee shorthand.\n * _.sortedIndexBy(objects, { \'x\': 4 }, \'x\');\n * // => 0\n */\n function sortedIndexBy(array, value, iteratee) {\n return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));\n }\n\n /**\n * This method is like `_.indexOf` except that it performs a binary\n * search on a sorted `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.sortedIndexOf([4, 5, 5, 5, 6], 5);\n * // => 1\n */\n function sortedIndexOf(array, value) {\n var length = array == null ? 0 : array.length;\n if (length) {\n var index = baseSortedIndex(array, value);\n if (index < length && eq(array[index], value)) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * This method is like `_.sortedIndex` except that it returns the highest\n * index at which `value` should be inserted into `array` in order to\n * maintain its sort order.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * _.sortedLastIndex([4, 5, 5, 5, 6], 5);\n * // => 4\n */\n function sortedLastIndex(array, value) {\n return baseSortedIndex(array, value, true);\n }\n\n /**\n * This method is like `_.sortedLastIndex` except that it accepts `iteratee`\n * which is invoked for `value` and each element of `array` to compute their\n * sort ranking. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * var objects = [{ \'x\': 4 }, { \'x\': 5 }];\n *\n * _.sortedLastIndexBy(objects, { \'x\': 4 }, function(o) { return o.x; });\n * // => 1\n *\n * // The `_.property` iteratee shorthand.\n * _.sortedLastIndexBy(objects, { \'x\': 4 }, \'x\');\n * // => 1\n */\n function sortedLastIndexBy(array, value, iteratee) {\n return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);\n }\n\n /**\n * This method is like `_.lastIndexOf` except that it performs a binary\n * search on a sorted `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);\n * // => 3\n */\n function sortedLastIndexOf(array, value) {\n var length = array == null ? 0 : array.length;\n if (length) {\n var index = baseSortedIndex(array, value, true) - 1;\n if (eq(array[index], value)) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * This method is like `_.uniq` except that it\'s designed and optimized\n * for sorted arrays.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.sortedUniq([1, 1, 2]);\n * // => [1, 2]\n */\n function sortedUniq(array) {\n return (array && array.length)\n ? baseSortedUniq(array)\n : [];\n }\n\n /**\n * This method is like `_.uniqBy` except that it\'s designed and optimized\n * for sorted arrays.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);\n * // => [1.1, 2.3]\n */\n function sortedUniqBy(array, iteratee) {\n return (array && array.length)\n ? baseSortedUniq(array, getIteratee(iteratee, 2))\n : [];\n }\n\n /**\n * Gets all but the first element of `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.tail([1, 2, 3]);\n * // => [2, 3]\n */\n function tail(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseSlice(array, 1, length) : [];\n }\n\n /**\n * Creates a slice of `array` with `n` elements taken from the beginning.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to take.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.take([1, 2, 3]);\n * // => [1]\n *\n * _.take([1, 2, 3], 2);\n * // => [1, 2]\n *\n * _.take([1, 2, 3], 5);\n * // => [1, 2, 3]\n *\n * _.take([1, 2, 3], 0);\n * // => []\n */\n function take(array, n, guard) {\n if (!(array && array.length)) {\n return [];\n }\n n = (guard || n === undefined) ? 1 : toInteger(n);\n return baseSlice(array, 0, n < 0 ? 0 : n);\n }\n\n /**\n * Creates a slice of `array` with `n` elements taken from the end.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to take.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.takeRight([1, 2, 3]);\n * // => [3]\n *\n * _.takeRight([1, 2, 3], 2);\n * // => [2, 3]\n *\n * _.takeRight([1, 2, 3], 5);\n * // => [1, 2, 3]\n *\n * _.takeRight([1, 2, 3], 0);\n * // => []\n */\n function takeRight(array, n, guard) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n n = (guard || n === undefined) ? 1 : toInteger(n);\n n = length - n;\n return baseSlice(array, n < 0 ? 0 : n, length);\n }\n\n /**\n * Creates a slice of `array` with elements taken from the end. Elements are\n * taken until `predicate` returns falsey. The predicate is invoked with\n * three arguments: (value, index, array).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * var users = [\n * { \'user\': \'barney\', \'active\': true },\n * { \'user\': \'fred\', \'active\': false },\n * { \'user\': \'pebbles\', \'active\': false }\n * ];\n *\n * _.takeRightWhile(users, function(o) { return !o.active; });\n * // => objects for [\'fred\', \'pebbles\']\n *\n * // The `_.matches` iteratee shorthand.\n * _.takeRightWhile(users, { \'user\': \'pebbles\', \'active\': false });\n * // => objects for [\'pebbles\']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.takeRightWhile(users, [\'active\', false]);\n * // => objects for [\'fred\', \'pebbles\']\n *\n * // The `_.property` iteratee shorthand.\n * _.takeRightWhile(users, \'active\');\n * // => []\n */\n function takeRightWhile(array, predicate) {\n return (array && array.length)\n ? baseWhile(array, getIteratee(predicate, 3), false, true)\n : [];\n }\n\n /**\n * Creates a slice of `array` with elements taken from the beginning. Elements\n * are taken until `predicate` returns falsey. The predicate is invoked with\n * three arguments: (value, index, array).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * var users = [\n * { \'user\': \'barney\', \'active\': false },\n * { \'user\': \'fred\', \'active\': false },\n * { \'user\': \'pebbles\', \'active\': true }\n * ];\n *\n * _.takeWhile(users, function(o) { return !o.active; });\n * // => objects for [\'barney\', \'fred\']\n *\n * // The `_.matches` iteratee shorthand.\n * _.takeWhile(users, { \'user\': \'barney\', \'active\': false });\n * // => objects for [\'barney\']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.takeWhile(users, [\'active\', false]);\n * // => objects for [\'barney\', \'fred\']\n *\n * // The `_.property` iteratee shorthand.\n * _.takeWhile(users, \'active\');\n * // => []\n */\n function takeWhile(array, predicate) {\n return (array && array.length)\n ? baseWhile(array, getIteratee(predicate, 3))\n : [];\n }\n\n /**\n * Creates an array of unique values, in order, from all given arrays using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of combined values.\n * @example\n *\n * _.union([2], [1, 2]);\n * // => [2, 1]\n */\n var union = baseRest(function(arrays) {\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));\n });\n\n /**\n * This method is like `_.union` except that it accepts `iteratee` which is\n * invoked for each element of each `arrays` to generate the criterion by\n * which uniqueness is computed. Result values are chosen from the first\n * array in which the value occurs. The iteratee is invoked with one argument:\n * (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new array of combined values.\n * @example\n *\n * _.unionBy([2.1], [1.2, 2.3], Math.floor);\n * // => [2.1, 1.2]\n *\n * // The `_.property` iteratee shorthand.\n * _.unionBy([{ \'x\': 1 }], [{ \'x\': 2 }, { \'x\': 1 }], \'x\');\n * // => [{ \'x\': 1 }, { \'x\': 2 }]\n */\n var unionBy = baseRest(function(arrays) {\n var iteratee = last(arrays);\n if (isArrayLikeObject(iteratee)) {\n iteratee = undefined;\n }\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));\n });\n\n /**\n * This method is like `_.union` except that it accepts `comparator` which\n * is invoked to compare elements of `arrays`. Result values are chosen from\n * the first array in which the value occurs. The comparator is invoked\n * with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of combined values.\n * @example\n *\n * var objects = [{ \'x\': 1, \'y\': 2 }, { \'x\': 2, \'y\': 1 }];\n * var others = [{ \'x\': 1, \'y\': 1 }, { \'x\': 1, \'y\': 2 }];\n *\n * _.unionWith(objects, others, _.isEqual);\n * // => [{ \'x\': 1, \'y\': 2 }, { \'x\': 2, \'y\': 1 }, { \'x\': 1, \'y\': 1 }]\n */\n var unionWith = baseRest(function(arrays) {\n var comparator = last(arrays);\n comparator = typeof comparator == \'function\' ? comparator : undefined;\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);\n });\n\n /**\n * Creates a duplicate-free version of an array, using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons, in which only the first occurrence of each element\n * is kept. The order of result values is determined by the order they occur\n * in the array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.uniq([2, 1, 2]);\n * // => [2, 1]\n */\n function uniq(array) {\n return (array && array.length) ? baseUniq(array) : [];\n }\n\n /**\n * This method is like `_.uniq` except that it accepts `iteratee` which is\n * invoked for each element in `array` to generate the criterion by which\n * uniqueness is computed. The order of result values is determined by the\n * order they occur in the array. The iteratee is invoked with one argument:\n * (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.uniqBy([2.1, 1.2, 2.3], Math.floor);\n * // => [2.1, 1.2]\n *\n * // The `_.property` iteratee shorthand.\n * _.uniqBy([{ \'x\': 1 }, { \'x\': 2 }, { \'x\': 1 }], \'x\');\n * // => [{ \'x\': 1 }, { \'x\': 2 }]\n */\n function uniqBy(array, iteratee) {\n return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : [];\n }\n\n /**\n * This method is like `_.uniq` except that it accepts `comparator` which\n * is invoked to compare elements of `array`. The order of result values is\n * determined by the order they occur in the array.The comparator is invoked\n * with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * var objects = [{ \'x\': 1, \'y\': 2 }, { \'x\': 2, \'y\': 1 }, { \'x\': 1, \'y\': 2 }];\n *\n * _.uniqWith(objects, _.isEqual);\n * // => [{ \'x\': 1, \'y\': 2 }, { \'x\': 2, \'y\': 1 }]\n */\n function uniqWith(array, comparator) {\n comparator = typeof comparator == \'function\' ? comparator : undefined;\n return (array && array.length) ? baseUniq(array, undefined, comparator) : [];\n }\n\n /**\n * This method is like `_.zip` except that it accepts an array of grouped\n * elements and creates an array regrouping the elements to their pre-zip\n * configuration.\n *\n * @static\n * @memberOf _\n * @since 1.2.0\n * @category Array\n * @param {Array} array The array of grouped elements to process.\n * @returns {Array} Returns the new array of regrouped elements.\n * @example\n *\n * var zipped = _.zip([\'a\', \'b\'], [1, 2], [true, false]);\n * // => [[\'a\', 1, true], [\'b\', 2, false]]\n *\n * _.unzip(zipped);\n * // => [[\'a\', \'b\'], [1, 2], [true, false]]\n */\n function unzip(array) {\n if (!(array && array.length)) {\n return [];\n }\n var length = 0;\n array = arrayFilter(array, function(group) {\n if (isArrayLikeObject(group)) {\n length = nativeMax(group.length, length);\n return true;\n }\n });\n return baseTimes(length, function(index) {\n return arrayMap(array, baseProperty(index));\n });\n }\n\n /**\n * This method is like `_.unzip` except that it accepts `iteratee` to specify\n * how regrouped values should be combined. The iteratee is invoked with the\n * elements of each group: (...group).\n *\n * @static\n * @memberOf _\n * @since 3.8.0\n * @category Array\n * @param {Array} array The array of grouped elements to process.\n * @param {Function} [iteratee=_.identity] The function to combine\n * regrouped values.\n * @returns {Array} Returns the new array of regrouped elements.\n * @example\n *\n * var zipped = _.zip([1, 2], [10, 20], [100, 200]);\n * // => [[1, 10, 100], [2, 20, 200]]\n *\n * _.unzipWith(zipped, _.add);\n * // => [3, 30, 300]\n */\n function unzipWith(array, iteratee) {\n if (!(array && array.length)) {\n return [];\n }\n var result = unzip(array);\n if (iteratee == null) {\n return result;\n }\n return arrayMap(result, function(group) {\n return apply(iteratee, undefined, group);\n });\n }\n\n /**\n * Creates an array excluding all given values using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * **Note:** Unlike `_.pull`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...*} [values] The values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.difference, _.xor\n * @example\n *\n * _.without([2, 1, 2, 3], 1, 2);\n * // => [3]\n */\n var without = baseRest(function(array, values) {\n return isArrayLikeObject(array)\n ? baseDifference(array, values)\n : [];\n });\n\n /**\n * Creates an array of unique values that is the\n * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)\n * of the given arrays. The order of result values is determined by the order\n * they occur in the arrays.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.difference, _.without\n * @example\n *\n * _.xor([2, 1], [2, 3]);\n * // => [1, 3]\n */\n var xor = baseRest(function(arrays) {\n return baseXor(arrayFilter(arrays, isArrayLikeObject));\n });\n\n /**\n * This method is like `_.xor` except that it accepts `iteratee` which is\n * invoked for each element of each `arrays` to generate the criterion by\n * which by which they\'re compared. The order of result values is determined\n * by the order they occur in the arrays. The iteratee is invoked with one\n * argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n * // => [1.2, 3.4]\n *\n * // The `_.property` iteratee shorthand.\n * _.xorBy([{ \'x\': 1 }], [{ \'x\': 2 }, { \'x\': 1 }], \'x\');\n * // => [{ \'x\': 2 }]\n */\n var xorBy = baseRest(function(arrays) {\n var iteratee = last(arrays);\n if (isArrayLikeObject(iteratee)) {\n iteratee = undefined;\n }\n return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));\n });\n\n /**\n * This method is like `_.xor` except that it accepts `comparator` which is\n * invoked to compare elements of `arrays`. The order of result values is\n * determined by the order they occur in the arrays. The comparator is invoked\n * with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * var objects = [{ \'x\': 1, \'y\': 2 }, { \'x\': 2, \'y\': 1 }];\n * var others = [{ \'x\': 1, \'y\': 1 }, { \'x\': 1, \'y\': 2 }];\n *\n * _.xorWith(objects, others, _.isEqual);\n * // => [{ \'x\': 2, \'y\': 1 }, { \'x\': 1, \'y\': 1 }]\n */\n var xorWith = baseRest(function(arrays) {\n var comparator = last(arrays);\n comparator = typeof comparator == \'function\' ? comparator : undefined;\n return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);\n });\n\n /**\n * Creates an array of grouped elements, the first of which contains the\n * first elements of the given arrays, the second of which contains the\n * second elements of the given arrays, and so on.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to process.\n * @returns {Array} Returns the new array of grouped elements.\n * @example\n *\n * _.zip([\'a\', \'b\'], [1, 2], [true, false]);\n * // => [[\'a\', 1, true], [\'b\', 2, false]]\n */\n var zip = baseRest(unzip);\n\n /**\n * This method is like `_.fromPairs` except that it accepts two arrays,\n * one of property identifiers and one of corresponding values.\n *\n * @static\n * @memberOf _\n * @since 0.4.0\n * @category Array\n * @param {Array} [props=[]] The property identifiers.\n * @param {Array} [values=[]] The property values.\n * @returns {Object} Returns the new object.\n * @example\n *\n * _.zipObject([\'a\', \'b\'], [1, 2]);\n * // => { \'a\': 1, \'b\': 2 }\n */\n function zipObject(props, values) {\n return baseZipObject(props || [], values || [], assignValue);\n }\n\n /**\n * This method is like `_.zipObject` except that it supports property paths.\n *\n * @static\n * @memberOf _\n * @since 4.1.0\n * @category Array\n * @param {Array} [props=[]] The property identifiers.\n * @param {Array} [values=[]] The property values.\n * @returns {Object} Returns the new object.\n * @example\n *\n * _.zipObjectDeep([\'a.b[0].c\', \'a.b[1].d\'], [1, 2]);\n * // => { \'a\': { \'b\': [{ \'c\': 1 }, { \'d\': 2 }] } }\n */\n function zipObjectDeep(props, values) {\n return baseZipObject(props || [], values || [], baseSet);\n }\n\n /**\n * This method is like `_.zip` except that it accepts `iteratee` to specify\n * how grouped values should be combined. The iteratee is invoked with the\n * elements of each group: (...group).\n *\n * @static\n * @memberOf _\n * @since 3.8.0\n * @category Array\n * @param {...Array} [arrays] The arrays to process.\n * @param {Function} [iteratee=_.identity] The function to combine\n * grouped values.\n * @returns {Array} Returns the new array of grouped elements.\n * @example\n *\n * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {\n * return a + b + c;\n * });\n * // => [111, 222]\n */\n var zipWith = baseRest(function(arrays) {\n var length = arrays.length,\n iteratee = length > 1 ? arrays[length - 1] : undefined;\n\n iteratee = typeof iteratee == \'function\' ? (arrays.pop(), iteratee) : undefined;\n return unzipWith(arrays, iteratee);\n });\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a `lodash` wrapper instance that wraps `value` with explicit method\n * chain sequences enabled. The result of such sequences must be unwrapped\n * with `_#value`.\n *\n * @static\n * @memberOf _\n * @since 1.3.0\n * @category Seq\n * @param {*} value The value to wrap.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var users = [\n * { \'user\': \'barney\', \'age\': 36 },\n * { \'user\': \'fred\', \'age\': 40 },\n * { \'user\': \'pebbles\', \'age\': 1 }\n * ];\n *\n * var youngest = _\n * .chain(users)\n * .sortBy(\'age\')\n * .map(function(o) {\n * return o.user + \' is \' + o.age;\n * })\n * .head()\n * .value();\n * // => \'pebbles is 1\'\n */\n function chain(value) {\n var result = lodash(value);\n result.__chain__ = true;\n return result;\n }\n\n /**\n * This method invokes `interceptor` and returns `value`. The interceptor\n * is invoked with one argument; (value). The purpose of this method is to\n * "tap into" a method chain sequence in order to modify intermediate results.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Seq\n * @param {*} value The value to provide to `interceptor`.\n * @param {Function} interceptor The function to invoke.\n * @returns {*} Returns `value`.\n * @example\n *\n * _([1, 2, 3])\n * .tap(function(array) {\n * // Mutate input array.\n * array.pop();\n * })\n * .reverse()\n * .value();\n * // => [2, 1]\n */\n function tap(value, interceptor) {\n interceptor(value);\n return value;\n }\n\n /**\n * This method is like `_.tap` except that it returns the result of `interceptor`.\n * The purpose of this method is to "pass thru" values replacing intermediate\n * results in a method chain sequence.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Seq\n * @param {*} value The value to provide to `interceptor`.\n * @param {Function} interceptor The function to invoke.\n * @returns {*} Returns the result of `interceptor`.\n * @example\n *\n * _(\' abc \')\n * .chain()\n * .trim()\n * .thru(function(value) {\n * return [value];\n * })\n * .value();\n * // => [\'abc\']\n */\n function thru(value, interceptor) {\n return interceptor(value);\n }\n\n /**\n * This method is the wrapper version of `_.at`.\n *\n * @name at\n * @memberOf _\n * @since 1.0.0\n * @category Seq\n * @param {...(string|string[])} [paths] The property paths to pick.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var object = { \'a\': [{ \'b\': { \'c\': 3 } }, 4] };\n *\n * _(object).at([\'a[0].b.c\', \'a[1]\']).value();\n * // => [3, 4]\n */\n var wrapperAt = flatRest(function(paths) {\n var length = paths.length,\n start = length ? paths[0] : 0,\n value = this.__wrapped__,\n interceptor = function(object) { return baseAt(object, paths); };\n\n if (length > 1 || this.__actions__.length ||\n !(value instanceof LazyWrapper) || !isIndex(start)) {\n return this.thru(interceptor);\n }\n value = value.slice(start, +start + (length ? 1 : 0));\n value.__actions__.push({\n \'func\': thru,\n \'args\': [interceptor],\n \'thisArg\': undefined\n });\n return new LodashWrapper(value, this.__chain__).thru(function(array) {\n if (length && !array.length) {\n array.push(undefined);\n }\n return array;\n });\n });\n\n /**\n * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.\n *\n * @name chain\n * @memberOf _\n * @since 0.1.0\n * @category Seq\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var users = [\n * { \'user\': \'barney\', \'age\': 36 },\n * { \'user\': \'fred\', \'age\': 40 }\n * ];\n *\n * // A sequence without explicit chaining.\n * _(users).head();\n * // => { \'user\': \'barney\', \'age\': 36 }\n *\n * // A sequence with explicit chaining.\n * _(users)\n * .chain()\n * .head()\n * .pick(\'user\')\n * .value();\n * // => { \'user\': \'barney\' }\n */\n function wrapperChain() {\n return chain(this);\n }\n\n /**\n * Executes the chain sequence and returns the wrapped result.\n *\n * @name commit\n * @memberOf _\n * @since 3.2.0\n * @category Seq\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var array = [1, 2];\n * var wrapped = _(array).push(3);\n *\n * console.log(array);\n * // => [1, 2]\n *\n * wrapped = wrapped.commit();\n * console.log(array);\n * // => [1, 2, 3]\n *\n * wrapped.last();\n * // => 3\n *\n * console.log(array);\n * // => [1, 2, 3]\n */\n function wrapperCommit() {\n return new LodashWrapper(this.value(), this.__chain__);\n }\n\n /**\n * Gets the next value on a wrapped object following the\n * [iterator protocol](https://mdn.io/iteration_protocols#iterator).\n *\n * @name next\n * @memberOf _\n * @since 4.0.0\n * @category Seq\n * @returns {Object} Returns the next iterator value.\n * @example\n *\n * var wrapped = _([1, 2]);\n *\n * wrapped.next();\n * // => { \'done\': false, \'value\': 1 }\n *\n * wrapped.next();\n * // => { \'done\': false, \'value\': 2 }\n *\n * wrapped.next();\n * // => { \'done\': true, \'value\': undefined }\n */\n function wrapperNext() {\n if (this.__values__ === undefined) {\n this.__values__ = toArray(this.value());\n }\n var done = this.__index__ >= this.__values__.length,\n value = done ? undefined : this.__values__[this.__index__++];\n\n return { \'done\': done, \'value\': value };\n }\n\n /**\n * Enables the wrapper to be iterable.\n *\n * @name Symbol.iterator\n * @memberOf _\n * @since 4.0.0\n * @category Seq\n * @returns {Object} Returns the wrapper object.\n * @example\n *\n * var wrapped = _([1, 2]);\n *\n * wrapped[Symbol.iterator]() === wrapped;\n * // => true\n *\n * Array.from(wrapped);\n * // => [1, 2]\n */\n function wrapperToIterator() {\n return this;\n }\n\n /**\n * Creates a clone of the chain sequence planting `value` as the wrapped value.\n *\n * @name plant\n * @memberOf _\n * @since 3.2.0\n * @category Seq\n * @param {*} value The value to plant.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var wrapped = _([1, 2]).map(square);\n * var other = wrapped.plant([3, 4]);\n *\n * other.value();\n * // => [9, 16]\n *\n * wrapped.value();\n * // => [1, 4]\n */\n function wrapperPlant(value) {\n var result,\n parent = this;\n\n while (parent instanceof baseLodash) {\n var clone = wrapperClone(parent);\n clone.__index__ = 0;\n clone.__values__ = undefined;\n if (result) {\n previous.__wrapped__ = clone;\n } else {\n result = clone;\n }\n var previous = clone;\n parent = parent.__wrapped__;\n }\n previous.__wrapped__ = value;\n return result;\n }\n\n /**\n * This method is the wrapper version of `_.reverse`.\n *\n * **Note:** This method mutates the wrapped array.\n *\n * @name reverse\n * @memberOf _\n * @since 0.1.0\n * @category Seq\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var array = [1, 2, 3];\n *\n * _(array).reverse().value()\n * // => [3, 2, 1]\n *\n * console.log(array);\n * // => [3, 2, 1]\n */\n function wrapperReverse() {\n var value = this.__wrapped__;\n if (value instanceof LazyWrapper) {\n var wrapped = value;\n if (this.__actions__.length) {\n wrapped = new LazyWrapper(this);\n }\n wrapped = wrapped.reverse();\n wrapped.__actions__.push({\n \'func\': thru,\n \'args\': [reverse],\n \'thisArg\': undefined\n });\n return new LodashWrapper(wrapped, this.__chain__);\n }\n return this.thru(reverse);\n }\n\n /**\n * Executes the chain sequence to resolve the unwrapped value.\n *\n * @name value\n * @memberOf _\n * @since 0.1.0\n * @alias toJSON, valueOf\n * @category Seq\n * @returns {*} Returns the resolved unwrapped value.\n * @example\n *\n * _([1, 2, 3]).value();\n * // => [1, 2, 3]\n */\n function wrapperValue() {\n return baseWrapperValue(this.__wrapped__, this.__actions__);\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The corresponding value of\n * each key is the number of times the key was returned by `iteratee`. The\n * iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * _.countBy([6.1, 4.2, 6.3], Math.floor);\n * // => { \'4\': 1, \'6\': 2 }\n *\n * // The `_.property` iteratee shorthand.\n * _.countBy([\'one\', \'two\', \'three\'], \'length\');\n * // => { \'3\': 2, \'5\': 1 }\n */\n var countBy = createAggregator(function(result, value, key) {\n if (hasOwnProperty.call(result, key)) {\n ++result[key];\n } else {\n baseAssignValue(result, key, 1);\n }\n });\n\n /**\n * Checks if `predicate` returns truthy for **all** elements of `collection`.\n * Iteration is stopped once `predicate` returns falsey. The predicate is\n * invoked with three arguments: (value, index|key, collection).\n *\n * **Note:** This method returns `true` for\n * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because\n * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of\n * elements of empty collections.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`.\n * @example\n *\n * _.every([true, 1, null, \'yes\'], Boolean);\n * // => false\n *\n * var users = [\n * { \'user\': \'barney\', \'age\': 36, \'active\': false },\n * { \'user\': \'fred\', \'age\': 40, \'active\': false }\n * ];\n *\n * // The `_.matches` iteratee shorthand.\n * _.every(users, { \'user\': \'barney\', \'active\': false });\n * // => false\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.every(users, [\'active\', false]);\n * // => true\n *\n * // The `_.property` iteratee shorthand.\n * _.every(users, \'active\');\n * // => false\n */\n function every(collection, predicate, guard) {\n var func = isArray(collection) ? arrayEvery : baseEvery;\n if (guard && isIterateeCall(collection, predicate, guard)) {\n predicate = undefined;\n }\n return func(collection, getIteratee(predicate, 3));\n }\n\n /**\n * Iterates over elements of `collection`, returning an array of all elements\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * **Note:** Unlike `_.remove`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n * @see _.reject\n * @example\n *\n * var users = [\n * { \'user\': \'barney\', \'age\': 36, \'active\': true },\n * { \'user\': \'fred\', \'age\': 40, \'active\': false }\n * ];\n *\n * _.filter(users, function(o) { return !o.active; });\n * // => objects for [\'fred\']\n *\n * // The `_.matches` iteratee shorthand.\n * _.filter(users, { \'age\': 36, \'active\': true });\n * // => objects for [\'barney\']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.filter(users, [\'active\', false]);\n * // => objects for [\'fred\']\n *\n * // The `_.property` iteratee shorthand.\n * _.filter(users, \'active\');\n * // => objects for [\'barney\']\n *\n * // Combining several predicates using `_.overEvery` or `_.overSome`.\n * _.filter(users, _.overSome([{ \'age\': 36 }, [\'age\', 40]]));\n * // => objects for [\'fred\', \'barney\']\n */\n function filter(collection, predicate) {\n var func = isArray(collection) ? arrayFilter : baseFilter;\n return func(collection, getIteratee(predicate, 3));\n }\n\n /**\n * Iterates over elements of `collection`, returning the first element\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {*} Returns the matched element, else `undefined`.\n * @example\n *\n * var users = [\n * { \'user\': \'barney\', \'age\': 36, \'active\': true },\n * { \'user\': \'fred\', \'age\': 40, \'active\': false },\n * { \'user\': \'pebbles\', \'age\': 1, \'active\': true }\n * ];\n *\n * _.find(users, function(o) { return o.age < 40; });\n * // => object for \'barney\'\n *\n * // The `_.matches` iteratee shorthand.\n * _.find(users, { \'age\': 1, \'active\': true });\n * // => object for \'pebbles\'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.find(users, [\'active\', false]);\n * // => object for \'fred\'\n *\n * // The `_.property` iteratee shorthand.\n * _.find(users, \'active\');\n * // => object for \'barney\'\n */\n var find = createFind(findIndex);\n\n /**\n * This method is like `_.find` except that it iterates over elements of\n * `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=collection.length-1] The index to search from.\n * @returns {*} Returns the matched element, else `undefined`.\n * @example\n *\n * _.findLast([1, 2, 3, 4], function(n) {\n * return n % 2 == 1;\n * });\n * // => 3\n */\n var findLast = createFind(findLastIndex);\n\n /**\n * Creates a flattened array of values by running each element in `collection`\n * thru `iteratee` and flattening the mapped results. The iteratee is invoked\n * with three arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * function duplicate(n) {\n * return [n, n];\n * }\n *\n * _.flatMap([1, 2], duplicate);\n * // => [1, 1, 2, 2]\n */\n function flatMap(collection, iteratee) {\n return baseFlatten(map(collection, iteratee), 1);\n }\n\n /**\n * This method is like `_.flatMap` except that it recursively flattens the\n * mapped results.\n *\n * @static\n * @memberOf _\n * @since 4.7.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * function duplicate(n) {\n * return [[[n, n]]];\n * }\n *\n * _.flatMapDeep([1, 2], duplicate);\n * // => [1, 1, 2, 2]\n */\n function flatMapDeep(collection, iteratee) {\n return baseFlatten(map(collection, iteratee), INFINITY);\n }\n\n /**\n * This method is like `_.flatMap` except that it recursively flattens the\n * mapped results up to `depth` times.\n *\n * @static\n * @memberOf _\n * @since 4.7.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {number} [depth=1] The maximum recursion depth.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * function duplicate(n) {\n * return [[[n, n]]];\n * }\n *\n * _.flatMapDepth([1, 2], duplicate, 2);\n * // => [[1, 1], [2, 2]]\n */\n function flatMapDepth(collection, iteratee, depth) {\n depth = depth === undefined ? 1 : toInteger(depth);\n return baseFlatten(map(collection, iteratee), depth);\n }\n\n /**\n * Iterates over elements of `collection` and invokes `iteratee` for each element.\n * The iteratee is invoked with three arguments: (value, index|key, collection).\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * **Note:** As with other "Collections" methods, objects with a "length"\n * property are iterated like arrays. To avoid this behavior use `_.forIn`\n * or `_.forOwn` for object iteration.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @alias each\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n * @see _.forEachRight\n * @example\n *\n * _.forEach([1, 2], function(value) {\n * console.log(value);\n * });\n * // => Logs `1` then `2`.\n *\n * _.forEach({ \'a\': 1, \'b\': 2 }, function(value, key) {\n * console.log(key);\n * });\n * // => Logs \'a\' then \'b\' (iteration order is not guaranteed).\n */\n function forEach(collection, iteratee) {\n var func = isArray(collection) ? arrayEach : baseEach;\n return func(collection, getIteratee(iteratee, 3));\n }\n\n /**\n * This method is like `_.forEach` except that it iterates over elements of\n * `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @alias eachRight\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n * @see _.forEach\n * @example\n *\n * _.forEachRight([1, 2], function(value) {\n * console.log(value);\n * });\n * // => Logs `2` then `1`.\n */\n function forEachRight(collection, iteratee) {\n var func = isArray(collection) ? arrayEachRight : baseEachRight;\n return func(collection, getIteratee(iteratee, 3));\n }\n\n /**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The order of grouped values\n * is determined by the order they occur in `collection`. The corresponding\n * value of each key is an array of elements responsible for generating the\n * key. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * _.groupBy([6.1, 4.2, 6.3], Math.floor);\n * // => { \'4\': [4.2], \'6\': [6.1, 6.3] }\n *\n * // The `_.property` iteratee shorthand.\n * _.groupBy([\'one\', \'two\', \'three\'], \'length\');\n * // => { \'3\': [\'one\', \'two\'], \'5\': [\'three\'] }\n */\n var groupBy = createAggregator(function(result, value, key) {\n if (hasOwnProperty.call(result, key)) {\n result[key].push(value);\n } else {\n baseAssignValue(result, key, [value]);\n }\n });\n\n /**\n * Checks if `value` is in `collection`. If `collection` is a string, it\'s\n * checked for a substring of `value`, otherwise\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * is used for equality comparisons. If `fromIndex` is negative, it\'s used as\n * the offset from the end of `collection`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object|string} collection The collection to inspect.\n * @param {*} value The value to search for.\n * @param {number} [fromIndex=0] The index to search from.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n * @returns {boolean} Returns `true` if `value` is found, else `false`.\n * @example\n *\n * _.includes([1, 2, 3], 1);\n * // => true\n *\n * _.includes([1, 2, 3], 1, 2);\n * // => false\n *\n * _.includes({ \'a\': 1, \'b\': 2 }, 1);\n * // => true\n *\n * _.includes(\'abcd\', \'bc\');\n * // => true\n */\n function includes(collection, value, fromIndex, guard) {\n collection = isArrayLike(collection) ? collection : values(collection);\n fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;\n\n var length = collection.length;\n if (fromIndex < 0) {\n fromIndex = nativeMax(length + fromIndex, 0);\n }\n return isString(collection)\n ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)\n : (!!length && baseIndexOf(collection, value, fromIndex) > -1);\n }\n\n /**\n * Invokes the method at `path` of each element in `collection`, returning\n * an array of the results of each invoked method. Any additional arguments\n * are provided to each invoked method. If `path` is a function, it\'s invoked\n * for, and `this` bound to, each element in `collection`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Array|Function|string} path The path of the method to invoke or\n * the function invoked per iteration.\n * @param {...*} [args] The arguments to invoke each method with.\n * @returns {Array} Returns the array of results.\n * @example\n *\n * _.invokeMap([[5, 1, 7], [3, 2, 1]], \'sort\');\n * // => [[1, 5, 7], [1, 2, 3]]\n *\n * _.invokeMap([123, 456], String.prototype.split, \'\');\n * // => [[\'1\', \'2\', \'3\'], [\'4\', \'5\', \'6\']]\n */\n var invokeMap = baseRest(function(collection, path, args) {\n var index = -1,\n isFunc = typeof path == \'function\',\n result = isArrayLike(collection) ? Array(collection.length) : [];\n\n baseEach(collection, function(value) {\n result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);\n });\n return result;\n });\n\n /**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The corresponding value of\n * each key is the last element responsible for generating the key. The\n * iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * var array = [\n * { \'dir\': \'left\', \'code\': 97 },\n * { \'dir\': \'right\', \'code\': 100 }\n * ];\n *\n * _.keyBy(array, function(o) {\n * return String.fromCharCode(o.code);\n * });\n * // => { \'a\': { \'dir\': \'left\', \'code\': 97 }, \'d\': { \'dir\': \'right\', \'code\': 100 } }\n *\n * _.keyBy(array, \'dir\');\n * // => { \'left\': { \'dir\': \'left\', \'code\': 97 }, \'right\': { \'dir\': \'right\', \'code\': 100 } }\n */\n var keyBy = createAggregator(function(result, value, key) {\n baseAssignValue(result, key, value);\n });\n\n /**\n * Creates an array of values by running each element in `collection` thru\n * `iteratee`. The iteratee is invoked with three arguments:\n * (value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n *\n * The guarded methods are:\n * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * _.map([4, 8], square);\n * // => [16, 64]\n *\n * _.map({ \'a\': 4, \'b\': 8 }, square);\n * // => [16, 64] (iteration order is not guaranteed)\n *\n * var users = [\n * { \'user\': \'barney\' },\n * { \'user\': \'fred\' }\n * ];\n *\n * // The `_.property` iteratee shorthand.\n * _.map(users, \'user\');\n * // => [\'barney\', \'fred\']\n */\n function map(collection, iteratee) {\n var func = isArray(collection) ? arrayMap : baseMap;\n return func(collection, getIteratee(iteratee, 3));\n }\n\n /**\n * This method is like `_.sortBy` except that it allows specifying the sort\n * orders of the iteratees to sort by. If `orders` is unspecified, all values\n * are sorted in ascending order. Otherwise, specify an order of "desc" for\n * descending or "asc" for ascending sort order of corresponding values.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]\n * The iteratees to sort by.\n * @param {string[]} [orders] The sort orders of `iteratees`.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * var users = [\n * { \'user\': \'fred\', \'age\': 48 },\n * { \'user\': \'barney\', \'age\': 34 },\n * { \'user\': \'fred\', \'age\': 40 },\n * { \'user\': \'barney\', \'age\': 36 }\n * ];\n *\n * // Sort by `user` in ascending order and by `age` in descending order.\n * _.orderBy(users, [\'user\', \'age\'], [\'asc\', \'desc\']);\n * // => objects for [[\'barney\', 36], [\'barney\', 34], [\'fred\', 48], [\'fred\', 40]]\n */\n function orderBy(collection, iteratees, orders, guard) {\n if (collection == null) {\n return [];\n }\n if (!isArray(iteratees)) {\n iteratees = iteratees == null ? [] : [iteratees];\n }\n orders = guard ? undefined : orders;\n if (!isArray(orders)) {\n orders = orders == null ? [] : [orders];\n }\n return baseOrderBy(collection, iteratees, orders);\n }\n\n /**\n * Creates an array of elements split into two groups, the first of which\n * contains elements `predicate` returns truthy for, the second of which\n * contains elements `predicate` returns falsey for. The predicate is\n * invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the array of grouped elements.\n * @example\n *\n * var users = [\n * { \'user\': \'barney\', \'age\': 36, \'active\': false },\n * { \'user\': \'fred\', \'age\': 40, \'active\': true },\n * { \'user\': \'pebbles\', \'age\': 1, \'active\': false }\n * ];\n *\n * _.partition(users, function(o) { return o.active; });\n * // => objects for [[\'fred\'], [\'barney\', \'pebbles\']]\n *\n * // The `_.matches` iteratee shorthand.\n * _.partition(users, { \'age\': 1, \'active\': false });\n * // => objects for [[\'pebbles\'], [\'barney\', \'fred\']]\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.partition(users, [\'active\', false]);\n * // => objects for [[\'barney\', \'pebbles\'], [\'fred\']]\n *\n * // The `_.property` iteratee shorthand.\n * _.partition(users, \'active\');\n * // => objects for [[\'fred\'], [\'barney\', \'pebbles\']]\n */\n var partition = createAggregator(function(result, value, key) {\n result[key ? 0 : 1].push(value);\n }, function() { return [[], []]; });\n\n /**\n * Reduces `collection` to a value which is the accumulated result of running\n * each element in `collection` thru `iteratee`, where each successive\n * invocation is supplied the return value of the previous. If `accumulator`\n * is not given, the first element of `collection` is used as the initial\n * value. The iteratee is invoked with four arguments:\n * (accumulator, value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.reduce`, `_.reduceRight`, and `_.transform`.\n *\n * The guarded methods are:\n * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\n * and `sortBy`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @returns {*} Returns the accumulated value.\n * @see _.reduceRight\n * @example\n *\n * _.reduce([1, 2], function(sum, n) {\n * return sum + n;\n * }, 0);\n * // => 3\n *\n * _.reduce({ \'a\': 1, \'b\': 2, \'c\': 1 }, function(result, value, key) {\n * (result[value] || (result[value] = [])).push(key);\n * return result;\n * }, {});\n * // => { \'1\': [\'a\', \'c\'], \'2\': [\'b\'] } (iteration order is not guaranteed)\n */\n function reduce(collection, iteratee, accumulator) {\n var func = isArray(collection) ? arrayReduce : baseReduce,\n initAccum = arguments.length < 3;\n\n return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);\n }\n\n /**\n * This method is like `_.reduce` except that it iterates over elements of\n * `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @returns {*} Returns the accumulated value.\n * @see _.reduce\n * @example\n *\n * var array = [[0, 1], [2, 3], [4, 5]];\n *\n * _.reduceRight(array, function(flattened, other) {\n * return flattened.concat(other);\n * }, []);\n * // => [4, 5, 2, 3, 0, 1]\n */\n function reduceRight(collection, iteratee, accumulator) {\n var func = isArray(collection) ? arrayReduceRight : baseReduce,\n initAccum = arguments.length < 3;\n\n return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);\n }\n\n /**\n * The opposite of `_.filter`; this method returns the elements of `collection`\n * that `predicate` does **not** return truthy for.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n * @see _.filter\n * @example\n *\n * var users = [\n * { \'user\': \'barney\', \'age\': 36, \'active\': false },\n * { \'user\': \'fred\', \'age\': 40, \'active\': true }\n * ];\n *\n * _.reject(users, function(o) { return !o.active; });\n * // => objects for [\'fred\']\n *\n * // The `_.matches` iteratee shorthand.\n * _.reject(users, { \'age\': 40, \'active\': true });\n * // => objects for [\'barney\']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.reject(users, [\'active\', false]);\n * // => objects for [\'fred\']\n *\n * // The `_.property` iteratee shorthand.\n * _.reject(users, \'active\');\n * // => objects for [\'barney\']\n */\n function reject(collection, predicate) {\n var func = isArray(collection) ? arrayFilter : baseFilter;\n return func(collection, negate(getIteratee(predicate, 3)));\n }\n\n /**\n * Gets a random element from `collection`.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to sample.\n * @returns {*} Returns the random element.\n * @example\n *\n * _.sample([1, 2, 3, 4]);\n * // => 2\n */\n function sample(collection) {\n var func = isArray(collection) ? arraySample : baseSample;\n return func(collection);\n }\n\n /**\n * Gets `n` random elements at unique keys from `collection` up to the\n * size of `collection`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to sample.\n * @param {number} [n=1] The number of elements to sample.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the random elements.\n * @example\n *\n * _.sampleSize([1, 2, 3], 2);\n * // => [3, 1]\n *\n * _.sampleSize([1, 2, 3], 4);\n * // => [2, 3, 1]\n */\n function sampleSize(collection, n, guard) {\n if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {\n n = 1;\n } else {\n n = toInteger(n);\n }\n var func = isArray(collection) ? arraySampleSize : baseSampleSize;\n return func(collection, n);\n }\n\n /**\n * Creates an array of shuffled values, using a version of the\n * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to shuffle.\n * @returns {Array} Returns the new shuffled array.\n * @example\n *\n * _.shuffle([1, 2, 3, 4]);\n * // => [4, 1, 3, 2]\n */\n function shuffle(collection) {\n var func = isArray(collection) ? arrayShuffle : baseShuffle;\n return func(collection);\n }\n\n /**\n * Gets the size of `collection` by returning its length for array-like\n * values or the number of own enumerable string keyed properties for objects.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object|string} collection The collection to inspect.\n * @returns {number} Returns the collection size.\n * @example\n *\n * _.size([1, 2, 3]);\n * // => 3\n *\n * _.size({ \'a\': 1, \'b\': 2 });\n * // => 2\n *\n * _.size(\'pebbles\');\n * // => 7\n */\n function size(collection) {\n if (collection == null) {\n return 0;\n }\n if (isArrayLike(collection)) {\n return isString(collection) ? stringSize(collection) : collection.length;\n }\n var tag = getTag(collection);\n if (tag == mapTag || tag == setTag) {\n return collection.size;\n }\n return baseKeys(collection).length;\n }\n\n /**\n * Checks if `predicate` returns truthy for **any** element of `collection`.\n * Iteration is stopped once `predicate` returns truthy. The predicate is\n * invoked with three arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n * @example\n *\n * _.some([null, 0, \'yes\', false], Boolean);\n * // => true\n *\n * var users = [\n * { \'user\': \'barney\', \'active\': true },\n * { \'user\': \'fred\', \'active\': false }\n * ];\n *\n * // The `_.matches` iteratee shorthand.\n * _.some(users, { \'user\': \'barney\', \'active\': false });\n * // => false\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.some(users, [\'active\', false]);\n * // => true\n *\n * // The `_.property` iteratee shorthand.\n * _.some(users, \'active\');\n * // => true\n */\n function some(collection, predicate, guard) {\n var func = isArray(collection) ? arraySome : baseSome;\n if (guard && isIterateeCall(collection, predicate, guard)) {\n predicate = undefined;\n }\n return func(collection, getIteratee(predicate, 3));\n }\n\n /**\n * Creates an array of elements, sorted in ascending order by the results of\n * running each element in a collection thru each iteratee. This method\n * performs a stable sort, that is, it preserves the original sort order of\n * equal elements. The iteratees are invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {...(Function|Function[])} [iteratees=[_.identity]]\n * The iteratees to sort by.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * var users = [\n * { \'user\': \'fred\', \'age\': 48 },\n * { \'user\': \'barney\', \'age\': 36 },\n * { \'user\': \'fred\', \'age\': 30 },\n * { \'user\': \'barney\', \'age\': 34 }\n * ];\n *\n * _.sortBy(users, [function(o) { return o.user; }]);\n * // => objects for [[\'barney\', 36], [\'barney\', 34], [\'fred\', 48], [\'fred\', 30]]\n *\n * _.sortBy(users, [\'user\', \'age\']);\n * // => objects for [[\'barney\', 34], [\'barney\', 36], [\'fred\', 30], [\'fred\', 48]]\n */\n var sortBy = baseRest(function(collection, iteratees) {\n if (collection == null) {\n return [];\n }\n var length = iteratees.length;\n if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\n iteratees = [];\n } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\n iteratees = [iteratees[0]];\n }\n return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\n });\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\n var now = ctxNow || function() {\n return root.Date.now();\n };\n\n /*------------------------------------------------------------------------*/\n\n /**\n * The opposite of `_.before`; this method creates a function that invokes\n * `func` once it\'s called `n` or more times.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {number} n The number of calls before `func` is invoked.\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new restricted function.\n * @example\n *\n * var saves = [\'profile\', \'settings\'];\n *\n * var done = _.after(saves.length, function() {\n * console.log(\'done saving!\');\n * });\n *\n * _.forEach(saves, function(type) {\n * asyncSave({ \'type\': type, \'complete\': done });\n * });\n * // => Logs \'done saving!\' after the two async saves have completed.\n */\n function after(n, func) {\n if (typeof func != \'function\') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n n = toInteger(n);\n return function() {\n if (--n < 1) {\n return func.apply(this, arguments);\n }\n };\n }\n\n /**\n * Creates a function that invokes `func`, with up to `n` arguments,\n * ignoring any additional arguments.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} func The function to cap arguments for.\n * @param {number} [n=func.length] The arity cap.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the new capped function.\n * @example\n *\n * _.map([\'6\', \'8\', \'10\'], _.ary(parseInt, 1));\n * // => [6, 8, 10]\n */\n function ary(func, n, guard) {\n n = guard ? undefined : n;\n n = (func && n == null) ? func.length : n;\n return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);\n }\n\n /**\n * Creates a function that invokes `func`, with the `this` binding and arguments\n * of the created function, while it\'s called less than `n` times. Subsequent\n * calls to the created function return the result of the last `func` invocation.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {number} n The number of calls at which `func` is no longer invoked.\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new restricted function.\n * @example\n *\n * jQuery(element).on(\'click\', _.before(5, addContactToList));\n * // => Allows adding up to 4 contacts to the list.\n */\n function before(n, func) {\n var result;\n if (typeof func != \'function\') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n n = toInteger(n);\n return function() {\n if (--n > 0) {\n result = func.apply(this, arguments);\n }\n if (n <= 1) {\n func = undefined;\n }\n return result;\n };\n }\n\n /**\n * Creates a function that invokes `func` with the `this` binding of `thisArg`\n * and `partials` prepended to the arguments it receives.\n *\n * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,\n * may be used as a placeholder for partially applied arguments.\n *\n * **Note:** Unlike native `Function#bind`, this method doesn\'t set the "length"\n * property of bound functions.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to bind.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new bound function.\n * @example\n *\n * function greet(greeting, punctuation) {\n * return greeting + \' \' + this.user + punctuation;\n * }\n *\n * var object = { \'user\': \'fred\' };\n *\n * var bound = _.bind(greet, object, \'hi\');\n * bound(\'!\');\n * // => \'hi fred!\'\n *\n * // Bound with placeholders.\n * var bound = _.bind(greet, object, _, \'!\');\n * bound(\'hi\');\n * // => \'hi fred!\'\n */\n var bind = baseRest(function(func, thisArg, partials) {\n var bitmask = WRAP_BIND_FLAG;\n if (partials.length) {\n var holders = replaceHolders(partials, getHolder(bind));\n bitmask |= WRAP_PARTIAL_FLAG;\n }\n return createWrap(func, bitmask, thisArg, partials, holders);\n });\n\n /**\n * Creates a function that invokes the method at `object[key]` with `partials`\n * prepended to the arguments it receives.\n *\n * This method differs from `_.bind` by allowing bound functions to reference\n * methods that may be redefined or don\'t yet exist. See\n * [Peter Michaux\'s article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)\n * for more details.\n *\n * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for partially applied arguments.\n *\n * @static\n * @memberOf _\n * @since 0.10.0\n * @category Function\n * @param {Object} object The object to invoke the method on.\n * @param {string} key The key of the method.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new bound function.\n * @example\n *\n * var object = {\n * \'user\': \'fred\',\n * \'greet\': function(greeting, punctuation) {\n * return greeting + \' \' + this.user + punctuation;\n * }\n * };\n *\n * var bound = _.bindKey(object, \'greet\', \'hi\');\n * bound(\'!\');\n * // => \'hi fred!\'\n *\n * object.greet = function(greeting, punctuation) {\n * return greeting + \'ya \' + this.user + punctuation;\n * };\n *\n * bound(\'!\');\n * // => \'hiya fred!\'\n *\n * // Bound with placeholders.\n * var bound = _.bindKey(object, \'greet\', _, \'!\');\n * bound(\'hi\');\n * // => \'hiya fred!\'\n */\n var bindKey = baseRest(function(object, key, partials) {\n var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;\n if (partials.length) {\n var holders = replaceHolders(partials, getHolder(bindKey));\n bitmask |= WRAP_PARTIAL_FLAG;\n }\n return createWrap(key, bitmask, object, partials, holders);\n });\n\n /**\n * Creates a function that accepts arguments of `func` and either invokes\n * `func` returning its result, if at least `arity` number of arguments have\n * been provided, or returns a function that accepts the remaining `func`\n * arguments, and so on. The arity of `func` may be specified if `func.length`\n * is not sufficient.\n *\n * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,\n * may be used as a placeholder for provided arguments.\n *\n * **Note:** This method doesn\'t set the "length" property of curried functions.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Function\n * @param {Function} func The function to curry.\n * @param {number} [arity=func.length] The arity of `func`.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the new curried function.\n * @example\n *\n * var abc = function(a, b, c) {\n * return [a, b, c];\n * };\n *\n * var curried = _.curry(abc);\n *\n * curried(1)(2)(3);\n * // => [1, 2, 3]\n *\n * curried(1, 2)(3);\n * // => [1, 2, 3]\n *\n * curried(1, 2, 3);\n * // => [1, 2, 3]\n *\n * // Curried with placeholders.\n * curried(1)(_, 3)(2);\n * // => [1, 2, 3]\n */\n function curry(func, arity, guard) {\n arity = guard ? undefined : arity;\n var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n result.placeholder = curry.placeholder;\n return result;\n }\n\n /**\n * This method is like `_.curry` except that arguments are applied to `func`\n * in the manner of `_.partialRight` instead of `_.partial`.\n *\n * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for provided arguments.\n *\n * **Note:** This method doesn\'t set the "length" property of curried functions.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} func The function to curry.\n * @param {number} [arity=func.length] The arity of `func`.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the new curried function.\n * @example\n *\n * var abc = function(a, b, c) {\n * return [a, b, c];\n * };\n *\n * var curried = _.curryRight(abc);\n *\n * curried(3)(2)(1);\n * // => [1, 2, 3]\n *\n * curried(2, 3)(1);\n * // => [1, 2, 3]\n *\n * curried(1, 2, 3);\n * // => [1, 2, 3]\n *\n * // Curried with placeholders.\n * curried(3)(1, _)(2);\n * // => [1, 2, 3]\n */\n function curryRight(func, arity, guard) {\n arity = guard ? undefined : arity;\n var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n result.placeholder = curryRight.placeholder;\n return result;\n }\n\n /**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho\'s article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it\'s invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on(\'resize\', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on(\'click\', _.debounce(sendMail, 300, {\n * \'leading\': true,\n * \'trailing\': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { \'maxWait\': 1000 });\n * var source = new EventSource(\'/stream\');\n * jQuery(source).on(\'message\', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on(\'popstate\', debounced.cancel);\n */\n function debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != \'function\') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = \'maxWait\' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = \'trailing\' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n timeWaiting = wait - timeSinceLastCall;\n\n return maxing\n ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we\'re at the\n // trailing edge, the system time has gone backwards and we\'re treating\n // it as the trailing edge, or we\'ve hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n clearTimeout(timerId);\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n }\n\n /**\n * Defers invoking the `func` until the current call stack has cleared. Any\n * additional arguments are provided to `func` when it\'s invoked.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to defer.\n * @param {...*} [args] The arguments to invoke `func` with.\n * @returns {number} Returns the timer id.\n * @example\n *\n * _.defer(function(text) {\n * console.log(text);\n * }, \'deferred\');\n * // => Logs \'deferred\' after one millisecond.\n */\n var defer = baseRest(function(func, args) {\n return baseDelay(func, 1, args);\n });\n\n /**\n * Invokes `func` after `wait` milliseconds. Any additional arguments are\n * provided to `func` when it\'s invoked.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to delay.\n * @param {number} wait The number of milliseconds to delay invocation.\n * @param {...*} [args] The arguments to invoke `func` with.\n * @returns {number} Returns the timer id.\n * @example\n *\n * _.delay(function(text) {\n * console.log(text);\n * }, 1000, \'later\');\n * // => Logs \'later\' after one second.\n */\n var delay = baseRest(function(func, wait, args) {\n return baseDelay(func, toNumber(wait) || 0, args);\n });\n\n /**\n * Creates a function that invokes `func` with arguments reversed.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Function\n * @param {Function} func The function to flip arguments for.\n * @returns {Function} Returns the new flipped function.\n * @example\n *\n * var flipped = _.flip(function() {\n * return _.toArray(arguments);\n * });\n *\n * flipped(\'a\', \'b\', \'c\', \'d\');\n * // => [\'d\', \'c\', \'b\', \'a\']\n */\n function flip(func) {\n return createWrap(func, WRAP_FLIP_FLAG);\n }\n\n /**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { \'a\': 1, \'b\': 2 };\n * var other = { \'c\': 3, \'d\': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, [\'a\', \'b\']);\n * values(object);\n * // => [\'a\', \'b\']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\n function memoize(func, resolver) {\n if (typeof func != \'function\' || (resolver != null && typeof resolver != \'function\')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n }\n\n // Expose `MapCache`.\n memoize.Cache = MapCache;\n\n /**\n * Creates a function that negates the result of the predicate `func`. The\n * `func` predicate is invoked with the `this` binding and arguments of the\n * created function.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} predicate The predicate to negate.\n * @returns {Function} Returns the new negated function.\n * @example\n *\n * function isEven(n) {\n * return n % 2 == 0;\n * }\n *\n * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\n * // => [1, 3, 5]\n */\n function negate(predicate) {\n if (typeof predicate != \'function\') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n return function() {\n var args = arguments;\n switch (args.length) {\n case 0: return !predicate.call(this);\n case 1: return !predicate.call(this, args[0]);\n case 2: return !predicate.call(this, args[0], args[1]);\n case 3: return !predicate.call(this, args[0], args[1], args[2]);\n }\n return !predicate.apply(this, args);\n };\n }\n\n /**\n * Creates a function that is restricted to invoking `func` once. Repeat calls\n * to the function return the value of the first invocation. The `func` is\n * invoked with the `this` binding and arguments of the created function.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new restricted function.\n * @example\n *\n * var initialize = _.once(createApplication);\n * initialize();\n * initialize();\n * // => `createApplication` is invoked once\n */\n function once(func) {\n return before(2, func);\n }\n\n /**\n * Creates a function that invokes `func` with its arguments transformed.\n *\n * @static\n * @since 4.0.0\n * @memberOf _\n * @category Function\n * @param {Function} func The function to wrap.\n * @param {...(Function|Function[])} [transforms=[_.identity]]\n * The argument transforms.\n * @returns {Function} Returns the new function.\n * @example\n *\n * function doubled(n) {\n * return n * 2;\n * }\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var func = _.overArgs(function(x, y) {\n * return [x, y];\n * }, [square, doubled]);\n *\n * func(9, 3);\n * // => [81, 6]\n *\n * func(10, 5);\n * // => [100, 10]\n */\n var overArgs = castRest(function(func, transforms) {\n transforms = (transforms.length == 1 && isArray(transforms[0]))\n ? arrayMap(transforms[0], baseUnary(getIteratee()))\n : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));\n\n var funcsLength = transforms.length;\n return baseRest(function(args) {\n var index = -1,\n length = nativeMin(args.length, funcsLength);\n\n while (++index < length) {\n args[index] = transforms[index].call(this, args[index]);\n }\n return apply(func, this, args);\n });\n });\n\n /**\n * Creates a function that invokes `func` with `partials` prepended to the\n * arguments it receives. This method is like `_.bind` except it does **not**\n * alter the `this` binding.\n *\n * The `_.partial.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for partially applied arguments.\n *\n * **Note:** This method doesn\'t set the "length" property of partially\n * applied functions.\n *\n * @static\n * @memberOf _\n * @since 0.2.0\n * @category Function\n * @param {Function} func The function to partially apply arguments to.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new partially applied function.\n * @example\n *\n * function greet(greeting, name) {\n * return greeting + \' \' + name;\n * }\n *\n * var sayHelloTo = _.partial(greet, \'hello\');\n * sayHelloTo(\'fred\');\n * // => \'hello fred\'\n *\n * // Partially applied with placeholders.\n * var greetFred = _.partial(greet, _, \'fred\');\n * greetFred(\'hi\');\n * // => \'hi fred\'\n */\n var partial = baseRest(function(func, partials) {\n var holders = replaceHolders(partials, getHolder(partial));\n return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);\n });\n\n /**\n * This method is like `_.partial` except that partially applied arguments\n * are appended to the arguments it receives.\n *\n * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for partially applied arguments.\n *\n * **Note:** This method doesn\'t set the "length" property of partially\n * applied functions.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Function\n * @param {Function} func The function to partially apply arguments to.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new partially applied function.\n * @example\n *\n * function greet(greeting, name) {\n * return greeting + \' \' + name;\n * }\n *\n * var greetFred = _.partialRight(greet, \'fred\');\n * greetFred(\'hi\');\n * // => \'hi fred\'\n *\n * // Partially applied with placeholders.\n * var sayHelloTo = _.partialRight(greet, \'hello\', _);\n * sayHelloTo(\'fred\');\n * // => \'hello fred\'\n */\n var partialRight = baseRest(function(func, partials) {\n var holders = replaceHolders(partials, getHolder(partialRight));\n return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);\n });\n\n /**\n * Creates a function that invokes `func` with arguments arranged according\n * to the specified `indexes` where the argument value at the first index is\n * provided as the first argument, the argument value at the second index is\n * provided as the second argument, and so on.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} func The function to rearrange arguments for.\n * @param {...(number|number[])} indexes The arranged argument indexes.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var rearged = _.rearg(function(a, b, c) {\n * return [a, b, c];\n * }, [2, 0, 1]);\n *\n * rearged(\'b\', \'c\', \'a\')\n * // => [\'a\', \'b\', \'c\']\n */\n var rearg = flatRest(function(func, indexes) {\n return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);\n });\n\n /**\n * Creates a function that invokes `func` with the `this` binding of the\n * created function and arguments from `start` and beyond provided as\n * an array.\n *\n * **Note:** This method is based on the\n * [rest parameter](https://mdn.io/rest_parameters).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Function\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var say = _.rest(function(what, names) {\n * return what + \' \' + _.initial(names).join(\', \') +\n * (_.size(names) > 1 ? \', & \' : \'\') + _.last(names);\n * });\n *\n * say(\'hello\', \'fred\', \'barney\', \'pebbles\');\n * // => \'hello fred, barney, & pebbles\'\n */\n function rest(func, start) {\n if (typeof func != \'function\') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n start = start === undefined ? start : toInteger(start);\n return baseRest(func, start);\n }\n\n /**\n * Creates a function that invokes `func` with the `this` binding of the\n * create function and an array of arguments much like\n * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).\n *\n * **Note:** This method is based on the\n * [spread operator](https://mdn.io/spread_operator).\n *\n * @static\n * @memberOf _\n * @since 3.2.0\n * @category Function\n * @param {Function} func The function to spread arguments over.\n * @param {number} [start=0] The start position of the spread.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var say = _.spread(function(who, what) {\n * return who + \' says \' + what;\n * });\n *\n * say([\'fred\', \'hello\']);\n * // => \'fred says hello\'\n *\n * var numbers = Promise.all([\n * Promise.resolve(40),\n * Promise.resolve(36)\n * ]);\n *\n * numbers.then(_.spread(function(x, y) {\n * return x + y;\n * }));\n * // => a Promise of 76\n */\n function spread(func, start) {\n if (typeof func != \'function\') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n start = start == null ? 0 : nativeMax(toInteger(start), 0);\n return baseRest(function(args) {\n var array = args[start],\n otherArgs = castSlice(args, 0, start);\n\n if (array) {\n arrayPush(otherArgs, array);\n }\n return apply(func, this, otherArgs);\n });\n }\n\n /**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed `func` invocations and a `flush` method to\n * immediately invoke them. Provide `options` to indicate whether `func`\n * should be invoked on the leading and/or trailing edge of the `wait`\n * timeout. The `func` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the throttled function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho\'s article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=true]\n * Specify invoking on the leading edge of the timeout.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // Avoid excessively updating the position while scrolling.\n * jQuery(window).on(\'scroll\', _.throttle(updatePosition, 100));\n *\n * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n * var throttled = _.throttle(renewToken, 300000, { \'trailing\': false });\n * jQuery(element).on(\'click\', throttled);\n *\n * // Cancel the trailing throttled invocation.\n * jQuery(window).on(\'popstate\', throttled.cancel);\n */\n function throttle(func, wait, options) {\n var leading = true,\n trailing = true;\n\n if (typeof func != \'function\') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (isObject(options)) {\n leading = \'leading\' in options ? !!options.leading : leading;\n trailing = \'trailing\' in options ? !!options.trailing : trailing;\n }\n return debounce(func, wait, {\n \'leading\': leading,\n \'maxWait\': wait,\n \'trailing\': trailing\n });\n }\n\n /**\n * Creates a function that accepts up to one argument, ignoring any\n * additional arguments.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Function\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n * @example\n *\n * _.map([\'6\', \'8\', \'10\'], _.unary(parseInt));\n * // => [6, 8, 10]\n */\n function unary(func) {\n return ary(func, 1);\n }\n\n /**\n * Creates a function that provides `value` to `wrapper` as its first\n * argument. Any additional arguments provided to the function are appended\n * to those provided to the `wrapper`. The wrapper is invoked with the `this`\n * binding of the created function.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {*} value The value to wrap.\n * @param {Function} [wrapper=identity] The wrapper function.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var p = _.wrap(_.escape, function(func, text) {\n * return \'

\' + func(text) + \'

\';\n * });\n *\n * p(\'fred, barney, & pebbles\');\n * // => \'

fred, barney, & pebbles

\'\n */\n function wrap(value, wrapper) {\n return partial(castFunction(wrapper), value);\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Casts `value` as an array if it\'s not one.\n *\n * @static\n * @memberOf _\n * @since 4.4.0\n * @category Lang\n * @param {*} value The value to inspect.\n * @returns {Array} Returns the cast array.\n * @example\n *\n * _.castArray(1);\n * // => [1]\n *\n * _.castArray({ \'a\': 1 });\n * // => [{ \'a\': 1 }]\n *\n * _.castArray(\'abc\');\n * // => [\'abc\']\n *\n * _.castArray(null);\n * // => [null]\n *\n * _.castArray(undefined);\n * // => [undefined]\n *\n * _.castArray();\n * // => []\n *\n * var array = [1, 2, 3];\n * console.log(_.castArray(array) === array);\n * // => true\n */\n function castArray() {\n if (!arguments.length) {\n return [];\n }\n var value = arguments[0];\n return isArray(value) ? value : [value];\n }\n\n /**\n * Creates a shallow clone of `value`.\n *\n * **Note:** This method is loosely based on the\n * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\n * and supports cloning arrays, array buffers, booleans, date objects, maps,\n * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\n * arrays. The own enumerable properties of `arguments` objects are cloned\n * as plain objects. An empty object is returned for uncloneable values such\n * as error objects, functions, DOM nodes, and WeakMaps.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to clone.\n * @returns {*} Returns the cloned value.\n * @see _.cloneDeep\n * @example\n *\n * var objects = [{ \'a\': 1 }, { \'b\': 2 }];\n *\n * var shallow = _.clone(objects);\n * console.log(shallow[0] === objects[0]);\n * // => true\n */\n function clone(value) {\n return baseClone(value, CLONE_SYMBOLS_FLAG);\n }\n\n /**\n * This method is like `_.clone` except that it accepts `customizer` which\n * is invoked to produce the cloned value. If `customizer` returns `undefined`,\n * cloning is handled by the method instead. The `customizer` is invoked with\n * up to four arguments; (value [, index|key, object, stack]).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to clone.\n * @param {Function} [customizer] The function to customize cloning.\n * @returns {*} Returns the cloned value.\n * @see _.cloneDeepWith\n * @example\n *\n * function customizer(value) {\n * if (_.isElement(value)) {\n * return value.cloneNode(false);\n * }\n * }\n *\n * var el = _.cloneWith(document.body, customizer);\n *\n * console.log(el === document.body);\n * // => false\n * console.log(el.nodeName);\n * // => \'BODY\'\n * console.log(el.childNodes.length);\n * // => 0\n */\n function cloneWith(value, customizer) {\n customizer = typeof customizer == \'function\' ? customizer : undefined;\n return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);\n }\n\n /**\n * This method is like `_.clone` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @returns {*} Returns the deep cloned value.\n * @see _.clone\n * @example\n *\n * var objects = [{ \'a\': 1 }, { \'b\': 2 }];\n *\n * var deep = _.cloneDeep(objects);\n * console.log(deep[0] === objects[0]);\n * // => false\n */\n function cloneDeep(value) {\n return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n }\n\n /**\n * This method is like `_.cloneWith` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @param {Function} [customizer] The function to customize cloning.\n * @returns {*} Returns the deep cloned value.\n * @see _.cloneWith\n * @example\n *\n * function customizer(value) {\n * if (_.isElement(value)) {\n * return value.cloneNode(true);\n * }\n * }\n *\n * var el = _.cloneDeepWith(document.body, customizer);\n *\n * console.log(el === document.body);\n * // => false\n * console.log(el.nodeName);\n * // => \'BODY\'\n * console.log(el.childNodes.length);\n * // => 20\n */\n function cloneDeepWith(value, customizer) {\n customizer = typeof customizer == \'function\' ? customizer : undefined;\n return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);\n }\n\n /**\n * Checks if `object` conforms to `source` by invoking the predicate\n * properties of `source` with the corresponding property values of `object`.\n *\n * **Note:** This method is equivalent to `_.conforms` when `source` is\n * partially applied.\n *\n * @static\n * @memberOf _\n * @since 4.14.0\n * @category Lang\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property predicates to conform to.\n * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n * @example\n *\n * var object = { \'a\': 1, \'b\': 2 };\n *\n * _.conformsTo(object, { \'b\': function(n) { return n > 1; } });\n * // => true\n *\n * _.conformsTo(object, { \'b\': function(n) { return n > 2; } });\n * // => false\n */\n function conformsTo(object, source) {\n return source == null || baseConformsTo(object, source, keys(source));\n }\n\n /**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { \'a\': 1 };\n * var other = { \'a\': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq(\'a\', \'a\');\n * // => true\n *\n * _.eq(\'a\', Object(\'a\'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\n function eq(value, other) {\n return value === other || (value !== value && other !== other);\n }\n\n /**\n * Checks if `value` is greater than `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than `other`,\n * else `false`.\n * @see _.lt\n * @example\n *\n * _.gt(3, 1);\n * // => true\n *\n * _.gt(3, 3);\n * // => false\n *\n * _.gt(1, 3);\n * // => false\n */\n var gt = createRelationalOperation(baseGt);\n\n /**\n * Checks if `value` is greater than or equal to `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than or equal to\n * `other`, else `false`.\n * @see _.lte\n * @example\n *\n * _.gte(3, 1);\n * // => true\n *\n * _.gte(3, 3);\n * // => true\n *\n * _.gte(1, 3);\n * // => false\n */\n var gte = createRelationalOperation(function(value, other) {\n return value >= other;\n });\n\n /**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\n var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, \'callee\') &&\n !propertyIsEnumerable.call(value, \'callee\');\n };\n\n /**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray(\'abc\');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\n var isArray = Array.isArray;\n\n /**\n * Checks if `value` is classified as an `ArrayBuffer` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n * @example\n *\n * _.isArrayBuffer(new ArrayBuffer(2));\n * // => true\n *\n * _.isArrayBuffer(new Array(2));\n * // => false\n */\n var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;\n\n /**\n * Checks if `value` is array-like. A value is considered array-like if it\'s\n * not a function and has a `value.length` that\'s an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike(\'abc\');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\n function isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n }\n\n /**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject(\'abc\');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\n function isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n }\n\n /**\n * Checks if `value` is classified as a boolean primitive or object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.\n * @example\n *\n * _.isBoolean(false);\n * // => true\n *\n * _.isBoolean(null);\n * // => false\n */\n function isBoolean(value) {\n return value === true || value === false ||\n (isObjectLike(value) && baseGetTag(value) == boolTag);\n }\n\n /**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\n var isBuffer = nativeIsBuffer || stubFalse;\n\n /**\n * Checks if `value` is classified as a `Date` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n * @example\n *\n * _.isDate(new Date);\n * // => true\n *\n * _.isDate(\'Mon April 23 2012\');\n * // => false\n */\n var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;\n\n /**\n * Checks if `value` is likely a DOM element.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.\n * @example\n *\n * _.isElement(document.body);\n * // => true\n *\n * _.isElement(\'\');\n * // => false\n */\n function isElement(value) {\n return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);\n }\n\n /**\n * Checks if `value` is an empty object, collection, map, or set.\n *\n * Objects are considered empty if they have no own enumerable string keyed\n * properties.\n *\n * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n * jQuery-like collections are considered empty if they have a `length` of `0`.\n * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n * @example\n *\n * _.isEmpty(null);\n * // => true\n *\n * _.isEmpty(true);\n * // => true\n *\n * _.isEmpty(1);\n * // => true\n *\n * _.isEmpty([1, 2, 3]);\n * // => false\n *\n * _.isEmpty({ \'a\': 1 });\n * // => false\n */\n function isEmpty(value) {\n if (value == null) {\n return true;\n }\n if (isArrayLike(value) &&\n (isArray(value) || typeof value == \'string\' || typeof value.splice == \'function\' ||\n isBuffer(value) || isTypedArray(value) || isArguments(value))) {\n return !value.length;\n }\n var tag = getTag(value);\n if (tag == mapTag || tag == setTag) {\n return !value.size;\n }\n if (isPrototype(value)) {\n return !baseKeys(value).length;\n }\n for (var key in value) {\n if (hasOwnProperty.call(value, key)) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Performs a deep comparison between two values to determine if they are\n * equivalent.\n *\n * **Note:** This method supports comparing arrays, array buffers, booleans,\n * date objects, error objects, maps, numbers, `Object` objects, regexes,\n * sets, strings, symbols, and typed arrays. `Object` objects are compared\n * by their own, not inherited, enumerable properties. Functions and DOM\n * nodes are compared by strict equality, i.e. `===`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { \'a\': 1 };\n * var other = { \'a\': 1 };\n *\n * _.isEqual(object, other);\n * // => true\n *\n * object === other;\n * // => false\n */\n function isEqual(value, other) {\n return baseIsEqual(value, other);\n }\n\n /**\n * This method is like `_.isEqual` except that it accepts `customizer` which\n * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n * are handled by the method instead. The `customizer` is invoked with up to\n * six arguments: (objValue, othValue [, index|key, object, other, stack]).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * function isGreeting(value) {\n * return /^h(?:i|ello)$/.test(value);\n * }\n *\n * function customizer(objValue, othValue) {\n * if (isGreeting(objValue) && isGreeting(othValue)) {\n * return true;\n * }\n * }\n *\n * var array = [\'hello\', \'goodbye\'];\n * var other = [\'hi\', \'goodbye\'];\n *\n * _.isEqualWith(array, other, customizer);\n * // => true\n */\n function isEqualWith(value, other, customizer) {\n customizer = typeof customizer == \'function\' ? customizer : undefined;\n var result = customizer ? customizer(value, other) : undefined;\n return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;\n }\n\n /**\n * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,\n * `SyntaxError`, `TypeError`, or `URIError` object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an error object, else `false`.\n * @example\n *\n * _.isError(new Error);\n * // => true\n *\n * _.isError(Error);\n * // => false\n */\n function isError(value) {\n if (!isObjectLike(value)) {\n return false;\n }\n var tag = baseGetTag(value);\n return tag == errorTag || tag == domExcTag ||\n (typeof value.message == \'string\' && typeof value.name == \'string\' && !isPlainObject(value));\n }\n\n /**\n * Checks if `value` is a finite primitive number.\n *\n * **Note:** This method is based on\n * [`Number.isFinite`](https://mdn.io/Number/isFinite).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\n * @example\n *\n * _.isFinite(3);\n * // => true\n *\n * _.isFinite(Number.MIN_VALUE);\n * // => true\n *\n * _.isFinite(Infinity);\n * // => false\n *\n * _.isFinite(\'3\');\n * // => false\n */\n function isFinite(value) {\n return typeof value == \'number\' && nativeIsFinite(value);\n }\n\n /**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\n function isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns \'object\' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n }\n\n /**\n * Checks if `value` is an integer.\n *\n * **Note:** This method is based on\n * [`Number.isInteger`](https://mdn.io/Number/isInteger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an integer, else `false`.\n * @example\n *\n * _.isInteger(3);\n * // => true\n *\n * _.isInteger(Number.MIN_VALUE);\n * // => false\n *\n * _.isInteger(Infinity);\n * // => false\n *\n * _.isInteger(\'3\');\n * // => false\n */\n function isInteger(value) {\n return typeof value == \'number\' && value == toInteger(value);\n }\n\n /**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength(\'3\');\n * // => false\n */\n function isLength(value) {\n return typeof value == \'number\' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n }\n\n /**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String(\'\')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\n function isObject(value) {\n var type = typeof value;\n return value != null && (type == \'object\' || type == \'function\');\n }\n\n /**\n * Checks if `value` is object-like. A value is object-like if it\'s not `null`\n * and has a `typeof` result of "object".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\n function isObjectLike(value) {\n return value != null && typeof value == \'object\';\n }\n\n /**\n * Checks if `value` is classified as a `Map` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n * @example\n *\n * _.isMap(new Map);\n * // => true\n *\n * _.isMap(new WeakMap);\n * // => false\n */\n var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\n /**\n * Performs a partial deep comparison between `object` and `source` to\n * determine if `object` contains equivalent property values.\n *\n * **Note:** This method is equivalent to `_.matches` when `source` is\n * partially applied.\n *\n * Partial comparisons will match empty array and empty object `source`\n * values against any array or object value, respectively. See `_.isEqual`\n * for a list of supported value comparisons.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n * @example\n *\n * var object = { \'a\': 1, \'b\': 2 };\n *\n * _.isMatch(object, { \'b\': 2 });\n * // => true\n *\n * _.isMatch(object, { \'b\': 1 });\n * // => false\n */\n function isMatch(object, source) {\n return object === source || baseIsMatch(object, source, getMatchData(source));\n }\n\n /**\n * This method is like `_.isMatch` except that it accepts `customizer` which\n * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n * are handled by the method instead. The `customizer` is invoked with five\n * arguments: (objValue, srcValue, index|key, object, source).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n * @example\n *\n * function isGreeting(value) {\n * return /^h(?:i|ello)$/.test(value);\n * }\n *\n * function customizer(objValue, srcValue) {\n * if (isGreeting(objValue) && isGreeting(srcValue)) {\n * return true;\n * }\n * }\n *\n * var object = { \'greeting\': \'hello\' };\n * var source = { \'greeting\': \'hi\' };\n *\n * _.isMatchWith(object, source, customizer);\n * // => true\n */\n function isMatchWith(object, source, customizer) {\n customizer = typeof customizer == \'function\' ? customizer : undefined;\n return baseIsMatch(object, source, getMatchData(source), customizer);\n }\n\n /**\n * Checks if `value` is `NaN`.\n *\n * **Note:** This method is based on\n * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as\n * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for\n * `undefined` and other non-number values.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n * @example\n *\n * _.isNaN(NaN);\n * // => true\n *\n * _.isNaN(new Number(NaN));\n * // => true\n *\n * isNaN(undefined);\n * // => true\n *\n * _.isNaN(undefined);\n * // => false\n */\n function isNaN(value) {\n // An `NaN` primitive is the only value that is not equal to itself.\n // Perform the `toStringTag` check first to avoid errors with some\n // ActiveX objects in IE.\n return isNumber(value) && value != +value;\n }\n\n /**\n * Checks if `value` is a pristine native function.\n *\n * **Note:** This method can\'t reliably detect native functions in the presence\n * of the core-js package because core-js circumvents this kind of detection.\n * Despite multiple requests, the core-js maintainer has made it clear: any\n * attempt to fix the detection will be obstructed. As a result, we\'re left\n * with little choice but to throw an error. Unfortunately, this also affects\n * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),\n * which rely on core-js.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n * @example\n *\n * _.isNative(Array.prototype.push);\n * // => true\n *\n * _.isNative(_);\n * // => false\n */\n function isNative(value) {\n if (isMaskable(value)) {\n throw new Error(CORE_ERROR_TEXT);\n }\n return baseIsNative(value);\n }\n\n /**\n * Checks if `value` is `null`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `null`, else `false`.\n * @example\n *\n * _.isNull(null);\n * // => true\n *\n * _.isNull(void 0);\n * // => false\n */\n function isNull(value) {\n return value === null;\n }\n\n /**\n * Checks if `value` is `null` or `undefined`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is nullish, else `false`.\n * @example\n *\n * _.isNil(null);\n * // => true\n *\n * _.isNil(void 0);\n * // => true\n *\n * _.isNil(NaN);\n * // => false\n */\n function isNil(value) {\n return value == null;\n }\n\n /**\n * Checks if `value` is classified as a `Number` primitive or object.\n *\n * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are\n * classified as numbers, use the `_.isFinite` method.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a number, else `false`.\n * @example\n *\n * _.isNumber(3);\n * // => true\n *\n * _.isNumber(Number.MIN_VALUE);\n * // => true\n *\n * _.isNumber(Infinity);\n * // => true\n *\n * _.isNumber(\'3\');\n * // => false\n */\n function isNumber(value) {\n return typeof value == \'number\' ||\n (isObjectLike(value) && baseGetTag(value) == numberTag);\n }\n\n /**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ \'x\': 0, \'y\': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\n function isPlainObject(value) {\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n return false;\n }\n var proto = getPrototype(value);\n if (proto === null) {\n return true;\n }\n var Ctor = hasOwnProperty.call(proto, \'constructor\') && proto.constructor;\n return typeof Ctor == \'function\' && Ctor instanceof Ctor &&\n funcToString.call(Ctor) == objectCtorString;\n }\n\n /**\n * Checks if `value` is classified as a `RegExp` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n * @example\n *\n * _.isRegExp(/abc/);\n * // => true\n *\n * _.isRegExp(\'/abc/\');\n * // => false\n */\n var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\n\n /**\n * Checks if `value` is a safe integer. An integer is safe if it\'s an IEEE-754\n * double precision number which isn\'t the result of a rounded unsafe integer.\n *\n * **Note:** This method is based on\n * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.\n * @example\n *\n * _.isSafeInteger(3);\n * // => true\n *\n * _.isSafeInteger(Number.MIN_VALUE);\n * // => false\n *\n * _.isSafeInteger(Infinity);\n * // => false\n *\n * _.isSafeInteger(\'3\');\n * // => false\n */\n function isSafeInteger(value) {\n return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;\n }\n\n /**\n * Checks if `value` is classified as a `Set` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n * @example\n *\n * _.isSet(new Set);\n * // => true\n *\n * _.isSet(new WeakSet);\n * // => false\n */\n var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\n /**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n * @example\n *\n * _.isString(\'abc\');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\n function isString(value) {\n return typeof value == \'string\' ||\n (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n }\n\n /**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol(\'abc\');\n * // => false\n */\n function isSymbol(value) {\n return typeof value == \'symbol\' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n }\n\n /**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\n var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\n /**\n * Checks if `value` is `undefined`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n * @example\n *\n * _.isUndefined(void 0);\n * // => true\n *\n * _.isUndefined(null);\n * // => false\n */\n function isUndefined(value) {\n return value === undefined;\n }\n\n /**\n * Checks if `value` is classified as a `WeakMap` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.\n * @example\n *\n * _.isWeakMap(new WeakMap);\n * // => true\n *\n * _.isWeakMap(new Map);\n * // => false\n */\n function isWeakMap(value) {\n return isObjectLike(value) && getTag(value) == weakMapTag;\n }\n\n /**\n * Checks if `value` is classified as a `WeakSet` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.\n * @example\n *\n * _.isWeakSet(new WeakSet);\n * // => true\n *\n * _.isWeakSet(new Set);\n * // => false\n */\n function isWeakSet(value) {\n return isObjectLike(value) && baseGetTag(value) == weakSetTag;\n }\n\n /**\n * Checks if `value` is less than `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than `other`,\n * else `false`.\n * @see _.gt\n * @example\n *\n * _.lt(1, 3);\n * // => true\n *\n * _.lt(3, 3);\n * // => false\n *\n * _.lt(3, 1);\n * // => false\n */\n var lt = createRelationalOperation(baseLt);\n\n /**\n * Checks if `value` is less than or equal to `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than or equal to\n * `other`, else `false`.\n * @see _.gte\n * @example\n *\n * _.lte(1, 3);\n * // => true\n *\n * _.lte(3, 3);\n * // => true\n *\n * _.lte(3, 1);\n * // => false\n */\n var lte = createRelationalOperation(function(value, other) {\n return value <= other;\n });\n\n /**\n * Converts `value` to an array.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Array} Returns the converted array.\n * @example\n *\n * _.toArray({ \'a\': 1, \'b\': 2 });\n * // => [1, 2]\n *\n * _.toArray(\'abc\');\n * // => [\'a\', \'b\', \'c\']\n *\n * _.toArray(1);\n * // => []\n *\n * _.toArray(null);\n * // => []\n */\n function toArray(value) {\n if (!value) {\n return [];\n }\n if (isArrayLike(value)) {\n return isString(value) ? stringToArray(value) : copyArray(value);\n }\n if (symIterator && value[symIterator]) {\n return iteratorToArray(value[symIterator]());\n }\n var tag = getTag(value),\n func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);\n\n return func(value);\n }\n\n /**\n * Converts `value` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite(\'3.2\');\n * // => 3.2\n */\n function toFinite(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === INFINITY || value === -INFINITY) {\n var sign = (value < 0 ? -1 : 1);\n return sign * MAX_INTEGER;\n }\n return value === value ? value : 0;\n }\n\n /**\n * Converts `value` to an integer.\n *\n * **Note:** This method is loosely based on\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3.2);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger(\'3.2\');\n * // => 3\n */\n function toInteger(value) {\n var result = toFinite(value),\n remainder = result % 1;\n\n return result === result ? (remainder ? result - remainder : result) : 0;\n }\n\n /**\n * Converts `value` to an integer suitable for use as the length of an\n * array-like object.\n *\n * **Note:** This method is based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toLength(3.2);\n * // => 3\n *\n * _.toLength(Number.MIN_VALUE);\n * // => 0\n *\n * _.toLength(Infinity);\n * // => 4294967295\n *\n * _.toLength(\'3.2\');\n * // => 3\n */\n function toLength(value) {\n return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;\n }\n\n /**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber(\'3.2\');\n * // => 3.2\n */\n function toNumber(value) {\n if (typeof value == \'number\') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == \'function\' ? value.valueOf() : value;\n value = isObject(other) ? (other + \'\') : other;\n }\n if (typeof value != \'string\') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n }\n\n /**\n * Converts `value` to a plain object flattening inherited enumerable string\n * keyed properties of `value` to own properties of the plain object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Object} Returns the converted plain object.\n * @example\n *\n * function Foo() {\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.assign({ \'a\': 1 }, new Foo);\n * // => { \'a\': 1, \'b\': 2 }\n *\n * _.assign({ \'a\': 1 }, _.toPlainObject(new Foo));\n * // => { \'a\': 1, \'b\': 2, \'c\': 3 }\n */\n function toPlainObject(value) {\n return copyObject(value, keysIn(value));\n }\n\n /**\n * Converts `value` to a safe integer. A safe integer can be compared and\n * represented correctly.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toSafeInteger(3.2);\n * // => 3\n *\n * _.toSafeInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toSafeInteger(Infinity);\n * // => 9007199254740991\n *\n * _.toSafeInteger(\'3.2\');\n * // => 3\n */\n function toSafeInteger(value) {\n return value\n ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)\n : (value === 0 ? value : 0);\n }\n\n /**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => \'\'\n *\n * _.toString(-0);\n * // => \'-0\'\n *\n * _.toString([1, 2, 3]);\n * // => \'1,2,3\'\n */\n function toString(value) {\n return value == null ? \'\' : baseToString(value);\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Assigns own enumerable string keyed properties of source objects to the\n * destination object. Source objects are applied from left to right.\n * Subsequent sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object` and is loosely based on\n * [`Object.assign`](https://mdn.io/Object/assign).\n *\n * @static\n * @memberOf _\n * @since 0.10.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.assignIn\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * function Bar() {\n * this.c = 3;\n * }\n *\n * Foo.prototype.b = 2;\n * Bar.prototype.d = 4;\n *\n * _.assign({ \'a\': 0 }, new Foo, new Bar);\n * // => { \'a\': 1, \'c\': 3 }\n */\n var assign = createAssigner(function(object, source) {\n if (isPrototype(source) || isArrayLike(source)) {\n copyObject(source, keys(source), object);\n return;\n }\n for (var key in source) {\n if (hasOwnProperty.call(source, key)) {\n assignValue(object, key, source[key]);\n }\n }\n });\n\n /**\n * This method is like `_.assign` except that it iterates over own and\n * inherited source properties.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias extend\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.assign\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * function Bar() {\n * this.c = 3;\n * }\n *\n * Foo.prototype.b = 2;\n * Bar.prototype.d = 4;\n *\n * _.assignIn({ \'a\': 0 }, new Foo, new Bar);\n * // => { \'a\': 1, \'b\': 2, \'c\': 3, \'d\': 4 }\n */\n var assignIn = createAssigner(function(object, source) {\n copyObject(source, keysIn(source), object);\n });\n\n /**\n * This method is like `_.assignIn` except that it accepts `customizer`\n * which is invoked to produce the assigned values. If `customizer` returns\n * `undefined`, assignment is handled by the method instead. The `customizer`\n * is invoked with five arguments: (objValue, srcValue, key, object, source).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias extendWith\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} sources The source objects.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @see _.assignWith\n * @example\n *\n * function customizer(objValue, srcValue) {\n * return _.isUndefined(objValue) ? srcValue : objValue;\n * }\n *\n * var defaults = _.partialRight(_.assignInWith, customizer);\n *\n * defaults({ \'a\': 1 }, { \'b\': 2 }, { \'a\': 3 });\n * // => { \'a\': 1, \'b\': 2 }\n */\n var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {\n copyObject(source, keysIn(source), object, customizer);\n });\n\n /**\n * This method is like `_.assign` except that it accepts `customizer`\n * which is invoked to produce the assigned values. If `customizer` returns\n * `undefined`, assignment is handled by the method instead. The `customizer`\n * is invoked with five arguments: (objValue, srcValue, key, object, source).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} sources The source objects.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @see _.assignInWith\n * @example\n *\n * function customizer(objValue, srcValue) {\n * return _.isUndefined(objValue) ? srcValue : objValue;\n * }\n *\n * var defaults = _.partialRight(_.assignWith, customizer);\n *\n * defaults({ \'a\': 1 }, { \'b\': 2 }, { \'a\': 3 });\n * // => { \'a\': 1, \'b\': 2 }\n */\n var assignWith = createAssigner(function(object, source, srcIndex, customizer) {\n copyObject(source, keys(source), object, customizer);\n });\n\n /**\n * Creates an array of values corresponding to `paths` of `object`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {...(string|string[])} [paths] The property paths to pick.\n * @returns {Array} Returns the picked values.\n * @example\n *\n * var object = { \'a\': [{ \'b\': { \'c\': 3 } }, 4] };\n *\n * _.at(object, [\'a[0].b.c\', \'a[1]\']);\n * // => [3, 4]\n */\n var at = flatRest(baseAt);\n\n /**\n * Creates an object that inherits from the `prototype` object. If a\n * `properties` object is given, its own enumerable string keyed properties\n * are assigned to the created object.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Object\n * @param {Object} prototype The object to inherit from.\n * @param {Object} [properties] The properties to assign to the object.\n * @returns {Object} Returns the new object.\n * @example\n *\n * function Shape() {\n * this.x = 0;\n * this.y = 0;\n * }\n *\n * function Circle() {\n * Shape.call(this);\n * }\n *\n * Circle.prototype = _.create(Shape.prototype, {\n * \'constructor\': Circle\n * });\n *\n * var circle = new Circle;\n * circle instanceof Circle;\n * // => true\n *\n * circle instanceof Shape;\n * // => true\n */\n function create(prototype, properties) {\n var result = baseCreate(prototype);\n return properties == null ? result : baseAssign(result, properties);\n }\n\n /**\n * Assigns own and inherited enumerable string keyed properties of source\n * objects to the destination object for all destination properties that\n * resolve to `undefined`. Source objects are applied from left to right.\n * Once a property is set, additional values of the same property are ignored.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.defaultsDeep\n * @example\n *\n * _.defaults({ \'a\': 1 }, { \'b\': 2 }, { \'a\': 3 });\n * // => { \'a\': 1, \'b\': 2 }\n */\n var defaults = baseRest(function(object, sources) {\n object = Object(object);\n\n var index = -1;\n var length = sources.length;\n var guard = length > 2 ? sources[2] : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n length = 1;\n }\n\n while (++index < length) {\n var source = sources[index];\n var props = keysIn(source);\n var propsIndex = -1;\n var propsLength = props.length;\n\n while (++propsIndex < propsLength) {\n var key = props[propsIndex];\n var value = object[key];\n\n if (value === undefined ||\n (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n object[key] = source[key];\n }\n }\n }\n\n return object;\n });\n\n /**\n * This method is like `_.defaults` except that it recursively assigns\n * default properties.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 3.10.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.defaults\n * @example\n *\n * _.defaultsDeep({ \'a\': { \'b\': 2 } }, { \'a\': { \'b\': 1, \'c\': 3 } });\n * // => { \'a\': { \'b\': 2, \'c\': 3 } }\n */\n var defaultsDeep = baseRest(function(args) {\n args.push(undefined, customDefaultsMerge);\n return apply(mergeWith, undefined, args);\n });\n\n /**\n * This method is like `_.find` except that it returns the key of the first\n * element `predicate` returns truthy for instead of the element itself.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Object\n * @param {Object} object The object to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {string|undefined} Returns the key of the matched element,\n * else `undefined`.\n * @example\n *\n * var users = {\n * \'barney\': { \'age\': 36, \'active\': true },\n * \'fred\': { \'age\': 40, \'active\': false },\n * \'pebbles\': { \'age\': 1, \'active\': true }\n * };\n *\n * _.findKey(users, function(o) { return o.age < 40; });\n * // => \'barney\' (iteration order is not guaranteed)\n *\n * // The `_.matches` iteratee shorthand.\n * _.findKey(users, { \'age\': 1, \'active\': true });\n * // => \'pebbles\'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findKey(users, [\'active\', false]);\n * // => \'fred\'\n *\n * // The `_.property` iteratee shorthand.\n * _.findKey(users, \'active\');\n * // => \'barney\'\n */\n function findKey(object, predicate) {\n return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);\n }\n\n /**\n * This method is like `_.findKey` except that it iterates over elements of\n * a collection in the opposite order.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Object\n * @param {Object} object The object to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {string|undefined} Returns the key of the matched element,\n * else `undefined`.\n * @example\n *\n * var users = {\n * \'barney\': { \'age\': 36, \'active\': true },\n * \'fred\': { \'age\': 40, \'active\': false },\n * \'pebbles\': { \'age\': 1, \'active\': true }\n * };\n *\n * _.findLastKey(users, function(o) { return o.age < 40; });\n * // => returns \'pebbles\' assuming `_.findKey` returns \'barney\'\n *\n * // The `_.matches` iteratee shorthand.\n * _.findLastKey(users, { \'age\': 36, \'active\': true });\n * // => \'barney\'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findLastKey(users, [\'active\', false]);\n * // => \'fred\'\n *\n * // The `_.property` iteratee shorthand.\n * _.findLastKey(users, \'active\');\n * // => \'pebbles\'\n */\n function findLastKey(object, predicate) {\n return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);\n }\n\n /**\n * Iterates over own and inherited enumerable string keyed properties of an\n * object and invokes `iteratee` for each property. The iteratee is invoked\n * with three arguments: (value, key, object). Iteratee functions may exit\n * iteration early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @since 0.3.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forInRight\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forIn(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs \'a\', \'b\', then \'c\' (iteration order is not guaranteed).\n */\n function forIn(object, iteratee) {\n return object == null\n ? object\n : baseFor(object, getIteratee(iteratee, 3), keysIn);\n }\n\n /**\n * This method is like `_.forIn` except that it iterates over properties of\n * `object` in the opposite order.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forIn\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forInRight(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs \'c\', \'b\', then \'a\' assuming `_.forIn` logs \'a\', \'b\', then \'c\'.\n */\n function forInRight(object, iteratee) {\n return object == null\n ? object\n : baseForRight(object, getIteratee(iteratee, 3), keysIn);\n }\n\n /**\n * Iterates over own enumerable string keyed properties of an object and\n * invokes `iteratee` for each property. The iteratee is invoked with three\n * arguments: (value, key, object). Iteratee functions may exit iteration\n * early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @since 0.3.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forOwnRight\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forOwn(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs \'a\' then \'b\' (iteration order is not guaranteed).\n */\n function forOwn(object, iteratee) {\n return object && baseForOwn(object, getIteratee(iteratee, 3));\n }\n\n /**\n * This method is like `_.forOwn` except that it iterates over properties of\n * `object` in the opposite order.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forOwn\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forOwnRight(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs \'b\' then \'a\' assuming `_.forOwn` logs \'a\' then \'b\'.\n */\n function forOwnRight(object, iteratee) {\n return object && baseForOwnRight(object, getIteratee(iteratee, 3));\n }\n\n /**\n * Creates an array of function property names from own enumerable properties\n * of `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to inspect.\n * @returns {Array} Returns the function names.\n * @see _.functionsIn\n * @example\n *\n * function Foo() {\n * this.a = _.constant(\'a\');\n * this.b = _.constant(\'b\');\n * }\n *\n * Foo.prototype.c = _.constant(\'c\');\n *\n * _.functions(new Foo);\n * // => [\'a\', \'b\']\n */\n function functions(object) {\n return object == null ? [] : baseFunctions(object, keys(object));\n }\n\n /**\n * Creates an array of function property names from own and inherited\n * enumerable properties of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to inspect.\n * @returns {Array} Returns the function names.\n * @see _.functions\n * @example\n *\n * function Foo() {\n * this.a = _.constant(\'a\');\n * this.b = _.constant(\'b\');\n * }\n *\n * Foo.prototype.c = _.constant(\'c\');\n *\n * _.functionsIn(new Foo);\n * // => [\'a\', \'b\', \'c\']\n */\n function functionsIn(object) {\n return object == null ? [] : baseFunctions(object, keysIn(object));\n }\n\n /**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { \'a\': [{ \'b\': { \'c\': 3 } }] };\n *\n * _.get(object, \'a[0].b.c\');\n * // => 3\n *\n * _.get(object, [\'a\', \'0\', \'b\', \'c\']);\n * // => 3\n *\n * _.get(object, \'a.b.c\', \'default\');\n * // => \'default\'\n */\n function get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n }\n\n /**\n * Checks if `path` is a direct property of `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = { \'a\': { \'b\': 2 } };\n * var other = _.create({ \'a\': _.create({ \'b\': 2 }) });\n *\n * _.has(object, \'a\');\n * // => true\n *\n * _.has(object, \'a.b\');\n * // => true\n *\n * _.has(object, [\'a\', \'b\']);\n * // => true\n *\n * _.has(other, \'a\');\n * // => false\n */\n function has(object, path) {\n return object != null && hasPath(object, path, baseHas);\n }\n\n /**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ \'a\': _.create({ \'b\': 2 }) });\n *\n * _.hasIn(object, \'a\');\n * // => true\n *\n * _.hasIn(object, \'a.b\');\n * // => true\n *\n * _.hasIn(object, [\'a\', \'b\']);\n * // => true\n *\n * _.hasIn(object, \'b\');\n * // => false\n */\n function hasIn(object, path) {\n return object != null && hasPath(object, path, baseHasIn);\n }\n\n /**\n * Creates an object composed of the inverted keys and values of `object`.\n * If `object` contains duplicate values, subsequent values overwrite\n * property assignments of previous values.\n *\n * @static\n * @memberOf _\n * @since 0.7.0\n * @category Object\n * @param {Object} object The object to invert.\n * @returns {Object} Returns the new inverted object.\n * @example\n *\n * var object = { \'a\': 1, \'b\': 2, \'c\': 1 };\n *\n * _.invert(object);\n * // => { \'1\': \'c\', \'2\': \'b\' }\n */\n var invert = createInverter(function(result, value, key) {\n if (value != null &&\n typeof value.toString != \'function\') {\n value = nativeObjectToString.call(value);\n }\n\n result[value] = key;\n }, constant(identity));\n\n /**\n * This method is like `_.invert` except that the inverted object is generated\n * from the results of running each element of `object` thru `iteratee`. The\n * corresponding inverted value of each inverted key is an array of keys\n * responsible for generating the inverted value. The iteratee is invoked\n * with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.1.0\n * @category Object\n * @param {Object} object The object to invert.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Object} Returns the new inverted object.\n * @example\n *\n * var object = { \'a\': 1, \'b\': 2, \'c\': 1 };\n *\n * _.invertBy(object);\n * // => { \'1\': [\'a\', \'c\'], \'2\': [\'b\'] }\n *\n * _.invertBy(object, function(value) {\n * return \'group\' + value;\n * });\n * // => { \'group1\': [\'a\', \'c\'], \'group2\': [\'b\'] }\n */\n var invertBy = createInverter(function(result, value, key) {\n if (value != null &&\n typeof value.toString != \'function\') {\n value = nativeObjectToString.call(value);\n }\n\n if (hasOwnProperty.call(result, value)) {\n result[value].push(key);\n } else {\n result[value] = [key];\n }\n }, getIteratee);\n\n /**\n * Invokes the method at `path` of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the method to invoke.\n * @param {...*} [args] The arguments to invoke the method with.\n * @returns {*} Returns the result of the invoked method.\n * @example\n *\n * var object = { \'a\': [{ \'b\': { \'c\': [1, 2, 3, 4] } }] };\n *\n * _.invoke(object, \'a[0].b.c.slice\', 1, 3);\n * // => [2, 3]\n */\n var invoke = baseRest(baseInvoke);\n\n /**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => [\'a\', \'b\'] (iteration order is not guaranteed)\n *\n * _.keys(\'hi\');\n * // => [\'0\', \'1\']\n */\n function keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n }\n\n /**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => [\'a\', \'b\', \'c\'] (iteration order is not guaranteed)\n */\n function keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n }\n\n /**\n * The opposite of `_.mapValues`; this method creates an object with the\n * same values as `object` and keys generated by running each own enumerable\n * string keyed property of `object` thru `iteratee`. The iteratee is invoked\n * with three arguments: (value, key, object).\n *\n * @static\n * @memberOf _\n * @since 3.8.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns the new mapped object.\n * @see _.mapValues\n * @example\n *\n * _.mapKeys({ \'a\': 1, \'b\': 2 }, function(value, key) {\n * return key + value;\n * });\n * // => { \'a1\': 1, \'b2\': 2 }\n */\n function mapKeys(object, iteratee) {\n var result = {};\n iteratee = getIteratee(iteratee, 3);\n\n baseForOwn(object, function(value, key, object) {\n baseAssignValue(result, iteratee(value, key, object), value);\n });\n return result;\n }\n\n /**\n * Creates an object with the same keys as `object` and values generated\n * by running each own enumerable string keyed property of `object` thru\n * `iteratee`. The iteratee is invoked with three arguments:\n * (value, key, object).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns the new mapped object.\n * @see _.mapKeys\n * @example\n *\n * var users = {\n * \'fred\': { \'user\': \'fred\', \'age\': 40 },\n * \'pebbles\': { \'user\': \'pebbles\', \'age\': 1 }\n * };\n *\n * _.mapValues(users, function(o) { return o.age; });\n * // => { \'fred\': 40, \'pebbles\': 1 } (iteration order is not guaranteed)\n *\n * // The `_.property` iteratee shorthand.\n * _.mapValues(users, \'age\');\n * // => { \'fred\': 40, \'pebbles\': 1 } (iteration order is not guaranteed)\n */\n function mapValues(object, iteratee) {\n var result = {};\n iteratee = getIteratee(iteratee, 3);\n\n baseForOwn(object, function(value, key, object) {\n baseAssignValue(result, key, iteratee(value, key, object));\n });\n return result;\n }\n\n /**\n * This method is like `_.assign` except that it recursively merges own and\n * inherited enumerable string keyed properties of source objects into the\n * destination object. Source properties that resolve to `undefined` are\n * skipped if a destination value exists. Array and plain object properties\n * are merged recursively. Other objects and value types are overridden by\n * assignment. Source objects are applied from left to right. Subsequent\n * sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {\n * \'a\': [{ \'b\': 2 }, { \'d\': 4 }]\n * };\n *\n * var other = {\n * \'a\': [{ \'c\': 3 }, { \'e\': 5 }]\n * };\n *\n * _.merge(object, other);\n * // => { \'a\': [{ \'b\': 2, \'c\': 3 }, { \'d\': 4, \'e\': 5 }] }\n */\n var merge = createAssigner(function(object, source, srcIndex) {\n baseMerge(object, source, srcIndex);\n });\n\n /**\n * This method is like `_.merge` except that it accepts `customizer` which\n * is invoked to produce the merged values of the destination and source\n * properties. If `customizer` returns `undefined`, merging is handled by the\n * method instead. The `customizer` is invoked with six arguments:\n * (objValue, srcValue, key, object, source, stack).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} sources The source objects.\n * @param {Function} customizer The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @example\n *\n * function customizer(objValue, srcValue) {\n * if (_.isArray(objValue)) {\n * return objValue.concat(srcValue);\n * }\n * }\n *\n * var object = { \'a\': [1], \'b\': [2] };\n * var other = { \'a\': [3], \'b\': [4] };\n *\n * _.mergeWith(object, other, customizer);\n * // => { \'a\': [1, 3], \'b\': [2, 4] }\n */\n var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {\n baseMerge(object, source, srcIndex, customizer);\n });\n\n /**\n * The opposite of `_.pick`; this method creates an object composed of the\n * own and inherited enumerable property paths of `object` that are not omitted.\n *\n * **Note:** This method is considerably slower than `_.pick`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The source object.\n * @param {...(string|string[])} [paths] The property paths to omit.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { \'a\': 1, \'b\': \'2\', \'c\': 3 };\n *\n * _.omit(object, [\'a\', \'c\']);\n * // => { \'b\': \'2\' }\n */\n var omit = flatRest(function(object, paths) {\n var result = {};\n if (object == null) {\n return result;\n }\n var isDeep = false;\n paths = arrayMap(paths, function(path) {\n path = castPath(path, object);\n isDeep || (isDeep = path.length > 1);\n return path;\n });\n copyObject(object, getAllKeysIn(object), result);\n if (isDeep) {\n result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);\n }\n var length = paths.length;\n while (length--) {\n baseUnset(result, paths[length]);\n }\n return result;\n });\n\n /**\n * The opposite of `_.pickBy`; this method creates an object composed of\n * the own and inherited enumerable string keyed properties of `object` that\n * `predicate` doesn\'t return truthy for. The predicate is invoked with two\n * arguments: (value, key).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The source object.\n * @param {Function} [predicate=_.identity] The function invoked per property.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { \'a\': 1, \'b\': \'2\', \'c\': 3 };\n *\n * _.omitBy(object, _.isNumber);\n * // => { \'b\': \'2\' }\n */\n function omitBy(object, predicate) {\n return pickBy(object, negate(getIteratee(predicate)));\n }\n\n /**\n * Creates an object composed of the picked `object` properties.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The source object.\n * @param {...(string|string[])} [paths] The property paths to pick.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { \'a\': 1, \'b\': \'2\', \'c\': 3 };\n *\n * _.pick(object, [\'a\', \'c\']);\n * // => { \'a\': 1, \'c\': 3 }\n */\n var pick = flatRest(function(object, paths) {\n return object == null ? {} : basePick(object, paths);\n });\n\n /**\n * Creates an object composed of the `object` properties `predicate` returns\n * truthy for. The predicate is invoked with two arguments: (value, key).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The source object.\n * @param {Function} [predicate=_.identity] The function invoked per property.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { \'a\': 1, \'b\': \'2\', \'c\': 3 };\n *\n * _.pickBy(object, _.isNumber);\n * // => { \'a\': 1, \'c\': 3 }\n */\n function pickBy(object, predicate) {\n if (object == null) {\n return {};\n }\n var props = arrayMap(getAllKeysIn(object), function(prop) {\n return [prop];\n });\n predicate = getIteratee(predicate);\n return basePickBy(object, props, function(value, path) {\n return predicate(value, path[0]);\n });\n }\n\n /**\n * This method is like `_.get` except that if the resolved value is a\n * function it\'s invoked with the `this` binding of its parent object and\n * its result is returned.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to resolve.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { \'a\': [{ \'b\': { \'c1\': 3, \'c2\': _.constant(4) } }] };\n *\n * _.result(object, \'a[0].b.c1\');\n * // => 3\n *\n * _.result(object, \'a[0].b.c2\');\n * // => 4\n *\n * _.result(object, \'a[0].b.c3\', \'default\');\n * // => \'default\'\n *\n * _.result(object, \'a[0].b.c3\', _.constant(\'default\'));\n * // => \'default\'\n */\n function result(object, path, defaultValue) {\n path = castPath(path, object);\n\n var index = -1,\n length = path.length;\n\n // Ensure the loop is entered when path is empty.\n if (!length) {\n length = 1;\n object = undefined;\n }\n while (++index < length) {\n var value = object == null ? undefined : object[toKey(path[index])];\n if (value === undefined) {\n index = length;\n value = defaultValue;\n }\n object = isFunction(value) ? value.call(object) : value;\n }\n return object;\n }\n\n /**\n * Sets the value at `path` of `object`. If a portion of `path` doesn\'t exist,\n * it\'s created. Arrays are created for missing index properties while objects\n * are created for all other missing properties. Use `_.setWith` to customize\n * `path` creation.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = { \'a\': [{ \'b\': { \'c\': 3 } }] };\n *\n * _.set(object, \'a[0].b.c\', 4);\n * console.log(object.a[0].b.c);\n * // => 4\n *\n * _.set(object, [\'x\', \'0\', \'y\', \'z\'], 5);\n * console.log(object.x[0].y.z);\n * // => 5\n */\n function set(object, path, value) {\n return object == null ? object : baseSet(object, path, value);\n }\n\n /**\n * This method is like `_.set` except that it accepts `customizer` which is\n * invoked to produce the objects of `path`. If `customizer` returns `undefined`\n * path creation is handled by the method instead. The `customizer` is invoked\n * with three arguments: (nsValue, key, nsObject).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {};\n *\n * _.setWith(object, \'[0][1]\', \'a\', Object);\n * // => { \'0\': { \'1\': \'a\' } }\n */\n function setWith(object, path, value, customizer) {\n customizer = typeof customizer == \'function\' ? customizer : undefined;\n return object == null ? object : baseSet(object, path, value, customizer);\n }\n\n /**\n * Creates an array of own enumerable string keyed-value pairs for `object`\n * which can be consumed by `_.fromPairs`. If `object` is a map or set, its\n * entries are returned.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias entries\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the key-value pairs.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.toPairs(new Foo);\n * // => [[\'a\', 1], [\'b\', 2]] (iteration order is not guaranteed)\n */\n var toPairs = createToPairs(keys);\n\n /**\n * Creates an array of own and inherited enumerable string keyed-value pairs\n * for `object` which can be consumed by `_.fromPairs`. If `object` is a map\n * or set, its entries are returned.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias entriesIn\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the key-value pairs.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.toPairsIn(new Foo);\n * // => [[\'a\', 1], [\'b\', 2], [\'c\', 3]] (iteration order is not guaranteed)\n */\n var toPairsIn = createToPairs(keysIn);\n\n /**\n * An alternative to `_.reduce`; this method transforms `object` to a new\n * `accumulator` object which is the result of running each of its own\n * enumerable string keyed properties thru `iteratee`, with each invocation\n * potentially mutating the `accumulator` object. If `accumulator` is not\n * provided, a new object with the same `[[Prototype]]` will be used. The\n * iteratee is invoked with four arguments: (accumulator, value, key, object).\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @since 1.3.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The custom accumulator value.\n * @returns {*} Returns the accumulated value.\n * @example\n *\n * _.transform([2, 3, 4], function(result, n) {\n * result.push(n *= n);\n * return n % 2 == 0;\n * }, []);\n * // => [4, 9]\n *\n * _.transform({ \'a\': 1, \'b\': 2, \'c\': 1 }, function(result, value, key) {\n * (result[value] || (result[value] = [])).push(key);\n * }, {});\n * // => { \'1\': [\'a\', \'c\'], \'2\': [\'b\'] }\n */\n function transform(object, iteratee, accumulator) {\n var isArr = isArray(object),\n isArrLike = isArr || isBuffer(object) || isTypedArray(object);\n\n iteratee = getIteratee(iteratee, 4);\n if (accumulator == null) {\n var Ctor = object && object.constructor;\n if (isArrLike) {\n accumulator = isArr ? new Ctor : [];\n }\n else if (isObject(object)) {\n accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};\n }\n else {\n accumulator = {};\n }\n }\n (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {\n return iteratee(accumulator, value, index, object);\n });\n return accumulator;\n }\n\n /**\n * Removes the property at `path` of `object`.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to unset.\n * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n * @example\n *\n * var object = { \'a\': [{ \'b\': { \'c\': 7 } }] };\n * _.unset(object, \'a[0].b.c\');\n * // => true\n *\n * console.log(object);\n * // => { \'a\': [{ \'b\': {} }] };\n *\n * _.unset(object, [\'a\', \'0\', \'b\', \'c\']);\n * // => true\n *\n * console.log(object);\n * // => { \'a\': [{ \'b\': {} }] };\n */\n function unset(object, path) {\n return object == null ? true : baseUnset(object, path);\n }\n\n /**\n * This method is like `_.set` except that accepts `updater` to produce the\n * value to set. Use `_.updateWith` to customize `path` creation. The `updater`\n * is invoked with one argument: (value).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.6.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {Function} updater The function to produce the updated value.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = { \'a\': [{ \'b\': { \'c\': 3 } }] };\n *\n * _.update(object, \'a[0].b.c\', function(n) { return n * n; });\n * console.log(object.a[0].b.c);\n * // => 9\n *\n * _.update(object, \'x[0].y.z\', function(n) { return n ? n + 1 : 0; });\n * console.log(object.x[0].y.z);\n * // => 0\n */\n function update(object, path, updater) {\n return object == null ? object : baseUpdate(object, path, castFunction(updater));\n }\n\n /**\n * This method is like `_.update` except that it accepts `customizer` which is\n * invoked to produce the objects of `path`. If `customizer` returns `undefined`\n * path creation is handled by the method instead. The `customizer` is invoked\n * with three arguments: (nsValue, key, nsObject).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.6.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {Function} updater The function to produce the updated value.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {};\n *\n * _.updateWith(object, \'[0][1]\', _.constant(\'a\'), Object);\n * // => { \'0\': { \'1\': \'a\' } }\n */\n function updateWith(object, path, updater, customizer) {\n customizer = typeof customizer == \'function\' ? customizer : undefined;\n return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);\n }\n\n /**\n * Creates an array of the own enumerable string keyed property values of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property values.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.values(new Foo);\n * // => [1, 2] (iteration order is not guaranteed)\n *\n * _.values(\'hi\');\n * // => [\'h\', \'i\']\n */\n function values(object) {\n return object == null ? [] : baseValues(object, keys(object));\n }\n\n /**\n * Creates an array of the own and inherited enumerable string keyed property\n * values of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property values.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.valuesIn(new Foo);\n * // => [1, 2, 3] (iteration order is not guaranteed)\n */\n function valuesIn(object) {\n return object == null ? [] : baseValues(object, keysIn(object));\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Clamps `number` within the inclusive `lower` and `upper` bounds.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Number\n * @param {number} number The number to clamp.\n * @param {number} [lower] The lower bound.\n * @param {number} upper The upper bound.\n * @returns {number} Returns the clamped number.\n * @example\n *\n * _.clamp(-10, -5, 5);\n * // => -5\n *\n * _.clamp(10, -5, 5);\n * // => 5\n */\n function clamp(number, lower, upper) {\n if (upper === undefined) {\n upper = lower;\n lower = undefined;\n }\n if (upper !== undefined) {\n upper = toNumber(upper);\n upper = upper === upper ? upper : 0;\n }\n if (lower !== undefined) {\n lower = toNumber(lower);\n lower = lower === lower ? lower : 0;\n }\n return baseClamp(toNumber(number), lower, upper);\n }\n\n /**\n * Checks if `n` is between `start` and up to, but not including, `end`. If\n * `end` is not specified, it\'s set to `start` with `start` then set to `0`.\n * If `start` is greater than `end` the params are swapped to support\n * negative ranges.\n *\n * @static\n * @memberOf _\n * @since 3.3.0\n * @category Number\n * @param {number} number The number to check.\n * @param {number} [start=0] The start of the range.\n * @param {number} end The end of the range.\n * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n * @see _.range, _.rangeRight\n * @example\n *\n * _.inRange(3, 2, 4);\n * // => true\n *\n * _.inRange(4, 8);\n * // => true\n *\n * _.inRange(4, 2);\n * // => false\n *\n * _.inRange(2, 2);\n * // => false\n *\n * _.inRange(1.2, 2);\n * // => true\n *\n * _.inRange(5.2, 4);\n * // => false\n *\n * _.inRange(-3, -2, -6);\n * // => true\n */\n function inRange(number, start, end) {\n start = toFinite(start);\n if (end === undefined) {\n end = start;\n start = 0;\n } else {\n end = toFinite(end);\n }\n number = toNumber(number);\n return baseInRange(number, start, end);\n }\n\n /**\n * Produces a random number between the inclusive `lower` and `upper` bounds.\n * If only one argument is provided a number between `0` and the given number\n * is returned. If `floating` is `true`, or either `lower` or `upper` are\n * floats, a floating-point number is returned instead of an integer.\n *\n * **Note:** JavaScript follows the IEEE-754 standard for resolving\n * floating-point values which can produce unexpected results.\n *\n * @static\n * @memberOf _\n * @since 0.7.0\n * @category Number\n * @param {number} [lower=0] The lower bound.\n * @param {number} [upper=1] The upper bound.\n * @param {boolean} [floating] Specify returning a floating-point number.\n * @returns {number} Returns the random number.\n * @example\n *\n * _.random(0, 5);\n * // => an integer between 0 and 5\n *\n * _.random(5);\n * // => also an integer between 0 and 5\n *\n * _.random(5, true);\n * // => a floating-point number between 0 and 5\n *\n * _.random(1.2, 5.2);\n * // => a floating-point number between 1.2 and 5.2\n */\n function random(lower, upper, floating) {\n if (floating && typeof floating != \'boolean\' && isIterateeCall(lower, upper, floating)) {\n upper = floating = undefined;\n }\n if (floating === undefined) {\n if (typeof upper == \'boolean\') {\n floating = upper;\n upper = undefined;\n }\n else if (typeof lower == \'boolean\') {\n floating = lower;\n lower = undefined;\n }\n }\n if (lower === undefined && upper === undefined) {\n lower = 0;\n upper = 1;\n }\n else {\n lower = toFinite(lower);\n if (upper === undefined) {\n upper = lower;\n lower = 0;\n } else {\n upper = toFinite(upper);\n }\n }\n if (lower > upper) {\n var temp = lower;\n lower = upper;\n upper = temp;\n }\n if (floating || lower % 1 || upper % 1) {\n var rand = nativeRandom();\n return nativeMin(lower + (rand * (upper - lower + freeParseFloat(\'1e-\' + ((rand + \'\').length - 1)))), upper);\n }\n return baseRandom(lower, upper);\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=\'\'] The string to convert.\n * @returns {string} Returns the camel cased string.\n * @example\n *\n * _.camelCase(\'Foo Bar\');\n * // => \'fooBar\'\n *\n * _.camelCase(\'--foo-bar--\');\n * // => \'fooBar\'\n *\n * _.camelCase(\'__FOO_BAR__\');\n * // => \'fooBar\'\n */\n var camelCase = createCompounder(function(result, word, index) {\n word = word.toLowerCase();\n return result + (index ? capitalize(word) : word);\n });\n\n /**\n * Converts the first character of `string` to upper case and the remaining\n * to lower case.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=\'\'] The string to capitalize.\n * @returns {string} Returns the capitalized string.\n * @example\n *\n * _.capitalize(\'FRED\');\n * // => \'Fred\'\n */\n function capitalize(string) {\n return upperFirst(toString(string).toLowerCase());\n }\n\n /**\n * Deburrs `string` by converting\n * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\n * letters to basic Latin letters and removing\n * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=\'\'] The string to deburr.\n * @returns {string} Returns the deburred string.\n * @example\n *\n * _.deburr(\'déjà vu\');\n * // => \'deja vu\'\n */\n function deburr(string) {\n string = toString(string);\n return string && string.replace(reLatin, deburrLetter).replace(reComboMark, \'\');\n }\n\n /**\n * Checks if `string` ends with the given target string.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=\'\'] The string to inspect.\n * @param {string} [target] The string to search for.\n * @param {number} [position=string.length] The position to search up to.\n * @returns {boolean} Returns `true` if `string` ends with `target`,\n * else `false`.\n * @example\n *\n * _.endsWith(\'abc\', \'c\');\n * // => true\n *\n * _.endsWith(\'abc\', \'b\');\n * // => false\n *\n * _.endsWith(\'abc\', \'b\', 2);\n * // => true\n */\n function endsWith(string, target, position) {\n string = toString(string);\n target = baseToString(target);\n\n var length = string.length;\n position = position === undefined\n ? length\n : baseClamp(toInteger(position), 0, length);\n\n var end = position;\n position -= target.length;\n return position >= 0 && string.slice(position, end) == target;\n }\n\n /**\n * Converts the characters "&", "<", ">", \'"\', and "\'" in `string` to their\n * corresponding HTML entities.\n *\n * **Note:** No other characters are escaped. To escape additional\n * characters use a third-party library like [_he_](https://mths.be/he).\n *\n * Though the ">" character is escaped for symmetry, characters like\n * ">" and "/" don\'t need escaping in HTML and have no special meaning\n * unless they\'re part of a tag or unquoted attribute value. See\n * [Mathias Bynens\'s article](https://mathiasbynens.be/notes/ambiguous-ampersands)\n * (under "semi-related fun fact") for more details.\n *\n * When working with HTML you should always\n * [quote attribute values](http://wonko.com/post/html-escaping) to reduce\n * XSS vectors.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category String\n * @param {string} [string=\'\'] The string to escape.\n * @returns {string} Returns the escaped string.\n * @example\n *\n * _.escape(\'fred, barney, & pebbles\');\n * // => \'fred, barney, & pebbles\'\n */\n function escape(string) {\n string = toString(string);\n return (string && reHasUnescapedHtml.test(string))\n ? string.replace(reUnescapedHtml, escapeHtmlChar)\n : string;\n }\n\n /**\n * Escapes the `RegExp` special characters "^", "$", "\\", ".", "*", "+",\n * "?", "(", ")", "[", "]", "{", "}", and "|" in `string`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=\'\'] The string to escape.\n * @returns {string} Returns the escaped string.\n * @example\n *\n * _.escapeRegExp(\'[lodash](https://lodash.com/)\');\n * // => \'\\[lodash\\]\\(https://lodash\\.com/\\)\'\n */\n function escapeRegExp(string) {\n string = toString(string);\n return (string && reHasRegExpChar.test(string))\n ? string.replace(reRegExpChar, \'\\\\$&\')\n : string;\n }\n\n /**\n * Converts `string` to\n * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=\'\'] The string to convert.\n * @returns {string} Returns the kebab cased string.\n * @example\n *\n * _.kebabCase(\'Foo Bar\');\n * // => \'foo-bar\'\n *\n * _.kebabCase(\'fooBar\');\n * // => \'foo-bar\'\n *\n * _.kebabCase(\'__FOO_BAR__\');\n * // => \'foo-bar\'\n */\n var kebabCase = createCompounder(function(result, word, index) {\n return result + (index ? \'-\' : \'\') + word.toLowerCase();\n });\n\n /**\n * Converts `string`, as space separated words, to lower case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=\'\'] The string to convert.\n * @returns {string} Returns the lower cased string.\n * @example\n *\n * _.lowerCase(\'--Foo-Bar--\');\n * // => \'foo bar\'\n *\n * _.lowerCase(\'fooBar\');\n * // => \'foo bar\'\n *\n * _.lowerCase(\'__FOO_BAR__\');\n * // => \'foo bar\'\n */\n var lowerCase = createCompounder(function(result, word, index) {\n return result + (index ? \' \' : \'\') + word.toLowerCase();\n });\n\n /**\n * Converts the first character of `string` to lower case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=\'\'] The string to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.lowerFirst(\'Fred\');\n * // => \'fred\'\n *\n * _.lowerFirst(\'FRED\');\n * // => \'fRED\'\n */\n var lowerFirst = createCaseFirst(\'toLowerCase\');\n\n /**\n * Pads `string` on the left and right sides if it\'s shorter than `length`.\n * Padding characters are truncated if they can\'t be evenly divided by `length`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=\'\'] The string to pad.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=\' \'] The string used as padding.\n * @returns {string} Returns the padded string.\n * @example\n *\n * _.pad(\'abc\', 8);\n * // => \' abc \'\n *\n * _.pad(\'abc\', 8, \'_-\');\n * // => \'_-abc_-_\'\n *\n * _.pad(\'abc\', 3);\n * // => \'abc\'\n */\n function pad(string, length, chars) {\n string = toString(string);\n length = toInteger(length);\n\n var strLength = length ? stringSize(string) : 0;\n if (!length || strLength >= length) {\n return string;\n }\n var mid = (length - strLength) / 2;\n return (\n createPadding(nativeFloor(mid), chars) +\n string +\n createPadding(nativeCeil(mid), chars)\n );\n }\n\n /**\n * Pads `string` on the right side if it\'s shorter than `length`. Padding\n * characters are truncated if they exceed `length`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=\'\'] The string to pad.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=\' \'] The string used as padding.\n * @returns {string} Returns the padded string.\n * @example\n *\n * _.padEnd(\'abc\', 6);\n * // => \'abc \'\n *\n * _.padEnd(\'abc\', 6, \'_-\');\n * // => \'abc_-_\'\n *\n * _.padEnd(\'abc\', 3);\n * // => \'abc\'\n */\n function padEnd(string, length, chars) {\n string = toString(string);\n length = toInteger(length);\n\n var strLength = length ? stringSize(string) : 0;\n return (length && strLength < length)\n ? (string + createPadding(length - strLength, chars))\n : string;\n }\n\n /**\n * Pads `string` on the left side if it\'s shorter than `length`. Padding\n * characters are truncated if they exceed `length`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=\'\'] The string to pad.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=\' \'] The string used as padding.\n * @returns {string} Returns the padded string.\n * @example\n *\n * _.padStart(\'abc\', 6);\n * // => \' abc\'\n *\n * _.padStart(\'abc\', 6, \'_-\');\n * // => \'_-_abc\'\n *\n * _.padStart(\'abc\', 3);\n * // => \'abc\'\n */\n function padStart(string, length, chars) {\n string = toString(string);\n length = toInteger(length);\n\n var strLength = length ? stringSize(string) : 0;\n return (length && strLength < length)\n ? (createPadding(length - strLength, chars) + string)\n : string;\n }\n\n /**\n * Converts `string` to an integer of the specified radix. If `radix` is\n * `undefined` or `0`, a `radix` of `10` is used unless `value` is a\n * hexadecimal, in which case a `radix` of `16` is used.\n *\n * **Note:** This method aligns with the\n * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category String\n * @param {string} string The string to convert.\n * @param {number} [radix=10] The radix to interpret `value` by.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.parseInt(\'08\');\n * // => 8\n *\n * _.map([\'6\', \'08\', \'10\'], _.parseInt);\n * // => [6, 8, 10]\n */\n function parseInt(string, radix, guard) {\n if (guard || radix == null) {\n radix = 0;\n } else if (radix) {\n radix = +radix;\n }\n return nativeParseInt(toString(string).replace(reTrimStart, \'\'), radix || 0);\n }\n\n /**\n * Repeats the given string `n` times.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=\'\'] The string to repeat.\n * @param {number} [n=1] The number of times to repeat the string.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {string} Returns the repeated string.\n * @example\n *\n * _.repeat(\'*\', 3);\n * // => \'***\'\n *\n * _.repeat(\'abc\', 2);\n * // => \'abcabc\'\n *\n * _.repeat(\'abc\', 0);\n * // => \'\'\n */\n function repeat(string, n, guard) {\n if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {\n n = 1;\n } else {\n n = toInteger(n);\n }\n return baseRepeat(toString(string), n);\n }\n\n /**\n * Replaces matches for `pattern` in `string` with `replacement`.\n *\n * **Note:** This method is based on\n * [`String#replace`](https://mdn.io/String/replace).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=\'\'] The string to modify.\n * @param {RegExp|string} pattern The pattern to replace.\n * @param {Function|string} replacement The match replacement.\n * @returns {string} Returns the modified string.\n * @example\n *\n * _.replace(\'Hi Fred\', \'Fred\', \'Barney\');\n * // => \'Hi Barney\'\n */\n function replace() {\n var args = arguments,\n string = toString(args[0]);\n\n return args.length < 3 ? string : string.replace(args[1], args[2]);\n }\n\n /**\n * Converts `string` to\n * [snake case](https://en.wikipedia.org/wiki/Snake_case).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=\'\'] The string to convert.\n * @returns {string} Returns the snake cased string.\n * @example\n *\n * _.snakeCase(\'Foo Bar\');\n * // => \'foo_bar\'\n *\n * _.snakeCase(\'fooBar\');\n * // => \'foo_bar\'\n *\n * _.snakeCase(\'--FOO-BAR--\');\n * // => \'foo_bar\'\n */\n var snakeCase = createCompounder(function(result, word, index) {\n return result + (index ? \'_\' : \'\') + word.toLowerCase();\n });\n\n /**\n * Splits `string` by `separator`.\n *\n * **Note:** This method is based on\n * [`String#split`](https://mdn.io/String/split).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=\'\'] The string to split.\n * @param {RegExp|string} separator The separator pattern to split by.\n * @param {number} [limit] The length to truncate results to.\n * @returns {Array} Returns the string segments.\n * @example\n *\n * _.split(\'a-b-c\', \'-\', 2);\n * // => [\'a\', \'b\']\n */\n function split(string, separator, limit) {\n if (limit && typeof limit != \'number\' && isIterateeCall(string, separator, limit)) {\n separator = limit = undefined;\n }\n limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;\n if (!limit) {\n return [];\n }\n string = toString(string);\n if (string && (\n typeof separator == \'string\' ||\n (separator != null && !isRegExp(separator))\n )) {\n separator = baseToString(separator);\n if (!separator && hasUnicode(string)) {\n return castSlice(stringToArray(string), 0, limit);\n }\n }\n return string.split(separator, limit);\n }\n\n /**\n * Converts `string` to\n * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).\n *\n * @static\n * @memberOf _\n * @since 3.1.0\n * @category String\n * @param {string} [string=\'\'] The string to convert.\n * @returns {string} Returns the start cased string.\n * @example\n *\n * _.startCase(\'--foo-bar--\');\n * // => \'Foo Bar\'\n *\n * _.startCase(\'fooBar\');\n * // => \'Foo Bar\'\n *\n * _.startCase(\'__FOO_BAR__\');\n * // => \'FOO BAR\'\n */\n var startCase = createCompounder(function(result, word, index) {\n return result + (index ? \' \' : \'\') + upperFirst(word);\n });\n\n /**\n * Checks if `string` starts with the given target string.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=\'\'] The string to inspect.\n * @param {string} [target] The string to search for.\n * @param {number} [position=0] The position to search from.\n * @returns {boolean} Returns `true` if `string` starts with `target`,\n * else `false`.\n * @example\n *\n * _.startsWith(\'abc\', \'a\');\n * // => true\n *\n * _.startsWith(\'abc\', \'b\');\n * // => false\n *\n * _.startsWith(\'abc\', \'b\', 1);\n * // => true\n */\n function startsWith(string, target, position) {\n string = toString(string);\n position = position == null\n ? 0\n : baseClamp(toInteger(position), 0, string.length);\n\n target = baseToString(target);\n return string.slice(position, position + target.length) == target;\n }\n\n /**\n * Creates a compiled template function that can interpolate data properties\n * in "interpolate" delimiters, HTML-escape interpolated data properties in\n * "escape" delimiters, and execute JavaScript in "evaluate" delimiters. Data\n * properties may be accessed as free variables in the template. If a setting\n * object is given, it takes precedence over `_.templateSettings` values.\n *\n * **Note:** In the development build `_.template` utilizes\n * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)\n * for easier debugging.\n *\n * For more information on precompiling templates see\n * [lodash\'s custom builds documentation](https://lodash.com/custom-builds).\n *\n * For more information on Chrome extension sandboxes see\n * [Chrome\'s extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category String\n * @param {string} [string=\'\'] The template string.\n * @param {Object} [options={}] The options object.\n * @param {RegExp} [options.escape=_.templateSettings.escape]\n * The HTML "escape" delimiter.\n * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]\n * The "evaluate" delimiter.\n * @param {Object} [options.imports=_.templateSettings.imports]\n * An object to import into the template as free variables.\n * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]\n * The "interpolate" delimiter.\n * @param {string} [options.sourceURL=\'lodash.templateSources[n]\']\n * The sourceURL of the compiled template.\n * @param {string} [options.variable=\'obj\']\n * The data object variable name.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the compiled template function.\n * @example\n *\n * // Use the "interpolate" delimiter to create a compiled template.\n * var compiled = _.template(\'hello <%= user %>!\');\n * compiled({ \'user\': \'fred\' });\n * // => \'hello fred!\'\n *\n * // Use the HTML "escape" delimiter to escape data property values.\n * var compiled = _.template(\'<%- value %>\');\n * compiled({ \'value\': \' + + + + + <% page_path = "/static/app/" + app_name + "/js/build/entry_page.js" %> + + + + diff --git a/apps/TA-socradar-incidents/bin/TA_socradar_incidents_rh_settings.py b/apps/TA-socradar-incidents/bin/TA_socradar_incidents_rh_settings.py new file mode 100755 index 00000000..cfc42f9d --- /dev/null +++ b/apps/TA-socradar-incidents/bin/TA_socradar_incidents_rh_settings.py @@ -0,0 +1,123 @@ + +import ta_socradar_incidents_declare + +from splunktaucclib.rest_handler.endpoint import ( + field, + validator, + RestModel, + MultipleModel, +) +from splunktaucclib.rest_handler import admin_external, util +from splunk_aoblib.rest_migration import ConfigMigrationHandler + +util.remove_http_proxy_env_vars() + + +fields_proxy = [ + field.RestField( + 'proxy_enabled', + required=False, + encrypted=False, + default=None, + validator=None + ), + field.RestField( + 'proxy_type', + required=False, + encrypted=False, + default='http', + validator=None + ), + field.RestField( + 'proxy_url', + required=False, + encrypted=False, + default=None, + validator=validator.String( + min_len=0, + max_len=4096, + ) + ), + field.RestField( + 'proxy_port', + required=False, + encrypted=False, + default=None, + validator=validator.Number( + min_val=1, + max_val=65535, + ) + ), + field.RestField( + 'proxy_username', + required=False, + encrypted=False, + default=None, + validator=validator.String( + min_len=0, + max_len=50, + ) + ), + field.RestField( + 'proxy_password', + required=False, + encrypted=True, + default=None, + validator=validator.String( + min_len=0, + max_len=8192, + ) + ), + field.RestField( + 'proxy_rdns', + required=False, + encrypted=False, + default=None, + validator=None + ) +] +model_proxy = RestModel(fields_proxy, name='proxy') + + +fields_logging = [ + field.RestField( + 'loglevel', + required=False, + encrypted=False, + default='INFO', + validator=None + ) +] +model_logging = RestModel(fields_logging, name='logging') + + +fields_additional_parameters = [ + field.RestField( + 'how_many_days', + required=False, + encrypted=False, + default='', + validator=validator.String( + min_len=0, + max_len=8192, + ) + ) +] +model_additional_parameters = RestModel(fields_additional_parameters, name='additional_parameters') + + +endpoint = MultipleModel( + 'ta_socradar_incidents_settings', + models=[ + model_proxy, + model_logging, + model_additional_parameters + ], +) + + +if __name__ == '__main__': + admin_external.handle( + endpoint, + handler=ConfigMigrationHandler, + ) diff --git a/apps/TA-socradar-incidents/bin/TA_socradar_incidents_rh_socradar_incidents_collector.py b/apps/TA-socradar-incidents/bin/TA_socradar_incidents_rh_socradar_incidents_collector.py new file mode 100755 index 00000000..bac1dd94 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/TA_socradar_incidents_rh_socradar_incidents_collector.py @@ -0,0 +1,78 @@ + +import ta_socradar_incidents_declare + +from splunktaucclib.rest_handler.endpoint import ( + field, + validator, + RestModel, + DataInputModel, +) +from splunktaucclib.rest_handler import admin_external, util +from splunk_aoblib.rest_migration import ConfigMigrationHandler + +util.remove_http_proxy_env_vars() + + +fields = [ + field.RestField( + 'interval', + required=True, + encrypted=False, + default=None, + validator=validator.Pattern( + regex=r"""^\-[1-9]\d*$|^\d*$""", + ) + ), + field.RestField( + 'index', + required=True, + encrypted=False, + default='default', + validator=validator.String( + min_len=1, + max_len=80, + ) + ), + field.RestField( + 'socradar_api_key', + required=False, + encrypted=False, + default='SOCRadar', + validator=validator.String( + min_len=0, + max_len=8192, + ) + ), + field.RestField( + 'socradar_company_id', + required=False, + encrypted=False, + default=None, + validator=validator.String( + min_len=0, + max_len=8192, + ) + ), + + field.RestField( + 'disabled', + required=False, + validator=None + ) + +] +model = RestModel(fields, name=None) + + + +endpoint = DataInputModel( + 'socradar_incidents_collector', + model, +) + + +if __name__ == '__main__': + admin_external.handle( + endpoint, + handler=ConfigMigrationHandler, + ) diff --git a/apps/TA-socradar-incidents/bin/__pycache__/input_module_socradar_incidents_collector.cpython-39.pyc b/apps/TA-socradar-incidents/bin/__pycache__/input_module_socradar_incidents_collector.cpython-39.pyc new file mode 100755 index 0000000000000000000000000000000000000000..2b9e160b6fa8cad18e8bd4c42c9e61c0acdaaec3 GIT binary patch literal 8348 zcma)B-ESPpai5u;UG6TIA0jD!=!-+?D3KJoOMRSl$H?d7k<^Lj6D5gviW_;Y`easK2(MfpeSocz z;@t(jT)Df_WA*^Ai**Cm%d|CRvM2cK>{_i{cXy0=#%8LnF=MPfT3EH1#f@dR|{!Z24fe zlJ}}5PLk$J)k?vtIj=8)@aun96{SSm()^<~V9El1o{k4op*k&iJ8R(Ydsf*29}r4v zpc0GjxFmY1>TWt)bqI@bPvWoqIp&6`ZMzIP!z{Bm9oL~@o(5_8_~!eCYRxZra$^d% zUjlPAudqHp)8u%jsS&TR;kX64SWzx*7n?Z67EZCXdHLEw*u5KZYy$y2_LEdnT%G68 zJ|+4b00fkx{|hWxC`Ss_#G^QP^4PCYpXeDJ!M=K>;NwhkI z4%{SuDP9vDyv9-@^-G0yhz>l{LYM92FO^s6M%wMgXd9w8(gOc1^Oc4*iIeQf(U_|Q z>%=-4j3-zQt*pfC5*g40f8acGsPZY1rKhip%uAJZ@91$aD|?E>P>zzUC#I^fUfIfu zjHWa)G1W6fmGy}%Q&|5WY9k7I1Fs-wyviL~#ajdiDR!2iOj#q%b+AEj)+su%P7w6@ zX*T3%MCVKOrPjzjRoq?`76^bhRn?*+y4H0a%^buWr0^c=zDlg?BIB-FTnDTVdx#cS}oXu?w%XMxUcJ`q{|@6j0nxf+9hpBTjcUpiL({+AlY9!LEx#(+B|u?z=TjbS#%F8@>!!$)V2l|=<|^vlsJY!ssdlE1gGU;Qst za5gRm@Vpx78uAWC8k1PpNHdYt{@~G&Km2?IJdTJF|D4FNi7(V)rEv~=8#y|EOzWIS z`&`_`b(gKR!jxG78QaL zWeIzO$`YvDkEwhOf0$tRM-=}mydlZIW*L~9b(n&MxJ%hCfbAL=iD?oLaJMM?2Ta$T#vuB5urrXnsKT@w?MqcKTi zOpJ-Hoh0n&=aNoIbV;v~r?5(vZ_p}ojFGi68)wxuc~)%-*gxA6@D#TFDicwa)H?Vl zkv&JaY!go#c7B*J^kZp^3ZnAMcg9jtTHRTU9MY}+*TyFZmjb{V+K(m&#H}rKgkN<_R>pL z6kaBz7fv;1{V6dk3PVaXf+%)FTms|FG+yI}^?%xDG z_1WJwCfc@ns0JKd-jWaw`?)P{AExHnBexNn(Hr^3;#hqP} z>vQprxFhZ&s%Bn%E|lka$@v}3>k(%}ueikyzDPFS73xtzyen;QMq1MhygtMKsVTk4 zM?QNGHs`)CZ7X|lHMXs*(zb#~cfZTFPFYj>#fH@P?~57eRpwoX=@)$xCJ4qFQ3fOO zhgtp)I2~q1UUG+AqaC%6ZX7G@$6qBHgTWN$-V}XOI%H4Bnv6jT`wTWGbAo6Ua6cDw z|Ld50LvsI<7T=Pa-|hvHzds;8C{vsKd?mQGwy?VVc)hr`KEJv?_rF(1R0N=M$%mO5 zukIfd>%1Ihqh_tj{jfU*dp371lr3?;W_jLTm9wCON)%Km->7rnsPCgp&77)?qQ8vAk$hoULu&*su+64~2-$#*BrC2n{-(QTOUrxr{<^8$#MV z9}KM#B1$@=gz5_=q+^x6d_EtH%x?lg(m|zpl9iwnO|GnlHGpaI%D(Gd`|X zcZi)0tF&VTNrN!WPFboJWjPy+E=$^;Z@GbG&^{ZRyjn4$if_&^FSbjx-P=W&M9KC% zn-wjT%oQ(4-N?V2zj@Ql$UgSd3z9eTv-#OD7ePSTuX`n8ulbiigDTTC{Je8`ILObQ z_2HyY8=9{OWI;mvW9@~$7FC$2jT4^FQA2B>tL}vAZoB;Cogffq?=e)(q|Wzt(f>F6 zl;Cn)Nfu#BxERRaD_2X{+V}Ep{6+qO$PwW{OBR{}x7 zu*%UDLQ4sNKnbub&zN|F&Yba$IvHG9sh%XXS*^Ql+JH*9PusG|ZEqXW>9j9F*E;S3 zaR1=4>fW3YbdP^JGhUe)XU6!0x$%dAjw=Qu$P{9mDFj`pq~kk}!tU)LLzfm$RzIFI zI4S!z!(%cTCg37rQf_vr<4(givvPe{jc=Q2+hwv93_Y}@sc`#6-S&K1jIfQMcQuC8 zEN)f2IRpEUirQfZU0+n|e%L{0g=2fQ{dJ4`Oo{ifHMs8_LSiWypaEIgk5fNP^xoys?e9m~V zzW&&_J$u7=;#zed4(vPHsIq=N8&t zBpnKak|^2tv{5ayVnhx7zG^tGBqZG1a<_;OE))X|a_Gj)dxqH^$yJPpgV9ynf(DpT zvGz}x4sO*b1{)JW^0D-`)SU5Q)i;9N38V?wKQ0yv^&0ssL-;T@Ej~@UuDkI9lfjwh z3S|rKOTPP>4%(o5iG0IAu#fzCF_l8}P(#(g@NjKDaxOv}J=V(mB-N{t}f zUh#DgQSVu9ZpelOvS1v}-tr9TGj?$1^iei9z7~wN=0%E%^(fUCZ|%VSdb!*pCU+5M zTL)G(dnHPdJKj#QjMKerc1957CbmDBgT?VU>&62RggM z1Pne*AdH4%i%a+CpM1Ptd^rC}ab@Xgad~B7d2wlFeXaO-X|)LV3kQinbUzHUKt@ue zjKm9j363~}Gzh~u0m5#AoY+v=k7mjZ?xAt1mZA*eq5d3hj6jI!?uA(gSsJYXv(U>9 zl8XzG!62}BobH#ygj?O?l%<4;x?ketO3}qVrd4WT8gn+uh{Ch<31WV6ezk~*QT$+j zZK;ST9I1ub8}+R)9miBJ>?f4<<%dg;o*+kGT6nawxE6Ls9)NpqMuv&tL2T|prFSJ$ zUfH&5@FXNSVTw{(mxY-ngwGmX#D_^v2N3k^xRNVC!BvvgD>aWNCEGYWq8upf+~baK z$DLGUW?{zhs`QD$@{x?goKEU(a*k(+hGy?I3xIfMJ$@Ynyo(;)^q}*A_u>&IrRA7e zvaKk~H#_2#);x16ZN+KI`3UBiBe0VqG1@vkiZ~pLI2^+>zhMz(?xZpBJG5xFz58Z& z+aai;Fnht!sk}9E!2T0x6eNn=+B19J0P+H{*GVZyob-mdW}uR)j`JyMn_ZMoQA=8h z*@GANPXMGEP-vN5s6pDI@(EgF2q_NooVxE|4=7cNa&*t^KdqM%PHW%nVf9+sDG{0k z@JZ4FY%R_;GJD9LlgjMFcO`stLkic@6u(MB zCh<|I4jY&FZV!5N@thb0PEMO3{eU~tC3FKRb9fVX6RM%p>{I`cIjiPCA>Ed?L$0n3g8uEq0JNIY zvPsfK_kX3Jl|FFUt4?X0W9LvJrPkn<6}yC9>yI{-&gupHJo*~yD-5+`Lt&awiueMJ zr^axTRzwT;BgxYHdj82v3@m=~I#m+`GR zn2vj1D|-MjDxs-zZ%xKWX`KD}_4|`L_rPk{$?WJ;G@ao?bq|N~J{WNkI^$2CG|*22 zbfZwF51=?r5V1%b5&v(RepUuWDca{yjwe6n(XI2VPz&e)H@MifW*cL{5q9v{$yKDEm2F$bfMzh!45A8SvZ#ZpkY>Ip{EG)va( j>3h*P;P+@BJqo~jDsrg-HK$7l(bB2(XUb=alhghOo{PIYn-8J^-fwyQOn;tOQs zDgI2}#rxPJ4Qcnwp~zU?Hp#i>uAGR@CrpLnvlh-wLKY>ra4YRS`VDD=Ao`tTQZ!7Jjts%6m zd^|Er`$Q-k+V>sC!W&@hZ}Znu_(yza=lVVEhPAs@AaSdM;Ui19O=1$`7^ip{ui 20 and len(api_key) < 20: + helper.log_warning("WARNING: API key and company ID might be swapped! Company ID is usually shorter.") + # Swap them + helper.log_info("Swapping credentials...") + company_id, api_key = api_key, company_id + helper.log_info(f"After swap - company_id: {company_id}, api_key: {api_key[:10]}...") + + if not company_id or not api_key: + helper.log_error("Missing credentials. Please configure socradar_company_id and socradar_api_key in the input configuration.") + return + + # Get how many days from GLOBAL settings (add-on level) + how_many_days_str = helper.get_global_setting("how_many_days") + if how_many_days_str: + try: + how_many_days = max(1, int(how_many_days_str)) + except: + how_many_days = 1 + else: + how_many_days = 1 + + helper.log_info(f"Configuration: Looking back {how_many_days} days") + + # Get max incidents per run from global settings + try: + max_new_incidents_per_run = int(helper.get_global_setting("total_limit") or DEFAULT_MAX_NEW_INCIDENTS_PER_RUN) + except: + max_new_incidents_per_run = DEFAULT_MAX_NEW_INCIDENTS_PER_RUN + + # Get Splunk settings + input_stanza_name = helper.get_input_stanza_names() + output_index = helper.get_output_index() + sourcetype = helper.get_sourcetype() + input_type = helper.get_input_type() + + # Log the actual input stanza name for debugging + helper.log_info(f"Input stanza name from helper: {input_stanza_name}") + + # --- Stage 2: Load Checkpoint --- + checkpoint_key = f"{input_stanza_name}_socradar_v4_processed_alarms" + processed_alarms = {} # Changed to dict to store alarm_id -> status + indexed_version = "1.9.22" # Default to current version for new checkpoints + + try: + checkpoint_data_raw = helper.get_check_point(checkpoint_key) + if checkpoint_data_raw: + checkpoint_data = json.loads(checkpoint_data_raw) + # Support both old format (list) and new format (dict) + if isinstance(checkpoint_data.get("alarm_ids"), list): + # Old format - convert to dict with string keys + for alarm_id in checkpoint_data.get("alarm_ids", []): + processed_alarms[str(alarm_id)] = None + indexed_version = "1.0.0" # Old format = pre-v1.9.20 + else: + # New format - dict with status, ensure all keys are strings + temp_alarms = checkpoint_data.get("alarm_status", {}) + processed_alarms = {str(k): v for k, v in temp_alarms.items()} + # Get indexed version from checkpoint (default to 1.0.0 if not present) + indexed_version = checkpoint_data.get("indexed_version", "1.0.0") + helper.log_info(f"Loaded checkpoint with {len(processed_alarms)} already processed alarm IDs (indexed_version: {indexed_version})") + except: + helper.log_info("No checkpoint found, starting fresh") + + # --- Stage 3: Calculate Time Window --- + current_time = datetime.now(timezone.utc) + start_time = current_time - timedelta(days=how_many_days) + + # Convert to Unix timestamps (SOCRadar format) + end_timestamp = int(current_time.timestamp()) + start_timestamp = int(start_time.timestamp()) + + helper.log_info(f"Time window: {start_time.strftime('%Y-%m-%d %H:%M')} to {current_time.strftime('%Y-%m-%d %H:%M')}") + + # --- Stage 4: Build API URL --- + api_url = f"{SOCRADAR_API_BASE_URL}/company/{company_id}/incidents/v4" + helper.log_info(f"API URL: {api_url}") + + # --- Stage 5: Fetch Incidents with Pagination --- + all_incidents = [] + page = 1 + consecutive_rate_limits = 0 + new_incidents_count = 0 + duplicate_count = 0 + + # Fetch all pages until API returns no more data (no page limit) + while True: + # API parameters - SOCRadar expects key as URL parameter for incidents endpoint + params = { + "key": api_key, + "limit": 100, # Get 100 per page from SOCRadar + "page": page, + "start_date": start_timestamp, + "end_date": end_timestamp + } + + # Log the request details + helper.log_info(f"Making request to page {page}") + helper.log_debug(f"Request params: {params}") + + # Make request + try: + response = requests.get(api_url, params=params, timeout=API_TIMEOUT_SECONDS, proxies=proxies) + + # Log response status + helper.log_info(f"Response status code: {response.status_code}") + + # Check for rate limit + if response.status_code == 429 or "rate limit exceeded" in response.text.lower(): + consecutive_rate_limits += 1 + + if consecutive_rate_limits == 1: + wait_time = 30 + else: + wait_time = 60 + + helper.log_warning(f"Rate limit hit! Waiting {wait_time} seconds... (attempt {consecutive_rate_limits})") + time.sleep(wait_time) + continue # Retry same page + + # Reset rate limit counter on success + consecutive_rate_limits = 0 + + # Check for authentication error + if response.status_code == 401: + helper.log_error(f"API error: HTTP 401 Unauthorized. Please check your API credentials.") + helper.log_error(f"Response: {response.text}") + break + + # Check for other errors + if response.status_code != 200: + helper.log_error(f"API error: HTTP {response.status_code}") + helper.log_error(f"Response: {response.text}") + break + + # Parse response + data = response.json() + incidents = data.get("data", []) + + if not incidents: + helper.log_info(f"No more incidents at page {page}") + break + + # Process incidents on this page + for incident in incidents: + # Truncate long text fields to 5000 characters + if 'alarm_text' in incident and incident['alarm_text'] and len(str(incident['alarm_text'])) > 5000: + incident['alarm_text'] = str(incident['alarm_text'])[:5000] + '...' + if 'alarm_response' in incident and incident['alarm_response'] and len(str(incident['alarm_response'])) > 5000: + incident['alarm_response'] = str(incident['alarm_response'])[:5000] + '...' + if 'alarm_type_details' in incident and isinstance(incident['alarm_type_details'], dict): + if 'alarm_default_mitigation_plan' in incident['alarm_type_details'] and incident['alarm_type_details']['alarm_default_mitigation_plan']: + if len(str(incident['alarm_type_details']['alarm_default_mitigation_plan'])) > 5000: + incident['alarm_type_details']['alarm_default_mitigation_plan'] = str(incident['alarm_type_details']['alarm_default_mitigation_plan'])[:5000] + '...' + # Extract alarm main type and sub type + incident['alarm_main_type'] = incident['alarm_type_details'].get('alarm_main_type', 'N/A') + incident['alarm_sub_type'] = incident['alarm_type_details'].get('alarm_sub_type', 'N/A') + else: + # Set defaults if alarm_type_details is not present + incident['alarm_main_type'] = 'N/A' + incident['alarm_sub_type'] = 'N/A' + + alarm_id = incident.get("alarm_id") + + # Generate alarm link + if alarm_id and company_id: + incident['alarm_link'] = f"https://platform.socradar.com/app/company/{company_id}/alarm-management?tab=approved&alarmId={alarm_id}" + else: + incident['alarm_link'] = 'N/A' + current_status = incident.get("status", "N/A") + helper.log_info(f"Processing Alarm ID: {alarm_id} - Status: {current_status}") + + # Check if already processed and if status changed + if alarm_id: + # Convert alarm_id to string for consistent comparison + alarm_id_str = str(alarm_id) + if alarm_id_str in processed_alarms: + old_status = processed_alarms.get(alarm_id_str) + helper.log_debug(f"Checkpoint check - alarm: {alarm_id_str}, old_status: {old_status}, current_status: {current_status}") + + # Force re-index if indexed with version < 1.9.20 (TRUNCATE fix) + # This ensures events that were previously truncated get re-indexed with complete data + if indexed_version < "1.9.20": + helper.log_info(f"Force re-indexing alarm {alarm_id} (indexed with v{indexed_version}, needs complete data)") + incident['reindexed'] = True + incident['reindex_reason'] = f"Upgraded from v{indexed_version} (TRUNCATE fix)" + incident['previous_status'] = old_status + # Continue to index this event + elif old_status == current_status: + # Status unchanged and already indexed with good version - skip + duplicate_count += 1 + continue + else: + # Status changed - index the update + helper.log_info(f"Status changed for {alarm_id}: {old_status} -> {current_status}") + incident['status_changed'] = True + incident['previous_status'] = old_status + + # New incident or status update + all_incidents.append(incident) + new_incidents_count += 1 + + # Stop if we hit the per-run limit + if new_incidents_count >= max_new_incidents_per_run: + helper.log_info(f"Reached max incidents per run ({max_new_incidents_per_run})") + break + + helper.log_info(f"Page {page}: Got {len(incidents)} incidents ({new_incidents_count} new/updated so far, {duplicate_count} unchanged)") + + # Stop if we hit the limit + if new_incidents_count >= max_new_incidents_per_run: + break + + # Check if this was the last page + if len(incidents) < 100: + helper.log_info("Reached last page") + break + + page += 1 + time.sleep(3) # Wait 3 seconds between requests for better API stability + + except Exception as e: + helper.log_error(f"Error on page {page}: {str(e)}") + break + + helper.log_info(f"Fetching complete. Found {new_incidents_count} new/updated incidents, skipped {duplicate_count} unchanged") + + # --- Stage 6: Index New Incidents to Splunk in Batches of 15 --- + indexed_count = 0 + indexed_alarms = {} # Changed to dict to store alarm_id -> status + batch_size = 15 # Reduced for better Splunk indexing performance + + # Process in batches of 15 + for batch_start in range(0, len(all_incidents), batch_size): + batch_end = min(batch_start + batch_size, len(all_incidents)) + batch = all_incidents[batch_start:batch_end] + + helper.log_info(f"Indexing batch {batch_start//batch_size + 1}: incidents {batch_start+1} to {batch_end}") + + for incident in batch: + alarm_id = incident.get("alarm_id") + + try: + # Get event time from incident + event_time = None + date_str = incident.get("date") # Using 'date' field based on your sample + if date_str: + try: + # Parse date like "2025-03-18 10:40:10" + event_datetime = datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S") + event_time = event_datetime.timestamp() + except: + pass + + # Log what we're indexing for debugging + if incident.get('status_changed'): + helper.log_info(f"Indexing status change for alarm {alarm_id}: {incident.get('previous_status')} -> {incident.get('status')}") + helper.log_debug(f"Full incident data: {json.dumps(incident)[:500]}...") + + # Create optimized event with critical fields first + # This ensures critical fields survive if event gets truncated + optimized_incident = OrderedDict() + + # Critical fields FIRST (always visible even if truncated) + optimized_incident['alarm_id'] = incident.get('alarm_id') + optimized_incident['status'] = incident.get('status') + optimized_incident['date'] = incident.get('date') + optimized_incident['alarm_risk_level'] = incident.get('alarm_risk_level') + optimized_incident['alarm_asset'] = incident.get('alarm_asset') + optimized_incident['alarm_main_type'] = incident.get('alarm_main_type') + optimized_incident['alarm_sub_type'] = incident.get('alarm_sub_type') + optimized_incident['alarm_link'] = incident.get('alarm_link') + + # Add all remaining fields + for key, value in incident.items(): + if key not in optimized_incident: + optimized_incident[key] = value + + # Create Splunk event + event = helper.new_event( + data=json.dumps(optimized_incident), + index=output_index, + source=input_type, + sourcetype=sourcetype, + time=event_time + ) + ew.write_event(event) + + indexed_count += 1 + if alarm_id: + # Store alarm_id as string for consistent checkpoint handling + indexed_alarms[str(alarm_id)] = incident.get('status') + + except Exception as e: + helper.log_error(f"Failed to index incident {alarm_id}: {str(e)}") + + # Log progress after each batch + helper.log_info(f"Batch complete. Total indexed: {indexed_count}") + + helper.log_info(f"Indexing complete. Indexed {indexed_count} new incidents to Splunk") + + # --- Stage 7: Update Checkpoint --- + if indexed_alarms: + # Update checkpoint with new alarms and their statuses + processed_alarms.update(indexed_alarms) + + # Save checkpoint with new format including version tracking + # No size limit - supports unlimited active alarms + checkpoint_data = { + "alarm_status": processed_alarms, + "indexed_version": "1.9.22", # Current version with TRUNCATE fix + "last_updated": datetime.now(timezone.utc).isoformat() + } + + try: + helper.save_check_point(checkpoint_key, json.dumps(checkpoint_data)) + helper.log_info(f"Checkpoint updated. Total tracked alarms: {len(processed_alarms)}") + except Exception as e: + helper.log_error(f"Failed to save checkpoint: {str(e)}") + + helper.log_info("SCRIPT_END: SOCRadar Incidents v4 collection complete.") + + +from splunklib.modularinput import Scheme + +def get_scheme(): + """Returns scheme parameters for this modular input.""" + scheme = Scheme("SOCRadar Incidents Collector v4") + scheme.description = "Collects incidents from the SOCRadar v4 API." + scheme.use_external_validation = True + scheme.use_single_instance = False + return scheme \ No newline at end of file diff --git a/apps/TA-socradar-incidents/bin/socradar_incidents_collector.py b/apps/TA-socradar-incidents/bin/socradar_incidents_collector.py new file mode 100755 index 00000000..eb9748e4 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/socradar_incidents_collector.py @@ -0,0 +1,94 @@ +import ta_socradar_incidents_declare + +import os +import sys +import time +import datetime +import json + +import modinput_wrapper.base_modinput +from splunklib import modularinput as smi + + + +import input_module_socradar_incidents_collector as input_module + +bin_dir = os.path.basename(__file__) + +''' + Do not edit this file!!! + This file is generated by Add-on builder automatically. + Add your modular input logic to file input_module_socradar_incidents_collector.py +''' +class ModInputsocradar_incidents_collector(modinput_wrapper.base_modinput.BaseModInput): + + def __init__(self): + if 'use_single_instance_mode' in dir(input_module): + use_single_instance = input_module.use_single_instance_mode() + else: + use_single_instance = False + super(ModInputsocradar_incidents_collector, self).__init__("ta_socradar_incidents", "socradar_incidents_collector", use_single_instance) + self.global_checkbox_fields = None + + def get_scheme(self): + """overloaded splunklib modularinput method""" + scheme = super(ModInputsocradar_incidents_collector, self).get_scheme() + scheme.title = ("SOCRadar Incidents API Collector") + scheme.description = ("Go to the add-on\'s configuration UI and configure modular inputs under the Inputs menu.") + scheme.use_external_validation = True + scheme.streaming_mode_xml = True + + scheme.add_argument(smi.Argument("name", title="Name", + description="", + required_on_create=True)) + + """ + For customized inputs, hard code the arguments here to hide argument detail from users. + For other input types, arguments should be get from input_module. Defining new input types could be easier. + """ + scheme.add_argument(smi.Argument("socradar_api_key", title="SOCRadar API Key", + description="", + required_on_create=False, + required_on_edit=False)) + scheme.add_argument(smi.Argument("socradar_company_id", title="SOCRadar Company ID", + description="", + required_on_create=False, + required_on_edit=False)) + return scheme + + def get_app_name(self): + return "TA-socradar-incidents" + + def validate_input(self, definition): + """validate the input stanza""" + input_module.validate_input(self, definition) + + def collect_events(self, ew): + """write out the events""" + input_module.collect_events(self, ew) + + def get_account_fields(self): + account_fields = [] + return account_fields + + def get_checkbox_fields(self): + checkbox_fields = [] + return checkbox_fields + + def get_global_checkbox_fields(self): + if self.global_checkbox_fields is None: + checkbox_name_file = os.path.join(bin_dir, 'global_checkbox_param.json') + try: + if os.path.isfile(checkbox_name_file): + with open(checkbox_name_file, 'r') as fp: + self.global_checkbox_fields = json.load(fp) + else: + self.global_checkbox_fields = [] + except Exception as e: + self.log_error('Get exception when loading global checkbox parameter names. ' + str(e)) + self.global_checkbox_fields = [] + return self.global_checkbox_fields + +if __name__ == "__main__": + exitcode = ModInputsocradar_incidents_collector().run(sys.argv) + sys.exit(exitcode) diff --git a/apps/TA-socradar-incidents/bin/status_update_with_log.py b/apps/TA-socradar-incidents/bin/status_update_with_log.py new file mode 100755 index 00000000..81d7ca7a --- /dev/null +++ b/apps/TA-socradar-incidents/bin/status_update_with_log.py @@ -0,0 +1,228 @@ +#!/usr/bin/env python + +import sys +import os +import requests +import time +import json +import subprocess +from datetime import datetime + +# Debug log file +DEBUG_LOG = "/opt/splunk/var/log/socradar/status_update_log.txt" + +def log_debug(msg): + os.makedirs(os.path.dirname(DEBUG_LOG), exist_ok=True) + with open(DEBUG_LOG, 'a') as f: + f.write(f"[{datetime.now()}] {msg}\n") + +# Simple version that outputs CSV directly +print("alarm_id,status,result,message,time") + +try: + log_debug("=== NEW STATUS UPDATE REQUEST ===") + + # Read all input + input_lines = [] + for line in sys.stdin: + input_lines.append(line.strip()) + + log_debug(f"Input lines: {input_lines}") + + # Parse alarm_id and new_status from input + alarm_id = "" + new_status = "" + + for line in input_lines: + if "alarm_id=" in line: + parts = line.split(',') + for part in parts: + if 'alarm_id=' in part: + alarm_id = part.split('=', 1)[1].strip().strip('"') + elif 'new_status=' in part: + new_status = part.split('=', 1)[1].strip().strip('"') + + log_debug(f"Parsed: alarm_id={alarm_id}, new_status={new_status}") + + if not alarm_id: + print("NONE,No alarm selected,WAITING,Enter an alarm ID," + str(int(time.time()))) + sys.exit(0) + + # Get credentials + conf_file = "/opt/splunk/etc/apps/TA-socradar-incidents/local/inputs.conf" + company_id = None + api_key = None + + if os.path.exists(conf_file): + with open(conf_file, 'r') as f: + for line in f: + line = line.strip() + if line.startswith('socradar_company_id'): + company_id = line.split('=', 1)[1].strip() + elif line.startswith('socradar_api_key'): + api_key = line.split('=', 1)[1].strip() + + if not company_id or not api_key: + log_debug("Missing credentials") + print(f"{alarm_id},Error,ERROR,Missing credentials," + str(int(time.time()))) + sys.exit(0) + + # Status mapping + status_map = { + '0': 'Open', + '1': 'OnHold-Investigating', + '2': 'Closed-Resolved', + '3': 'OnHold-Pending', + '5': 'OnHold-Legal', + '9': 'Closed-FalsePositive', + '10': 'Closed-Duplicate', + '11': 'Closed-ProcessedInternally', + '12': 'Closed-Mitigated', + '13': 'Closed-NotApplicable' + } + + status_name = status_map.get(new_status, f'Status-{new_status}') + + # Make API call + url = f"https://platform.socradar.com/api/company/{company_id}/alarms/status/change?key={api_key}" + payload = { + "status": new_status, + "alarm_ids": alarm_id, + "comments": f"Updated via Splunk to: {status_name}" + } + + log_debug(f"Calling API: {url[:50]}...") + log_debug(f"Payload: {payload}") + + response = requests.post(url, json=payload, headers={"Content-Type": "application/json"}, timeout=30) + response_data = response.json() + + log_debug(f"API Response: {response.status_code} - {response_data}") + + if response.status_code == 200 and response_data.get('is_success', False): + print(f"{alarm_id},{status_name},SUCCESS,Updated successfully," + str(int(time.time()))) + + # Map status to SOCRadar API format + api_status_map = { + 'Open': 'OPEN', + 'OnHold-Investigating': 'INVESTIGATING', + 'Closed-Resolved': 'RESOLVED', + 'OnHold-Pending': 'PENDING_INFO', + 'OnHold-Legal': 'LEGAL', + 'Closed-FalsePositive': 'FALSE_POSITIVE', + 'Closed-Duplicate': 'DUPLICATE', + 'Closed-ProcessedInternally': 'PROCESSED_INTERNALLY', + 'Closed-Mitigated': 'MITIGATED', + 'Closed-NotApplicable': 'NOT_APPLICABLE' + } + + api_status = api_status_map.get(status_name, status_name) + + # Update checkpoint + try: + checkpoint_file = "/opt/splunk/var/lib/splunk/modinputs/socradar_incidents_collector/deneme_002_socradar_v4_processed_alarms" + + if os.path.exists(checkpoint_file): + with open(checkpoint_file, 'r') as f: + checkpoint_data = json.load(f) + + if 'alarm_status' in checkpoint_data: + checkpoint_data['alarm_status'][str(alarm_id)] = api_status + checkpoint_data['last_updated'] = datetime.now().isoformat() + + with open(checkpoint_file, 'w') as f: + json.dump(checkpoint_data, f) + log_debug(f"Updated checkpoint: {alarm_id} -> {api_status}") + except Exception as e: + log_debug(f"Checkpoint update error: {e}") + + # Index the status change immediately using REST API + try: + log_debug("Attempting to index status change...") + + # Create event + event = { + "time": time.time(), + "host": "socradar", + "source": "status_update", + "sourcetype": "socradar:incidents", + "index": "socradar_incidents", + "event": json.dumps({ + "alarm_id": alarm_id, + "status": api_status, + "alarm_status": api_status, + "date": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), + "update_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), + "update_source": "manual_status_update", + "_time": time.time() + }) + } + + # Use Splunk REST API to index + import urllib.request + import urllib.parse + import base64 + + # Use HTTP Event Collector endpoint with index specification + url = "https://localhost:8089/services/receivers/simple?index=socradar_incidents&sourcetype=socradar:incidents" + data = event['event'] + + # Create request + req = urllib.request.Request( + url, + data=data.encode('utf-8'), + headers={ + 'Authorization': 'Basic ' + base64.b64encode(b'admin:123456789').decode('ascii'), + 'Content-Type': 'application/json' + } + ) + + # Disable SSL verification for localhost + import ssl + ctx = ssl.create_default_context() + ctx.check_hostname = False + ctx.verify_mode = ssl.CERT_NONE + + # Send request + with urllib.request.urlopen(req, context=ctx) as response: + result = response.read().decode('utf-8') + log_debug(f"Index result: {result}") + + except Exception as e: + log_debug(f"Indexing error: {e}") + + # Fallback to oneshot + try: + # Get the full alarm data from collector's last run + event_data = { + "alarm_id": alarm_id, + "status": api_status, + "alarm_status": api_status, + "date": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), + "update_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), + "update_source": "manual_status_update", + "_time": time.time(), + "alarm_type": "incident", + "alarm_risk_level": "UNKNOWN" + } + event_json = json.dumps(event_data) + + cmd = ['/opt/splunk/bin/splunk', 'add', 'oneshot', '-', + '-sourcetype', 'socradar:incidents', + '-index', 'socradar_incidents', + '-auth', 'admin:123456789'] + + proc = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + stdout, stderr = proc.communicate(input=event_json.encode()) + log_debug(f"Oneshot result: {proc.returncode}, stdout: {stdout}, stderr: {stderr}") + except Exception as e2: + log_debug(f"Oneshot error: {e2}") + + else: + msg = response_data.get('message', 'Update failed').replace(',', ';') + print(f"{alarm_id},{status_name},FAILED,{msg}," + str(int(time.time()))) + log_debug(f"Update failed: {msg}") + +except Exception as e: + log_debug(f"EXCEPTION: {e}") + print(f"ERROR,Error,ERROR,{str(e).replace(',', ';')}," + str(int(time.time()))) \ No newline at end of file diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/Mako-1.2.4.dist-info/INSTALLER b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/Mako-1.2.4.dist-info/INSTALLER new file mode 100755 index 00000000..a1b589e3 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/Mako-1.2.4.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/Mako-1.2.4.dist-info/LICENSE b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/Mako-1.2.4.dist-info/LICENSE new file mode 100755 index 00000000..be84a38e --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/Mako-1.2.4.dist-info/LICENSE @@ -0,0 +1,19 @@ +Copyright 2006-2022 the Mako authors and contributors . + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/Mako-1.2.4.dist-info/METADATA b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/Mako-1.2.4.dist-info/METADATA new file mode 100755 index 00000000..33a75808 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/Mako-1.2.4.dist-info/METADATA @@ -0,0 +1,87 @@ +Metadata-Version: 2.1 +Name: Mako +Version: 1.2.4 +Summary: A super-fast templating language that borrows the best ideas from the existing templating languages. +Home-page: https://www.makotemplates.org/ +Author: Mike Bayer +Author-email: mike@zzzcomputing.com +License: MIT +Project-URL: Documentation, https://docs.makotemplates.org +Project-URL: Issue Tracker, https://github.com/sqlalchemy/mako +Classifier: Development Status :: 5 - Production/Stable +Classifier: License :: OSI Approved :: MIT License +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Requires-Python: >=3.7 +Description-Content-Type: text/x-rst +License-File: LICENSE +Requires-Dist: MarkupSafe (>=0.9.2) +Requires-Dist: importlib-metadata ; python_version < "3.8" +Provides-Extra: babel +Requires-Dist: Babel ; extra == 'babel' +Provides-Extra: lingua +Requires-Dist: lingua ; extra == 'lingua' +Provides-Extra: testing +Requires-Dist: pytest ; extra == 'testing' + +========================= +Mako Templates for Python +========================= + +Mako is a template library written in Python. It provides a familiar, non-XML +syntax which compiles into Python modules for maximum performance. Mako's +syntax and API borrows from the best ideas of many others, including Django +templates, Cheetah, Myghty, and Genshi. Conceptually, Mako is an embedded +Python (i.e. Python Server Page) language, which refines the familiar ideas +of componentized layout and inheritance to produce one of the most +straightforward and flexible models available, while also maintaining close +ties to Python calling and scoping semantics. + +Nutshell +======== + +:: + + <%inherit file="base.html"/> + <% + rows = [[v for v in range(0,10)] for row in range(0,10)] + %> + + % for row in rows: + ${makerow(row)} + % endfor +
+ + <%def name="makerow(row)"> + + % for name in row: + ${name}\ + % endfor + + + +Philosophy +=========== + +Python is a great scripting language. Don't reinvent the wheel...your templates can handle it ! + +Documentation +============== + +See documentation for Mako at https://docs.makotemplates.org/en/latest/ + +License +======== + +Mako is licensed under an MIT-style license (see LICENSE). +Other incorporated projects may be licensed under different licenses. +All licenses allow for non-commercial and commercial use. diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/Mako-1.2.4.dist-info/RECORD b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/Mako-1.2.4.dist-info/RECORD new file mode 100755 index 00000000..04ad20c7 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/Mako-1.2.4.dist-info/RECORD @@ -0,0 +1,42 @@ +../../bin/mako-render,sha256=jDAytBvt-We4snJ-6W-_gXavxsSTjPKgK86UFb0ZDR8,216 +Mako-1.2.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Mako-1.2.4.dist-info/LICENSE,sha256=dg8is-nqSlDrmSAb2N0RiGnygQjPtkzM5tGzBc-a6fo,1098 +Mako-1.2.4.dist-info/METADATA,sha256=MlPkZcQ5bASEMtzkRaH8aRSQE6gmLH3KTnASUawz6eA,2909 +Mako-1.2.4.dist-info/RECORD,, +Mako-1.2.4.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +Mako-1.2.4.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92 +Mako-1.2.4.dist-info/entry_points.txt,sha256=LsKkUsOsJQYbJ2M72hZCm968wi5K8Ywb5uFxCuN8Obk,512 +Mako-1.2.4.dist-info/top_level.txt,sha256=LItdH8cDPetpUu8rUyBG3DObS6h9Gcpr9j_WLj2S-R0,5 +mako/__init__.py,sha256=R1cQoVGhYA-fl43kNSPKm6kzdJOs28e8sq8WYMHctMQ,242 +mako/_ast_util.py,sha256=BcwJLuE4E-aiFXi_fanO378Cn3Ou03bJxc6Incjse4Y,20247 +mako/ast.py,sha256=h07xBpz2l19RSwpejrhkhgB4r5efpwGmsYOy_L8xvUc,6642 +mako/cache.py,sha256=jkspun9tLgu0IVKSmo_fkL_DAbSTl2P5a5zkMBkjZvk,7680 +mako/cmd.py,sha256=vQg9ip89KMsuZEGamCRAPg7UyDNlpMmnG3XHDNLHS5o,2814 +mako/codegen.py,sha256=h1z8DGLkB92nbUz2OZGVmUKqPr9kVNbnNL8KnLizYAk,47309 +mako/compat.py,sha256=Sa3Rzrjl44xo25nXUHbhfIrEoMgceq5-Ohl0FO6cCHk,1913 +mako/exceptions.py,sha256=xQZKYdb-4d8rcrNFsFzjGSEuNG4upFqGNPErtSCDqfI,12530 +mako/ext/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +mako/ext/autohandler.py,sha256=-hNv4VHbQplLGDt5e4mFsBC-QpfWMjKokOe0axDP308,1885 +mako/ext/babelplugin.py,sha256=s6ZIAh1hUhsJIiF3j4soVHrFN_1cRJ_e3sEbz7ein7k,2091 +mako/ext/beaker_cache.py,sha256=D6gh_ke7QOKiSJtq9v67RvmqCRMDJx-IwTcd-NDjKvk,2578 +mako/ext/extract.py,sha256=EhXglj2eW5u80T3xWWB7jMgL8oNDfAQaD5E5IRiL9N0,4659 +mako/ext/linguaplugin.py,sha256=iLip2gZ0ya5pooHrxwZrP8VFQfJidXmgPZ5h1j30Kow,1935 +mako/ext/preprocessors.py,sha256=pEUbmfSO2zb4DuCt_-_oYnWypWiXs4MnJHxjTMiks5A,576 +mako/ext/pygmentplugin.py,sha256=GuOd93TjetzpTfW5oUEtuPS7jKDHgJIH3Faiaq76S0c,4753 +mako/ext/turbogears.py,sha256=mxFDF59NFK6cm__3qwGjZ1VAW0qdjJWNj23l6dcwqEg,2141 +mako/filters.py,sha256=rlHJ2L5RFr5Gf-MyOJKZI7TSJpM5oBXH58niJWCp2-4,4658 +mako/lexer.py,sha256=GOHNLeSlTIEa_yV8W5Qr27SjaPlJcO0Kij7Z2rpUkCA,15982 +mako/lookup.py,sha256=_2VPSA2CgCiT0Vd9GnSIjyY5wlpXiB2C5luXJP7gym8,12429 +mako/parsetree.py,sha256=pXbZP0orsT3iBIgWa9yD1TEfvytsCaXu2Ttws8RTMGM,19007 +mako/pygen.py,sha256=K-l_hsvXfWdMTunfHyVxvA5EG4Uzr4Qaw6IUc3hw8zI,10416 +mako/pyparser.py,sha256=diSXgo-ZwdZxbRsNZ1DmARQKVnlOFc6Qgx9Dc3wZB_U,7032 +mako/runtime.py,sha256=MwO5T1rGy0yLeJiFh2hh5cO_kfd5_9fJq_vfBzLFe_0,27806 +mako/template.py,sha256=gEhMPjKZ1Q_sYWWg6PLnRX-KBeTF0kBnyRZimlmgQks,23858 +mako/testing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +mako/testing/_config.py,sha256=k-qpnsnbXUoN-ykMN5BRpg84i1x0p6UsAddKQnrIytU,3566 +mako/testing/assertions.py,sha256=XnYDPSnDFiEX9eO95OZ5LndZrUpJ6_xGofe6qDzJxqU,5162 +mako/testing/config.py,sha256=wmYVZfzGvOK3mJUZpzmgO8-iIgvaCH41Woi4yDpxq6E,323 +mako/testing/exclusions.py,sha256=_t6ADKdatk3f18tOfHV_ZY6u_ZwQsKphZ2MXJVSAOcI,1553 +mako/testing/fixtures.py,sha256=nEp7wTusf7E0n3Q-BHJW2s_t1vx0KB9poadQ1BmIJzE,3044 +mako/testing/helpers.py,sha256=kTaIg8OL1uvcuLptbRA_aJtGndIDDaxAzacYbv_Km1Q,1521 +mako/util.py,sha256=XmYQmq6WfMAt-BPM7zhT9lybEqHVIWCM9wF1ukzqpew,10638 diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/Mako-1.2.4.dist-info/REQUESTED b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/Mako-1.2.4.dist-info/REQUESTED new file mode 100755 index 00000000..e69de29b diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/Mako-1.2.4.dist-info/WHEEL b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/Mako-1.2.4.dist-info/WHEEL new file mode 100755 index 00000000..57e3d840 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/Mako-1.2.4.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.38.4) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/MarkupSafe-2.0.1.dist-info/INSTALLER b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/MarkupSafe-2.0.1.dist-info/INSTALLER new file mode 100755 index 00000000..a1b589e3 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/MarkupSafe-2.0.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/MarkupSafe-2.0.1.dist-info/LICENSE.rst b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/MarkupSafe-2.0.1.dist-info/LICENSE.rst new file mode 100755 index 00000000..9d227a0c --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/MarkupSafe-2.0.1.dist-info/LICENSE.rst @@ -0,0 +1,28 @@ +Copyright 2010 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/MarkupSafe-2.0.1.dist-info/METADATA b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/MarkupSafe-2.0.1.dist-info/METADATA new file mode 100755 index 00000000..e87ebb99 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/MarkupSafe-2.0.1.dist-info/METADATA @@ -0,0 +1,101 @@ +Metadata-Version: 2.1 +Name: MarkupSafe +Version: 2.0.1 +Summary: Safely add untrusted strings to HTML/XML markup. +Home-page: https://palletsprojects.com/p/markupsafe/ +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +Maintainer: Pallets +Maintainer-email: contact@palletsprojects.com +License: BSD-3-Clause +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Documentation, https://markupsafe.palletsprojects.com/ +Project-URL: Changes, https://markupsafe.palletsprojects.com/changes/ +Project-URL: Source Code, https://github.com/pallets/markupsafe/ +Project-URL: Issue Tracker, https://github.com/pallets/markupsafe/issues/ +Project-URL: Twitter, https://twitter.com/PalletsTeam +Project-URL: Chat, https://discord.gg/pallets +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Text Processing :: Markup :: HTML +Requires-Python: >=3.6 +Description-Content-Type: text/x-rst +License-File: LICENSE.rst + +MarkupSafe +========== + +MarkupSafe implements a text object that escapes characters so it is +safe to use in HTML and XML. Characters that have special meanings are +replaced so that they display as the actual characters. This mitigates +injection attacks, meaning untrusted user input can safely be displayed +on a page. + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + pip install -U MarkupSafe + +.. _pip: https://pip.pypa.io/en/stable/quickstart/ + + +Examples +-------- + +.. code-block:: pycon + + >>> from markupsafe import Markup, escape + + >>> # escape replaces special characters and wraps in Markup + >>> escape("") + Markup('<script>alert(document.cookie);</script>') + + >>> # wrap in Markup to mark text "safe" and prevent escaping + >>> Markup("Hello") + Markup('hello') + + >>> escape(Markup("Hello")) + Markup('hello') + + >>> # Markup is a str subclass + >>> # methods and operators escape their arguments + >>> template = Markup("Hello {name}") + >>> template.format(name='"World"') + Markup('Hello "World"') + + +Donate +------ + +The Pallets organization develops and supports MarkupSafe and other +popular packages. In order to grow the community of contributors and +users, and allow the maintainers to devote more time to the projects, +`please donate today`_. + +.. _please donate today: https://palletsprojects.com/donate + + +Links +----- + +- Documentation: https://markupsafe.palletsprojects.com/ +- Changes: https://markupsafe.palletsprojects.com/changes/ +- PyPI Releases: https://pypi.org/project/MarkupSafe/ +- Source Code: https://github.com/pallets/markupsafe/ +- Issue Tracker: https://github.com/pallets/markupsafe/issues/ +- Website: https://palletsprojects.com/p/markupsafe/ +- Twitter: https://twitter.com/PalletsTeam +- Chat: https://discord.gg/pallets + + diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/MarkupSafe-2.0.1.dist-info/RECORD b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/MarkupSafe-2.0.1.dist-info/RECORD new file mode 100755 index 00000000..ab618d33 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/MarkupSafe-2.0.1.dist-info/RECORD @@ -0,0 +1,13 @@ +MarkupSafe-2.0.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +MarkupSafe-2.0.1.dist-info/LICENSE.rst,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 +MarkupSafe-2.0.1.dist-info/METADATA,sha256=lknelt-VPHWai5EJcvZpATGKVbXkg74h7CQuPwDS71U,3237 +MarkupSafe-2.0.1.dist-info/RECORD,, +MarkupSafe-2.0.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +MarkupSafe-2.0.1.dist-info/WHEEL,sha256=T7Cp5xu87yB0VfKahSR3N0JT_FVycX4pq6-fNwtW39g,221 +MarkupSafe-2.0.1.dist-info/top_level.txt,sha256=qy0Plje5IJuvsCBjejJyhDCjEAdcDLK_2agVcex8Z6U,11 +markupsafe/__init__.py,sha256=9Tez4UIlI7J6_sQcUFK1dKniT_b_8YefpGIyYJ3Sr2Q,8923 +markupsafe/_native.py,sha256=GTKEV-bWgZuSjklhMHOYRHU9k0DMewTf5mVEZfkbuns,1986 +markupsafe/_speedups.c,sha256=CDDtwaV21D2nYtypnMQzxvvpZpcTvIs8OZ6KDa1g4t0,7400 +markupsafe/_speedups.cpython-37m-x86_64-linux-gnu.so,sha256=-pXHCix2zJNQJAxiYofThwxd31HBcNtF5a-bsrUgcuc,53568 +markupsafe/_speedups.pyi,sha256=vfMCsOgbAXRNLUXkyuyonG8uEWKYU4PDqNuMaDELAYw,229 +markupsafe/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/MarkupSafe-2.0.1.dist-info/REQUESTED b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/MarkupSafe-2.0.1.dist-info/REQUESTED new file mode 100755 index 00000000..e69de29b diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/MarkupSafe-2.0.1.dist-info/WHEEL b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/MarkupSafe-2.0.1.dist-info/WHEEL new file mode 100755 index 00000000..1b8892ab --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/MarkupSafe-2.0.1.dist-info/WHEEL @@ -0,0 +1,8 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.36.2) +Root-Is-Purelib: false +Tag: cp37-cp37m-manylinux_2_5_x86_64 +Tag: cp37-cp37m-manylinux1_x86_64 +Tag: cp37-cp37m-manylinux_2_12_x86_64 +Tag: cp37-cp37m-manylinux2010_x86_64 + diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/PySocks-1.7.1.dist-info/INSTALLER b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/PySocks-1.7.1.dist-info/INSTALLER new file mode 100755 index 00000000..a1b589e3 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/PySocks-1.7.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/PySocks-1.7.1.dist-info/LICENSE b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/PySocks-1.7.1.dist-info/LICENSE new file mode 100755 index 00000000..04b6b1f3 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/PySocks-1.7.1.dist-info/LICENSE @@ -0,0 +1,22 @@ +Copyright 2006 Dan-Haim. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +3. Neither the name of Dan Haim nor the names of his contributors may be used + to endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY DAN HAIM "AS IS" AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +EVENT SHALL DAN HAIM OR HIS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA +OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMANGE. diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/PySocks-1.7.1.dist-info/METADATA b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/PySocks-1.7.1.dist-info/METADATA new file mode 100755 index 00000000..ae2ae341 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/PySocks-1.7.1.dist-info/METADATA @@ -0,0 +1,321 @@ +Metadata-Version: 2.1 +Name: PySocks +Version: 1.7.1 +Summary: A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information. +Home-page: https://github.com/Anorov/PySocks +Author: Anorov +Author-email: anorov.vorona@gmail.com +License: BSD +Keywords: socks,proxy +Platform: UNKNOWN +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* +Description-Content-Type: text/markdown + +PySocks +======= + +PySocks lets you send traffic through SOCKS and HTTP proxy servers. It is a modern fork of [SocksiPy](http://socksipy.sourceforge.net/) with bug fixes and extra features. + +Acts as a drop-in replacement to the socket module. Seamlessly configure SOCKS proxies for any socket object by calling `socket_object.set_proxy()`. + +---------------- + +Features +======== + +* SOCKS proxy client for Python 2.7 and 3.4+ +* TCP supported +* UDP mostly supported (issues may occur in some edge cases) +* HTTP proxy client included but not supported or recommended (you should use urllib2's or requests' own HTTP proxy interface) +* urllib2 handler included. `pip install` / `setup.py install` will automatically install the `sockshandler` module. + +Installation +============ + + pip install PySocks + +Or download the tarball / `git clone` and... + + python setup.py install + +These will install both the `socks` and `sockshandler` modules. + +Alternatively, include just `socks.py` in your project. + +-------------------------------------------- + +*Warning:* PySocks/SocksiPy only supports HTTP proxies that use CONNECT tunneling. Certain HTTP proxies may not work with this library. If you wish to use HTTP (not SOCKS) proxies, it is recommended that you rely on your HTTP client's native proxy support (`proxies` dict for `requests`, or `urllib2.ProxyHandler` for `urllib2`) instead. + +-------------------------------------------- + +Usage +===== + +## socks.socksocket ## + + import socks + + s = socks.socksocket() # Same API as socket.socket in the standard lib + + s.set_proxy(socks.SOCKS5, "localhost") # SOCKS4 and SOCKS5 use port 1080 by default + # Or + s.set_proxy(socks.SOCKS4, "localhost", 4444) + # Or + s.set_proxy(socks.HTTP, "5.5.5.5", 8888) + + # Can be treated identical to a regular socket object + s.connect(("www.somesite.com", 80)) + s.sendall("GET / HTTP/1.1 ...") + print s.recv(4096) + +## Monkeypatching ## + +To monkeypatch the entire standard library with a single default proxy: + + import urllib2 + import socket + import socks + + socks.set_default_proxy(socks.SOCKS5, "localhost") + socket.socket = socks.socksocket + + urllib2.urlopen("http://www.somesite.com/") # All requests will pass through the SOCKS proxy + +Note that monkeypatching may not work for all standard modules or for all third party modules, and generally isn't recommended. Monkeypatching is usually an anti-pattern in Python. + +## urllib2 Handler ## + +Example use case with the `sockshandler` urllib2 handler. Note that you must import both `socks` and `sockshandler`, as the handler is its own module separate from PySocks. The module is included in the PyPI package. + + import urllib2 + import socks + from sockshandler import SocksiPyHandler + + opener = urllib2.build_opener(SocksiPyHandler(socks.SOCKS5, "127.0.0.1", 9050)) + print opener.open("http://www.somesite.com/") # All requests made by the opener will pass through the SOCKS proxy + +-------------------------------------------- + +Original SocksiPy README attached below, amended to reflect API changes. + +-------------------------------------------- + +SocksiPy + +A Python SOCKS module. + +(C) 2006 Dan-Haim. All rights reserved. + +See LICENSE file for details. + + +*WHAT IS A SOCKS PROXY?* + +A SOCKS proxy is a proxy server at the TCP level. In other words, it acts as +a tunnel, relaying all traffic going through it without modifying it. +SOCKS proxies can be used to relay traffic using any network protocol that +uses TCP. + +*WHAT IS SOCKSIPY?* + +This Python module allows you to create TCP connections through a SOCKS +proxy without any special effort. +It also supports relaying UDP packets with a SOCKS5 proxy. + +*PROXY COMPATIBILITY* + +SocksiPy is compatible with three different types of proxies: + +1. SOCKS Version 4 (SOCKS4), including the SOCKS4a extension. +2. SOCKS Version 5 (SOCKS5). +3. HTTP Proxies which support tunneling using the CONNECT method. + +*SYSTEM REQUIREMENTS* + +Being written in Python, SocksiPy can run on any platform that has a Python +interpreter and TCP/IP support. +This module has been tested with Python 2.3 and should work with greater versions +just as well. + + +INSTALLATION +------------- + +Simply copy the file "socks.py" to your Python's `lib/site-packages` directory, +and you're ready to go. [Editor's note: it is better to use `python setup.py install` for PySocks] + + +USAGE +------ + +First load the socks module with the command: + + >>> import socks + >>> + +The socks module provides a class called `socksocket`, which is the base to all of the module's functionality. + +The `socksocket` object has the same initialization parameters as the normal socket +object to ensure maximal compatibility, however it should be noted that `socksocket` will only function with family being `AF_INET` and +type being either `SOCK_STREAM` or `SOCK_DGRAM`. +Generally, it is best to initialize the `socksocket` object with no parameters + + >>> s = socks.socksocket() + >>> + +The `socksocket` object has an interface which is very similiar to socket's (in fact +the `socksocket` class is derived from socket) with a few extra methods. +To select the proxy server you would like to use, use the `set_proxy` method, whose +syntax is: + + set_proxy(proxy_type, addr[, port[, rdns[, username[, password]]]]) + +Explanation of the parameters: + +`proxy_type` - The type of the proxy server. This can be one of three possible +choices: `PROXY_TYPE_SOCKS4`, `PROXY_TYPE_SOCKS5` and `PROXY_TYPE_HTTP` for SOCKS4, +SOCKS5 and HTTP servers respectively. `SOCKS4`, `SOCKS5`, and `HTTP` are all aliases, respectively. + +`addr` - The IP address or DNS name of the proxy server. + +`port` - The port of the proxy server. Defaults to 1080 for socks and 8080 for http. + +`rdns` - This is a boolean flag than modifies the behavior regarding DNS resolving. +If it is set to True, DNS resolving will be preformed remotely, on the server. +If it is set to False, DNS resolving will be preformed locally. Please note that +setting this to True with SOCKS4 servers actually use an extension to the protocol, +called SOCKS4a, which may not be supported on all servers (SOCKS5 and http servers +always support DNS). The default is True. + +`username` - For SOCKS5 servers, this allows simple username / password authentication +with the server. For SOCKS4 servers, this parameter will be sent as the userid. +This parameter is ignored if an HTTP server is being used. If it is not provided, +authentication will not be used (servers may accept unauthenticated requests). + +`password` - This parameter is valid only for SOCKS5 servers and specifies the +respective password for the username provided. + +Example of usage: + + >>> s.set_proxy(socks.SOCKS5, "socks.example.com") # uses default port 1080 + >>> s.set_proxy(socks.SOCKS4, "socks.test.com", 1081) + +After the set_proxy method has been called, simply call the connect method with the +traditional parameters to establish a connection through the proxy: + + >>> s.connect(("www.sourceforge.net", 80)) + >>> + +Connection will take a bit longer to allow negotiation with the proxy server. +Please note that calling connect without calling `set_proxy` earlier will connect +without a proxy (just like a regular socket). + +Errors: Any errors in the connection process will trigger exceptions. The exception +may either be generated by the underlying socket layer or may be custom module +exceptions, whose details follow: + +class `ProxyError` - This is a base exception class. It is not raised directly but +rather all other exception classes raised by this module are derived from it. +This allows an easy way to catch all proxy-related errors. It descends from `IOError`. + +All `ProxyError` exceptions have an attribute `socket_err`, which will contain either a +caught `socket.error` exception, or `None` if there wasn't any. + +class `GeneralProxyError` - When thrown, it indicates a problem which does not fall +into another category. + +* `Sent invalid data` - This error means that unexpected data has been received from +the server. The most common reason is that the server specified as the proxy is +not really a SOCKS4/SOCKS5/HTTP proxy, or maybe the proxy type specified is wrong. + +* `Connection closed unexpectedly` - The proxy server unexpectedly closed the connection. +This may indicate that the proxy server is experiencing network or software problems. + +* `Bad proxy type` - This will be raised if the type of the proxy supplied to the +set_proxy function was not one of `SOCKS4`/`SOCKS5`/`HTTP`. + +* `Bad input` - This will be raised if the `connect()` method is called with bad input +parameters. + +class `SOCKS5AuthError` - This indicates that the connection through a SOCKS5 server +failed due to an authentication problem. + +* `Authentication is required` - This will happen if you use a SOCKS5 server which +requires authentication without providing a username / password at all. + +* `All offered authentication methods were rejected` - This will happen if the proxy +requires a special authentication method which is not supported by this module. + +* `Unknown username or invalid password` - Self descriptive. + +class `SOCKS5Error` - This will be raised for SOCKS5 errors which are not related to +authentication. +The parameter is a tuple containing a code, as given by the server, +and a description of the +error. The possible errors, according to the RFC, are: + +* `0x01` - General SOCKS server failure - If for any reason the proxy server is unable to +fulfill your request (internal server error). +* `0x02` - connection not allowed by ruleset - If the address you're trying to connect to +is blacklisted on the server or requires authentication. +* `0x03` - Network unreachable - The target could not be contacted. A router on the network +had replied with a destination net unreachable error. +* `0x04` - Host unreachable - The target could not be contacted. A router on the network +had replied with a destination host unreachable error. +* `0x05` - Connection refused - The target server has actively refused the connection +(the requested port is closed). +* `0x06` - TTL expired - The TTL value of the SYN packet from the proxy to the target server +has expired. This usually means that there are network problems causing the packet +to be caught in a router-to-router "ping-pong". +* `0x07` - Command not supported - For instance if the server does not support UDP. +* `0x08` - Address type not supported - The client has provided an invalid address type. +When using this module, this error should not occur. + +class `SOCKS4Error` - This will be raised for SOCKS4 errors. The parameter is a tuple +containing a code and a description of the error, as given by the server. The +possible error, according to the specification are: + +* `0x5B` - Request rejected or failed - Will be raised in the event of an failure for any +reason other then the two mentioned next. +* `0x5C` - request rejected because SOCKS server cannot connect to identd on the client - +The Socks server had tried an ident lookup on your computer and has failed. In this +case you should run an identd server and/or configure your firewall to allow incoming +connections to local port 113 from the remote server. +* `0x5D` - request rejected because the client program and identd report different user-ids - +The Socks server had performed an ident lookup on your computer and has received a +different userid than the one you have provided. Change your userid (through the +username parameter of the set_proxy method) to match and try again. + +class `HTTPError` - This will be raised for HTTP errors. The message will contain +the HTTP status code and provided error message. + +After establishing the connection, the object behaves like a standard socket. + +Methods like `makefile()` and `settimeout()` should behave just like regular sockets. +Call the `close()` method to close the connection. + +In addition to the `socksocket` class, an additional function worth mentioning is the +`set_default_proxy` function. The parameters are the same as the `set_proxy` method. +This function will set default proxy settings for newly created `socksocket` objects, +in which the proxy settings haven't been changed via the `set_proxy` method. +This is quite useful if you wish to force 3rd party modules to use a SOCKS proxy, +by overriding the socket object. +For example: + + >>> socks.set_default_proxy(socks.SOCKS5, "socks.example.com") + >>> socket.socket = socks.socksocket + >>> urllib.urlopen("http://www.sourceforge.net/") + + +PROBLEMS +--------- + +Please open a GitHub issue at https://github.com/Anorov/PySocks + + diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/PySocks-1.7.1.dist-info/RECORD b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/PySocks-1.7.1.dist-info/RECORD new file mode 100755 index 00000000..0c8247e0 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/PySocks-1.7.1.dist-info/RECORD @@ -0,0 +1,8 @@ +PySocks-1.7.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +PySocks-1.7.1.dist-info/LICENSE,sha256=cCfiFOAU63i3rcwc7aWspxOnn8T2oMUsnaWz5wfm_-k,1401 +PySocks-1.7.1.dist-info/METADATA,sha256=zbQMizjPOOP4DhEiEX24XXjNrYuIxF9UGUpN0uFDB6Y,13235 +PySocks-1.7.1.dist-info/RECORD,, +PySocks-1.7.1.dist-info/WHEEL,sha256=t_MpApv386-8PVts2R6wsTifdIn0vbUDTVv61IbqFC8,92 +PySocks-1.7.1.dist-info/top_level.txt,sha256=TKSOIfCFBoK9EY8FBYbYqC3PWd3--G15ph9n8-QHPDk,19 +socks.py,sha256=xOYn27t9IGrbTBzWsUUuPa0YBuplgiUykzkOB5V5iFY,31086 +sockshandler.py,sha256=2SYGj-pwt1kjgLoZAmyeaEXCeZDWRmfVS_QG6kErGtY,3966 diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/PySocks-1.7.1.dist-info/WHEEL b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/PySocks-1.7.1.dist-info/WHEEL new file mode 100755 index 00000000..129a6735 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/PySocks-1.7.1.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.3) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/PyYAML-6.0.1.dist-info/INSTALLER b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/PyYAML-6.0.1.dist-info/INSTALLER new file mode 100755 index 00000000..a1b589e3 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/PyYAML-6.0.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/PyYAML-6.0.1.dist-info/LICENSE b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/PyYAML-6.0.1.dist-info/LICENSE new file mode 100755 index 00000000..2f1b8e15 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/PyYAML-6.0.1.dist-info/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2017-2021 Ingy döt Net +Copyright (c) 2006-2016 Kirill Simonov + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/PyYAML-6.0.1.dist-info/METADATA b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/PyYAML-6.0.1.dist-info/METADATA new file mode 100755 index 00000000..c8905983 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/PyYAML-6.0.1.dist-info/METADATA @@ -0,0 +1,46 @@ +Metadata-Version: 2.1 +Name: PyYAML +Version: 6.0.1 +Summary: YAML parser and emitter for Python +Home-page: https://pyyaml.org/ +Download-URL: https://pypi.org/project/PyYAML/ +Author: Kirill Simonov +Author-email: xi@resolvent.net +License: MIT +Project-URL: Bug Tracker, https://github.com/yaml/pyyaml/issues +Project-URL: CI, https://github.com/yaml/pyyaml/actions +Project-URL: Documentation, https://pyyaml.org/wiki/PyYAMLDocumentation +Project-URL: Mailing lists, http://lists.sourceforge.net/lists/listinfo/yaml-core +Project-URL: Source Code, https://github.com/yaml/pyyaml +Platform: Any +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Cython +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Markup +Requires-Python: >=3.6 +License-File: LICENSE + +YAML is a data serialization format designed for human readability +and interaction with scripting languages. PyYAML is a YAML parser +and emitter for Python. + +PyYAML features a complete YAML 1.1 parser, Unicode support, pickle +support, capable extension API, and sensible error messages. PyYAML +supports standard YAML tags and provides Python-specific tags that +allow to represent an arbitrary Python object. + +PyYAML is applicable for a broad range of tasks from complex +configuration files to object serialization and persistence. diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/PyYAML-6.0.1.dist-info/RECORD b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/PyYAML-6.0.1.dist-info/RECORD new file mode 100755 index 00000000..5651a8b7 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/PyYAML-6.0.1.dist-info/RECORD @@ -0,0 +1,26 @@ +PyYAML-6.0.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +PyYAML-6.0.1.dist-info/LICENSE,sha256=jTko-dxEkP1jVwfLiOsmvXZBAqcoKVQwfT5RZ6V36KQ,1101 +PyYAML-6.0.1.dist-info/METADATA,sha256=UNNF8-SzzwOKXVo-kV5lXUGH2_wDWMBmGxqISpp5HQk,2058 +PyYAML-6.0.1.dist-info/RECORD,, +PyYAML-6.0.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +PyYAML-6.0.1.dist-info/WHEEL,sha256=E0CkEo6W7NC93sVo8jj5Y2C0iOJBJ79Iyun5srY2VI0,150 +PyYAML-6.0.1.dist-info/top_level.txt,sha256=rpj0IVMTisAjh_1vG3Ccf9v5jpCQwAz6cD1IVU5ZdhQ,11 +_yaml/__init__.py,sha256=04Ae_5osxahpJHa3XBZUAf4wi6XX32gR8D6X6p64GEA,1402 +yaml/__init__.py,sha256=bhl05qSeO-1ZxlSRjGrvl2m9nrXb1n9-GQatTN0Mrqc,12311 +yaml/_yaml.cpython-37m-x86_64-linux-gnu.so,sha256=esho9rx9cSckIi84QOt04kVtI4LHNm_M81Sa55G-Rjg,2129400 +yaml/composer.py,sha256=_Ko30Wr6eDWUeUpauUGT3Lcg9QPBnOPVlTnIMRGJ9FM,4883 +yaml/constructor.py,sha256=kNgkfaeLUkwQYY_Q6Ff1Tz2XVw_pG1xVE9Ak7z-viLA,28639 +yaml/cyaml.py,sha256=6ZrAG9fAYvdVe2FK_w0hmXoG7ZYsoYUwapG8CiC72H0,3851 +yaml/dumper.py,sha256=PLctZlYwZLp7XmeUdwRuv4nYOZ2UBnDIUy8-lKfLF-o,2837 +yaml/emitter.py,sha256=jghtaU7eFwg31bG0B7RZea_29Adi9CKmXq_QjgQpCkQ,43006 +yaml/error.py,sha256=Ah9z-toHJUbE9j-M8YpxgSRM5CgLCcwVzJgLLRF2Fxo,2533 +yaml/events.py,sha256=50_TksgQiE4up-lKo_V-nBy-tAIxkIPQxY5qDhKCeHw,2445 +yaml/loader.py,sha256=UVa-zIqmkFSCIYq_PgSGm4NSJttHY2Rf_zQ4_b1fHN0,2061 +yaml/nodes.py,sha256=gPKNj8pKCdh2d4gr3gIYINnPOaOxGhJAUiYhGRnPE84,1440 +yaml/parser.py,sha256=ilWp5vvgoHFGzvOZDItFoGjD6D42nhlZrZyjAwa0oJo,25495 +yaml/reader.py,sha256=0dmzirOiDG4Xo41RnuQS7K9rkY3xjHiVasfDMNTqCNw,6794 +yaml/representer.py,sha256=IuWP-cAW9sHKEnS0gCqSa894k1Bg4cgTxaDwIcbRQ-Y,14190 +yaml/resolver.py,sha256=9L-VYfm4mWHxUD1Vg4X7rjDRK_7VZd6b92wzq7Y2IKY,9004 +yaml/scanner.py,sha256=YEM3iLZSaQwXcQRg2l2R4MdT0zGP2F9eHkKGKnHyWQY,51279 +yaml/serializer.py,sha256=ChuFgmhU01hj4xgI8GaKv6vfM2Bujwa9i7d2FAHj7cA,4165 +yaml/tokens.py,sha256=lTQIzSVw8Mg9wv459-TjiOQe6wVziqaRlqX2_89rp54,2573 diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/PyYAML-6.0.1.dist-info/REQUESTED b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/PyYAML-6.0.1.dist-info/REQUESTED new file mode 100755 index 00000000..e69de29b diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/PyYAML-6.0.1.dist-info/WHEEL b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/PyYAML-6.0.1.dist-info/WHEEL new file mode 100755 index 00000000..235b512c --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/PyYAML-6.0.1.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.40.0) +Root-Is-Purelib: false +Tag: cp37-cp37m-manylinux_2_17_x86_64 +Tag: cp37-cp37m-manylinux2014_x86_64 + diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/__pycache__/socks.cpython-39.pyc b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/__pycache__/socks.cpython-39.pyc new file mode 100755 index 0000000000000000000000000000000000000000..2425b367f9deff963e8c73cdbf19595ad5387f97 GIT binary patch literal 21412 zcmbt+dvILWdEeg0F7}1RgWy9HMO{-bu1tcIOi?mL(F7loDAOQHK$5kRvR&X@fJ-iR zp>r=tVYRCyq8zJ9q`VZrbU%O`6WMX`6N$PsY9NA8DPLmNRXp z9d}ZX8i)P;zH{$BK+>)oVD8y-&-?YgzjJG&qxls6nm?bbH#btL@9<^tFNc@Ycmi#w zQYxjaMrzfnSXQb%jyJnuuR0aSO1+wD?srqZyK%xw@n7=NChxUW(>}@+r;%A5sf?^< zE7{dtB`2laM!u3qUb<0OEmn$g+Gu4IX>OxbDd9KMD6NiF#^Sv33VU`N6O{@1ovci% zk;)FgbahH)ui5(B{^Zr2Dt9fVzuhiMiCvXl7~ftQ-|w06`L4>}wBEDK*!dRHd&v70>^Kf57)PAKFSGe0VE$)4pj{ z9`VPoj-%|OmB-YW8h<}kIru_KO{mHDQ)<#L-*hUE<9&yk!uyo}INm>r_nm4N-gn9S zA-wNad+@$T-VfvbKD8I`d*yu^@As>Hc;6@QNAUiD+K>1B@_tl3s66!vbpT_0LOrA& zR*$Gh)nn?QDyzrUC%>AlJn7%B4*3t@c~Bj$JC#qV)9Q#i`o2{;rk+qwV$4sePpM=0 zJ?MG&Sotq)RL))!ODma>%n ze)gu-wK^77!I@n`f!<#lG4}Hyp5SW;IsnZ3QeC^J`{xm_!M7}i())_NEf0zX`AV5#fPl_+=q?InLLthbuw zbmZ3bN)TnP-H=~5@EgmOVznMrd&MpPBkbt%dUJ_YK1zN3@{!hBcqCYBtT(S6@x!Gf zwY9b2$imFwptYoHs-_Run@e@&H^bn_V!e4JtW}d7Y-EyCYb{pSHa>L(S=WN;wT)=x zhDJlaKFGD+k051dE!WE8KW~kv5q@l2C2OyfwTid1R{H?vRONVkL!CZ}Db^ansp+_> zvK{4Q;H_38h|)|A%C_Evw)OoC?qjf<0nbG=aYvJnB00z);9yFln&TQeAZP0uc|)8vnF9@VpW0ZGcvj*Zaj*!tlPj@wln z-A%iL1NwBzMy?zfd$#SK@ZRa-yf~}DN|ZPKaWGM4xusWYVcF3;(WLeme1d_jngp_H z*($cR9#*T*A~VP$NLd*xW4l&+M}MBvNvR>&B%Jb*k#n6p80UQIBMTTsdi=;Ty>IJt zq*@I^U9Fx$m4E=Avf7hFok?~X?PMYhuvuI6tJNr9t**AzdV}#|wffe2tr6#-LDgES zR`o+@OLN-?rrDdTCL;JW9yt>{p7{|;TSD58PDU98D}lc_aCX}De3ZTtJ(Agn&kw}>O=SH@Gvr78t9Pk zKT?Ndf}Nk5Sr4!Lu)e0z_Uu4keE*U9Dww{0SU*S5?&X1g`2PRV&#@oY&r!7d%0NGS z|B?F1k&^weUYqahCi0NqeQ*}3&Prf};G25)jQ`(kJr9v^43uKo5W`iI%$fWa}eZeYTT z8(=URJ`j3)$E+XTXz6R-dQua2WuMTl-F~hL6)M|LXp!B^nN@+g`yl`X9A1+?b>H=n^i57%~xkc9G z7P0p&;=fxX42VSQ&mgD%Au!Iu5_6J2##!hro`68oA-cCaPRG?#9hW>w6V#`Z)(1N2 z<|%)>hH?hzG*Qrros)vmYX$cG6T=CVkG`Uv80q{d#qhIZNwZH>$Nr)S%u8iSe zd3u&Conb!>F){;)M&r&*K_K+1XyV6dP?u=SeuA%;Z4~mQz7VY!T^Gr zIkT0V440$T&!HNqfV0+GlMcX<>_C#9V$etXGRQHkO*}?v;9Zn4{0P{hlBG!vh6afD zVS*Z_u5#C{_OZ);xURul3~rq?dI&%t5@NU!Ln|_kv5~6llMMP}>ye~r0$k>Bo%d1H zkYroGfcPEso@>a34fY}6@bq{{x^GwQW;O&fO?gomC8u^D=;%xs`m1X=d_Y3L8;#l$ z4v=T)_+vqQh`dI9QP=baPH1=q*)cLR+><%lpQBX4nQlAzIL}~<@0|R>>FMdRw_Mjj zIPEQ5shiU;XS>yGpeN!KphGhfu4@fa%c>x@7;F>}#}WVn!VCt_h3APCkQe z>ZIPVyZLURlQ)o{_aP<%Q8y3Nbd0Ep5F#;??kcBS4DC&zu1;FHp?%feav|G(t2^2m zeIwm1b;r8n-HGlb%I#>k!*r+A8S6k6?(XR1^iOqiC|l}Ib#`3Mbf&(9bN|-$aHL~} z*)X?k-?a7DIy*M=9rS5I1k>NZTY+e@lkQ|XBc1G42I;o`EuboiYWPbr}&KTHXl82v9m}@_+7$ZLnBYRvI;cRwt82BoKIA?A`XMit z<=({GL12_8sHKGeb z2G8vf9f)Z~Z-Cxm@5#gA`dY*1Sw47S?#LCKYaaDO9>JkJEe#Kj8&&3!4{ERyctp{l z*#HrCW4f9qGLk_ZEPM535GfGzW@uW9*8+`P5<#{nC?%`pU9UCP(R;lKxW<~Qz*G!c z>w3wrl3tKx9rnzq4|2TmScNhTOc|qs6f2_x*{TB%nMPzvNkj3PCA)`3J197URBoxY zx>gJ8i}gl5+$c-6kFD3+_UmsNX}!H?rB;uZ8>>KEw*hnptW%x<4Ge2K42adDG-R6k zntl;b7Zrea*?GOW+=_(rt*B%Vr?7M4bYoG882Xa#Wm^i5#@8iP5&B#ECm#=NC{aIE^4RNyS7SR5)+D&My4AmTeUw z_Ci5nOR810+}kcv^76h5B{Im}XJ;(e)(y0=#D)g{NE}b&5e-ORZiFtuRt_`>uAjb{ zs$@iEmyQb6Gqu2(mcbW~7~p$a1V+KtF%!EHM!jei@(0wH479_VwRRqi#Gx!lr(U?|0#d^eQrbj~$VEiUunyX+vuZgfD6%hXpAM^mUP-2+%^ZK=Q{z z+z8P^l1rqLZT3Jjlrp8cyCJkY8wJF;NVtG%DAWK~9u05)=xmQ}g;voLk!RRL)Q zRaB$+EkdnMbAbhehZqYgB`HlqLAEj`aT*D-FnT;AZ!{6)VEXv9ywO0Ag8@Vg1C33y}7J`lLF9 z-~H;an#S*gVk$_9`Qt$tK<@V+@;w+49`+wmC!{`22sxNS9z}|n5fFbYHX zj6?LSP=eZ%SVzK_fw6oRm=^LEA~OW zheSJ}oI=?HA$34J5Eo+>msCi2TQeGv=Q?=n3r)z-3IZporD5EGnaExrk|ug40mI#H zK$SuC{@l#-)eE!d7euch(|GQvq4FHo0nYCL`HS^cDj3A30Bq-jlADwDoOs%=0LR1s#?I-egHD(ZiQbmvKvo%*F;T1#&WM2=jur=hW z)ujeFLMUT<_)0MEA0s~?l}_2?Af+Yy0JO}MPM~c@ti6MSFej^r$(J0KkN>D;>FLQS z(qhXT$ezwkY!B?1&p?Vt%%tprg{bRx++aGi6)cbMS(F`~hQa48w?n?&Y5(+Pf61?3 z_r3FYM#92wkEHD7=m&GFo8ok05z@Kn9j%h&-PTi(9i+!6qp)tu;Sr5`^i8!UiMRi^9IFr~6Qq$oLh|4aKqe=d_ z8C0sA{^*QJvf{l6@=N(oJ!}VA)T>S|0O@IAP$C36BJC!vX?h3Pu0cmJOS(2-H7LV|Z z9jH^VnlSHh^_qE!iwGPWdMuT>Xbn>$|> z;&jYA2s375U5VC+Fng?4Hk4|6OMKs6{VAbW1F2N=3!P(WN=lrG`6D4qM9hSQ8vQ(k zY@+&ev-7cV%?hG=8mcTQLp7(pb4KkeQvVZ2pE=qmyS-7w-S>WsQ2@GI$idGfRXFZ= zYvO!EJ6Vf@U4I($S6b^0#ld>Og}M%`2uck40)oE^92MIXj9ljhur%CjBnNd($TxIt z#ttDCU#U_y>`1J?^q?qP(CdDGNWICJ$Sg$26F3eicLfqrv*r1)MZnY{3dDG$@0eF2 zq?)6^ht0? z5KjjsqH`#UL7&HuX5R_czo)i63w$mpW2TSwILaZymXsO7_(YY&lENI?s7>5g=>&_EvG5TWICt~vTd=w5}Cyj_}}XU&Yh2p!=_n1#O7Cf^a}P(vxZo0If> zC&%=#5Eg~KO!ub^9cF5CbSq_avC5$?6FOE`By?cd%@WA$DErtP>x_~_D7RZeI*10e zsHIME%aOXs#qT(Dw_~QQq&L(XPc)>xvJF6w79VN9a$yxZL9*Y_@sV3h z?1?znf^}X#Hy6ti(9iW?{zdwM0Dq`;sJD#zkvb_TEY<+3{&f4mJg_bm`3*7|8{Q(= z7NekpsA5!m?Z?=*=-_&&oF)zd?57fn0x}R;N59L%=9KM^M~+U*zc|s%mZ#*X>kp7? zScjirtjXXN1~(ayozP?|H5npJ38Bw+h?_%)sitWb)j!7IG=mui0&gB-kyRB~j2s1tfUsH_#Zpvf<}vjPGYjV{ zX+V5!BXX%f+s^iIUeELJlWM2Z?(HIUTI0}`WWeW9nNhTMr4a)&L@k$VO}UIsfd_1l z4FEFtYlu&w)`e>$0P?pG!GVF9?5d4}{dnkv;P)UW;UEJb>{v!}C?gqw2u|RLj?jES zmA$gzg9Rx|!7=g+jHkow%~Ur7b^8byid<(TKG<1#%Sx>jOaX2uvjynv^;bZCaSL4N zZUSO@u-|U3lS3{*X%D5Y^z27=WW3jI-Nv6`(Nc1BQV^@Q9g_DjL&JD>7?YDCXNGJM zJ(236AMLElZ*m6WldHQdk_EpfI&6qaexp&&8zwC+GDTlzibmpERO;5~$#n$~;p>WX zdH$73etuzQ_T0?HOS9)i{c^{4b8y$V-5w$-Z0>$=x_NAF5gQJ*r94G@zh&Qsd^It! z!A7YwBwcZP`Oqp9@I3amSUixR2_zQ?9pSPAwN<>i!y@vs-OuUk3A5W*SJw2W&_f^6 zWYuC#p#JO3`iQ|4gKexm*Z0RcX~WhQak_`jE~hp$u^cK8!byjMZzAYT%+dRkv$Tn` z3%MWuUC7M@)BW=bb5wl3aWY}}+Km&u1%Z;DgPVEfgaw{S#EZ(M$Qh1y+?$qehACVVCC)n&j3)abqCgN8^YjYxmv#uc?Fm3^EX!KgP zm&N~VR{vGZqR!nijtJbc_P$t}RUT0%Y?MT?%euBg1aAB`$L8YHdIPq6UzK-k-=8(7X6$QW5% zUk>VRU-mt6@D{lod?ib1fxKuLLwrv_p*`Abszi7x&A7$ zwsTfo*I(dZ*+~k68amJ%($H{FQVz2mXwHwrq1bp;#Bgf#V=){;c`_*1Z02hyJ^*%) z@O2x2vB)p?0gTJk9v{FRqM5j3KpfOrJOY*+3b3x#J~8OEVCXy~pBU*G%^x-|(U8CZ zPnKJFjcLfYB%*hdviHM{J`)%5Fa}FxtLaAt`ys&{<1{&O;5rhYOAj{#1{p z8Jq>j4|YXFv%Y4hKki;7Sn6r!>uED&t+(;iUq+9Aqc?K*9wSehxMSpZU-TQ>hiiDM zdkve$Ksc+?I_Isz!3y5m1KgYuwEC-?=GoLRY77HJ->68b!GII9P?Cklo3)`SMny5CDzGK|? z>zpqSR|+f_jEJ|}`vzuxNAV%OHKiR^y_H;qyE~t_+t%9DO}Z zE7&R^#1!ETossnXHMmjeNwoc8Cl`Dr%&3BtV7tW-VowJS`8Tc2+*S&-GP^q^X=tUF zmfJ1bt-JIO$B|zDMfCqiz5Yjg{f}OA(Ep3*x5R#%#|Oq1=MAKc$!Jfb^thDH_FCk4 zvmMZLH5!kHJf_phV;xG{#x{YpvCdd;Y*-tN;V&m`g$3lr>jTbUyfdyKB%;J`hef!g zjH^l1p8!X&L&Pt%CM!mxgtlO7G?2zl`A=gz@F%5SJLaYL_qf}Rhan_r0Y zr@aKH!11EhfXdoqW>Qjor*1$GW7KuJnJq{WM)ITjKxPTkCD*6SMsd@LE8Z#+O&TMn4{Xxp}SGy3sTq zrym#IIq}fZV{doq%RgJ*C30Vsr9GF5ef`%kC`t(H!4>_NILc2lpo|weOINi1^L!QM z&aW``H<>YN=1@I<`SPX9^N|DmtB)}E0E55H;5`OnBBCPM$gL#)U<*a1>=Iw1hgGG2 znFXF>aEifQv_(-yq#<~3P^gCpQ&^(uuvz7zR0<5?^Ir?sg9?nu<_yu25v;+)Ea@VP zSDeMB+Rl*>6@QaBlva{ddeY8=jdSg+TXgdfV2k#+V?)Mq)00lt&APh~x9!rO*pB`E z4D+pVTk>txMD0lk#gK?xNpmNWpLNI}%DXcT2?{lwJj#in{C%5VWW2MocMxmG>l+`i zA&G;A07@Na@dPhn;2m=RB(vhE^6rc!<>DfX8>fE!%L#xY8}OUxG9M z>*d+`x$|d@HMnqL z4mOE}OVx$5bJ6I`h3d??bC&3ui4z_5U{h$N?(HpAcyf=bC4 z>8oL@N}YxFkr?HP@8vzH;KREM{%&OTn6iyA(nL<44Ul*Skrb|kP2ytM zIKYm;#|KW^R?%?*-W~vwtdjeE7tY)S@uW;!G>!yB+^f2)24+ZcMH!Py8v(_iM?|%+5iD) zPg#Pjl;mf@c8rkJ3s}NYKysn|-Lh4liZ6gsT7>$-thrbqM2JVooTz_=*e#+H{f`*@ zYX&rF%29*tEYv_wS?>td1pn)Q$5Q{6fe?$|MJ&p!H+ibc8FL_b7AkHH)-=KDQ3l54 zmGFu=8QTOE5{%Dr?{*~ zcZjpX*TS!&$Jge;*H)nPF0@PHdQ85z2rKiGypeg;-B>f&4aUhgRJvPKnQoyu&XRbb zFR;8Vs%^rpOtK9Vt&m-K@EO-TojtH8ghe9S-Q zHi0RHpN1Q?B2G5^Y%b=T9sP$P{F&rHFej%<%mK$pyg4Qu(7x>N0=Lju*kC8=YHB&GiWc31yH2H4%y^G3OWv$N24Pn|jQ zq996h=)cZFzr*0u2-=1ZJQi#D@5KiS9Nem~)<0(OPY}!sgp_w1?E4!`9srIS@hvq^ z(I`+9@z>%8#Zke*nh>JD#X#`wZ!*?rwgz~rV=+&q{~3!MWpIGOe_-$*8GM0(h{D27 z#rXH{BQvyFd&pi+t*W@93yzs;QAX7Dc=a6;QK?VTd%u{Q|2mr*oD zCJ1m#zgAwzE#Vg;DZ=dSJXoi^L&b4E4cmaQMKSBtV~fVET~H=xtVz2_A55}EKS-E8 zc5k3xzB|xo^xlqznP0Jhg5 zoL&cr;@U1;xZrST1ksylAqMd@)T;z>nkB$8!6JvgUr@Ip|012-VLqurAEZbDev_ydD}P*#NE7||3r$AAv3;Cl)9w~OI;2Z*3M zikka?x=Og2;Kg+(j9?qr9gPvgWi?LV@05rb0P+*pQvmRnz-Udvt7$Bp=!|i6KnJkk z!Bk=Zekv9YZ~Rd3ZF=Gnkl4F>OcuTwa6Y!QFRg3d_Jh@V&@va8im^82a1d_5J&HO! zI0{UQ+9S^L1jdDRIuVdRmWoH7n0`W(hA#pjPk6!o$e5$G@$d{}1~?eEMKyK8TdW23 zB~NsGqj~)^C>B|sV1f2ycQ`W)%Z(H>;Ct@3(=2$TeN;M#F_ouUP!jQ0APtu_u#DnY z4G)EWtLtAN@a|qhC{Ogau z=@|vv0=UpSyI8GlNEdLo7&3zoPE zxq|N^2RgDSBc@x$ZZcXnreW1)x>PVTEN#3B6p~Nk_i_X z5Y6Z(7zkeMVZ($GB_h=SnZXZ4ftBKwFkGt|i&#)`m%)iw3T9=iGKLkjfm;G1J>u$( z@+-V=0THu`%kXzajAH}JHZJ#9dT7y|bS8=9Zc_@h?V>QA8LMqVB zsYZY(^56$VMr2%#i1n)g?PBco(9J<2h5acU4NGz*>l*`O`vxy%A=eGZZrZ^&!K(;* zyo)Xi$abB`io6H3-!0%u*Pq3l zcMH0PhBEl+P6kppyXc3Bpd5N88`&A?dTmaa5ebDA4vU62dvD zuiXc4A1l3$iKSN^o=`@SAJBJbX6}OAG7%XIS2Sa057&Ep6&7&U3yw#;T8`eNwHPfP zqE-&^-tDgeTSD*J5qzNjUv8Xv`0I;1`m+F#cJHGz#M;frdRMu<3v<_xpYR?D#5k(I zg0i#iqZbmzVSg145Ad!-7sq&4ubl?6ey7`hP%N0q%*BnR1>IacQxq6|gbpq~Xa)Oh z7w3&j3p`OZo$3Mp4G=muiXBdzztrX>C;4?4$C_x3j<+#7b zD+qG$TYD^$OZxV=YyCK}e-CsR(1M!E?RDWL4s4u-Du6c0yh}$G_&7M?=HlSW7Vx$W ztzY*0c3N;VHHBnV!OB8gh|DQ4zgg6#;7S|~oguDv745yQjh4nyG9%s-dw}1;*iH@z zwDGAKQZ5i<6LX)%6L7-qDQftDvw^jL7G43bf?<_!1z8)HfeVn*#&?FU+WI8JSK)I8 z+~RiacVV=Ozab=V_=b@D64RKwVzo!XF?b}1!HFYB@U0VmbO-EFbGoHhj(qA!e1BTL z#{efIdC z+X2z)k;hu5i`W5v)&jOXe#C%X<2Fe0MV(*}H^C11zpxo1cG8l^gA|QinirUs8c^s<}j!(&<{4?ZA-Y-35xFq*Q6_lKiV~E5WV3;ox=faM& zw!bIrz^5cQlw6|cofAOq6Ft~SH8p7 zKV&e27f!=*`cab^h)W69+iSy=JUkcB1c|DSk*IRxE~_U>DuCw#!iC`hx-q-8V1G+14Z;7 zA=@}srWqqR=zXkW*ISwZ5{-Z^;d@ytk=+W6XOZme?=sH`HUeCft%86A=n)HZoyo=I zoj0f}qeEYri*ne)i)a#P=rI)5T(W4QPYI1)@|f(*o#{`>W>v-p%9Cf8-K!M(sq?xe z18mo!wHIfDeK|9hFjxFaXJkj>x}JK2Kk;@$lJpZs%^qcqSJ LGewZ|Dd+zJTJOw2 literal 0 HcmV?d00001 diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/_pyrsistent_version.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/_pyrsistent_version.py new file mode 100755 index 00000000..b6991384 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/_pyrsistent_version.py @@ -0,0 +1 @@ +__version__ = '0.19.3' diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/_yaml/__init__.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/_yaml/__init__.py new file mode 100755 index 00000000..7baa8c4b --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/_yaml/__init__.py @@ -0,0 +1,33 @@ +# This is a stub package designed to roughly emulate the _yaml +# extension module, which previously existed as a standalone module +# and has been moved into the `yaml` package namespace. +# It does not perfectly mimic its old counterpart, but should get +# close enough for anyone who's relying on it even when they shouldn't. +import yaml + +# in some circumstances, the yaml module we imoprted may be from a different version, so we need +# to tread carefully when poking at it here (it may not have the attributes we expect) +if not getattr(yaml, '__with_libyaml__', False): + from sys import version_info + + exc = ModuleNotFoundError if version_info >= (3, 6) else ImportError + raise exc("No module named '_yaml'") +else: + from yaml._yaml import * + import warnings + warnings.warn( + 'The _yaml extension module is now located at yaml._yaml' + ' and its location is subject to change. To use the' + ' LibYAML-based parser and emitter, import from `yaml`:' + ' `from yaml import CLoader as Loader, CDumper as Dumper`.', + DeprecationWarning + ) + del warnings + # Don't `del yaml` here because yaml is actually an existing + # namespace member of _yaml. + +__name__ = '_yaml' +# If the module is top-level (i.e. not a part of any specific package) +# then the attribute should be set to ''. +# https://docs.python.org/3.8/library/types.html +__package__ = '' diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/__init__.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/__init__.py new file mode 100755 index 00000000..51b1c255 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/__init__.py @@ -0,0 +1,103 @@ +# SPDX-License-Identifier: MIT + +""" +Classes Without Boilerplate +""" + +from functools import partial +from typing import Callable + +from . import converters, exceptions, filters, setters, validators +from ._cmp import cmp_using +from ._compat import Protocol +from ._config import get_run_validators, set_run_validators +from ._funcs import asdict, assoc, astuple, evolve, has, resolve_types +from ._make import ( + NOTHING, + Attribute, + Converter, + Factory, + attrib, + attrs, + fields, + fields_dict, + make_class, + validate, +) +from ._next_gen import define, field, frozen, mutable +from ._version_info import VersionInfo + + +s = attributes = attrs +ib = attr = attrib +dataclass = partial(attrs, auto_attribs=True) # happy Easter ;) + + +class AttrsInstance(Protocol): + pass + + +__all__ = [ + "Attribute", + "AttrsInstance", + "Converter", + "Factory", + "NOTHING", + "asdict", + "assoc", + "astuple", + "attr", + "attrib", + "attributes", + "attrs", + "cmp_using", + "converters", + "define", + "evolve", + "exceptions", + "field", + "fields", + "fields_dict", + "filters", + "frozen", + "get_run_validators", + "has", + "ib", + "make_class", + "mutable", + "resolve_types", + "s", + "set_run_validators", + "setters", + "validate", + "validators", +] + + +def _make_getattr(mod_name: str) -> Callable: + """ + Create a metadata proxy for packaging information that uses *mod_name* in + its warnings and errors. + """ + + def __getattr__(name: str) -> str: + if name not in ("__version__", "__version_info__"): + msg = f"module {mod_name} has no attribute {name}" + raise AttributeError(msg) + + try: + from importlib.metadata import metadata + except ImportError: + from importlib_metadata import metadata + + meta = metadata("attrs") + + if name == "__version_info__": + return VersionInfo._from_version_string(meta["version"]) + + return meta["version"] + + return __getattr__ + + +__getattr__ = _make_getattr(__name__) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/__init__.pyi b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/__init__.pyi new file mode 100755 index 00000000..6ae0a83d --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/__init__.pyi @@ -0,0 +1,388 @@ +import enum +import sys + +from typing import ( + Any, + Callable, + Generic, + Mapping, + Protocol, + Sequence, + TypeVar, + overload, +) + +# `import X as X` is required to make these public +from . import converters as converters +from . import exceptions as exceptions +from . import filters as filters +from . import setters as setters +from . import validators as validators +from ._cmp import cmp_using as cmp_using +from ._typing_compat import AttrsInstance_ +from ._version_info import VersionInfo +from attrs import ( + define as define, + field as field, + mutable as mutable, + frozen as frozen, + _EqOrderType, + _ValidatorType, + _ConverterType, + _ReprArgType, + _OnSetAttrType, + _OnSetAttrArgType, + _FieldTransformer, + _ValidatorArgType, +) + +if sys.version_info >= (3, 10): + from typing import TypeGuard +else: + from typing_extensions import TypeGuard + +if sys.version_info >= (3, 11): + from typing import dataclass_transform +else: + from typing_extensions import dataclass_transform + +__version__: str +__version_info__: VersionInfo +__title__: str +__description__: str +__url__: str +__uri__: str +__author__: str +__email__: str +__license__: str +__copyright__: str + +_T = TypeVar("_T") +_C = TypeVar("_C", bound=type) + +_FilterType = Callable[["Attribute[_T]", _T], bool] + +# We subclass this here to keep the protocol's qualified name clean. +class AttrsInstance(AttrsInstance_, Protocol): + pass + +_A = TypeVar("_A", bound=type[AttrsInstance]) + +class _Nothing(enum.Enum): + NOTHING = enum.auto() + +NOTHING = _Nothing.NOTHING + +# NOTE: Factory lies about its return type to make this possible: +# `x: List[int] # = Factory(list)` +# Work around mypy issue #4554 in the common case by using an overload. +if sys.version_info >= (3, 8): + from typing import Literal + @overload + def Factory(factory: Callable[[], _T]) -> _T: ... + @overload + def Factory( + factory: Callable[[Any], _T], + takes_self: Literal[True], + ) -> _T: ... + @overload + def Factory( + factory: Callable[[], _T], + takes_self: Literal[False], + ) -> _T: ... + +else: + @overload + def Factory(factory: Callable[[], _T]) -> _T: ... + @overload + def Factory( + factory: Union[Callable[[Any], _T], Callable[[], _T]], + takes_self: bool = ..., + ) -> _T: ... + +In = TypeVar("In") +Out = TypeVar("Out") + +class Converter(Generic[In, Out]): + @overload + def __init__(self, converter: Callable[[In], Out]) -> None: ... + @overload + def __init__( + self, + converter: Callable[[In, AttrsInstance, Attribute], Out], + *, + takes_self: Literal[True], + takes_field: Literal[True], + ) -> None: ... + @overload + def __init__( + self, + converter: Callable[[In, Attribute], Out], + *, + takes_field: Literal[True], + ) -> None: ... + @overload + def __init__( + self, + converter: Callable[[In, AttrsInstance], Out], + *, + takes_self: Literal[True], + ) -> None: ... + +class Attribute(Generic[_T]): + name: str + default: _T | None + validator: _ValidatorType[_T] | None + repr: _ReprArgType + cmp: _EqOrderType + eq: _EqOrderType + order: _EqOrderType + hash: bool | None + init: bool + converter: _ConverterType | Converter[Any, _T] | None + metadata: dict[Any, Any] + type: type[_T] | None + kw_only: bool + on_setattr: _OnSetAttrType + alias: str | None + + def evolve(self, **changes: Any) -> "Attribute[Any]": ... + +# NOTE: We had several choices for the annotation to use for type arg: +# 1) Type[_T] +# - Pros: Handles simple cases correctly +# - Cons: Might produce less informative errors in the case of conflicting +# TypeVars e.g. `attr.ib(default='bad', type=int)` +# 2) Callable[..., _T] +# - Pros: Better error messages than #1 for conflicting TypeVars +# - Cons: Terrible error messages for validator checks. +# e.g. attr.ib(type=int, validator=validate_str) +# -> error: Cannot infer function type argument +# 3) type (and do all of the work in the mypy plugin) +# - Pros: Simple here, and we could customize the plugin with our own errors. +# - Cons: Would need to write mypy plugin code to handle all the cases. +# We chose option #1. + +# `attr` lies about its return type to make the following possible: +# attr() -> Any +# attr(8) -> int +# attr(validator=) -> Whatever the callable expects. +# This makes this type of assignments possible: +# x: int = attr(8) +# +# This form catches explicit None or no default but with no other arguments +# returns Any. +@overload +def attrib( + default: None = ..., + validator: None = ..., + repr: _ReprArgType = ..., + cmp: _EqOrderType | None = ..., + hash: bool | None = ..., + init: bool = ..., + metadata: Mapping[Any, Any] | None = ..., + type: None = ..., + converter: None = ..., + factory: None = ..., + kw_only: bool = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., +) -> Any: ... + +# This form catches an explicit None or no default and infers the type from the +# other arguments. +@overload +def attrib( + default: None = ..., + validator: _ValidatorArgType[_T] | None = ..., + repr: _ReprArgType = ..., + cmp: _EqOrderType | None = ..., + hash: bool | None = ..., + init: bool = ..., + metadata: Mapping[Any, Any] | None = ..., + type: type[_T] | None = ..., + converter: _ConverterType | Converter[Any, _T] | None = ..., + factory: Callable[[], _T] | None = ..., + kw_only: bool = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., +) -> _T: ... + +# This form catches an explicit default argument. +@overload +def attrib( + default: _T, + validator: _ValidatorArgType[_T] | None = ..., + repr: _ReprArgType = ..., + cmp: _EqOrderType | None = ..., + hash: bool | None = ..., + init: bool = ..., + metadata: Mapping[Any, Any] | None = ..., + type: type[_T] | None = ..., + converter: _ConverterType | Converter[Any, _T] | None = ..., + factory: Callable[[], _T] | None = ..., + kw_only: bool = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., +) -> _T: ... + +# This form covers type=non-Type: e.g. forward references (str), Any +@overload +def attrib( + default: _T | None = ..., + validator: _ValidatorArgType[_T] | None = ..., + repr: _ReprArgType = ..., + cmp: _EqOrderType | None = ..., + hash: bool | None = ..., + init: bool = ..., + metadata: Mapping[Any, Any] | None = ..., + type: object = ..., + converter: _ConverterType | Converter[Any, _T] | None = ..., + factory: Callable[[], _T] | None = ..., + kw_only: bool = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., +) -> Any: ... +@overload +@dataclass_transform(order_default=True, field_specifiers=(attrib, field)) +def attrs( + maybe_cls: _C, + these: dict[str, Any] | None = ..., + repr_ns: str | None = ..., + repr: bool = ..., + cmp: _EqOrderType | None = ..., + hash: bool | None = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., + auto_exc: bool = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + auto_detect: bool = ..., + collect_by_mro: bool = ..., + getstate_setstate: bool | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + field_transformer: _FieldTransformer | None = ..., + match_args: bool = ..., + unsafe_hash: bool | None = ..., +) -> _C: ... +@overload +@dataclass_transform(order_default=True, field_specifiers=(attrib, field)) +def attrs( + maybe_cls: None = ..., + these: dict[str, Any] | None = ..., + repr_ns: str | None = ..., + repr: bool = ..., + cmp: _EqOrderType | None = ..., + hash: bool | None = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., + auto_exc: bool = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + auto_detect: bool = ..., + collect_by_mro: bool = ..., + getstate_setstate: bool | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + field_transformer: _FieldTransformer | None = ..., + match_args: bool = ..., + unsafe_hash: bool | None = ..., +) -> Callable[[_C], _C]: ... +def fields(cls: type[AttrsInstance]) -> Any: ... +def fields_dict(cls: type[AttrsInstance]) -> dict[str, Attribute[Any]]: ... +def validate(inst: AttrsInstance) -> None: ... +def resolve_types( + cls: _A, + globalns: dict[str, Any] | None = ..., + localns: dict[str, Any] | None = ..., + attribs: list[Attribute[Any]] | None = ..., + include_extras: bool = ..., +) -> _A: ... + +# TODO: add support for returning a proper attrs class from the mypy plugin +# we use Any instead of _CountingAttr so that e.g. `make_class('Foo', +# [attr.ib()])` is valid +def make_class( + name: str, + attrs: list[str] | tuple[str, ...] | dict[str, Any], + bases: tuple[type, ...] = ..., + class_body: dict[str, Any] | None = ..., + repr_ns: str | None = ..., + repr: bool = ..., + cmp: _EqOrderType | None = ..., + hash: bool | None = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., + auto_exc: bool = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + collect_by_mro: bool = ..., + on_setattr: _OnSetAttrArgType | None = ..., + field_transformer: _FieldTransformer | None = ..., +) -> type: ... + +# _funcs -- + +# TODO: add support for returning TypedDict from the mypy plugin +# FIXME: asdict/astuple do not honor their factory args. Waiting on one of +# these: +# https://github.com/python/mypy/issues/4236 +# https://github.com/python/typing/issues/253 +# XXX: remember to fix attrs.asdict/astuple too! +def asdict( + inst: AttrsInstance, + recurse: bool = ..., + filter: _FilterType[Any] | None = ..., + dict_factory: type[Mapping[Any, Any]] = ..., + retain_collection_types: bool = ..., + value_serializer: Callable[[type, Attribute[Any], Any], Any] | None = ..., + tuple_keys: bool | None = ..., +) -> dict[str, Any]: ... + +# TODO: add support for returning NamedTuple from the mypy plugin +def astuple( + inst: AttrsInstance, + recurse: bool = ..., + filter: _FilterType[Any] | None = ..., + tuple_factory: type[Sequence[Any]] = ..., + retain_collection_types: bool = ..., +) -> tuple[Any, ...]: ... +def has(cls: type) -> TypeGuard[type[AttrsInstance]]: ... +def assoc(inst: _T, **changes: Any) -> _T: ... +def evolve(inst: _T, **changes: Any) -> _T: ... + +# _config -- + +def set_run_validators(run: bool) -> None: ... +def get_run_validators() -> bool: ... + +# aliases -- + +s = attributes = attrs +ib = attr = attrib +dataclass = attrs # Technically, partial(attrs, auto_attribs=True) ;) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/_cmp.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/_cmp.py new file mode 100755 index 00000000..f367bb3a --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/_cmp.py @@ -0,0 +1,160 @@ +# SPDX-License-Identifier: MIT + + +import functools +import types + +from ._make import _make_ne + + +_operation_names = {"eq": "==", "lt": "<", "le": "<=", "gt": ">", "ge": ">="} + + +def cmp_using( + eq=None, + lt=None, + le=None, + gt=None, + ge=None, + require_same_type=True, + class_name="Comparable", +): + """ + Create a class that can be passed into `attrs.field`'s ``eq``, ``order``, + and ``cmp`` arguments to customize field comparison. + + The resulting class will have a full set of ordering methods if at least + one of ``{lt, le, gt, ge}`` and ``eq`` are provided. + + Args: + eq (typing.Callable | None): + Callable used to evaluate equality of two objects. + + lt (typing.Callable | None): + Callable used to evaluate whether one object is less than another + object. + + le (typing.Callable | None): + Callable used to evaluate whether one object is less than or equal + to another object. + + gt (typing.Callable | None): + Callable used to evaluate whether one object is greater than + another object. + + ge (typing.Callable | None): + Callable used to evaluate whether one object is greater than or + equal to another object. + + require_same_type (bool): + When `True`, equality and ordering methods will return + `NotImplemented` if objects are not of the same type. + + class_name (str | None): Name of class. Defaults to "Comparable". + + See `comparison` for more details. + + .. versionadded:: 21.1.0 + """ + + body = { + "__slots__": ["value"], + "__init__": _make_init(), + "_requirements": [], + "_is_comparable_to": _is_comparable_to, + } + + # Add operations. + num_order_functions = 0 + has_eq_function = False + + if eq is not None: + has_eq_function = True + body["__eq__"] = _make_operator("eq", eq) + body["__ne__"] = _make_ne() + + if lt is not None: + num_order_functions += 1 + body["__lt__"] = _make_operator("lt", lt) + + if le is not None: + num_order_functions += 1 + body["__le__"] = _make_operator("le", le) + + if gt is not None: + num_order_functions += 1 + body["__gt__"] = _make_operator("gt", gt) + + if ge is not None: + num_order_functions += 1 + body["__ge__"] = _make_operator("ge", ge) + + type_ = types.new_class( + class_name, (object,), {}, lambda ns: ns.update(body) + ) + + # Add same type requirement. + if require_same_type: + type_._requirements.append(_check_same_type) + + # Add total ordering if at least one operation was defined. + if 0 < num_order_functions < 4: + if not has_eq_function: + # functools.total_ordering requires __eq__ to be defined, + # so raise early error here to keep a nice stack. + msg = "eq must be define is order to complete ordering from lt, le, gt, ge." + raise ValueError(msg) + type_ = functools.total_ordering(type_) + + return type_ + + +def _make_init(): + """ + Create __init__ method. + """ + + def __init__(self, value): + """ + Initialize object with *value*. + """ + self.value = value + + return __init__ + + +def _make_operator(name, func): + """ + Create operator method. + """ + + def method(self, other): + if not self._is_comparable_to(other): + return NotImplemented + + result = func(self.value, other.value) + if result is NotImplemented: + return NotImplemented + + return result + + method.__name__ = f"__{name}__" + method.__doc__ = ( + f"Return a {_operation_names[name]} b. Computed by attrs." + ) + + return method + + +def _is_comparable_to(self, other): + """ + Check whether `other` is comparable to `self`. + """ + return all(func(self, other) for func in self._requirements) + + +def _check_same_type(self, other): + """ + Return True if *self* and *other* are of the same type, False otherwise. + """ + return other.value.__class__ is self.value.__class__ diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/_cmp.pyi b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/_cmp.pyi new file mode 100755 index 00000000..cc7893b0 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/_cmp.pyi @@ -0,0 +1,13 @@ +from typing import Any, Callable + +_CompareWithType = Callable[[Any, Any], bool] + +def cmp_using( + eq: _CompareWithType | None = ..., + lt: _CompareWithType | None = ..., + le: _CompareWithType | None = ..., + gt: _CompareWithType | None = ..., + ge: _CompareWithType | None = ..., + require_same_type: bool = ..., + class_name: str = ..., +) -> type: ... diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/_compat.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/_compat.py new file mode 100755 index 00000000..104eeb07 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/_compat.py @@ -0,0 +1,103 @@ +# SPDX-License-Identifier: MIT + +import inspect +import platform +import sys +import threading + +from collections.abc import Mapping, Sequence # noqa: F401 +from typing import _GenericAlias + + +PYPY = platform.python_implementation() == "PyPy" +PY_3_8_PLUS = sys.version_info[:2] >= (3, 8) +PY_3_9_PLUS = sys.version_info[:2] >= (3, 9) +PY_3_10_PLUS = sys.version_info[:2] >= (3, 10) +PY_3_11_PLUS = sys.version_info[:2] >= (3, 11) +PY_3_12_PLUS = sys.version_info[:2] >= (3, 12) +PY_3_13_PLUS = sys.version_info[:2] >= (3, 13) +PY_3_14_PLUS = sys.version_info[:2] >= (3, 14) + + +if sys.version_info < (3, 8): + try: + from typing_extensions import Protocol + except ImportError: # pragma: no cover + Protocol = object +else: + from typing import Protocol # noqa: F401 + +if PY_3_14_PLUS: # pragma: no cover + import annotationlib + + _get_annotations = annotationlib.get_annotations + +else: + + def _get_annotations(cls): + """ + Get annotations for *cls*. + """ + return cls.__dict__.get("__annotations__", {}) + + +class _AnnotationExtractor: + """ + Extract type annotations from a callable, returning None whenever there + is none. + """ + + __slots__ = ["sig"] + + def __init__(self, callable): + try: + self.sig = inspect.signature(callable) + except (ValueError, TypeError): # inspect failed + self.sig = None + + def get_first_param_type(self): + """ + Return the type annotation of the first argument if it's not empty. + """ + if not self.sig: + return None + + params = list(self.sig.parameters.values()) + if params and params[0].annotation is not inspect.Parameter.empty: + return params[0].annotation + + return None + + def get_return_type(self): + """ + Return the return type if it's not empty. + """ + if ( + self.sig + and self.sig.return_annotation is not inspect.Signature.empty + ): + return self.sig.return_annotation + + return None + + +# Thread-local global to track attrs instances which are already being repr'd. +# This is needed because there is no other (thread-safe) way to pass info +# about the instances that are already being repr'd through the call stack +# in order to ensure we don't perform infinite recursion. +# +# For instance, if an instance contains a dict which contains that instance, +# we need to know that we're already repr'ing the outside instance from within +# the dict's repr() call. +# +# This lives here rather than in _make.py so that the functions in _make.py +# don't have a direct reference to the thread-local in their globals dict. +# If they have such a reference, it breaks cloudpickle. +repr_context = threading.local() + + +def get_generic_base(cl): + """If this is a generic class (A[str]), return the generic base for it.""" + if cl.__class__ is _GenericAlias: + return cl.__origin__ + return None diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/_config.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/_config.py new file mode 100755 index 00000000..9c245b14 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/_config.py @@ -0,0 +1,31 @@ +# SPDX-License-Identifier: MIT + +__all__ = ["set_run_validators", "get_run_validators"] + +_run_validators = True + + +def set_run_validators(run): + """ + Set whether or not validators are run. By default, they are run. + + .. deprecated:: 21.3.0 It will not be removed, but it also will not be + moved to new ``attrs`` namespace. Use `attrs.validators.set_disabled()` + instead. + """ + if not isinstance(run, bool): + msg = "'run' must be bool." + raise TypeError(msg) + global _run_validators + _run_validators = run + + +def get_run_validators(): + """ + Return whether or not validators are run. + + .. deprecated:: 21.3.0 It will not be removed, but it also will not be + moved to new ``attrs`` namespace. Use `attrs.validators.get_disabled()` + instead. + """ + return _run_validators diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/_funcs.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/_funcs.py new file mode 100755 index 00000000..355cef44 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/_funcs.py @@ -0,0 +1,522 @@ +# SPDX-License-Identifier: MIT + + +import copy + +from ._compat import PY_3_9_PLUS, get_generic_base +from ._make import _OBJ_SETATTR, NOTHING, fields +from .exceptions import AttrsAttributeNotFoundError + + +def asdict( + inst, + recurse=True, + filter=None, + dict_factory=dict, + retain_collection_types=False, + value_serializer=None, +): + """ + Return the *attrs* attribute values of *inst* as a dict. + + Optionally recurse into other *attrs*-decorated classes. + + Args: + inst: Instance of an *attrs*-decorated class. + + recurse (bool): Recurse into classes that are also *attrs*-decorated. + + filter (~typing.Callable): + A callable whose return code determines whether an attribute or + element is included (`True`) or dropped (`False`). Is called with + the `attrs.Attribute` as the first argument and the value as the + second argument. + + dict_factory (~typing.Callable): + A callable to produce dictionaries from. For example, to produce + ordered dictionaries instead of normal Python dictionaries, pass in + ``collections.OrderedDict``. + + retain_collection_types (bool): + Do not convert to `list` when encountering an attribute whose type + is `tuple` or `set`. Only meaningful if *recurse* is `True`. + + value_serializer (typing.Callable | None): + A hook that is called for every attribute or dict key/value. It + receives the current instance, field and value and must return the + (updated) value. The hook is run *after* the optional *filter* has + been applied. + + Returns: + Return type of *dict_factory*. + + Raises: + attrs.exceptions.NotAnAttrsClassError: + If *cls* is not an *attrs* class. + + .. versionadded:: 16.0.0 *dict_factory* + .. versionadded:: 16.1.0 *retain_collection_types* + .. versionadded:: 20.3.0 *value_serializer* + .. versionadded:: 21.3.0 + If a dict has a collection for a key, it is serialized as a tuple. + """ + attrs = fields(inst.__class__) + rv = dict_factory() + for a in attrs: + v = getattr(inst, a.name) + if filter is not None and not filter(a, v): + continue + + if value_serializer is not None: + v = value_serializer(inst, a, v) + + if recurse is True: + if has(v.__class__): + rv[a.name] = asdict( + v, + recurse=True, + filter=filter, + dict_factory=dict_factory, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ) + elif isinstance(v, (tuple, list, set, frozenset)): + cf = v.__class__ if retain_collection_types is True else list + items = [ + _asdict_anything( + i, + is_key=False, + filter=filter, + dict_factory=dict_factory, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ) + for i in v + ] + try: + rv[a.name] = cf(items) + except TypeError: + if not issubclass(cf, tuple): + raise + # Workaround for TypeError: cf.__new__() missing 1 required + # positional argument (which appears, for a namedturle) + rv[a.name] = cf(*items) + elif isinstance(v, dict): + df = dict_factory + rv[a.name] = df( + ( + _asdict_anything( + kk, + is_key=True, + filter=filter, + dict_factory=df, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ), + _asdict_anything( + vv, + is_key=False, + filter=filter, + dict_factory=df, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ), + ) + for kk, vv in v.items() + ) + else: + rv[a.name] = v + else: + rv[a.name] = v + return rv + + +def _asdict_anything( + val, + is_key, + filter, + dict_factory, + retain_collection_types, + value_serializer, +): + """ + ``asdict`` only works on attrs instances, this works on anything. + """ + if getattr(val.__class__, "__attrs_attrs__", None) is not None: + # Attrs class. + rv = asdict( + val, + recurse=True, + filter=filter, + dict_factory=dict_factory, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ) + elif isinstance(val, (tuple, list, set, frozenset)): + if retain_collection_types is True: + cf = val.__class__ + elif is_key: + cf = tuple + else: + cf = list + + rv = cf( + [ + _asdict_anything( + i, + is_key=False, + filter=filter, + dict_factory=dict_factory, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ) + for i in val + ] + ) + elif isinstance(val, dict): + df = dict_factory + rv = df( + ( + _asdict_anything( + kk, + is_key=True, + filter=filter, + dict_factory=df, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ), + _asdict_anything( + vv, + is_key=False, + filter=filter, + dict_factory=df, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ), + ) + for kk, vv in val.items() + ) + else: + rv = val + if value_serializer is not None: + rv = value_serializer(None, None, rv) + + return rv + + +def astuple( + inst, + recurse=True, + filter=None, + tuple_factory=tuple, + retain_collection_types=False, +): + """ + Return the *attrs* attribute values of *inst* as a tuple. + + Optionally recurse into other *attrs*-decorated classes. + + Args: + inst: Instance of an *attrs*-decorated class. + + recurse (bool): + Recurse into classes that are also *attrs*-decorated. + + filter (~typing.Callable): + A callable whose return code determines whether an attribute or + element is included (`True`) or dropped (`False`). Is called with + the `attrs.Attribute` as the first argument and the value as the + second argument. + + tuple_factory (~typing.Callable): + A callable to produce tuples from. For example, to produce lists + instead of tuples. + + retain_collection_types (bool): + Do not convert to `list` or `dict` when encountering an attribute + which type is `tuple`, `dict` or `set`. Only meaningful if + *recurse* is `True`. + + Returns: + Return type of *tuple_factory* + + Raises: + attrs.exceptions.NotAnAttrsClassError: + If *cls* is not an *attrs* class. + + .. versionadded:: 16.2.0 + """ + attrs = fields(inst.__class__) + rv = [] + retain = retain_collection_types # Very long. :/ + for a in attrs: + v = getattr(inst, a.name) + if filter is not None and not filter(a, v): + continue + if recurse is True: + if has(v.__class__): + rv.append( + astuple( + v, + recurse=True, + filter=filter, + tuple_factory=tuple_factory, + retain_collection_types=retain, + ) + ) + elif isinstance(v, (tuple, list, set, frozenset)): + cf = v.__class__ if retain is True else list + items = [ + ( + astuple( + j, + recurse=True, + filter=filter, + tuple_factory=tuple_factory, + retain_collection_types=retain, + ) + if has(j.__class__) + else j + ) + for j in v + ] + try: + rv.append(cf(items)) + except TypeError: + if not issubclass(cf, tuple): + raise + # Workaround for TypeError: cf.__new__() missing 1 required + # positional argument (which appears, for a namedturle) + rv.append(cf(*items)) + elif isinstance(v, dict): + df = v.__class__ if retain is True else dict + rv.append( + df( + ( + ( + astuple( + kk, + tuple_factory=tuple_factory, + retain_collection_types=retain, + ) + if has(kk.__class__) + else kk + ), + ( + astuple( + vv, + tuple_factory=tuple_factory, + retain_collection_types=retain, + ) + if has(vv.__class__) + else vv + ), + ) + for kk, vv in v.items() + ) + ) + else: + rv.append(v) + else: + rv.append(v) + + return rv if tuple_factory is list else tuple_factory(rv) + + +def has(cls): + """ + Check whether *cls* is a class with *attrs* attributes. + + Args: + cls (type): Class to introspect. + + Raises: + TypeError: If *cls* is not a class. + + Returns: + bool: + """ + attrs = getattr(cls, "__attrs_attrs__", None) + if attrs is not None: + return True + + # No attrs, maybe it's a specialized generic (A[str])? + generic_base = get_generic_base(cls) + if generic_base is not None: + generic_attrs = getattr(generic_base, "__attrs_attrs__", None) + if generic_attrs is not None: + # Stick it on here for speed next time. + cls.__attrs_attrs__ = generic_attrs + return generic_attrs is not None + return False + + +def assoc(inst, **changes): + """ + Copy *inst* and apply *changes*. + + This is different from `evolve` that applies the changes to the arguments + that create the new instance. + + `evolve`'s behavior is preferable, but there are `edge cases`_ where it + doesn't work. Therefore `assoc` is deprecated, but will not be removed. + + .. _`edge cases`: https://github.com/python-attrs/attrs/issues/251 + + Args: + inst: Instance of a class with *attrs* attributes. + + changes: Keyword changes in the new copy. + + Returns: + A copy of inst with *changes* incorporated. + + Raises: + attrs.exceptions.AttrsAttributeNotFoundError: + If *attr_name* couldn't be found on *cls*. + + attrs.exceptions.NotAnAttrsClassError: + If *cls* is not an *attrs* class. + + .. deprecated:: 17.1.0 + Use `attrs.evolve` instead if you can. This function will not be + removed du to the slightly different approach compared to + `attrs.evolve`, though. + """ + new = copy.copy(inst) + attrs = fields(inst.__class__) + for k, v in changes.items(): + a = getattr(attrs, k, NOTHING) + if a is NOTHING: + msg = f"{k} is not an attrs attribute on {new.__class__}." + raise AttrsAttributeNotFoundError(msg) + _OBJ_SETATTR(new, k, v) + return new + + +def evolve(*args, **changes): + """ + Create a new instance, based on the first positional argument with + *changes* applied. + + Args: + + inst: + Instance of a class with *attrs* attributes. *inst* must be passed + as a positional argument. + + changes: + Keyword changes in the new copy. + + Returns: + A copy of inst with *changes* incorporated. + + Raises: + TypeError: + If *attr_name* couldn't be found in the class ``__init__``. + + attrs.exceptions.NotAnAttrsClassError: + If *cls* is not an *attrs* class. + + .. versionadded:: 17.1.0 + .. deprecated:: 23.1.0 + It is now deprecated to pass the instance using the keyword argument + *inst*. It will raise a warning until at least April 2024, after which + it will become an error. Always pass the instance as a positional + argument. + .. versionchanged:: 24.1.0 + *inst* can't be passed as a keyword argument anymore. + """ + try: + (inst,) = args + except ValueError: + msg = ( + f"evolve() takes 1 positional argument, but {len(args)} were given" + ) + raise TypeError(msg) from None + + cls = inst.__class__ + attrs = fields(cls) + for a in attrs: + if not a.init: + continue + attr_name = a.name # To deal with private attributes. + init_name = a.alias + if init_name not in changes: + changes[init_name] = getattr(inst, attr_name) + + return cls(**changes) + + +def resolve_types( + cls, globalns=None, localns=None, attribs=None, include_extras=True +): + """ + Resolve any strings and forward annotations in type annotations. + + This is only required if you need concrete types in :class:`Attribute`'s + *type* field. In other words, you don't need to resolve your types if you + only use them for static type checking. + + With no arguments, names will be looked up in the module in which the class + was created. If this is not what you want, for example, if the name only + exists inside a method, you may pass *globalns* or *localns* to specify + other dictionaries in which to look up these names. See the docs of + `typing.get_type_hints` for more details. + + Args: + cls (type): Class to resolve. + + globalns (dict | None): Dictionary containing global variables. + + localns (dict | None): Dictionary containing local variables. + + attribs (list | None): + List of attribs for the given class. This is necessary when calling + from inside a ``field_transformer`` since *cls* is not an *attrs* + class yet. + + include_extras (bool): + Resolve more accurately, if possible. Pass ``include_extras`` to + ``typing.get_hints``, if supported by the typing module. On + supported Python versions (3.9+), this resolves the types more + accurately. + + Raises: + TypeError: If *cls* is not a class. + + attrs.exceptions.NotAnAttrsClassError: + If *cls* is not an *attrs* class and you didn't pass any attribs. + + NameError: If types cannot be resolved because of missing variables. + + Returns: + *cls* so you can use this function also as a class decorator. Please + note that you have to apply it **after** `attrs.define`. That means the + decorator has to come in the line **before** `attrs.define`. + + .. versionadded:: 20.1.0 + .. versionadded:: 21.1.0 *attribs* + .. versionadded:: 23.1.0 *include_extras* + """ + # Since calling get_type_hints is expensive we cache whether we've + # done it already. + if getattr(cls, "__attrs_types_resolved__", None) != cls: + import typing + + kwargs = {"globalns": globalns, "localns": localns} + + if PY_3_9_PLUS: + kwargs["include_extras"] = include_extras + + hints = typing.get_type_hints(cls, **kwargs) + for field in fields(cls) if attribs is None else attribs: + if field.name in hints: + # Since fields have been frozen we must work around it. + _OBJ_SETATTR(field, "type", hints[field.name]) + # We store the class we resolved so that subclasses know they haven't + # been resolved. + cls.__attrs_types_resolved__ = cls + + # Return the class so you can use it as a decorator too. + return cls diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/_make.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/_make.py new file mode 100755 index 00000000..bf00c5f8 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/_make.py @@ -0,0 +1,2960 @@ +# SPDX-License-Identifier: MIT + +from __future__ import annotations + +import abc +import contextlib +import copy +import enum +import functools +import inspect +import itertools +import linecache +import sys +import types +import typing + +from operator import itemgetter + +# We need to import _compat itself in addition to the _compat members to avoid +# having the thread-local in the globals here. +from . import _compat, _config, setters +from ._compat import ( + PY_3_8_PLUS, + PY_3_10_PLUS, + PY_3_11_PLUS, + _AnnotationExtractor, + _get_annotations, + get_generic_base, +) +from .exceptions import ( + DefaultAlreadySetError, + FrozenInstanceError, + NotAnAttrsClassError, + UnannotatedAttributeError, +) + + +# This is used at least twice, so cache it here. +_OBJ_SETATTR = object.__setattr__ +_INIT_FACTORY_PAT = "__attr_factory_%s" +_CLASSVAR_PREFIXES = ( + "typing.ClassVar", + "t.ClassVar", + "ClassVar", + "typing_extensions.ClassVar", +) +# we don't use a double-underscore prefix because that triggers +# name mangling when trying to create a slot for the field +# (when slots=True) +_HASH_CACHE_FIELD = "_attrs_cached_hash" + +_EMPTY_METADATA_SINGLETON = types.MappingProxyType({}) + +# Unique object for unequivocal getattr() defaults. +_SENTINEL = object() + +_DEFAULT_ON_SETATTR = setters.pipe(setters.convert, setters.validate) + + +class _Nothing(enum.Enum): + """ + Sentinel to indicate the lack of a value when `None` is ambiguous. + + If extending attrs, you can use ``typing.Literal[NOTHING]`` to show + that a value may be ``NOTHING``. + + .. versionchanged:: 21.1.0 ``bool(NOTHING)`` is now False. + .. versionchanged:: 22.2.0 ``NOTHING`` is now an ``enum.Enum`` variant. + """ + + NOTHING = enum.auto() + + def __repr__(self): + return "NOTHING" + + def __bool__(self): + return False + + +NOTHING = _Nothing.NOTHING +""" +Sentinel to indicate the lack of a value when `None` is ambiguous. +""" + + +class _CacheHashWrapper(int): + """ + An integer subclass that pickles / copies as None + + This is used for non-slots classes with ``cache_hash=True``, to avoid + serializing a potentially (even likely) invalid hash value. Since `None` + is the default value for uncalculated hashes, whenever this is copied, + the copy's value for the hash should automatically reset. + + See GH #613 for more details. + """ + + def __reduce__(self, _none_constructor=type(None), _args=()): # noqa: B008 + return _none_constructor, _args + + +def attrib( + default=NOTHING, + validator=None, + repr=True, + cmp=None, + hash=None, + init=True, + metadata=None, + type=None, + converter=None, + factory=None, + kw_only=False, + eq=None, + order=None, + on_setattr=None, + alias=None, +): + """ + Create a new field / attribute on a class. + + Identical to `attrs.field`, except it's not keyword-only. + + Consider using `attrs.field` in new code (``attr.ib`` will *never* go away, + though). + + .. warning:: + + Does **nothing** unless the class is also decorated with + `attr.s` (or similar)! + + + .. versionadded:: 15.2.0 *convert* + .. versionadded:: 16.3.0 *metadata* + .. versionchanged:: 17.1.0 *validator* can be a ``list`` now. + .. versionchanged:: 17.1.0 + *hash* is `None` and therefore mirrors *eq* by default. + .. versionadded:: 17.3.0 *type* + .. deprecated:: 17.4.0 *convert* + .. versionadded:: 17.4.0 + *converter* as a replacement for the deprecated *convert* to achieve + consistency with other noun-based arguments. + .. versionadded:: 18.1.0 + ``factory=f`` is syntactic sugar for ``default=attr.Factory(f)``. + .. versionadded:: 18.2.0 *kw_only* + .. versionchanged:: 19.2.0 *convert* keyword argument removed. + .. versionchanged:: 19.2.0 *repr* also accepts a custom callable. + .. deprecated:: 19.2.0 *cmp* Removal on or after 2021-06-01. + .. versionadded:: 19.2.0 *eq* and *order* + .. versionadded:: 20.1.0 *on_setattr* + .. versionchanged:: 20.3.0 *kw_only* backported to Python 2 + .. versionchanged:: 21.1.0 + *eq*, *order*, and *cmp* also accept a custom callable + .. versionchanged:: 21.1.0 *cmp* undeprecated + .. versionadded:: 22.2.0 *alias* + """ + eq, eq_key, order, order_key = _determine_attrib_eq_order( + cmp, eq, order, True + ) + + if hash is not None and hash is not True and hash is not False: + msg = "Invalid value for hash. Must be True, False, or None." + raise TypeError(msg) + + if factory is not None: + if default is not NOTHING: + msg = ( + "The `default` and `factory` arguments are mutually exclusive." + ) + raise ValueError(msg) + if not callable(factory): + msg = "The `factory` argument must be a callable." + raise ValueError(msg) + default = Factory(factory) + + if metadata is None: + metadata = {} + + # Apply syntactic sugar by auto-wrapping. + if isinstance(on_setattr, (list, tuple)): + on_setattr = setters.pipe(*on_setattr) + + if validator and isinstance(validator, (list, tuple)): + validator = and_(*validator) + + if converter and isinstance(converter, (list, tuple)): + converter = pipe(*converter) + + return _CountingAttr( + default=default, + validator=validator, + repr=repr, + cmp=None, + hash=hash, + init=init, + converter=converter, + metadata=metadata, + type=type, + kw_only=kw_only, + eq=eq, + eq_key=eq_key, + order=order, + order_key=order_key, + on_setattr=on_setattr, + alias=alias, + ) + + +def _compile_and_eval(script, globs, locs=None, filename=""): + """ + Evaluate the script with the given global (globs) and local (locs) + variables. + """ + bytecode = compile(script, filename, "exec") + eval(bytecode, globs, locs) + + +def _make_method(name, script, filename, globs, locals=None): + """ + Create the method with the script given and return the method object. + """ + locs = {} if locals is None else locals + + # In order of debuggers like PDB being able to step through the code, + # we add a fake linecache entry. + count = 1 + base_filename = filename + while True: + linecache_tuple = ( + len(script), + None, + script.splitlines(True), + filename, + ) + old_val = linecache.cache.setdefault(filename, linecache_tuple) + if old_val == linecache_tuple: + break + + filename = f"{base_filename[:-1]}-{count}>" + count += 1 + + _compile_and_eval(script, globs, locs, filename) + + return locs[name] + + +def _make_attr_tuple_class(cls_name, attr_names): + """ + Create a tuple subclass to hold `Attribute`s for an `attrs` class. + + The subclass is a bare tuple with properties for names. + + class MyClassAttributes(tuple): + __slots__ = () + x = property(itemgetter(0)) + """ + attr_class_name = f"{cls_name}Attributes" + attr_class_template = [ + f"class {attr_class_name}(tuple):", + " __slots__ = ()", + ] + if attr_names: + for i, attr_name in enumerate(attr_names): + attr_class_template.append( + f" {attr_name} = _attrs_property(_attrs_itemgetter({i}))" + ) + else: + attr_class_template.append(" pass") + globs = {"_attrs_itemgetter": itemgetter, "_attrs_property": property} + _compile_and_eval("\n".join(attr_class_template), globs) + return globs[attr_class_name] + + +# Tuple class for extracted attributes from a class definition. +# `base_attrs` is a subset of `attrs`. +_Attributes = _make_attr_tuple_class( + "_Attributes", + [ + # all attributes to build dunder methods for + "attrs", + # attributes that have been inherited + "base_attrs", + # map inherited attributes to their originating classes + "base_attrs_map", + ], +) + + +def _is_class_var(annot): + """ + Check whether *annot* is a typing.ClassVar. + + The string comparison hack is used to avoid evaluating all string + annotations which would put attrs-based classes at a performance + disadvantage compared to plain old classes. + """ + annot = str(annot) + + # Annotation can be quoted. + if annot.startswith(("'", '"')) and annot.endswith(("'", '"')): + annot = annot[1:-1] + + return annot.startswith(_CLASSVAR_PREFIXES) + + +def _has_own_attribute(cls, attrib_name): + """ + Check whether *cls* defines *attrib_name* (and doesn't just inherit it). + """ + return attrib_name in cls.__dict__ + + +def _collect_base_attrs(cls, taken_attr_names): + """ + Collect attr.ibs from base classes of *cls*, except *taken_attr_names*. + """ + base_attrs = [] + base_attr_map = {} # A dictionary of base attrs to their classes. + + # Traverse the MRO and collect attributes. + for base_cls in reversed(cls.__mro__[1:-1]): + for a in getattr(base_cls, "__attrs_attrs__", []): + if a.inherited or a.name in taken_attr_names: + continue + + a = a.evolve(inherited=True) # noqa: PLW2901 + base_attrs.append(a) + base_attr_map[a.name] = base_cls + + # For each name, only keep the freshest definition i.e. the furthest at the + # back. base_attr_map is fine because it gets overwritten with every new + # instance. + filtered = [] + seen = set() + for a in reversed(base_attrs): + if a.name in seen: + continue + filtered.insert(0, a) + seen.add(a.name) + + return filtered, base_attr_map + + +def _collect_base_attrs_broken(cls, taken_attr_names): + """ + Collect attr.ibs from base classes of *cls*, except *taken_attr_names*. + + N.B. *taken_attr_names* will be mutated. + + Adhere to the old incorrect behavior. + + Notably it collects from the front and considers inherited attributes which + leads to the buggy behavior reported in #428. + """ + base_attrs = [] + base_attr_map = {} # A dictionary of base attrs to their classes. + + # Traverse the MRO and collect attributes. + for base_cls in cls.__mro__[1:-1]: + for a in getattr(base_cls, "__attrs_attrs__", []): + if a.name in taken_attr_names: + continue + + a = a.evolve(inherited=True) # noqa: PLW2901 + taken_attr_names.add(a.name) + base_attrs.append(a) + base_attr_map[a.name] = base_cls + + return base_attrs, base_attr_map + + +def _transform_attrs( + cls, these, auto_attribs, kw_only, collect_by_mro, field_transformer +): + """ + Transform all `_CountingAttr`s on a class into `Attribute`s. + + If *these* is passed, use that and don't look for them on the class. + + If *collect_by_mro* is True, collect them in the correct MRO order, + otherwise use the old -- incorrect -- order. See #428. + + Return an `_Attributes`. + """ + cd = cls.__dict__ + anns = _get_annotations(cls) + + if these is not None: + ca_list = list(these.items()) + elif auto_attribs is True: + ca_names = { + name + for name, attr in cd.items() + if isinstance(attr, _CountingAttr) + } + ca_list = [] + annot_names = set() + for attr_name, type in anns.items(): + if _is_class_var(type): + continue + annot_names.add(attr_name) + a = cd.get(attr_name, NOTHING) + + if not isinstance(a, _CountingAttr): + a = attrib() if a is NOTHING else attrib(default=a) + ca_list.append((attr_name, a)) + + unannotated = ca_names - annot_names + if len(unannotated) > 0: + raise UnannotatedAttributeError( + "The following `attr.ib`s lack a type annotation: " + + ", ".join( + sorted(unannotated, key=lambda n: cd.get(n).counter) + ) + + "." + ) + else: + ca_list = sorted( + ( + (name, attr) + for name, attr in cd.items() + if isinstance(attr, _CountingAttr) + ), + key=lambda e: e[1].counter, + ) + + own_attrs = [ + Attribute.from_counting_attr( + name=attr_name, ca=ca, type=anns.get(attr_name) + ) + for attr_name, ca in ca_list + ] + + if collect_by_mro: + base_attrs, base_attr_map = _collect_base_attrs( + cls, {a.name for a in own_attrs} + ) + else: + base_attrs, base_attr_map = _collect_base_attrs_broken( + cls, {a.name for a in own_attrs} + ) + + if kw_only: + own_attrs = [a.evolve(kw_only=True) for a in own_attrs] + base_attrs = [a.evolve(kw_only=True) for a in base_attrs] + + attrs = base_attrs + own_attrs + + # Mandatory vs non-mandatory attr order only matters when they are part of + # the __init__ signature and when they aren't kw_only (which are moved to + # the end and can be mandatory or non-mandatory in any order, as they will + # be specified as keyword args anyway). Check the order of those attrs: + had_default = False + for a in (a for a in attrs if a.init is not False and a.kw_only is False): + if had_default is True and a.default is NOTHING: + msg = f"No mandatory attributes allowed after an attribute with a default value or factory. Attribute in question: {a!r}" + raise ValueError(msg) + + if had_default is False and a.default is not NOTHING: + had_default = True + + if field_transformer is not None: + attrs = field_transformer(cls, attrs) + + # Resolve default field alias after executing field_transformer. + # This allows field_transformer to differentiate between explicit vs + # default aliases and supply their own defaults. + attrs = [ + a.evolve(alias=_default_init_alias_for(a.name)) if not a.alias else a + for a in attrs + ] + + # Create AttrsClass *after* applying the field_transformer since it may + # add or remove attributes! + attr_names = [a.name for a in attrs] + AttrsClass = _make_attr_tuple_class(cls.__name__, attr_names) + + return _Attributes((AttrsClass(attrs), base_attrs, base_attr_map)) + + +def _make_cached_property_getattr(cached_properties, original_getattr, cls): + lines = [ + # Wrapped to get `__class__` into closure cell for super() + # (It will be replaced with the newly constructed class after construction). + "def wrapper(_cls):", + " __class__ = _cls", + " def __getattr__(self, item, cached_properties=cached_properties, original_getattr=original_getattr, _cached_setattr_get=_cached_setattr_get):", + " func = cached_properties.get(item)", + " if func is not None:", + " result = func(self)", + " _setter = _cached_setattr_get(self)", + " _setter(item, result)", + " return result", + ] + if original_getattr is not None: + lines.append( + " return original_getattr(self, item)", + ) + else: + lines.extend( + [ + " try:", + " return super().__getattribute__(item)", + " except AttributeError:", + " if not hasattr(super(), '__getattr__'):", + " raise", + " return super().__getattr__(item)", + " original_error = f\"'{self.__class__.__name__}' object has no attribute '{item}'\"", + " raise AttributeError(original_error)", + ] + ) + + lines.extend( + [ + " return __getattr__", + "__getattr__ = wrapper(_cls)", + ] + ) + + unique_filename = _generate_unique_filename(cls, "getattr") + + glob = { + "cached_properties": cached_properties, + "_cached_setattr_get": _OBJ_SETATTR.__get__, + "original_getattr": original_getattr, + } + + return _make_method( + "__getattr__", + "\n".join(lines), + unique_filename, + glob, + locals={ + "_cls": cls, + }, + ) + + +def _frozen_setattrs(self, name, value): + """ + Attached to frozen classes as __setattr__. + """ + if isinstance(self, BaseException) and name in ( + "__cause__", + "__context__", + "__traceback__", + ): + BaseException.__setattr__(self, name, value) + return + + raise FrozenInstanceError() + + +def _frozen_delattrs(self, name): + """ + Attached to frozen classes as __delattr__. + """ + raise FrozenInstanceError() + + +class _ClassBuilder: + """ + Iteratively build *one* class. + """ + + __slots__ = ( + "_attr_names", + "_attrs", + "_base_attr_map", + "_base_names", + "_cache_hash", + "_cls", + "_cls_dict", + "_delete_attribs", + "_frozen", + "_has_pre_init", + "_pre_init_has_args", + "_has_post_init", + "_is_exc", + "_on_setattr", + "_slots", + "_weakref_slot", + "_wrote_own_setattr", + "_has_custom_setattr", + ) + + def __init__( + self, + cls, + these, + slots, + frozen, + weakref_slot, + getstate_setstate, + auto_attribs, + kw_only, + cache_hash, + is_exc, + collect_by_mro, + on_setattr, + has_custom_setattr, + field_transformer, + ): + attrs, base_attrs, base_map = _transform_attrs( + cls, + these, + auto_attribs, + kw_only, + collect_by_mro, + field_transformer, + ) + + self._cls = cls + self._cls_dict = dict(cls.__dict__) if slots else {} + self._attrs = attrs + self._base_names = {a.name for a in base_attrs} + self._base_attr_map = base_map + self._attr_names = tuple(a.name for a in attrs) + self._slots = slots + self._frozen = frozen + self._weakref_slot = weakref_slot + self._cache_hash = cache_hash + self._has_pre_init = bool(getattr(cls, "__attrs_pre_init__", False)) + self._pre_init_has_args = False + if self._has_pre_init: + # Check if the pre init method has more arguments than just `self` + # We want to pass arguments if pre init expects arguments + pre_init_func = cls.__attrs_pre_init__ + pre_init_signature = inspect.signature(pre_init_func) + self._pre_init_has_args = len(pre_init_signature.parameters) > 1 + self._has_post_init = bool(getattr(cls, "__attrs_post_init__", False)) + self._delete_attribs = not bool(these) + self._is_exc = is_exc + self._on_setattr = on_setattr + + self._has_custom_setattr = has_custom_setattr + self._wrote_own_setattr = False + + self._cls_dict["__attrs_attrs__"] = self._attrs + + if frozen: + self._cls_dict["__setattr__"] = _frozen_setattrs + self._cls_dict["__delattr__"] = _frozen_delattrs + + self._wrote_own_setattr = True + elif on_setattr in ( + _DEFAULT_ON_SETATTR, + setters.validate, + setters.convert, + ): + has_validator = has_converter = False + for a in attrs: + if a.validator is not None: + has_validator = True + if a.converter is not None: + has_converter = True + + if has_validator and has_converter: + break + if ( + ( + on_setattr == _DEFAULT_ON_SETATTR + and not (has_validator or has_converter) + ) + or (on_setattr == setters.validate and not has_validator) + or (on_setattr == setters.convert and not has_converter) + ): + # If class-level on_setattr is set to convert + validate, but + # there's no field to convert or validate, pretend like there's + # no on_setattr. + self._on_setattr = None + + if getstate_setstate: + ( + self._cls_dict["__getstate__"], + self._cls_dict["__setstate__"], + ) = self._make_getstate_setstate() + + def __repr__(self): + return f"<_ClassBuilder(cls={self._cls.__name__})>" + + def build_class(self): + """ + Finalize class based on the accumulated configuration. + + Builder cannot be used after calling this method. + """ + if self._slots is True: + cls = self._create_slots_class() + else: + cls = self._patch_original_class() + if PY_3_10_PLUS: + cls = abc.update_abstractmethods(cls) + + # The method gets only called if it's not inherited from a base class. + # _has_own_attribute does NOT work properly for classmethods. + if ( + getattr(cls, "__attrs_init_subclass__", None) + and "__attrs_init_subclass__" not in cls.__dict__ + ): + cls.__attrs_init_subclass__() + + return cls + + def _patch_original_class(self): + """ + Apply accumulated methods and return the class. + """ + cls = self._cls + base_names = self._base_names + + # Clean class of attribute definitions (`attr.ib()`s). + if self._delete_attribs: + for name in self._attr_names: + if ( + name not in base_names + and getattr(cls, name, _SENTINEL) is not _SENTINEL + ): + # An AttributeError can happen if a base class defines a + # class variable and we want to set an attribute with the + # same name by using only a type annotation. + with contextlib.suppress(AttributeError): + delattr(cls, name) + + # Attach our dunder methods. + for name, value in self._cls_dict.items(): + setattr(cls, name, value) + + # If we've inherited an attrs __setattr__ and don't write our own, + # reset it to object's. + if not self._wrote_own_setattr and getattr( + cls, "__attrs_own_setattr__", False + ): + cls.__attrs_own_setattr__ = False + + if not self._has_custom_setattr: + cls.__setattr__ = _OBJ_SETATTR + + return cls + + def _create_slots_class(self): + """ + Build and return a new class with a `__slots__` attribute. + """ + cd = { + k: v + for k, v in self._cls_dict.items() + if k not in (*tuple(self._attr_names), "__dict__", "__weakref__") + } + + # If our class doesn't have its own implementation of __setattr__ + # (either from the user or by us), check the bases, if one of them has + # an attrs-made __setattr__, that needs to be reset. We don't walk the + # MRO because we only care about our immediate base classes. + # XXX: This can be confused by subclassing a slotted attrs class with + # XXX: a non-attrs class and subclass the resulting class with an attrs + # XXX: class. See `test_slotted_confused` for details. For now that's + # XXX: OK with us. + if not self._wrote_own_setattr: + cd["__attrs_own_setattr__"] = False + + if not self._has_custom_setattr: + for base_cls in self._cls.__bases__: + if base_cls.__dict__.get("__attrs_own_setattr__", False): + cd["__setattr__"] = _OBJ_SETATTR + break + + # Traverse the MRO to collect existing slots + # and check for an existing __weakref__. + existing_slots = {} + weakref_inherited = False + for base_cls in self._cls.__mro__[1:-1]: + if base_cls.__dict__.get("__weakref__", None) is not None: + weakref_inherited = True + existing_slots.update( + { + name: getattr(base_cls, name) + for name in getattr(base_cls, "__slots__", []) + } + ) + + base_names = set(self._base_names) + + names = self._attr_names + if ( + self._weakref_slot + and "__weakref__" not in getattr(self._cls, "__slots__", ()) + and "__weakref__" not in names + and not weakref_inherited + ): + names += ("__weakref__",) + + if PY_3_8_PLUS: + cached_properties = { + name: cached_property.func + for name, cached_property in cd.items() + if isinstance(cached_property, functools.cached_property) + } + else: + # `functools.cached_property` was introduced in 3.8. + # So can't be used before this. + cached_properties = {} + + # Collect methods with a `__class__` reference that are shadowed in the new class. + # To know to update them. + additional_closure_functions_to_update = [] + if cached_properties: + class_annotations = _get_annotations(self._cls) + for name, func in cached_properties.items(): + # Add cached properties to names for slotting. + names += (name,) + # Clear out function from class to avoid clashing. + del cd[name] + additional_closure_functions_to_update.append(func) + annotation = inspect.signature(func).return_annotation + if annotation is not inspect.Parameter.empty: + class_annotations[name] = annotation + + original_getattr = cd.get("__getattr__") + if original_getattr is not None: + additional_closure_functions_to_update.append(original_getattr) + + cd["__getattr__"] = _make_cached_property_getattr( + cached_properties, original_getattr, self._cls + ) + + # We only add the names of attributes that aren't inherited. + # Setting __slots__ to inherited attributes wastes memory. + slot_names = [name for name in names if name not in base_names] + + # There are slots for attributes from current class + # that are defined in parent classes. + # As their descriptors may be overridden by a child class, + # we collect them here and update the class dict + reused_slots = { + slot: slot_descriptor + for slot, slot_descriptor in existing_slots.items() + if slot in slot_names + } + slot_names = [name for name in slot_names if name not in reused_slots] + cd.update(reused_slots) + if self._cache_hash: + slot_names.append(_HASH_CACHE_FIELD) + + cd["__slots__"] = tuple(slot_names) + + cd["__qualname__"] = self._cls.__qualname__ + + # Create new class based on old class and our methods. + cls = type(self._cls)(self._cls.__name__, self._cls.__bases__, cd) + + # The following is a fix for + # . + # If a method mentions `__class__` or uses the no-arg super(), the + # compiler will bake a reference to the class in the method itself + # as `method.__closure__`. Since we replace the class with a + # clone, we rewrite these references so it keeps working. + for item in itertools.chain( + cls.__dict__.values(), additional_closure_functions_to_update + ): + if isinstance(item, (classmethod, staticmethod)): + # Class- and staticmethods hide their functions inside. + # These might need to be rewritten as well. + closure_cells = getattr(item.__func__, "__closure__", None) + elif isinstance(item, property): + # Workaround for property `super()` shortcut (PY3-only). + # There is no universal way for other descriptors. + closure_cells = getattr(item.fget, "__closure__", None) + else: + closure_cells = getattr(item, "__closure__", None) + + if not closure_cells: # Catch None or the empty list. + continue + for cell in closure_cells: + try: + match = cell.cell_contents is self._cls + except ValueError: # noqa: PERF203 + # ValueError: Cell is empty + pass + else: + if match: + cell.cell_contents = cls + return cls + + def add_repr(self, ns): + self._cls_dict["__repr__"] = self._add_method_dunders( + _make_repr(self._attrs, ns, self._cls) + ) + return self + + def add_str(self): + repr = self._cls_dict.get("__repr__") + if repr is None: + msg = "__str__ can only be generated if a __repr__ exists." + raise ValueError(msg) + + def __str__(self): + return self.__repr__() + + self._cls_dict["__str__"] = self._add_method_dunders(__str__) + return self + + def _make_getstate_setstate(self): + """ + Create custom __setstate__ and __getstate__ methods. + """ + # __weakref__ is not writable. + state_attr_names = tuple( + an for an in self._attr_names if an != "__weakref__" + ) + + def slots_getstate(self): + """ + Automatically created by attrs. + """ + return {name: getattr(self, name) for name in state_attr_names} + + hash_caching_enabled = self._cache_hash + + def slots_setstate(self, state): + """ + Automatically created by attrs. + """ + __bound_setattr = _OBJ_SETATTR.__get__(self) + if isinstance(state, tuple): + # Backward compatibility with attrs instances pickled with + # attrs versions before v22.2.0 which stored tuples. + for name, value in zip(state_attr_names, state): + __bound_setattr(name, value) + else: + for name in state_attr_names: + if name in state: + __bound_setattr(name, state[name]) + + # The hash code cache is not included when the object is + # serialized, but it still needs to be initialized to None to + # indicate that the first call to __hash__ should be a cache + # miss. + if hash_caching_enabled: + __bound_setattr(_HASH_CACHE_FIELD, None) + + return slots_getstate, slots_setstate + + def make_unhashable(self): + self._cls_dict["__hash__"] = None + return self + + def add_hash(self): + self._cls_dict["__hash__"] = self._add_method_dunders( + _make_hash( + self._cls, + self._attrs, + frozen=self._frozen, + cache_hash=self._cache_hash, + ) + ) + + return self + + def add_init(self): + self._cls_dict["__init__"] = self._add_method_dunders( + _make_init( + self._cls, + self._attrs, + self._has_pre_init, + self._pre_init_has_args, + self._has_post_init, + self._frozen, + self._slots, + self._cache_hash, + self._base_attr_map, + self._is_exc, + self._on_setattr, + attrs_init=False, + ) + ) + + return self + + def add_match_args(self): + self._cls_dict["__match_args__"] = tuple( + field.name + for field in self._attrs + if field.init and not field.kw_only + ) + + def add_attrs_init(self): + self._cls_dict["__attrs_init__"] = self._add_method_dunders( + _make_init( + self._cls, + self._attrs, + self._has_pre_init, + self._pre_init_has_args, + self._has_post_init, + self._frozen, + self._slots, + self._cache_hash, + self._base_attr_map, + self._is_exc, + self._on_setattr, + attrs_init=True, + ) + ) + + return self + + def add_eq(self): + cd = self._cls_dict + + cd["__eq__"] = self._add_method_dunders( + _make_eq(self._cls, self._attrs) + ) + cd["__ne__"] = self._add_method_dunders(_make_ne()) + + return self + + def add_order(self): + cd = self._cls_dict + + cd["__lt__"], cd["__le__"], cd["__gt__"], cd["__ge__"] = ( + self._add_method_dunders(meth) + for meth in _make_order(self._cls, self._attrs) + ) + + return self + + def add_setattr(self): + if self._frozen: + return self + + sa_attrs = {} + for a in self._attrs: + on_setattr = a.on_setattr or self._on_setattr + if on_setattr and on_setattr is not setters.NO_OP: + sa_attrs[a.name] = a, on_setattr + + if not sa_attrs: + return self + + if self._has_custom_setattr: + # We need to write a __setattr__ but there already is one! + msg = "Can't combine custom __setattr__ with on_setattr hooks." + raise ValueError(msg) + + # docstring comes from _add_method_dunders + def __setattr__(self, name, val): + try: + a, hook = sa_attrs[name] + except KeyError: + nval = val + else: + nval = hook(self, a, val) + + _OBJ_SETATTR(self, name, nval) + + self._cls_dict["__attrs_own_setattr__"] = True + self._cls_dict["__setattr__"] = self._add_method_dunders(__setattr__) + self._wrote_own_setattr = True + + return self + + def _add_method_dunders(self, method): + """ + Add __module__ and __qualname__ to a *method* if possible. + """ + with contextlib.suppress(AttributeError): + method.__module__ = self._cls.__module__ + + with contextlib.suppress(AttributeError): + method.__qualname__ = f"{self._cls.__qualname__}.{method.__name__}" + + with contextlib.suppress(AttributeError): + method.__doc__ = ( + "Method generated by attrs for class " + f"{self._cls.__qualname__}." + ) + + return method + + +def _determine_attrs_eq_order(cmp, eq, order, default_eq): + """ + Validate the combination of *cmp*, *eq*, and *order*. Derive the effective + values of eq and order. If *eq* is None, set it to *default_eq*. + """ + if cmp is not None and any((eq is not None, order is not None)): + msg = "Don't mix `cmp` with `eq' and `order`." + raise ValueError(msg) + + # cmp takes precedence due to bw-compatibility. + if cmp is not None: + return cmp, cmp + + # If left None, equality is set to the specified default and ordering + # mirrors equality. + if eq is None: + eq = default_eq + + if order is None: + order = eq + + if eq is False and order is True: + msg = "`order` can only be True if `eq` is True too." + raise ValueError(msg) + + return eq, order + + +def _determine_attrib_eq_order(cmp, eq, order, default_eq): + """ + Validate the combination of *cmp*, *eq*, and *order*. Derive the effective + values of eq and order. If *eq* is None, set it to *default_eq*. + """ + if cmp is not None and any((eq is not None, order is not None)): + msg = "Don't mix `cmp` with `eq' and `order`." + raise ValueError(msg) + + def decide_callable_or_boolean(value): + """ + Decide whether a key function is used. + """ + if callable(value): + value, key = True, value + else: + key = None + return value, key + + # cmp takes precedence due to bw-compatibility. + if cmp is not None: + cmp, cmp_key = decide_callable_or_boolean(cmp) + return cmp, cmp_key, cmp, cmp_key + + # If left None, equality is set to the specified default and ordering + # mirrors equality. + if eq is None: + eq, eq_key = default_eq, None + else: + eq, eq_key = decide_callable_or_boolean(eq) + + if order is None: + order, order_key = eq, eq_key + else: + order, order_key = decide_callable_or_boolean(order) + + if eq is False and order is True: + msg = "`order` can only be True if `eq` is True too." + raise ValueError(msg) + + return eq, eq_key, order, order_key + + +def _determine_whether_to_implement( + cls, flag, auto_detect, dunders, default=True +): + """ + Check whether we should implement a set of methods for *cls*. + + *flag* is the argument passed into @attr.s like 'init', *auto_detect* the + same as passed into @attr.s and *dunders* is a tuple of attribute names + whose presence signal that the user has implemented it themselves. + + Return *default* if no reason for either for or against is found. + """ + if flag is True or flag is False: + return flag + + if flag is None and auto_detect is False: + return default + + # Logically, flag is None and auto_detect is True here. + for dunder in dunders: + if _has_own_attribute(cls, dunder): + return False + + return default + + +def attrs( + maybe_cls=None, + these=None, + repr_ns=None, + repr=None, + cmp=None, + hash=None, + init=None, + slots=False, + frozen=False, + weakref_slot=True, + str=False, + auto_attribs=False, + kw_only=False, + cache_hash=False, + auto_exc=False, + eq=None, + order=None, + auto_detect=False, + collect_by_mro=False, + getstate_setstate=None, + on_setattr=None, + field_transformer=None, + match_args=True, + unsafe_hash=None, +): + r""" + A class decorator that adds :term:`dunder methods` according to the + specified attributes using `attr.ib` or the *these* argument. + + Consider using `attrs.define` / `attrs.frozen` in new code (``attr.s`` will + *never* go away, though). + + Args: + repr_ns (str): + When using nested classes, there was no way in Python 2 to + automatically detect that. This argument allows to set a custom + name for a more meaningful ``repr`` output. This argument is + pointless in Python 3 and is therefore deprecated. + + .. caution:: + Refer to `attrs.define` for the rest of the parameters, but note that they + can have different defaults. + + Notably, leaving *on_setattr* as `None` will **not** add any hooks. + + .. versionadded:: 16.0.0 *slots* + .. versionadded:: 16.1.0 *frozen* + .. versionadded:: 16.3.0 *str* + .. versionadded:: 16.3.0 Support for ``__attrs_post_init__``. + .. versionchanged:: 17.1.0 + *hash* supports `None` as value which is also the default now. + .. versionadded:: 17.3.0 *auto_attribs* + .. versionchanged:: 18.1.0 + If *these* is passed, no attributes are deleted from the class body. + .. versionchanged:: 18.1.0 If *these* is ordered, the order is retained. + .. versionadded:: 18.2.0 *weakref_slot* + .. deprecated:: 18.2.0 + ``__lt__``, ``__le__``, ``__gt__``, and ``__ge__`` now raise a + `DeprecationWarning` if the classes compared are subclasses of + each other. ``__eq`` and ``__ne__`` never tried to compared subclasses + to each other. + .. versionchanged:: 19.2.0 + ``__lt__``, ``__le__``, ``__gt__``, and ``__ge__`` now do not consider + subclasses comparable anymore. + .. versionadded:: 18.2.0 *kw_only* + .. versionadded:: 18.2.0 *cache_hash* + .. versionadded:: 19.1.0 *auto_exc* + .. deprecated:: 19.2.0 *cmp* Removal on or after 2021-06-01. + .. versionadded:: 19.2.0 *eq* and *order* + .. versionadded:: 20.1.0 *auto_detect* + .. versionadded:: 20.1.0 *collect_by_mro* + .. versionadded:: 20.1.0 *getstate_setstate* + .. versionadded:: 20.1.0 *on_setattr* + .. versionadded:: 20.3.0 *field_transformer* + .. versionchanged:: 21.1.0 + ``init=False`` injects ``__attrs_init__`` + .. versionchanged:: 21.1.0 Support for ``__attrs_pre_init__`` + .. versionchanged:: 21.1.0 *cmp* undeprecated + .. versionadded:: 21.3.0 *match_args* + .. versionadded:: 22.2.0 + *unsafe_hash* as an alias for *hash* (for :pep:`681` compliance). + .. deprecated:: 24.1.0 *repr_ns* + .. versionchanged:: 24.1.0 + Instances are not compared as tuples of attributes anymore, but using a + big ``and`` condition. This is faster and has more correct behavior for + uncomparable values like `math.nan`. + .. versionadded:: 24.1.0 + If a class has an *inherited* classmethod called + ``__attrs_init_subclass__``, it is executed after the class is created. + .. deprecated:: 24.1.0 *hash* is deprecated in favor of *unsafe_hash*. + """ + if repr_ns is not None: + import warnings + + warnings.warn( + DeprecationWarning( + "The `repr_ns` argument is deprecated and will be removed in or after August 2025." + ), + stacklevel=2, + ) + + eq_, order_ = _determine_attrs_eq_order(cmp, eq, order, None) + + # unsafe_hash takes precedence due to PEP 681. + if unsafe_hash is not None: + hash = unsafe_hash + + if isinstance(on_setattr, (list, tuple)): + on_setattr = setters.pipe(*on_setattr) + + def wrap(cls): + is_frozen = frozen or _has_frozen_base_class(cls) + is_exc = auto_exc is True and issubclass(cls, BaseException) + has_own_setattr = auto_detect and _has_own_attribute( + cls, "__setattr__" + ) + + if has_own_setattr and is_frozen: + msg = "Can't freeze a class with a custom __setattr__." + raise ValueError(msg) + + builder = _ClassBuilder( + cls, + these, + slots, + is_frozen, + weakref_slot, + _determine_whether_to_implement( + cls, + getstate_setstate, + auto_detect, + ("__getstate__", "__setstate__"), + default=slots, + ), + auto_attribs, + kw_only, + cache_hash, + is_exc, + collect_by_mro, + on_setattr, + has_own_setattr, + field_transformer, + ) + if _determine_whether_to_implement( + cls, repr, auto_detect, ("__repr__",) + ): + builder.add_repr(repr_ns) + if str is True: + builder.add_str() + + eq = _determine_whether_to_implement( + cls, eq_, auto_detect, ("__eq__", "__ne__") + ) + if not is_exc and eq is True: + builder.add_eq() + if not is_exc and _determine_whether_to_implement( + cls, order_, auto_detect, ("__lt__", "__le__", "__gt__", "__ge__") + ): + builder.add_order() + + builder.add_setattr() + + nonlocal hash + if ( + hash is None + and auto_detect is True + and _has_own_attribute(cls, "__hash__") + ): + hash = False + + if hash is not True and hash is not False and hash is not None: + # Can't use `hash in` because 1 == True for example. + msg = "Invalid value for hash. Must be True, False, or None." + raise TypeError(msg) + + if hash is False or (hash is None and eq is False) or is_exc: + # Don't do anything. Should fall back to __object__'s __hash__ + # which is by id. + if cache_hash: + msg = "Invalid value for cache_hash. To use hash caching, hashing must be either explicitly or implicitly enabled." + raise TypeError(msg) + elif hash is True or ( + hash is None and eq is True and is_frozen is True + ): + # Build a __hash__ if told so, or if it's safe. + builder.add_hash() + else: + # Raise TypeError on attempts to hash. + if cache_hash: + msg = "Invalid value for cache_hash. To use hash caching, hashing must be either explicitly or implicitly enabled." + raise TypeError(msg) + builder.make_unhashable() + + if _determine_whether_to_implement( + cls, init, auto_detect, ("__init__",) + ): + builder.add_init() + else: + builder.add_attrs_init() + if cache_hash: + msg = "Invalid value for cache_hash. To use hash caching, init must be True." + raise TypeError(msg) + + if ( + PY_3_10_PLUS + and match_args + and not _has_own_attribute(cls, "__match_args__") + ): + builder.add_match_args() + + return builder.build_class() + + # maybe_cls's type depends on the usage of the decorator. It's a class + # if it's used as `@attrs` but `None` if used as `@attrs()`. + if maybe_cls is None: + return wrap + + return wrap(maybe_cls) + + +_attrs = attrs +""" +Internal alias so we can use it in functions that take an argument called +*attrs*. +""" + + +def _has_frozen_base_class(cls): + """ + Check whether *cls* has a frozen ancestor by looking at its + __setattr__. + """ + return cls.__setattr__ is _frozen_setattrs + + +def _generate_unique_filename(cls, func_name): + """ + Create a "filename" suitable for a function being generated. + """ + return ( + f"" + ) + + +def _make_hash(cls, attrs, frozen, cache_hash): + attrs = tuple( + a for a in attrs if a.hash is True or (a.hash is None and a.eq is True) + ) + + tab = " " + + unique_filename = _generate_unique_filename(cls, "hash") + type_hash = hash(unique_filename) + # If eq is custom generated, we need to include the functions in globs + globs = {} + + hash_def = "def __hash__(self" + hash_func = "hash((" + closing_braces = "))" + if not cache_hash: + hash_def += "):" + else: + hash_def += ", *" + + hash_def += ", _cache_wrapper=__import__('attr._make')._make._CacheHashWrapper):" + hash_func = "_cache_wrapper(" + hash_func + closing_braces += ")" + + method_lines = [hash_def] + + def append_hash_computation_lines(prefix, indent): + """ + Generate the code for actually computing the hash code. + Below this will either be returned directly or used to compute + a value which is then cached, depending on the value of cache_hash + """ + + method_lines.extend( + [ + indent + prefix + hash_func, + indent + f" {type_hash},", + ] + ) + + for a in attrs: + if a.eq_key: + cmp_name = f"_{a.name}_key" + globs[cmp_name] = a.eq_key + method_lines.append( + indent + f" {cmp_name}(self.{a.name})," + ) + else: + method_lines.append(indent + f" self.{a.name},") + + method_lines.append(indent + " " + closing_braces) + + if cache_hash: + method_lines.append(tab + f"if self.{_HASH_CACHE_FIELD} is None:") + if frozen: + append_hash_computation_lines( + f"object.__setattr__(self, '{_HASH_CACHE_FIELD}', ", tab * 2 + ) + method_lines.append(tab * 2 + ")") # close __setattr__ + else: + append_hash_computation_lines( + f"self.{_HASH_CACHE_FIELD} = ", tab * 2 + ) + method_lines.append(tab + f"return self.{_HASH_CACHE_FIELD}") + else: + append_hash_computation_lines("return ", tab) + + script = "\n".join(method_lines) + return _make_method("__hash__", script, unique_filename, globs) + + +def _add_hash(cls, attrs): + """ + Add a hash method to *cls*. + """ + cls.__hash__ = _make_hash(cls, attrs, frozen=False, cache_hash=False) + return cls + + +def _make_ne(): + """ + Create __ne__ method. + """ + + def __ne__(self, other): + """ + Check equality and either forward a NotImplemented or + return the result negated. + """ + result = self.__eq__(other) + if result is NotImplemented: + return NotImplemented + + return not result + + return __ne__ + + +def _make_eq(cls, attrs): + """ + Create __eq__ method for *cls* with *attrs*. + """ + attrs = [a for a in attrs if a.eq] + + unique_filename = _generate_unique_filename(cls, "eq") + lines = [ + "def __eq__(self, other):", + " if other.__class__ is not self.__class__:", + " return NotImplemented", + ] + + # We can't just do a big self.x = other.x and... clause due to + # irregularities like nan == nan is false but (nan,) == (nan,) is true. + globs = {} + if attrs: + lines.append(" return (") + for a in attrs: + if a.eq_key: + cmp_name = f"_{a.name}_key" + # Add the key function to the global namespace + # of the evaluated function. + globs[cmp_name] = a.eq_key + lines.append( + f" {cmp_name}(self.{a.name}) == {cmp_name}(other.{a.name})" + ) + else: + lines.append(f" self.{a.name} == other.{a.name}") + if a is not attrs[-1]: + lines[-1] = f"{lines[-1]} and" + lines.append(" )") + else: + lines.append(" return True") + + script = "\n".join(lines) + + return _make_method("__eq__", script, unique_filename, globs) + + +def _make_order(cls, attrs): + """ + Create ordering methods for *cls* with *attrs*. + """ + attrs = [a for a in attrs if a.order] + + def attrs_to_tuple(obj): + """ + Save us some typing. + """ + return tuple( + key(value) if key else value + for value, key in ( + (getattr(obj, a.name), a.order_key) for a in attrs + ) + ) + + def __lt__(self, other): + """ + Automatically created by attrs. + """ + if other.__class__ is self.__class__: + return attrs_to_tuple(self) < attrs_to_tuple(other) + + return NotImplemented + + def __le__(self, other): + """ + Automatically created by attrs. + """ + if other.__class__ is self.__class__: + return attrs_to_tuple(self) <= attrs_to_tuple(other) + + return NotImplemented + + def __gt__(self, other): + """ + Automatically created by attrs. + """ + if other.__class__ is self.__class__: + return attrs_to_tuple(self) > attrs_to_tuple(other) + + return NotImplemented + + def __ge__(self, other): + """ + Automatically created by attrs. + """ + if other.__class__ is self.__class__: + return attrs_to_tuple(self) >= attrs_to_tuple(other) + + return NotImplemented + + return __lt__, __le__, __gt__, __ge__ + + +def _add_eq(cls, attrs=None): + """ + Add equality methods to *cls* with *attrs*. + """ + if attrs is None: + attrs = cls.__attrs_attrs__ + + cls.__eq__ = _make_eq(cls, attrs) + cls.__ne__ = _make_ne() + + return cls + + +def _make_repr(attrs, ns, cls): + unique_filename = _generate_unique_filename(cls, "repr") + # Figure out which attributes to include, and which function to use to + # format them. The a.repr value can be either bool or a custom + # callable. + attr_names_with_reprs = tuple( + (a.name, (repr if a.repr is True else a.repr), a.init) + for a in attrs + if a.repr is not False + ) + globs = { + name + "_repr": r for name, r, _ in attr_names_with_reprs if r != repr + } + globs["_compat"] = _compat + globs["AttributeError"] = AttributeError + globs["NOTHING"] = NOTHING + attribute_fragments = [] + for name, r, i in attr_names_with_reprs: + accessor = ( + "self." + name if i else 'getattr(self, "' + name + '", NOTHING)' + ) + fragment = ( + "%s={%s!r}" % (name, accessor) + if r == repr + else "%s={%s_repr(%s)}" % (name, name, accessor) + ) + attribute_fragments.append(fragment) + repr_fragment = ", ".join(attribute_fragments) + + if ns is None: + cls_name_fragment = '{self.__class__.__qualname__.rsplit(">.", 1)[-1]}' + else: + cls_name_fragment = ns + ".{self.__class__.__name__}" + + lines = [ + "def __repr__(self):", + " try:", + " already_repring = _compat.repr_context.already_repring", + " except AttributeError:", + " already_repring = {id(self),}", + " _compat.repr_context.already_repring = already_repring", + " else:", + " if id(self) in already_repring:", + " return '...'", + " else:", + " already_repring.add(id(self))", + " try:", + f" return f'{cls_name_fragment}({repr_fragment})'", + " finally:", + " already_repring.remove(id(self))", + ] + + return _make_method( + "__repr__", "\n".join(lines), unique_filename, globs=globs + ) + + +def _add_repr(cls, ns=None, attrs=None): + """ + Add a repr method to *cls*. + """ + if attrs is None: + attrs = cls.__attrs_attrs__ + + cls.__repr__ = _make_repr(attrs, ns, cls) + return cls + + +def fields(cls): + """ + Return the tuple of *attrs* attributes for a class. + + The tuple also allows accessing the fields by their names (see below for + examples). + + Args: + cls (type): Class to introspect. + + Raises: + TypeError: If *cls* is not a class. + + attrs.exceptions.NotAnAttrsClassError: + If *cls* is not an *attrs* class. + + Returns: + tuple (with name accessors) of `attrs.Attribute` + + .. versionchanged:: 16.2.0 Returned tuple allows accessing the fields + by name. + .. versionchanged:: 23.1.0 Add support for generic classes. + """ + generic_base = get_generic_base(cls) + + if generic_base is None and not isinstance(cls, type): + msg = "Passed object must be a class." + raise TypeError(msg) + + attrs = getattr(cls, "__attrs_attrs__", None) + + if attrs is None: + if generic_base is not None: + attrs = getattr(generic_base, "__attrs_attrs__", None) + if attrs is not None: + # Even though this is global state, stick it on here to speed + # it up. We rely on `cls` being cached for this to be + # efficient. + cls.__attrs_attrs__ = attrs + return attrs + msg = f"{cls!r} is not an attrs-decorated class." + raise NotAnAttrsClassError(msg) + + return attrs + + +def fields_dict(cls): + """ + Return an ordered dictionary of *attrs* attributes for a class, whose keys + are the attribute names. + + Args: + cls (type): Class to introspect. + + Raises: + TypeError: If *cls* is not a class. + + attrs.exceptions.NotAnAttrsClassError: + If *cls* is not an *attrs* class. + + Returns: + dict[str, attrs.Attribute]: Dict of attribute name to definition + + .. versionadded:: 18.1.0 + """ + if not isinstance(cls, type): + msg = "Passed object must be a class." + raise TypeError(msg) + attrs = getattr(cls, "__attrs_attrs__", None) + if attrs is None: + msg = f"{cls!r} is not an attrs-decorated class." + raise NotAnAttrsClassError(msg) + return {a.name: a for a in attrs} + + +def validate(inst): + """ + Validate all attributes on *inst* that have a validator. + + Leaves all exceptions through. + + Args: + inst: Instance of a class with *attrs* attributes. + """ + if _config._run_validators is False: + return + + for a in fields(inst.__class__): + v = a.validator + if v is not None: + v(inst, a, getattr(inst, a.name)) + + +def _is_slot_attr(a_name, base_attr_map): + """ + Check if the attribute name comes from a slot class. + """ + cls = base_attr_map.get(a_name) + return cls and "__slots__" in cls.__dict__ + + +def _make_init( + cls, + attrs, + pre_init, + pre_init_has_args, + post_init, + frozen, + slots, + cache_hash, + base_attr_map, + is_exc, + cls_on_setattr, + attrs_init, +): + has_cls_on_setattr = ( + cls_on_setattr is not None and cls_on_setattr is not setters.NO_OP + ) + + if frozen and has_cls_on_setattr: + msg = "Frozen classes can't use on_setattr." + raise ValueError(msg) + + needs_cached_setattr = cache_hash or frozen + filtered_attrs = [] + attr_dict = {} + for a in attrs: + if not a.init and a.default is NOTHING: + continue + + filtered_attrs.append(a) + attr_dict[a.name] = a + + if a.on_setattr is not None: + if frozen is True: + msg = "Frozen classes can't use on_setattr." + raise ValueError(msg) + + needs_cached_setattr = True + elif has_cls_on_setattr and a.on_setattr is not setters.NO_OP: + needs_cached_setattr = True + + unique_filename = _generate_unique_filename(cls, "init") + + script, globs, annotations = _attrs_to_init_script( + filtered_attrs, + frozen, + slots, + pre_init, + pre_init_has_args, + post_init, + cache_hash, + base_attr_map, + is_exc, + needs_cached_setattr, + has_cls_on_setattr, + "__attrs_init__" if attrs_init else "__init__", + ) + if cls.__module__ in sys.modules: + # This makes typing.get_type_hints(CLS.__init__) resolve string types. + globs.update(sys.modules[cls.__module__].__dict__) + + globs.update({"NOTHING": NOTHING, "attr_dict": attr_dict}) + + if needs_cached_setattr: + # Save the lookup overhead in __init__ if we need to circumvent + # setattr hooks. + globs["_cached_setattr_get"] = _OBJ_SETATTR.__get__ + + init = _make_method( + "__attrs_init__" if attrs_init else "__init__", + script, + unique_filename, + globs, + ) + init.__annotations__ = annotations + + return init + + +def _setattr(attr_name: str, value_var: str, has_on_setattr: bool) -> str: + """ + Use the cached object.setattr to set *attr_name* to *value_var*. + """ + return f"_setattr('{attr_name}', {value_var})" + + +def _setattr_with_converter( + attr_name: str, value_var: str, has_on_setattr: bool, converter: Converter +) -> str: + """ + Use the cached object.setattr to set *attr_name* to *value_var*, but run + its converter first. + """ + return f"_setattr('{attr_name}', {converter._fmt_converter_call(attr_name, value_var)})" + + +def _assign(attr_name: str, value: str, has_on_setattr: bool) -> str: + """ + Unless *attr_name* has an on_setattr hook, use normal assignment. Otherwise + relegate to _setattr. + """ + if has_on_setattr: + return _setattr(attr_name, value, True) + + return f"self.{attr_name} = {value}" + + +def _assign_with_converter( + attr_name: str, value_var: str, has_on_setattr: bool, converter: Converter +) -> str: + """ + Unless *attr_name* has an on_setattr hook, use normal assignment after + conversion. Otherwise relegate to _setattr_with_converter. + """ + if has_on_setattr: + return _setattr_with_converter(attr_name, value_var, True, converter) + + return f"self.{attr_name} = {converter._fmt_converter_call(attr_name, value_var)}" + + +def _determine_setters( + frozen: bool, slots: bool, base_attr_map: dict[str, type] +): + """ + Determine the correct setter functions based on whether a class is frozen + and/or slotted. + """ + if frozen is True: + if slots is True: + return (), _setattr, _setattr_with_converter + + # Dict frozen classes assign directly to __dict__. + # But only if the attribute doesn't come from an ancestor slot + # class. + # Note _inst_dict will be used again below if cache_hash is True + + def fmt_setter( + attr_name: str, value_var: str, has_on_setattr: bool + ) -> str: + if _is_slot_attr(attr_name, base_attr_map): + return _setattr(attr_name, value_var, has_on_setattr) + + return f"_inst_dict['{attr_name}'] = {value_var}" + + def fmt_setter_with_converter( + attr_name: str, + value_var: str, + has_on_setattr: bool, + converter: Converter, + ) -> str: + if has_on_setattr or _is_slot_attr(attr_name, base_attr_map): + return _setattr_with_converter( + attr_name, value_var, has_on_setattr, converter + ) + + return f"_inst_dict['{attr_name}'] = {converter._fmt_converter_call(attr_name, value_var)}" + + return ( + ("_inst_dict = self.__dict__",), + fmt_setter, + fmt_setter_with_converter, + ) + + # Not frozen -- we can just assign directly. + return (), _assign, _assign_with_converter + + +def _attrs_to_init_script( + attrs: list[Attribute], + is_frozen: bool, + is_slotted: bool, + call_pre_init: bool, + pre_init_has_args: bool, + call_post_init: bool, + does_cache_hash: bool, + base_attr_map: dict[str, type], + is_exc: bool, + needs_cached_setattr: bool, + has_cls_on_setattr: bool, + method_name: str, +) -> tuple[str, dict, dict]: + """ + Return a script of an initializer for *attrs*, a dict of globals, and + annotations for the initializer. + + The globals are required by the generated script. + """ + lines = ["self.__attrs_pre_init__()"] if call_pre_init else [] + + if needs_cached_setattr: + lines.append( + # Circumvent the __setattr__ descriptor to save one lookup per + # assignment. Note _setattr will be used again below if + # does_cache_hash is True. + "_setattr = _cached_setattr_get(self)" + ) + + extra_lines, fmt_setter, fmt_setter_with_converter = _determine_setters( + is_frozen, is_slotted, base_attr_map + ) + lines.extend(extra_lines) + + args = [] + kw_only_args = [] + attrs_to_validate = [] + + # This is a dictionary of names to validator and converter callables. + # Injecting this into __init__ globals lets us avoid lookups. + names_for_globals = {} + annotations = {"return": None} + + for a in attrs: + if a.validator: + attrs_to_validate.append(a) + + attr_name = a.name + has_on_setattr = a.on_setattr is not None or ( + a.on_setattr is not setters.NO_OP and has_cls_on_setattr + ) + # a.alias is set to maybe-mangled attr_name in _ClassBuilder if not + # explicitly provided + arg_name = a.alias + + has_factory = isinstance(a.default, Factory) + maybe_self = "self" if has_factory and a.default.takes_self else "" + + if a.converter and not isinstance(a.converter, Converter): + converter = Converter(a.converter) + else: + converter = a.converter + + if a.init is False: + if has_factory: + init_factory_name = _INIT_FACTORY_PAT % (a.name,) + if converter is not None: + lines.append( + fmt_setter_with_converter( + attr_name, + init_factory_name + f"({maybe_self})", + has_on_setattr, + converter, + ) + ) + names_for_globals[converter._get_global_name(a.name)] = ( + converter.converter + ) + else: + lines.append( + fmt_setter( + attr_name, + init_factory_name + f"({maybe_self})", + has_on_setattr, + ) + ) + names_for_globals[init_factory_name] = a.default.factory + elif converter is not None: + lines.append( + fmt_setter_with_converter( + attr_name, + f"attr_dict['{attr_name}'].default", + has_on_setattr, + converter, + ) + ) + names_for_globals[converter._get_global_name(a.name)] = ( + converter.converter + ) + else: + lines.append( + fmt_setter( + attr_name, + f"attr_dict['{attr_name}'].default", + has_on_setattr, + ) + ) + elif a.default is not NOTHING and not has_factory: + arg = f"{arg_name}=attr_dict['{attr_name}'].default" + if a.kw_only: + kw_only_args.append(arg) + else: + args.append(arg) + + if converter is not None: + lines.append( + fmt_setter_with_converter( + attr_name, arg_name, has_on_setattr, converter + ) + ) + names_for_globals[converter._get_global_name(a.name)] = ( + converter.converter + ) + else: + lines.append(fmt_setter(attr_name, arg_name, has_on_setattr)) + + elif has_factory: + arg = f"{arg_name}=NOTHING" + if a.kw_only: + kw_only_args.append(arg) + else: + args.append(arg) + lines.append(f"if {arg_name} is not NOTHING:") + + init_factory_name = _INIT_FACTORY_PAT % (a.name,) + if converter is not None: + lines.append( + " " + + fmt_setter_with_converter( + attr_name, arg_name, has_on_setattr, converter + ) + ) + lines.append("else:") + lines.append( + " " + + fmt_setter_with_converter( + attr_name, + init_factory_name + "(" + maybe_self + ")", + has_on_setattr, + converter, + ) + ) + names_for_globals[converter._get_global_name(a.name)] = ( + converter.converter + ) + else: + lines.append( + " " + fmt_setter(attr_name, arg_name, has_on_setattr) + ) + lines.append("else:") + lines.append( + " " + + fmt_setter( + attr_name, + init_factory_name + "(" + maybe_self + ")", + has_on_setattr, + ) + ) + names_for_globals[init_factory_name] = a.default.factory + else: + if a.kw_only: + kw_only_args.append(arg_name) + else: + args.append(arg_name) + + if converter is not None: + lines.append( + fmt_setter_with_converter( + attr_name, arg_name, has_on_setattr, converter + ) + ) + names_for_globals[converter._get_global_name(a.name)] = ( + converter.converter + ) + else: + lines.append(fmt_setter(attr_name, arg_name, has_on_setattr)) + + if a.init is True: + if a.type is not None and converter is None: + annotations[arg_name] = a.type + elif converter is not None and converter._first_param_type: + # Use the type from the converter if present. + annotations[arg_name] = converter._first_param_type + + if attrs_to_validate: # we can skip this if there are no validators. + names_for_globals["_config"] = _config + lines.append("if _config._run_validators is True:") + for a in attrs_to_validate: + val_name = "__attr_validator_" + a.name + attr_name = "__attr_" + a.name + lines.append(f" {val_name}(self, {attr_name}, self.{a.name})") + names_for_globals[val_name] = a.validator + names_for_globals[attr_name] = a + + if call_post_init: + lines.append("self.__attrs_post_init__()") + + # Because this is set only after __attrs_post_init__ is called, a crash + # will result if post-init tries to access the hash code. This seemed + # preferable to setting this beforehand, in which case alteration to field + # values during post-init combined with post-init accessing the hash code + # would result in silent bugs. + if does_cache_hash: + if is_frozen: + if is_slotted: + init_hash_cache = f"_setattr('{_HASH_CACHE_FIELD}', None)" + else: + init_hash_cache = f"_inst_dict['{_HASH_CACHE_FIELD}'] = None" + else: + init_hash_cache = f"self.{_HASH_CACHE_FIELD} = None" + lines.append(init_hash_cache) + + # For exceptions we rely on BaseException.__init__ for proper + # initialization. + if is_exc: + vals = ",".join(f"self.{a.name}" for a in attrs if a.init) + + lines.append(f"BaseException.__init__(self, {vals})") + + args = ", ".join(args) + pre_init_args = args + if kw_only_args: + # leading comma & kw_only args + args += f"{', ' if args else ''}*, {', '.join(kw_only_args)}" + pre_init_kw_only_args = ", ".join( + [ + f"{kw_arg_name}={kw_arg_name}" + # We need to remove the defaults from the kw_only_args. + for kw_arg_name in (kwa.split("=")[0] for kwa in kw_only_args) + ] + ) + pre_init_args += ", " if pre_init_args else "" + pre_init_args += pre_init_kw_only_args + + if call_pre_init and pre_init_has_args: + # If pre init method has arguments, pass same arguments as `__init__`. + lines[0] = f"self.__attrs_pre_init__({pre_init_args})" + + # Python 3.7 doesn't allow backslashes in f strings. + NL = "\n " + return ( + f"""def {method_name}(self, {args}): + {NL.join(lines) if lines else 'pass'} +""", + names_for_globals, + annotations, + ) + + +def _default_init_alias_for(name: str) -> str: + """ + The default __init__ parameter name for a field. + + This performs private-name adjustment via leading-unscore stripping, + and is the default value of Attribute.alias if not provided. + """ + + return name.lstrip("_") + + +class Attribute: + """ + *Read-only* representation of an attribute. + + .. warning:: + + You should never instantiate this class yourself. + + The class has *all* arguments of `attr.ib` (except for ``factory`` which is + only syntactic sugar for ``default=Factory(...)`` plus the following: + + - ``name`` (`str`): The name of the attribute. + - ``alias`` (`str`): The __init__ parameter name of the attribute, after + any explicit overrides and default private-attribute-name handling. + - ``inherited`` (`bool`): Whether or not that attribute has been inherited + from a base class. + - ``eq_key`` and ``order_key`` (`typing.Callable` or `None`): The + callables that are used for comparing and ordering objects by this + attribute, respectively. These are set by passing a callable to + `attr.ib`'s ``eq``, ``order``, or ``cmp`` arguments. See also + :ref:`comparison customization `. + + Instances of this class are frequently used for introspection purposes + like: + + - `fields` returns a tuple of them. + - Validators get them passed as the first argument. + - The :ref:`field transformer ` hook receives a list of + them. + - The ``alias`` property exposes the __init__ parameter name of the field, + with any overrides and default private-attribute handling applied. + + + .. versionadded:: 20.1.0 *inherited* + .. versionadded:: 20.1.0 *on_setattr* + .. versionchanged:: 20.2.0 *inherited* is not taken into account for + equality checks and hashing anymore. + .. versionadded:: 21.1.0 *eq_key* and *order_key* + .. versionadded:: 22.2.0 *alias* + + For the full version history of the fields, see `attr.ib`. + """ + + __slots__ = ( + "name", + "default", + "validator", + "repr", + "eq", + "eq_key", + "order", + "order_key", + "hash", + "init", + "metadata", + "type", + "converter", + "kw_only", + "inherited", + "on_setattr", + "alias", + ) + + def __init__( + self, + name, + default, + validator, + repr, + cmp, # XXX: unused, remove along with other cmp code. + hash, + init, + inherited, + metadata=None, + type=None, + converter=None, + kw_only=False, + eq=None, + eq_key=None, + order=None, + order_key=None, + on_setattr=None, + alias=None, + ): + eq, eq_key, order, order_key = _determine_attrib_eq_order( + cmp, eq_key or eq, order_key or order, True + ) + + # Cache this descriptor here to speed things up later. + bound_setattr = _OBJ_SETATTR.__get__(self) + + # Despite the big red warning, people *do* instantiate `Attribute` + # themselves. + bound_setattr("name", name) + bound_setattr("default", default) + bound_setattr("validator", validator) + bound_setattr("repr", repr) + bound_setattr("eq", eq) + bound_setattr("eq_key", eq_key) + bound_setattr("order", order) + bound_setattr("order_key", order_key) + bound_setattr("hash", hash) + bound_setattr("init", init) + bound_setattr("converter", converter) + bound_setattr( + "metadata", + ( + types.MappingProxyType(dict(metadata)) # Shallow copy + if metadata + else _EMPTY_METADATA_SINGLETON + ), + ) + bound_setattr("type", type) + bound_setattr("kw_only", kw_only) + bound_setattr("inherited", inherited) + bound_setattr("on_setattr", on_setattr) + bound_setattr("alias", alias) + + def __setattr__(self, name, value): + raise FrozenInstanceError() + + @classmethod + def from_counting_attr(cls, name, ca, type=None): + # type holds the annotated value. deal with conflicts: + if type is None: + type = ca.type + elif ca.type is not None: + msg = "Type annotation and type argument cannot both be present" + raise ValueError(msg) + inst_dict = { + k: getattr(ca, k) + for k in Attribute.__slots__ + if k + not in ( + "name", + "validator", + "default", + "type", + "inherited", + ) # exclude methods and deprecated alias + } + return cls( + name=name, + validator=ca._validator, + default=ca._default, + type=type, + cmp=None, + inherited=False, + **inst_dict, + ) + + # Don't use attrs.evolve since fields(Attribute) doesn't work + def evolve(self, **changes): + """ + Copy *self* and apply *changes*. + + This works similarly to `attrs.evolve` but that function does not work + with {class}`Attribute`. + + It is mainly meant to be used for `transform-fields`. + + .. versionadded:: 20.3.0 + """ + new = copy.copy(self) + + new._setattrs(changes.items()) + + return new + + # Don't use _add_pickle since fields(Attribute) doesn't work + def __getstate__(self): + """ + Play nice with pickle. + """ + return tuple( + getattr(self, name) if name != "metadata" else dict(self.metadata) + for name in self.__slots__ + ) + + def __setstate__(self, state): + """ + Play nice with pickle. + """ + self._setattrs(zip(self.__slots__, state)) + + def _setattrs(self, name_values_pairs): + bound_setattr = _OBJ_SETATTR.__get__(self) + for name, value in name_values_pairs: + if name != "metadata": + bound_setattr(name, value) + else: + bound_setattr( + name, + ( + types.MappingProxyType(dict(value)) + if value + else _EMPTY_METADATA_SINGLETON + ), + ) + + +_a = [ + Attribute( + name=name, + default=NOTHING, + validator=None, + repr=True, + cmp=None, + eq=True, + order=False, + hash=(name != "metadata"), + init=True, + inherited=False, + alias=_default_init_alias_for(name), + ) + for name in Attribute.__slots__ +] + +Attribute = _add_hash( + _add_eq( + _add_repr(Attribute, attrs=_a), + attrs=[a for a in _a if a.name != "inherited"], + ), + attrs=[a for a in _a if a.hash and a.name != "inherited"], +) + + +class _CountingAttr: + """ + Intermediate representation of attributes that uses a counter to preserve + the order in which the attributes have been defined. + + *Internal* data structure of the attrs library. Running into is most + likely the result of a bug like a forgotten `@attr.s` decorator. + """ + + __slots__ = ( + "counter", + "_default", + "repr", + "eq", + "eq_key", + "order", + "order_key", + "hash", + "init", + "metadata", + "_validator", + "converter", + "type", + "kw_only", + "on_setattr", + "alias", + ) + __attrs_attrs__ = ( + *tuple( + Attribute( + name=name, + alias=_default_init_alias_for(name), + default=NOTHING, + validator=None, + repr=True, + cmp=None, + hash=True, + init=True, + kw_only=False, + eq=True, + eq_key=None, + order=False, + order_key=None, + inherited=False, + on_setattr=None, + ) + for name in ( + "counter", + "_default", + "repr", + "eq", + "order", + "hash", + "init", + "on_setattr", + "alias", + ) + ), + Attribute( + name="metadata", + alias="metadata", + default=None, + validator=None, + repr=True, + cmp=None, + hash=False, + init=True, + kw_only=False, + eq=True, + eq_key=None, + order=False, + order_key=None, + inherited=False, + on_setattr=None, + ), + ) + cls_counter = 0 + + def __init__( + self, + default, + validator, + repr, + cmp, + hash, + init, + converter, + metadata, + type, + kw_only, + eq, + eq_key, + order, + order_key, + on_setattr, + alias, + ): + _CountingAttr.cls_counter += 1 + self.counter = _CountingAttr.cls_counter + self._default = default + self._validator = validator + self.converter = converter + self.repr = repr + self.eq = eq + self.eq_key = eq_key + self.order = order + self.order_key = order_key + self.hash = hash + self.init = init + self.metadata = metadata + self.type = type + self.kw_only = kw_only + self.on_setattr = on_setattr + self.alias = alias + + def validator(self, meth): + """ + Decorator that adds *meth* to the list of validators. + + Returns *meth* unchanged. + + .. versionadded:: 17.1.0 + """ + if self._validator is None: + self._validator = meth + else: + self._validator = and_(self._validator, meth) + return meth + + def default(self, meth): + """ + Decorator that allows to set the default for an attribute. + + Returns *meth* unchanged. + + Raises: + DefaultAlreadySetError: If default has been set before. + + .. versionadded:: 17.1.0 + """ + if self._default is not NOTHING: + raise DefaultAlreadySetError() + + self._default = Factory(meth, takes_self=True) + + return meth + + +_CountingAttr = _add_eq(_add_repr(_CountingAttr)) + + +class Factory: + """ + Stores a factory callable. + + If passed as the default value to `attrs.field`, the factory is used to + generate a new value. + + Args: + factory (typing.Callable): + A callable that takes either none or exactly one mandatory + positional argument depending on *takes_self*. + + takes_self (bool): + Pass the partially initialized instance that is being initialized + as a positional argument. + + .. versionadded:: 17.1.0 *takes_self* + """ + + __slots__ = ("factory", "takes_self") + + def __init__(self, factory, takes_self=False): + self.factory = factory + self.takes_self = takes_self + + def __getstate__(self): + """ + Play nice with pickle. + """ + return tuple(getattr(self, name) for name in self.__slots__) + + def __setstate__(self, state): + """ + Play nice with pickle. + """ + for name, value in zip(self.__slots__, state): + setattr(self, name, value) + + +_f = [ + Attribute( + name=name, + default=NOTHING, + validator=None, + repr=True, + cmp=None, + eq=True, + order=False, + hash=True, + init=True, + inherited=False, + ) + for name in Factory.__slots__ +] + +Factory = _add_hash(_add_eq(_add_repr(Factory, attrs=_f), attrs=_f), attrs=_f) + + +class Converter: + """ + Stores a converter callable. + + Allows for the wrapped converter to take additional arguments. The + arguments are passed in the order they are documented. + + Args: + converter (Callable): A callable that converts the passed value. + + takes_self (bool): + Pass the partially initialized instance that is being initialized + as a positional argument. (default: `False`) + + takes_field (bool): + Pass the field definition (an :class:`Attribute`) into the + converter as a positional argument. (default: `False`) + + .. versionadded:: 24.1.0 + """ + + __slots__ = ( + "converter", + "takes_self", + "takes_field", + "_first_param_type", + "_global_name", + "__call__", + ) + + def __init__(self, converter, *, takes_self=False, takes_field=False): + self.converter = converter + self.takes_self = takes_self + self.takes_field = takes_field + + ex = _AnnotationExtractor(converter) + self._first_param_type = ex.get_first_param_type() + + if not (self.takes_self or self.takes_field): + self.__call__ = lambda value, _, __: self.converter(value) + elif self.takes_self and not self.takes_field: + self.__call__ = lambda value, instance, __: self.converter( + value, instance + ) + elif not self.takes_self and self.takes_field: + self.__call__ = lambda value, __, field: self.converter( + value, field + ) + else: + self.__call__ = lambda value, instance, field: self.converter( + value, instance, field + ) + + rt = ex.get_return_type() + if rt is not None: + self.__call__.__annotations__["return"] = rt + + @staticmethod + def _get_global_name(attr_name: str) -> str: + """ + Return the name that a converter for an attribute name *attr_name* + would have. + """ + return f"__attr_converter_{attr_name}" + + def _fmt_converter_call(self, attr_name: str, value_var: str) -> str: + """ + Return a string that calls the converter for an attribute name + *attr_name* and the value in variable named *value_var* according to + `self.takes_self` and `self.takes_field`. + """ + if not (self.takes_self or self.takes_field): + return f"{self._get_global_name(attr_name)}({value_var})" + + if self.takes_self and self.takes_field: + return f"{self._get_global_name(attr_name)}({value_var}, self, attr_dict['{attr_name}'])" + + if self.takes_self: + return f"{self._get_global_name(attr_name)}({value_var}, self)" + + return f"{self._get_global_name(attr_name)}({value_var}, attr_dict['{attr_name}'])" + + def __getstate__(self): + """ + Return a dict containing only converter and takes_self -- the rest gets + computed when loading. + """ + return { + "converter": self.converter, + "takes_self": self.takes_self, + "takes_field": self.takes_field, + } + + def __setstate__(self, state): + """ + Load instance from state. + """ + self.__init__(**state) + + +_f = [ + Attribute( + name=name, + default=NOTHING, + validator=None, + repr=True, + cmp=None, + eq=True, + order=False, + hash=True, + init=True, + inherited=False, + ) + for name in ("converter", "takes_self", "takes_field") +] + +Converter = _add_hash( + _add_eq(_add_repr(Converter, attrs=_f), attrs=_f), attrs=_f +) + + +def make_class( + name, attrs, bases=(object,), class_body=None, **attributes_arguments +): + r""" + A quick way to create a new class called *name* with *attrs*. + + Args: + name (str): The name for the new class. + + attrs( list | dict): + A list of names or a dictionary of mappings of names to `attr.ib`\ + s / `attrs.field`\ s. + + The order is deduced from the order of the names or attributes + inside *attrs*. Otherwise the order of the definition of the + attributes is used. + + bases (tuple[type, ...]): Classes that the new class will subclass. + + class_body (dict): + An optional dictionary of class attributes for the new class. + + attributes_arguments: Passed unmodified to `attr.s`. + + Returns: + type: A new class with *attrs*. + + .. versionadded:: 17.1.0 *bases* + .. versionchanged:: 18.1.0 If *attrs* is ordered, the order is retained. + .. versionchanged:: 23.2.0 *class_body* + """ + if isinstance(attrs, dict): + cls_dict = attrs + elif isinstance(attrs, (list, tuple)): + cls_dict = {a: attrib() for a in attrs} + else: + msg = "attrs argument must be a dict or a list." + raise TypeError(msg) + + pre_init = cls_dict.pop("__attrs_pre_init__", None) + post_init = cls_dict.pop("__attrs_post_init__", None) + user_init = cls_dict.pop("__init__", None) + + body = {} + if class_body is not None: + body.update(class_body) + if pre_init is not None: + body["__attrs_pre_init__"] = pre_init + if post_init is not None: + body["__attrs_post_init__"] = post_init + if user_init is not None: + body["__init__"] = user_init + + type_ = types.new_class(name, bases, {}, lambda ns: ns.update(body)) + + # For pickling to work, the __module__ variable needs to be set to the + # frame where the class is created. Bypass this step in environments where + # sys._getframe is not defined (Jython for example) or sys._getframe is not + # defined for arguments greater than 0 (IronPython). + with contextlib.suppress(AttributeError, ValueError): + type_.__module__ = sys._getframe(1).f_globals.get( + "__name__", "__main__" + ) + + # We do it here for proper warnings with meaningful stacklevel. + cmp = attributes_arguments.pop("cmp", None) + ( + attributes_arguments["eq"], + attributes_arguments["order"], + ) = _determine_attrs_eq_order( + cmp, + attributes_arguments.get("eq"), + attributes_arguments.get("order"), + True, + ) + + cls = _attrs(these=cls_dict, **attributes_arguments)(type_) + # Only add type annotations now or "_attrs()" will complain: + cls.__annotations__ = { + k: v.type for k, v in cls_dict.items() if v.type is not None + } + return cls + + +# These are required by within this module so we define them here and merely +# import into .validators / .converters. + + +@attrs(slots=True, unsafe_hash=True) +class _AndValidator: + """ + Compose many validators to a single one. + """ + + _validators = attrib() + + def __call__(self, inst, attr, value): + for v in self._validators: + v(inst, attr, value) + + +def and_(*validators): + """ + A validator that composes multiple validators into one. + + When called on a value, it runs all wrapped validators. + + Args: + validators (~collections.abc.Iterable[typing.Callable]): + Arbitrary number of validators. + + .. versionadded:: 17.1.0 + """ + vals = [] + for validator in validators: + vals.extend( + validator._validators + if isinstance(validator, _AndValidator) + else [validator] + ) + + return _AndValidator(tuple(vals)) + + +def pipe(*converters): + """ + A converter that composes multiple converters into one. + + When called on a value, it runs all wrapped converters, returning the + *last* value. + + Type annotations will be inferred from the wrapped converters', if they + have any. + + converters (~collections.abc.Iterable[typing.Callable]): + Arbitrary number of converters. + + .. versionadded:: 20.1.0 + """ + + def pipe_converter(val, inst, field): + for c in converters: + val = c(val, inst, field) if isinstance(c, Converter) else c(val) + + return val + + if not converters: + # If the converter list is empty, pipe_converter is the identity. + A = typing.TypeVar("A") + pipe_converter.__annotations__.update({"val": A, "return": A}) + else: + # Get parameter type from first converter. + t = _AnnotationExtractor(converters[0]).get_first_param_type() + if t: + pipe_converter.__annotations__["val"] = t + + last = converters[-1] + if not PY_3_11_PLUS and isinstance(last, Converter): + last = last.__call__ + + # Get return type from last converter. + rt = _AnnotationExtractor(last).get_return_type() + if rt: + pipe_converter.__annotations__["return"] = rt + + return Converter(pipe_converter, takes_self=True, takes_field=True) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/_next_gen.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/_next_gen.py new file mode 100755 index 00000000..dbb65cc9 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/_next_gen.py @@ -0,0 +1,631 @@ +# SPDX-License-Identifier: MIT + +""" +These are keyword-only APIs that call `attr.s` and `attr.ib` with different +default values. +""" + + +from functools import partial + +from . import setters +from ._funcs import asdict as _asdict +from ._funcs import astuple as _astuple +from ._make import ( + _DEFAULT_ON_SETATTR, + NOTHING, + _frozen_setattrs, + attrib, + attrs, +) +from .exceptions import UnannotatedAttributeError + + +def define( + maybe_cls=None, + *, + these=None, + repr=None, + unsafe_hash=None, + hash=None, + init=None, + slots=True, + frozen=False, + weakref_slot=True, + str=False, + auto_attribs=None, + kw_only=False, + cache_hash=False, + auto_exc=True, + eq=None, + order=False, + auto_detect=True, + getstate_setstate=None, + on_setattr=None, + field_transformer=None, + match_args=True, +): + r""" + A class decorator that adds :term:`dunder methods` according to + :term:`fields ` specified using :doc:`type annotations `, + `field()` calls, or the *these* argument. + + Since *attrs* patches or replaces an existing class, you cannot use + `object.__init_subclass__` with *attrs* classes, because it runs too early. + As a replacement, you can define ``__attrs_init_subclass__`` on your class. + It will be called by *attrs* classes that subclass it after they're + created. See also :ref:`init-subclass`. + + Args: + slots (bool): + Create a :term:`slotted class ` that's more + memory-efficient. Slotted classes are generally superior to the + default dict classes, but have some gotchas you should know about, + so we encourage you to read the :term:`glossary entry `. + + auto_detect (bool): + Instead of setting the *init*, *repr*, *eq*, and *hash* arguments + explicitly, assume they are set to True **unless any** of the + involved methods for one of the arguments is implemented in the + *current* class (meaning, it is *not* inherited from some base + class). + + So, for example by implementing ``__eq__`` on a class yourself, + *attrs* will deduce ``eq=False`` and will create *neither* + ``__eq__`` *nor* ``__ne__`` (but Python classes come with a + sensible ``__ne__`` by default, so it *should* be enough to only + implement ``__eq__`` in most cases). + + Passing True or False` to *init*, *repr*, *eq*, *cmp*, or *hash* + overrides whatever *auto_detect* would determine. + + auto_exc (bool): + If the class subclasses `BaseException` (which implicitly includes + any subclass of any exception), the following happens to behave + like a well-behaved Python exception class: + + - the values for *eq*, *order*, and *hash* are ignored and the + instances compare and hash by the instance's ids [#]_ , + - all attributes that are either passed into ``__init__`` or have a + default value are additionally available as a tuple in the + ``args`` attribute, + - the value of *str* is ignored leaving ``__str__`` to base + classes. + + .. [#] + Note that *attrs* will *not* remove existing implementations of + ``__hash__`` or the equality methods. It just won't add own + ones. + + on_setattr (~typing.Callable | list[~typing.Callable] | None | ~typing.Literal[attrs.setters.NO_OP]): + A callable that is run whenever the user attempts to set an + attribute (either by assignment like ``i.x = 42`` or by using + `setattr` like ``setattr(i, "x", 42)``). It receives the same + arguments as validators: the instance, the attribute that is being + modified, and the new value. + + If no exception is raised, the attribute is set to the return value + of the callable. + + If a list of callables is passed, they're automatically wrapped in + an `attrs.setters.pipe`. + + If left None, the default behavior is to run converters and + validators whenever an attribute is set. + + init (bool): + Create a ``__init__`` method that initializes the *attrs* + attributes. Leading underscores are stripped for the argument name, + unless an alias is set on the attribute. + + .. seealso:: + `init` shows advanced ways to customize the generated + ``__init__`` method, including executing code before and after. + + repr(bool): + Create a ``__repr__`` method with a human readable representation + of *attrs* attributes. + + str (bool): + Create a ``__str__`` method that is identical to ``__repr__``. This + is usually not necessary except for `Exception`\ s. + + eq (bool | None): + If True or None (default), add ``__eq__`` and ``__ne__`` methods + that check two instances for equality. + + .. seealso:: + `comparison` describes how to customize the comparison behavior + going as far comparing NumPy arrays. + + order (bool | None): + If True, add ``__lt__``, ``__le__``, ``__gt__``, and ``__ge__`` + methods that behave like *eq* above and allow instances to be + ordered. + + They compare the instances as if they were tuples of their *attrs* + attributes if and only if the types of both classes are + *identical*. + + If `None` mirror value of *eq*. + + .. seealso:: `comparison` + + cmp (bool | None): + Setting *cmp* is equivalent to setting *eq* and *order* to the same + value. Must not be mixed with *eq* or *order*. + + unsafe_hash (bool | None): + If None (default), the ``__hash__`` method is generated according + how *eq* and *frozen* are set. + + 1. If *both* are True, *attrs* will generate a ``__hash__`` for + you. + 2. If *eq* is True and *frozen* is False, ``__hash__`` will be set + to None, marking it unhashable (which it is). + 3. If *eq* is False, ``__hash__`` will be left untouched meaning + the ``__hash__`` method of the base class will be used. If the + base class is `object`, this means it will fall back to id-based + hashing. + + Although not recommended, you can decide for yourself and force + *attrs* to create one (for example, if the class is immutable even + though you didn't freeze it programmatically) by passing True or + not. Both of these cases are rather special and should be used + carefully. + + .. seealso:: + + - Our documentation on `hashing`, + - Python's documentation on `object.__hash__`, + - and the `GitHub issue that led to the default \ behavior + `_ for more + details. + + hash (bool | None): + Deprecated alias for *unsafe_hash*. *unsafe_hash* takes precedence. + + cache_hash (bool): + Ensure that the object's hash code is computed only once and stored + on the object. If this is set to True, hashing must be either + explicitly or implicitly enabled for this class. If the hash code + is cached, avoid any reassignments of fields involved in hash code + computation or mutations of the objects those fields point to after + object creation. If such changes occur, the behavior of the + object's hash code is undefined. + + frozen (bool): + Make instances immutable after initialization. If someone attempts + to modify a frozen instance, `attrs.exceptions.FrozenInstanceError` + is raised. + + .. note:: + + 1. This is achieved by installing a custom ``__setattr__`` + method on your class, so you can't implement your own. + + 2. True immutability is impossible in Python. + + 3. This *does* have a minor a runtime performance `impact + ` when initializing new instances. In other + words: ``__init__`` is slightly slower with ``frozen=True``. + + 4. If a class is frozen, you cannot modify ``self`` in + ``__attrs_post_init__`` or a self-written ``__init__``. You + can circumvent that limitation by using + ``object.__setattr__(self, "attribute_name", value)``. + + 5. Subclasses of a frozen class are frozen too. + + kw_only (bool): + Make all attributes keyword-only in the generated ``__init__`` (if + *init* is False, this parameter is ignored). + + weakref_slot (bool): + Make instances weak-referenceable. This has no effect unless + *slots* is True. + + field_transformer (~typing.Callable | None): + A function that is called with the original class object and all + fields right before *attrs* finalizes the class. You can use this, + for example, to automatically add converters or validators to + fields based on their types. + + .. seealso:: `transform-fields` + + match_args (bool): + If True (default), set ``__match_args__`` on the class to support + :pep:`634` (*Structural Pattern Matching*). It is a tuple of all + non-keyword-only ``__init__`` parameter names on Python 3.10 and + later. Ignored on older Python versions. + + collect_by_mro (bool): + If True, *attrs* collects attributes from base classes correctly + according to the `method resolution order + `_. If False, *attrs* + will mimic the (wrong) behavior of `dataclasses` and :pep:`681`. + + See also `issue #428 + `_. + + getstate_setstate (bool | None): + .. note:: + + This is usually only interesting for slotted classes and you + should probably just set *auto_detect* to True. + + If True, ``__getstate__`` and ``__setstate__`` are generated and + attached to the class. This is necessary for slotted classes to be + pickleable. If left None, it's True by default for slotted classes + and False for dict classes. + + If *auto_detect* is True, and *getstate_setstate* is left None, and + **either** ``__getstate__`` or ``__setstate__`` is detected + directly on the class (meaning: not inherited), it is set to False + (this is usually what you want). + + auto_attribs (bool | None): + If True, look at type annotations to determine which attributes to + use, like `dataclasses`. If False, it will only look for explicit + :func:`field` class attributes, like classic *attrs*. + + If left None, it will guess: + + 1. If any attributes are annotated and no unannotated + `attrs.field`\ s are found, it assumes *auto_attribs=True*. + 2. Otherwise it assumes *auto_attribs=False* and tries to collect + `attrs.field`\ s. + + If *attrs* decides to look at type annotations, **all** fields + **must** be annotated. If *attrs* encounters a field that is set to + a :func:`field` / `attr.ib` but lacks a type annotation, an + `attrs.exceptions.UnannotatedAttributeError` is raised. Use + ``field_name: typing.Any = field(...)`` if you don't want to set a + type. + + .. warning:: + + For features that use the attribute name to create decorators + (for example, :ref:`validators `), you still *must* + assign :func:`field` / `attr.ib` to them. Otherwise Python will + either not find the name or try to use the default value to + call, for example, ``validator`` on it. + + Attributes annotated as `typing.ClassVar`, and attributes that are + neither annotated nor set to an `field()` are **ignored**. + + these (dict[str, object]): + A dictionary of name to the (private) return value of `field()` + mappings. This is useful to avoid the definition of your attributes + within the class body because you can't (for example, if you want + to add ``__repr__`` methods to Django models) or don't want to. + + If *these* is not `None`, *attrs* will *not* search the class body + for attributes and will *not* remove any attributes from it. + + The order is deduced from the order of the attributes inside + *these*. + + Arguably, this is a rather obscure feature. + + .. versionadded:: 20.1.0 + .. versionchanged:: 21.3.0 Converters are also run ``on_setattr``. + .. versionadded:: 22.2.0 + *unsafe_hash* as an alias for *hash* (for :pep:`681` compliance). + .. versionchanged:: 24.1.0 + Instances are not compared as tuples of attributes anymore, but using a + big ``and`` condition. This is faster and has more correct behavior for + uncomparable values like `math.nan`. + .. versionadded:: 24.1.0 + If a class has an *inherited* classmethod called + ``__attrs_init_subclass__``, it is executed after the class is created. + .. deprecated:: 24.1.0 *hash* is deprecated in favor of *unsafe_hash*. + + .. note:: + + The main differences to the classic `attr.s` are: + + - Automatically detect whether or not *auto_attribs* should be `True` + (c.f. *auto_attribs* parameter). + - Converters and validators run when attributes are set by default -- + if *frozen* is `False`. + - *slots=True* + + Usually, this has only upsides and few visible effects in everyday + programming. But it *can* lead to some surprising behaviors, so + please make sure to read :term:`slotted classes`. + + - *auto_exc=True* + - *auto_detect=True* + - *order=False* + - Some options that were only relevant on Python 2 or were kept around + for backwards-compatibility have been removed. + + """ + + def do_it(cls, auto_attribs): + return attrs( + maybe_cls=cls, + these=these, + repr=repr, + hash=hash, + unsafe_hash=unsafe_hash, + init=init, + slots=slots, + frozen=frozen, + weakref_slot=weakref_slot, + str=str, + auto_attribs=auto_attribs, + kw_only=kw_only, + cache_hash=cache_hash, + auto_exc=auto_exc, + eq=eq, + order=order, + auto_detect=auto_detect, + collect_by_mro=True, + getstate_setstate=getstate_setstate, + on_setattr=on_setattr, + field_transformer=field_transformer, + match_args=match_args, + ) + + def wrap(cls): + """ + Making this a wrapper ensures this code runs during class creation. + + We also ensure that frozen-ness of classes is inherited. + """ + nonlocal frozen, on_setattr + + had_on_setattr = on_setattr not in (None, setters.NO_OP) + + # By default, mutable classes convert & validate on setattr. + if frozen is False and on_setattr is None: + on_setattr = _DEFAULT_ON_SETATTR + + # However, if we subclass a frozen class, we inherit the immutability + # and disable on_setattr. + for base_cls in cls.__bases__: + if base_cls.__setattr__ is _frozen_setattrs: + if had_on_setattr: + msg = "Frozen classes can't use on_setattr (frozen-ness was inherited)." + raise ValueError(msg) + + on_setattr = setters.NO_OP + break + + if auto_attribs is not None: + return do_it(cls, auto_attribs) + + try: + return do_it(cls, True) + except UnannotatedAttributeError: + return do_it(cls, False) + + # maybe_cls's type depends on the usage of the decorator. It's a class + # if it's used as `@attrs` but `None` if used as `@attrs()`. + if maybe_cls is None: + return wrap + + return wrap(maybe_cls) + + +mutable = define +frozen = partial(define, frozen=True, on_setattr=None) + + +def field( + *, + default=NOTHING, + validator=None, + repr=True, + hash=None, + init=True, + metadata=None, + type=None, + converter=None, + factory=None, + kw_only=False, + eq=None, + order=None, + on_setattr=None, + alias=None, +): + """ + Create a new :term:`field` / :term:`attribute` on a class. + + .. warning:: + + Does **nothing** unless the class is also decorated with + `attrs.define` (or similar)! + + Args: + default: + A value that is used if an *attrs*-generated ``__init__`` is used + and no value is passed while instantiating or the attribute is + excluded using ``init=False``. + + If the value is an instance of `attrs.Factory`, its callable will + be used to construct a new value (useful for mutable data types + like lists or dicts). + + If a default is not set (or set manually to `attrs.NOTHING`), a + value *must* be supplied when instantiating; otherwise a + `TypeError` will be raised. + + .. seealso:: `defaults` + + factory (~typing.Callable): + Syntactic sugar for ``default=attr.Factory(factory)``. + + validator (~typing.Callable | list[~typing.Callable]): + Callable that is called by *attrs*-generated ``__init__`` methods + after the instance has been initialized. They receive the + initialized instance, the :func:`~attrs.Attribute`, and the passed + value. + + The return value is *not* inspected so the validator has to throw + an exception itself. + + If a `list` is passed, its items are treated as validators and must + all pass. + + Validators can be globally disabled and re-enabled using + `attrs.validators.get_disabled` / `attrs.validators.set_disabled`. + + The validator can also be set using decorator notation as shown + below. + + .. seealso:: :ref:`validators` + + repr (bool | ~typing.Callable): + Include this attribute in the generated ``__repr__`` method. If + True, include the attribute; if False, omit it. By default, the + built-in ``repr()`` function is used. To override how the attribute + value is formatted, pass a ``callable`` that takes a single value + and returns a string. Note that the resulting string is used as-is, + which means it will be used directly *instead* of calling + ``repr()`` (the default). + + eq (bool | ~typing.Callable): + If True (default), include this attribute in the generated + ``__eq__`` and ``__ne__`` methods that check two instances for + equality. To override how the attribute value is compared, pass a + callable that takes a single value and returns the value to be + compared. + + .. seealso:: `comparison` + + order (bool | ~typing.Callable): + If True (default), include this attributes in the generated + ``__lt__``, ``__le__``, ``__gt__`` and ``__ge__`` methods. To + override how the attribute value is ordered, pass a callable that + takes a single value and returns the value to be ordered. + + .. seealso:: `comparison` + + cmp(bool | ~typing.Callable): + Setting *cmp* is equivalent to setting *eq* and *order* to the same + value. Must not be mixed with *eq* or *order*. + + .. seealso:: `comparison` + + hash (bool | None): + Include this attribute in the generated ``__hash__`` method. If + None (default), mirror *eq*'s value. This is the correct behavior + according the Python spec. Setting this value to anything else + than None is *discouraged*. + + .. seealso:: `hashing` + + init (bool): + Include this attribute in the generated ``__init__`` method. + + It is possible to set this to False and set a default value. In + that case this attributed is unconditionally initialized with the + specified default value or factory. + + .. seealso:: `init` + + converter (typing.Callable | Converter): + A callable that is called by *attrs*-generated ``__init__`` methods + to convert attribute's value to the desired format. + + If a vanilla callable is passed, it is given the passed-in value as + the only positional argument. It is possible to receive additional + arguments by wrapping the callable in a `Converter`. + + Either way, the returned value will be used as the new value of the + attribute. The value is converted before being passed to the + validator, if any. + + .. seealso:: :ref:`converters` + + metadata (dict | None): + An arbitrary mapping, to be used by third-party code. + + .. seealso:: `extending-metadata`. + + type (type): + The type of the attribute. Nowadays, the preferred method to + specify the type is using a variable annotation (see :pep:`526`). + This argument is provided for backwards-compatibility and for usage + with `make_class`. Regardless of the approach used, the type will + be stored on ``Attribute.type``. + + Please note that *attrs* doesn't do anything with this metadata by + itself. You can use it as part of your own code or for `static type + checking `. + + kw_only (bool): + Make this attribute keyword-only in the generated ``__init__`` (if + ``init`` is False, this parameter is ignored). + + on_setattr (~typing.Callable | list[~typing.Callable] | None | ~typing.Literal[attrs.setters.NO_OP]): + Allows to overwrite the *on_setattr* setting from `attr.s`. If left + None, the *on_setattr* value from `attr.s` is used. Set to + `attrs.setters.NO_OP` to run **no** `setattr` hooks for this + attribute -- regardless of the setting in `define()`. + + alias (str | None): + Override this attribute's parameter name in the generated + ``__init__`` method. If left None, default to ``name`` stripped + of leading underscores. See `private-attributes`. + + .. versionadded:: 20.1.0 + .. versionchanged:: 21.1.0 + *eq*, *order*, and *cmp* also accept a custom callable + .. versionadded:: 22.2.0 *alias* + .. versionadded:: 23.1.0 + The *type* parameter has been re-added; mostly for `attrs.make_class`. + Please note that type checkers ignore this metadata. + + .. seealso:: + + `attr.ib` + """ + return attrib( + default=default, + validator=validator, + repr=repr, + hash=hash, + init=init, + metadata=metadata, + type=type, + converter=converter, + factory=factory, + kw_only=kw_only, + eq=eq, + order=order, + on_setattr=on_setattr, + alias=alias, + ) + + +def asdict(inst, *, recurse=True, filter=None, value_serializer=None): + """ + Same as `attr.asdict`, except that collections types are always retained + and dict is always used as *dict_factory*. + + .. versionadded:: 21.3.0 + """ + return _asdict( + inst=inst, + recurse=recurse, + filter=filter, + value_serializer=value_serializer, + retain_collection_types=True, + ) + + +def astuple(inst, *, recurse=True, filter=None): + """ + Same as `attr.astuple`, except that collections types are always retained + and `tuple` is always used as the *tuple_factory*. + + .. versionadded:: 21.3.0 + """ + return _astuple( + inst=inst, recurse=recurse, filter=filter, retain_collection_types=True + ) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/_typing_compat.pyi b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/_typing_compat.pyi new file mode 100755 index 00000000..ca7b71e9 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/_typing_compat.pyi @@ -0,0 +1,15 @@ +from typing import Any, ClassVar, Protocol + +# MYPY is a special constant in mypy which works the same way as `TYPE_CHECKING`. +MYPY = False + +if MYPY: + # A protocol to be able to statically accept an attrs class. + class AttrsInstance_(Protocol): + __attrs_attrs__: ClassVar[Any] + +else: + # For type checkers without plug-in support use an empty protocol that + # will (hopefully) be combined into a union. + class AttrsInstance_(Protocol): + pass diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/_version_info.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/_version_info.py new file mode 100755 index 00000000..51a1312f --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/_version_info.py @@ -0,0 +1,86 @@ +# SPDX-License-Identifier: MIT + + +from functools import total_ordering + +from ._funcs import astuple +from ._make import attrib, attrs + + +@total_ordering +@attrs(eq=False, order=False, slots=True, frozen=True) +class VersionInfo: + """ + A version object that can be compared to tuple of length 1--4: + + >>> attr.VersionInfo(19, 1, 0, "final") <= (19, 2) + True + >>> attr.VersionInfo(19, 1, 0, "final") < (19, 1, 1) + True + >>> vi = attr.VersionInfo(19, 2, 0, "final") + >>> vi < (19, 1, 1) + False + >>> vi < (19,) + False + >>> vi == (19, 2,) + True + >>> vi == (19, 2, 1) + False + + .. versionadded:: 19.2 + """ + + year = attrib(type=int) + minor = attrib(type=int) + micro = attrib(type=int) + releaselevel = attrib(type=str) + + @classmethod + def _from_version_string(cls, s): + """ + Parse *s* and return a _VersionInfo. + """ + v = s.split(".") + if len(v) == 3: + v.append("final") + + return cls( + year=int(v[0]), minor=int(v[1]), micro=int(v[2]), releaselevel=v[3] + ) + + def _ensure_tuple(self, other): + """ + Ensure *other* is a tuple of a valid length. + + Returns a possibly transformed *other* and ourselves as a tuple of + the same length as *other*. + """ + + if self.__class__ is other.__class__: + other = astuple(other) + + if not isinstance(other, tuple): + raise NotImplementedError + + if not (1 <= len(other) <= 4): + raise NotImplementedError + + return astuple(self)[: len(other)], other + + def __eq__(self, other): + try: + us, them = self._ensure_tuple(other) + except NotImplementedError: + return NotImplemented + + return us == them + + def __lt__(self, other): + try: + us, them = self._ensure_tuple(other) + except NotImplementedError: + return NotImplemented + + # Since alphabetically "dev0" < "final" < "post1" < "post2", we don't + # have to do anything special with releaselevel for now. + return us < them diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/_version_info.pyi b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/_version_info.pyi new file mode 100755 index 00000000..45ced086 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/_version_info.pyi @@ -0,0 +1,9 @@ +class VersionInfo: + @property + def year(self) -> int: ... + @property + def minor(self) -> int: ... + @property + def micro(self) -> int: ... + @property + def releaselevel(self) -> str: ... diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/converters.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/converters.py new file mode 100755 index 00000000..92383110 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/converters.py @@ -0,0 +1,151 @@ +# SPDX-License-Identifier: MIT + +""" +Commonly useful converters. +""" + + +import typing + +from ._compat import _AnnotationExtractor +from ._make import NOTHING, Factory, pipe + + +__all__ = [ + "default_if_none", + "optional", + "pipe", + "to_bool", +] + + +def optional(converter): + """ + A converter that allows an attribute to be optional. An optional attribute + is one which can be set to `None`. + + Type annotations will be inferred from the wrapped converter's, if it has + any. + + Args: + converter (typing.Callable): + the converter that is used for non-`None` values. + + .. versionadded:: 17.1.0 + """ + + def optional_converter(val): + if val is None: + return None + return converter(val) + + xtr = _AnnotationExtractor(converter) + + t = xtr.get_first_param_type() + if t: + optional_converter.__annotations__["val"] = typing.Optional[t] + + rt = xtr.get_return_type() + if rt: + optional_converter.__annotations__["return"] = typing.Optional[rt] + + return optional_converter + + +def default_if_none(default=NOTHING, factory=None): + """ + A converter that allows to replace `None` values by *default* or the result + of *factory*. + + Args: + default: + Value to be used if `None` is passed. Passing an instance of + `attrs.Factory` is supported, however the ``takes_self`` option is + *not*. + + factory (typing.Callable): + A callable that takes no parameters whose result is used if `None` + is passed. + + Raises: + TypeError: If **neither** *default* or *factory* is passed. + + TypeError: If **both** *default* and *factory* are passed. + + ValueError: + If an instance of `attrs.Factory` is passed with + ``takes_self=True``. + + .. versionadded:: 18.2.0 + """ + if default is NOTHING and factory is None: + msg = "Must pass either `default` or `factory`." + raise TypeError(msg) + + if default is not NOTHING and factory is not None: + msg = "Must pass either `default` or `factory` but not both." + raise TypeError(msg) + + if factory is not None: + default = Factory(factory) + + if isinstance(default, Factory): + if default.takes_self: + msg = "`takes_self` is not supported by default_if_none." + raise ValueError(msg) + + def default_if_none_converter(val): + if val is not None: + return val + + return default.factory() + + else: + + def default_if_none_converter(val): + if val is not None: + return val + + return default + + return default_if_none_converter + + +def to_bool(val): + """ + Convert "boolean" strings (for example, from environment variables) to real + booleans. + + Values mapping to `True`: + + - ``True`` + - ``"true"`` / ``"t"`` + - ``"yes"`` / ``"y"`` + - ``"on"`` + - ``"1"`` + - ``1`` + + Values mapping to `False`: + + - ``False`` + - ``"false"`` / ``"f"`` + - ``"no"`` / ``"n"`` + - ``"off"`` + - ``"0"`` + - ``0`` + + Raises: + ValueError: For any other value. + + .. versionadded:: 21.3.0 + """ + if isinstance(val, str): + val = val.lower() + + if val in (True, "true", "t", "yes", "y", "on", "1", 1): + return True + if val in (False, "false", "f", "no", "n", "off", "0", 0): + return False + + msg = f"Cannot convert value to bool: {val!r}" + raise ValueError(msg) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/converters.pyi b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/converters.pyi new file mode 100755 index 00000000..9ef478f2 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/converters.pyi @@ -0,0 +1,13 @@ +from typing import Callable, TypeVar, overload + +from attrs import _ConverterType + +_T = TypeVar("_T") + +def pipe(*validators: _ConverterType) -> _ConverterType: ... +def optional(converter: _ConverterType) -> _ConverterType: ... +@overload +def default_if_none(default: _T) -> _ConverterType: ... +@overload +def default_if_none(*, factory: Callable[[], _T]) -> _ConverterType: ... +def to_bool(val: str) -> bool: ... diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/exceptions.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/exceptions.py new file mode 100755 index 00000000..3b7abb81 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/exceptions.py @@ -0,0 +1,95 @@ +# SPDX-License-Identifier: MIT + +from __future__ import annotations + +from typing import ClassVar + + +class FrozenError(AttributeError): + """ + A frozen/immutable instance or attribute have been attempted to be + modified. + + It mirrors the behavior of ``namedtuples`` by using the same error message + and subclassing `AttributeError`. + + .. versionadded:: 20.1.0 + """ + + msg = "can't set attribute" + args: ClassVar[tuple[str]] = [msg] + + +class FrozenInstanceError(FrozenError): + """ + A frozen instance has been attempted to be modified. + + .. versionadded:: 16.1.0 + """ + + +class FrozenAttributeError(FrozenError): + """ + A frozen attribute has been attempted to be modified. + + .. versionadded:: 20.1.0 + """ + + +class AttrsAttributeNotFoundError(ValueError): + """ + An *attrs* function couldn't find an attribute that the user asked for. + + .. versionadded:: 16.2.0 + """ + + +class NotAnAttrsClassError(ValueError): + """ + A non-*attrs* class has been passed into an *attrs* function. + + .. versionadded:: 16.2.0 + """ + + +class DefaultAlreadySetError(RuntimeError): + """ + A default has been set when defining the field and is attempted to be reset + using the decorator. + + .. versionadded:: 17.1.0 + """ + + +class UnannotatedAttributeError(RuntimeError): + """ + A class with ``auto_attribs=True`` has a field without a type annotation. + + .. versionadded:: 17.3.0 + """ + + +class PythonTooOldError(RuntimeError): + """ + It was attempted to use an *attrs* feature that requires a newer Python + version. + + .. versionadded:: 18.2.0 + """ + + +class NotCallableError(TypeError): + """ + A field requiring a callable has been set with a value that is not + callable. + + .. versionadded:: 19.2.0 + """ + + def __init__(self, msg, value): + super(TypeError, self).__init__(msg, value) + self.msg = msg + self.value = value + + def __str__(self): + return str(self.msg) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/exceptions.pyi b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/exceptions.pyi new file mode 100755 index 00000000..f2680118 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/exceptions.pyi @@ -0,0 +1,17 @@ +from typing import Any + +class FrozenError(AttributeError): + msg: str = ... + +class FrozenInstanceError(FrozenError): ... +class FrozenAttributeError(FrozenError): ... +class AttrsAttributeNotFoundError(ValueError): ... +class NotAnAttrsClassError(ValueError): ... +class DefaultAlreadySetError(RuntimeError): ... +class UnannotatedAttributeError(RuntimeError): ... +class PythonTooOldError(RuntimeError): ... + +class NotCallableError(TypeError): + msg: str = ... + value: Any = ... + def __init__(self, msg: str, value: Any) -> None: ... diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/filters.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/filters.py new file mode 100755 index 00000000..689b1705 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/filters.py @@ -0,0 +1,72 @@ +# SPDX-License-Identifier: MIT + +""" +Commonly useful filters for `attrs.asdict` and `attrs.astuple`. +""" + +from ._make import Attribute + + +def _split_what(what): + """ + Returns a tuple of `frozenset`s of classes and attributes. + """ + return ( + frozenset(cls for cls in what if isinstance(cls, type)), + frozenset(cls for cls in what if isinstance(cls, str)), + frozenset(cls for cls in what if isinstance(cls, Attribute)), + ) + + +def include(*what): + """ + Create a filter that only allows *what*. + + Args: + what (list[type, str, attrs.Attribute]): + What to include. Can be a type, a name, or an attribute. + + Returns: + Callable: + A callable that can be passed to `attrs.asdict`'s and + `attrs.astuple`'s *filter* argument. + + .. versionchanged:: 23.1.0 Accept strings with field names. + """ + cls, names, attrs = _split_what(what) + + def include_(attribute, value): + return ( + value.__class__ in cls + or attribute.name in names + or attribute in attrs + ) + + return include_ + + +def exclude(*what): + """ + Create a filter that does **not** allow *what*. + + Args: + what (list[type, str, attrs.Attribute]): + What to exclude. Can be a type, a name, or an attribute. + + Returns: + Callable: + A callable that can be passed to `attrs.asdict`'s and + `attrs.astuple`'s *filter* argument. + + .. versionchanged:: 23.3.0 Accept field name string as input argument + """ + cls, names, attrs = _split_what(what) + + def exclude_(attribute, value): + return not ( + value.__class__ in cls + or attribute.name in names + or attribute in attrs + ) + + return exclude_ diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/filters.pyi b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/filters.pyi new file mode 100755 index 00000000..974abdcd --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/filters.pyi @@ -0,0 +1,6 @@ +from typing import Any + +from . import Attribute, _FilterType + +def include(*what: type | str | Attribute[Any]) -> _FilterType[Any]: ... +def exclude(*what: type | str | Attribute[Any]) -> _FilterType[Any]: ... diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/py.typed b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/py.typed new file mode 100755 index 00000000..e69de29b diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/setters.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/setters.py new file mode 100755 index 00000000..a9ce0169 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/setters.py @@ -0,0 +1,79 @@ +# SPDX-License-Identifier: MIT + +""" +Commonly used hooks for on_setattr. +""" + +from . import _config +from .exceptions import FrozenAttributeError + + +def pipe(*setters): + """ + Run all *setters* and return the return value of the last one. + + .. versionadded:: 20.1.0 + """ + + def wrapped_pipe(instance, attrib, new_value): + rv = new_value + + for setter in setters: + rv = setter(instance, attrib, rv) + + return rv + + return wrapped_pipe + + +def frozen(_, __, ___): + """ + Prevent an attribute to be modified. + + .. versionadded:: 20.1.0 + """ + raise FrozenAttributeError() + + +def validate(instance, attrib, new_value): + """ + Run *attrib*'s validator on *new_value* if it has one. + + .. versionadded:: 20.1.0 + """ + if _config._run_validators is False: + return new_value + + v = attrib.validator + if not v: + return new_value + + v(instance, attrib, new_value) + + return new_value + + +def convert(instance, attrib, new_value): + """ + Run *attrib*'s converter -- if it has one -- on *new_value* and return the + result. + + .. versionadded:: 20.1.0 + """ + c = attrib.converter + if c: + # This can be removed once we drop 3.8 and use attrs.Converter instead. + from ._make import Converter + + if not isinstance(c, Converter): + return c(new_value) + + return c(new_value, instance, attrib) + + return new_value + + +# Sentinel for disabling class-wide *on_setattr* hooks for certain attributes. +# Sphinx's autodata stopped working, so the docstring is inlined in the API +# docs. +NO_OP = object() diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/setters.pyi b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/setters.pyi new file mode 100755 index 00000000..73abf36e --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/setters.pyi @@ -0,0 +1,20 @@ +from typing import Any, NewType, NoReturn, TypeVar + +from . import Attribute +from attrs import _OnSetAttrType + +_T = TypeVar("_T") + +def frozen( + instance: Any, attribute: Attribute[Any], new_value: Any +) -> NoReturn: ... +def pipe(*setters: _OnSetAttrType) -> _OnSetAttrType: ... +def validate(instance: Any, attribute: Attribute[_T], new_value: _T) -> _T: ... + +# convert is allowed to return Any, because they can be chained using pipe. +def convert( + instance: Any, attribute: Attribute[Any], new_value: Any +) -> Any: ... + +_NoOpType = NewType("_NoOpType", object) +NO_OP: _NoOpType diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/validators.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/validators.py new file mode 100755 index 00000000..8a56717d --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/validators.py @@ -0,0 +1,711 @@ +# SPDX-License-Identifier: MIT + +""" +Commonly useful validators. +""" + + +import operator +import re + +from contextlib import contextmanager +from re import Pattern + +from ._config import get_run_validators, set_run_validators +from ._make import _AndValidator, and_, attrib, attrs +from .converters import default_if_none +from .exceptions import NotCallableError + + +__all__ = [ + "and_", + "deep_iterable", + "deep_mapping", + "disabled", + "ge", + "get_disabled", + "gt", + "in_", + "instance_of", + "is_callable", + "le", + "lt", + "matches_re", + "max_len", + "min_len", + "not_", + "optional", + "or_", + "set_disabled", +] + + +def set_disabled(disabled): + """ + Globally disable or enable running validators. + + By default, they are run. + + Args: + disabled (bool): If `True`, disable running all validators. + + .. warning:: + + This function is not thread-safe! + + .. versionadded:: 21.3.0 + """ + set_run_validators(not disabled) + + +def get_disabled(): + """ + Return a bool indicating whether validators are currently disabled or not. + + Returns: + bool:`True` if validators are currently disabled. + + .. versionadded:: 21.3.0 + """ + return not get_run_validators() + + +@contextmanager +def disabled(): + """ + Context manager that disables running validators within its context. + + .. warning:: + + This context manager is not thread-safe! + + .. versionadded:: 21.3.0 + """ + set_run_validators(False) + try: + yield + finally: + set_run_validators(True) + + +@attrs(repr=False, slots=True, unsafe_hash=True) +class _InstanceOfValidator: + type = attrib() + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if not isinstance(value, self.type): + msg = f"'{attr.name}' must be {self.type!r} (got {value!r} that is a {value.__class__!r})." + raise TypeError( + msg, + attr, + self.type, + value, + ) + + def __repr__(self): + return f"" + + +def instance_of(type): + """ + A validator that raises a `TypeError` if the initializer is called with a + wrong type for this particular attribute (checks are performed using + `isinstance` therefore it's also valid to pass a tuple of types). + + Args: + type (type | tuple[type]): The type to check for. + + Raises: + TypeError: + With a human readable error message, the attribute (of type + `attrs.Attribute`), the expected type, and the value it got. + """ + return _InstanceOfValidator(type) + + +@attrs(repr=False, frozen=True, slots=True) +class _MatchesReValidator: + pattern = attrib() + match_func = attrib() + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if not self.match_func(value): + msg = f"'{attr.name}' must match regex {self.pattern.pattern!r} ({value!r} doesn't)" + raise ValueError( + msg, + attr, + self.pattern, + value, + ) + + def __repr__(self): + return f"" + + +def matches_re(regex, flags=0, func=None): + r""" + A validator that raises `ValueError` if the initializer is called with a + string that doesn't match *regex*. + + Args: + regex (str, re.Pattern): + A regex string or precompiled pattern to match against + + flags (int): + Flags that will be passed to the underlying re function (default 0) + + func (typing.Callable): + Which underlying `re` function to call. Valid options are + `re.fullmatch`, `re.search`, and `re.match`; the default `None` + means `re.fullmatch`. For performance reasons, the pattern is + always precompiled using `re.compile`. + + .. versionadded:: 19.2.0 + .. versionchanged:: 21.3.0 *regex* can be a pre-compiled pattern. + """ + valid_funcs = (re.fullmatch, None, re.search, re.match) + if func not in valid_funcs: + msg = "'func' must be one of {}.".format( + ", ".join( + sorted(e and e.__name__ or "None" for e in set(valid_funcs)) + ) + ) + raise ValueError(msg) + + if isinstance(regex, Pattern): + if flags: + msg = "'flags' can only be used with a string pattern; pass flags to re.compile() instead" + raise TypeError(msg) + pattern = regex + else: + pattern = re.compile(regex, flags) + + if func is re.match: + match_func = pattern.match + elif func is re.search: + match_func = pattern.search + else: + match_func = pattern.fullmatch + + return _MatchesReValidator(pattern, match_func) + + +@attrs(repr=False, slots=True, unsafe_hash=True) +class _OptionalValidator: + validator = attrib() + + def __call__(self, inst, attr, value): + if value is None: + return + + self.validator(inst, attr, value) + + def __repr__(self): + return f"" + + +def optional(validator): + """ + A validator that makes an attribute optional. An optional attribute is one + which can be set to `None` in addition to satisfying the requirements of + the sub-validator. + + Args: + validator + (typing.Callable | tuple[typing.Callable] | list[typing.Callable]): + A validator (or validators) that is used for non-`None` values. + + .. versionadded:: 15.1.0 + .. versionchanged:: 17.1.0 *validator* can be a list of validators. + .. versionchanged:: 23.1.0 *validator* can also be a tuple of validators. + """ + if isinstance(validator, (list, tuple)): + return _OptionalValidator(_AndValidator(validator)) + + return _OptionalValidator(validator) + + +@attrs(repr=False, slots=True, unsafe_hash=True) +class _InValidator: + options = attrib() + _original_options = attrib(hash=False) + + def __call__(self, inst, attr, value): + try: + in_options = value in self.options + except TypeError: # e.g. `1 in "abc"` + in_options = False + + if not in_options: + msg = f"'{attr.name}' must be in {self._original_options!r} (got {value!r})" + raise ValueError( + msg, + attr, + self._original_options, + value, + ) + + def __repr__(self): + return f"" + + +def in_(options): + """ + A validator that raises a `ValueError` if the initializer is called with a + value that does not belong in the *options* provided. + + The check is performed using ``value in options``, so *options* has to + support that operation. + + To keep the validator hashable, dicts, lists, and sets are transparently + transformed into a `tuple`. + + Args: + options: Allowed options. + + Raises: + ValueError: + With a human readable error message, the attribute (of type + `attrs.Attribute`), the expected options, and the value it got. + + .. versionadded:: 17.1.0 + .. versionchanged:: 22.1.0 + The ValueError was incomplete until now and only contained the human + readable error message. Now it contains all the information that has + been promised since 17.1.0. + .. versionchanged:: 24.1.0 + *options* that are a list, dict, or a set are now transformed into a + tuple to keep the validator hashable. + """ + repr_options = options + if isinstance(options, (list, dict, set)): + options = tuple(options) + + return _InValidator(options, repr_options) + + +@attrs(repr=False, slots=False, unsafe_hash=True) +class _IsCallableValidator: + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if not callable(value): + message = ( + "'{name}' must be callable " + "(got {value!r} that is a {actual!r})." + ) + raise NotCallableError( + msg=message.format( + name=attr.name, value=value, actual=value.__class__ + ), + value=value, + ) + + def __repr__(self): + return "" + + +def is_callable(): + """ + A validator that raises a `attrs.exceptions.NotCallableError` if the + initializer is called with a value for this particular attribute that is + not callable. + + .. versionadded:: 19.1.0 + + Raises: + attrs.exceptions.NotCallableError: + With a human readable error message containing the attribute + (`attrs.Attribute`) name, and the value it got. + """ + return _IsCallableValidator() + + +@attrs(repr=False, slots=True, unsafe_hash=True) +class _DeepIterable: + member_validator = attrib(validator=is_callable()) + iterable_validator = attrib( + default=None, validator=optional(is_callable()) + ) + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if self.iterable_validator is not None: + self.iterable_validator(inst, attr, value) + + for member in value: + self.member_validator(inst, attr, member) + + def __repr__(self): + iterable_identifier = ( + "" + if self.iterable_validator is None + else f" {self.iterable_validator!r}" + ) + return ( + f"" + ) + + +def deep_iterable(member_validator, iterable_validator=None): + """ + A validator that performs deep validation of an iterable. + + Args: + member_validator: Validator to apply to iterable members. + + iterable_validator: + Validator to apply to iterable itself (optional). + + Raises + TypeError: if any sub-validators fail + + .. versionadded:: 19.1.0 + """ + if isinstance(member_validator, (list, tuple)): + member_validator = and_(*member_validator) + return _DeepIterable(member_validator, iterable_validator) + + +@attrs(repr=False, slots=True, unsafe_hash=True) +class _DeepMapping: + key_validator = attrib(validator=is_callable()) + value_validator = attrib(validator=is_callable()) + mapping_validator = attrib(default=None, validator=optional(is_callable())) + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if self.mapping_validator is not None: + self.mapping_validator(inst, attr, value) + + for key in value: + self.key_validator(inst, attr, key) + self.value_validator(inst, attr, value[key]) + + def __repr__(self): + return f"" + + +def deep_mapping(key_validator, value_validator, mapping_validator=None): + """ + A validator that performs deep validation of a dictionary. + + Args: + key_validator: Validator to apply to dictionary keys. + + value_validator: Validator to apply to dictionary values. + + mapping_validator: + Validator to apply to top-level mapping attribute (optional). + + .. versionadded:: 19.1.0 + + Raises: + TypeError: if any sub-validators fail + """ + return _DeepMapping(key_validator, value_validator, mapping_validator) + + +@attrs(repr=False, frozen=True, slots=True) +class _NumberValidator: + bound = attrib() + compare_op = attrib() + compare_func = attrib() + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if not self.compare_func(value, self.bound): + msg = f"'{attr.name}' must be {self.compare_op} {self.bound}: {value}" + raise ValueError(msg) + + def __repr__(self): + return f"" + + +def lt(val): + """ + A validator that raises `ValueError` if the initializer is called with a + number larger or equal to *val*. + + The validator uses `operator.lt` to compare the values. + + Args: + val: Exclusive upper bound for values. + + .. versionadded:: 21.3.0 + """ + return _NumberValidator(val, "<", operator.lt) + + +def le(val): + """ + A validator that raises `ValueError` if the initializer is called with a + number greater than *val*. + + The validator uses `operator.le` to compare the values. + + Args: + val: Inclusive upper bound for values. + + .. versionadded:: 21.3.0 + """ + return _NumberValidator(val, "<=", operator.le) + + +def ge(val): + """ + A validator that raises `ValueError` if the initializer is called with a + number smaller than *val*. + + The validator uses `operator.ge` to compare the values. + + Args: + val: Inclusive lower bound for values + + .. versionadded:: 21.3.0 + """ + return _NumberValidator(val, ">=", operator.ge) + + +def gt(val): + """ + A validator that raises `ValueError` if the initializer is called with a + number smaller or equal to *val*. + + The validator uses `operator.ge` to compare the values. + + Args: + val: Exclusive lower bound for values + + .. versionadded:: 21.3.0 + """ + return _NumberValidator(val, ">", operator.gt) + + +@attrs(repr=False, frozen=True, slots=True) +class _MaxLengthValidator: + max_length = attrib() + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if len(value) > self.max_length: + msg = f"Length of '{attr.name}' must be <= {self.max_length}: {len(value)}" + raise ValueError(msg) + + def __repr__(self): + return f"" + + +def max_len(length): + """ + A validator that raises `ValueError` if the initializer is called + with a string or iterable that is longer than *length*. + + Args: + length (int): Maximum length of the string or iterable + + .. versionadded:: 21.3.0 + """ + return _MaxLengthValidator(length) + + +@attrs(repr=False, frozen=True, slots=True) +class _MinLengthValidator: + min_length = attrib() + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if len(value) < self.min_length: + msg = f"Length of '{attr.name}' must be >= {self.min_length}: {len(value)}" + raise ValueError(msg) + + def __repr__(self): + return f"" + + +def min_len(length): + """ + A validator that raises `ValueError` if the initializer is called + with a string or iterable that is shorter than *length*. + + Args: + length (int): Minimum length of the string or iterable + + .. versionadded:: 22.1.0 + """ + return _MinLengthValidator(length) + + +@attrs(repr=False, slots=True, unsafe_hash=True) +class _SubclassOfValidator: + type = attrib() + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if not issubclass(value, self.type): + msg = f"'{attr.name}' must be a subclass of {self.type!r} (got {value!r})." + raise TypeError( + msg, + attr, + self.type, + value, + ) + + def __repr__(self): + return f"" + + +def _subclass_of(type): + """ + A validator that raises a `TypeError` if the initializer is called with a + wrong type for this particular attribute (checks are performed using + `issubclass` therefore it's also valid to pass a tuple of types). + + Args: + type (type | tuple[type, ...]): The type(s) to check for. + + Raises: + TypeError: + With a human readable error message, the attribute (of type + `attrs.Attribute`), the expected type, and the value it got. + """ + return _SubclassOfValidator(type) + + +@attrs(repr=False, slots=True, unsafe_hash=True) +class _NotValidator: + validator = attrib() + msg = attrib( + converter=default_if_none( + "not_ validator child '{validator!r}' " + "did not raise a captured error" + ) + ) + exc_types = attrib( + validator=deep_iterable( + member_validator=_subclass_of(Exception), + iterable_validator=instance_of(tuple), + ), + ) + + def __call__(self, inst, attr, value): + try: + self.validator(inst, attr, value) + except self.exc_types: + pass # suppress error to invert validity + else: + raise ValueError( + self.msg.format( + validator=self.validator, + exc_types=self.exc_types, + ), + attr, + self.validator, + value, + self.exc_types, + ) + + def __repr__(self): + return f"" + + +def not_(validator, *, msg=None, exc_types=(ValueError, TypeError)): + """ + A validator that wraps and logically 'inverts' the validator passed to it. + It will raise a `ValueError` if the provided validator *doesn't* raise a + `ValueError` or `TypeError` (by default), and will suppress the exception + if the provided validator *does*. + + Intended to be used with existing validators to compose logic without + needing to create inverted variants, for example, ``not_(in_(...))``. + + Args: + validator: A validator to be logically inverted. + + msg (str): + Message to raise if validator fails. Formatted with keys + ``exc_types`` and ``validator``. + + exc_types (tuple[type, ...]): + Exception type(s) to capture. Other types raised by child + validators will not be intercepted and pass through. + + Raises: + ValueError: + With a human readable error message, the attribute (of type + `attrs.Attribute`), the validator that failed to raise an + exception, the value it got, and the expected exception types. + + .. versionadded:: 22.2.0 + """ + try: + exc_types = tuple(exc_types) + except TypeError: + exc_types = (exc_types,) + return _NotValidator(validator, msg, exc_types) + + +@attrs(repr=False, slots=True, unsafe_hash=True) +class _OrValidator: + validators = attrib() + + def __call__(self, inst, attr, value): + for v in self.validators: + try: + v(inst, attr, value) + except Exception: # noqa: BLE001, PERF203, S112 + continue + else: + return + + msg = f"None of {self.validators!r} satisfied for value {value!r}" + raise ValueError(msg) + + def __repr__(self): + return f"" + + +def or_(*validators): + """ + A validator that composes multiple validators into one. + + When called on a value, it runs all wrapped validators until one of them is + satisfied. + + Args: + validators (~collections.abc.Iterable[typing.Callable]): + Arbitrary number of validators. + + Raises: + ValueError: + If no validator is satisfied. Raised with a human-readable error + message listing all the wrapped validators and the value that + failed all of them. + + .. versionadded:: 24.1.0 + """ + vals = [] + for v in validators: + vals.extend(v.validators if isinstance(v, _OrValidator) else [v]) + + return _OrValidator(tuple(vals)) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/validators.pyi b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/validators.pyi new file mode 100755 index 00000000..a314110e --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attr/validators.pyi @@ -0,0 +1,83 @@ +from typing import ( + Any, + AnyStr, + Callable, + Container, + ContextManager, + Iterable, + Mapping, + Match, + Pattern, + TypeVar, + overload, +) + +from attrs import _ValidatorType +from attrs import _ValidatorArgType + +_T = TypeVar("_T") +_T1 = TypeVar("_T1") +_T2 = TypeVar("_T2") +_T3 = TypeVar("_T3") +_I = TypeVar("_I", bound=Iterable) +_K = TypeVar("_K") +_V = TypeVar("_V") +_M = TypeVar("_M", bound=Mapping) + +def set_disabled(run: bool) -> None: ... +def get_disabled() -> bool: ... +def disabled() -> ContextManager[None]: ... + +# To be more precise on instance_of use some overloads. +# If there are more than 3 items in the tuple then we fall back to Any +@overload +def instance_of(type: type[_T]) -> _ValidatorType[_T]: ... +@overload +def instance_of(type: tuple[type[_T]]) -> _ValidatorType[_T]: ... +@overload +def instance_of( + type: tuple[type[_T1], type[_T2]] +) -> _ValidatorType[_T1 | _T2]: ... +@overload +def instance_of( + type: tuple[type[_T1], type[_T2], type[_T3]] +) -> _ValidatorType[_T1 | _T2 | _T3]: ... +@overload +def instance_of(type: tuple[type, ...]) -> _ValidatorType[Any]: ... +def optional( + validator: ( + _ValidatorType[_T] + | list[_ValidatorType[_T]] + | tuple[_ValidatorType[_T]] + ), +) -> _ValidatorType[_T | None]: ... +def in_(options: Container[_T]) -> _ValidatorType[_T]: ... +def and_(*validators: _ValidatorType[_T]) -> _ValidatorType[_T]: ... +def matches_re( + regex: Pattern[AnyStr] | AnyStr, + flags: int = ..., + func: Callable[[AnyStr, AnyStr, int], Match[AnyStr] | None] | None = ..., +) -> _ValidatorType[AnyStr]: ... +def deep_iterable( + member_validator: _ValidatorArgType[_T], + iterable_validator: _ValidatorType[_I] | None = ..., +) -> _ValidatorType[_I]: ... +def deep_mapping( + key_validator: _ValidatorType[_K], + value_validator: _ValidatorType[_V], + mapping_validator: _ValidatorType[_M] | None = ..., +) -> _ValidatorType[_M]: ... +def is_callable() -> _ValidatorType[_T]: ... +def lt(val: _T) -> _ValidatorType[_T]: ... +def le(val: _T) -> _ValidatorType[_T]: ... +def ge(val: _T) -> _ValidatorType[_T]: ... +def gt(val: _T) -> _ValidatorType[_T]: ... +def max_len(length: int) -> _ValidatorType[_T]: ... +def min_len(length: int) -> _ValidatorType[_T]: ... +def not_( + validator: _ValidatorType[_T], + *, + msg: str | None = None, + exc_types: type[Exception] | Iterable[type[Exception]] = ..., +) -> _ValidatorType[_T]: ... +def or_(*validators: _ValidatorType[_T]) -> _ValidatorType[_T]: ... diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs-24.2.0.dist-info/INSTALLER b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs-24.2.0.dist-info/INSTALLER new file mode 100755 index 00000000..a1b589e3 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs-24.2.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs-24.2.0.dist-info/METADATA b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs-24.2.0.dist-info/METADATA new file mode 100755 index 00000000..a85b3786 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs-24.2.0.dist-info/METADATA @@ -0,0 +1,242 @@ +Metadata-Version: 2.3 +Name: attrs +Version: 24.2.0 +Summary: Classes Without Boilerplate +Project-URL: Documentation, https://www.attrs.org/ +Project-URL: Changelog, https://www.attrs.org/en/stable/changelog.html +Project-URL: GitHub, https://github.com/python-attrs/attrs +Project-URL: Funding, https://github.com/sponsors/hynek +Project-URL: Tidelift, https://tidelift.com/subscription/pkg/pypi-attrs?utm_source=pypi-attrs&utm_medium=pypi +Author-email: Hynek Schlawack +License-Expression: MIT +License-File: LICENSE +Keywords: attribute,boilerplate,class +Classifier: Development Status :: 5 - Production/Stable +Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Typing :: Typed +Requires-Python: >=3.7 +Requires-Dist: importlib-metadata; python_version < '3.8' +Provides-Extra: benchmark +Requires-Dist: cloudpickle; (platform_python_implementation == 'CPython') and extra == 'benchmark' +Requires-Dist: hypothesis; extra == 'benchmark' +Requires-Dist: mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.9') and extra == 'benchmark' +Requires-Dist: pympler; extra == 'benchmark' +Requires-Dist: pytest-codspeed; extra == 'benchmark' +Requires-Dist: pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.9' and python_version < '3.13') and extra == 'benchmark' +Requires-Dist: pytest-xdist[psutil]; extra == 'benchmark' +Requires-Dist: pytest>=4.3.0; extra == 'benchmark' +Provides-Extra: cov +Requires-Dist: cloudpickle; (platform_python_implementation == 'CPython') and extra == 'cov' +Requires-Dist: coverage[toml]>=5.3; extra == 'cov' +Requires-Dist: hypothesis; extra == 'cov' +Requires-Dist: mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.9') and extra == 'cov' +Requires-Dist: pympler; extra == 'cov' +Requires-Dist: pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.9' and python_version < '3.13') and extra == 'cov' +Requires-Dist: pytest-xdist[psutil]; extra == 'cov' +Requires-Dist: pytest>=4.3.0; extra == 'cov' +Provides-Extra: dev +Requires-Dist: cloudpickle; (platform_python_implementation == 'CPython') and extra == 'dev' +Requires-Dist: hypothesis; extra == 'dev' +Requires-Dist: mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.9') and extra == 'dev' +Requires-Dist: pre-commit; extra == 'dev' +Requires-Dist: pympler; extra == 'dev' +Requires-Dist: pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.9' and python_version < '3.13') and extra == 'dev' +Requires-Dist: pytest-xdist[psutil]; extra == 'dev' +Requires-Dist: pytest>=4.3.0; extra == 'dev' +Provides-Extra: docs +Requires-Dist: cogapp; extra == 'docs' +Requires-Dist: furo; extra == 'docs' +Requires-Dist: myst-parser; extra == 'docs' +Requires-Dist: sphinx; extra == 'docs' +Requires-Dist: sphinx-notfound-page; extra == 'docs' +Requires-Dist: sphinxcontrib-towncrier; extra == 'docs' +Requires-Dist: towncrier<24.7; extra == 'docs' +Provides-Extra: tests +Requires-Dist: cloudpickle; (platform_python_implementation == 'CPython') and extra == 'tests' +Requires-Dist: hypothesis; extra == 'tests' +Requires-Dist: mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.9') and extra == 'tests' +Requires-Dist: pympler; extra == 'tests' +Requires-Dist: pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.9' and python_version < '3.13') and extra == 'tests' +Requires-Dist: pytest-xdist[psutil]; extra == 'tests' +Requires-Dist: pytest>=4.3.0; extra == 'tests' +Provides-Extra: tests-mypy +Requires-Dist: mypy>=1.11.1; (platform_python_implementation == 'CPython' and python_version >= '3.9') and extra == 'tests-mypy' +Requires-Dist: pytest-mypy-plugins; (platform_python_implementation == 'CPython' and python_version >= '3.9' and python_version < '3.13') and extra == 'tests-mypy' +Description-Content-Type: text/markdown + +

+ + attrs + +

+ + +*attrs* is the Python package that will bring back the **joy** of **writing classes** by relieving you from the drudgery of implementing object protocols (aka [dunder methods](https://www.attrs.org/en/latest/glossary.html#term-dunder-methods)). +[Trusted by NASA](https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-github-profile/customizing-your-profile/personalizing-your-profile#list-of-qualifying-repositories-for-mars-2020-helicopter-contributor-achievement) for Mars missions since 2020! + +Its main goal is to help you to write **concise** and **correct** software without slowing down your code. + + +## Sponsors + +*attrs* would not be possible without our [amazing sponsors](https://github.com/sponsors/hynek). +Especially those generously supporting us at the *The Organization* tier and higher: + + + +

+ + + + + + + + +

+ + + +

+ Please consider joining them to help make attrs’s maintenance more sustainable! +

+ + + +## Example + +*attrs* gives you a class decorator and a way to declaratively define the attributes on that class: + + + +```pycon +>>> from attrs import asdict, define, make_class, Factory + +>>> @define +... class SomeClass: +... a_number: int = 42 +... list_of_numbers: list[int] = Factory(list) +... +... def hard_math(self, another_number): +... return self.a_number + sum(self.list_of_numbers) * another_number + + +>>> sc = SomeClass(1, [1, 2, 3]) +>>> sc +SomeClass(a_number=1, list_of_numbers=[1, 2, 3]) + +>>> sc.hard_math(3) +19 +>>> sc == SomeClass(1, [1, 2, 3]) +True +>>> sc != SomeClass(2, [3, 2, 1]) +True + +>>> asdict(sc) +{'a_number': 1, 'list_of_numbers': [1, 2, 3]} + +>>> SomeClass() +SomeClass(a_number=42, list_of_numbers=[]) + +>>> C = make_class("C", ["a", "b"]) +>>> C("foo", "bar") +C(a='foo', b='bar') +``` + +After *declaring* your attributes, *attrs* gives you: + +- a concise and explicit overview of the class's attributes, +- a nice human-readable `__repr__`, +- equality-checking methods, +- an initializer, +- and much more, + +*without* writing dull boilerplate code again and again and *without* runtime performance penalties. + +--- + +This example uses *attrs*'s modern APIs that have been introduced in version 20.1.0, and the *attrs* package import name that has been added in version 21.3.0. +The classic APIs (`@attr.s`, `attr.ib`, plus their serious-business aliases) and the `attr` package import name will remain **indefinitely**. + +Check out [*On The Core API Names*](https://www.attrs.org/en/latest/names.html) for an in-depth explanation! + + +### Hate Type Annotations!? + +No problem! +Types are entirely **optional** with *attrs*. +Simply assign `attrs.field()` to the attributes instead of annotating them with types: + +```python +from attrs import define, field + +@define +class SomeClass: + a_number = field(default=42) + list_of_numbers = field(factory=list) +``` + + +## Data Classes + +On the tin, *attrs* might remind you of `dataclasses` (and indeed, `dataclasses` [are a descendant](https://hynek.me/articles/import-attrs/) of *attrs*). +In practice it does a lot more and is more flexible. +For instance, it allows you to define [special handling of NumPy arrays for equality checks](https://www.attrs.org/en/stable/comparison.html#customization), allows more ways to [plug into the initialization process](https://www.attrs.org/en/stable/init.html#hooking-yourself-into-initialization), has a replacement for `__init_subclass__`, and allows for stepping through the generated methods using a debugger. + +For more details, please refer to our [comparison page](https://www.attrs.org/en/stable/why.html#data-classes), but generally speaking, we are more likely to commit crimes against nature to make things work that one would expect to work, but that are quite complicated in practice. + + +## Project Information + +- [**Changelog**](https://www.attrs.org/en/stable/changelog.html) +- [**Documentation**](https://www.attrs.org/) +- [**PyPI**](https://pypi.org/project/attrs/) +- [**Source Code**](https://github.com/python-attrs/attrs) +- [**Contributing**](https://github.com/python-attrs/attrs/blob/main/.github/CONTRIBUTING.md) +- [**Third-party Extensions**](https://github.com/python-attrs/attrs/wiki/Extensions-to-attrs) +- **Get Help**: use the `python-attrs` tag on [Stack Overflow](https://stackoverflow.com/questions/tagged/python-attrs) + + +### *attrs* for Enterprise + +Available as part of the Tidelift Subscription. + +The maintainers of *attrs* and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source packages you use to build your applications. +Save time, reduce risk, and improve code health, while paying the maintainers of the exact packages you use. +[Learn more](https://tidelift.com/?utm_source=lifter&utm_medium=referral&utm_campaign=hynek). + +## Release Information + +### Deprecations + +- Given the amount of warnings raised in the broader ecosystem, we've decided to only soft-deprecate the *hash* argument to `@define` / `@attr.s`. + Please don't use it in new code, but we don't intend to remove it anymore. + [#1330](https://github.com/python-attrs/attrs/issues/1330) + + +### Changes + +- `attrs.converters.pipe()` (and its syntactic sugar of passing a list for `attrs.field()`'s / `attr.ib()`'s *converter* argument) works again when passing `attrs.setters.convert` to *on_setattr* (which is default for `attrs.define`). + [#1328](https://github.com/python-attrs/attrs/issues/1328) +- Restored support for PEP [649](https://peps.python.org/pep-0649/) / [749](https://peps.python.org/pep-0749/)-implementing Pythons -- currently 3.14-dev. + [#1329](https://github.com/python-attrs/attrs/issues/1329) + + + +--- + +[Full changelog →](https://www.attrs.org/en/stable/changelog.html) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs-24.2.0.dist-info/RECORD b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs-24.2.0.dist-info/RECORD new file mode 100755 index 00000000..78e82417 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs-24.2.0.dist-info/RECORD @@ -0,0 +1,36 @@ +attr/__init__.py,sha256=l8Ewh5KZE7CCY0i1iDfSCnFiUTIkBVoqsXjX9EZnIVA,2087 +attr/__init__.pyi,sha256=aTVHBPX6krCGvbQvOl_UKqEzmi2HFsaIVm2WKmAiqVs,11434 +attr/_cmp.py,sha256=3umHiBtgsEYtvNP_8XrQwTCdFoZIX4DEur76N-2a3X8,4123 +attr/_cmp.pyi,sha256=U-_RU_UZOyPUEQzXE6RMYQQcjkZRY25wTH99sN0s7MM,368 +attr/_compat.py,sha256=n2Uk3c-ywv0PkFfGlvqR7SzDXp4NOhWmNV_ZK6YfWoM,2958 +attr/_config.py,sha256=z81Vt-GeT_2taxs1XZfmHx9TWlSxjPb6eZH1LTGsS54,843 +attr/_funcs.py,sha256=SGDmNlED1TM3tgO9Ap2mfRfVI24XEAcrNQs7o2eBXHQ,17386 +attr/_make.py,sha256=BjENJz5eJoojJVbCoupWjXLLEZJ7VID89lisLbQUlmQ,91479 +attr/_next_gen.py,sha256=dhGb96VFg4kXBkS9Zdz1A2uxVJ99q_RT1hw3kLA9-uI,24630 +attr/_typing_compat.pyi,sha256=XDP54TUn-ZKhD62TOQebmzrwFyomhUCoGRpclb6alRA,469 +attr/_version_info.py,sha256=exSqb3b5E-fMSsgZAlEw9XcLpEgobPORCZpcaEglAM4,2121 +attr/_version_info.pyi,sha256=x_M3L3WuB7r_ULXAWjx959udKQ4HLB8l-hsc1FDGNvk,209 +attr/converters.py,sha256=vNa58pZi9V6uxBzl4t1QrHbQfkT4iRFAodyXe7lcgg0,3506 +attr/converters.pyi,sha256=mpDoVFO3Cpx8xYSSV0iZFl7IAHuoNBglxKfxHvLj_sY,410 +attr/exceptions.py,sha256=HRFq4iybmv7-DcZwyjl6M1euM2YeJVK_hFxuaBGAngI,1977 +attr/exceptions.pyi,sha256=zZq8bCUnKAy9mDtBEw42ZhPhAUIHoTKedDQInJD883M,539 +attr/filters.py,sha256=ZBiKWLp3R0LfCZsq7X11pn9WX8NslS2wXM4jsnLOGc8,1795 +attr/filters.pyi,sha256=3J5BG-dTxltBk1_-RuNRUHrv2qu1v8v4aDNAQ7_mifA,208 +attr/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +attr/setters.py,sha256=faMQeiBo_nbXYnPaQ1pq8PXeA7Zr-uNsVsPMiKCmxhc,1619 +attr/setters.pyi,sha256=NnVkaFU1BB4JB8E4JuXyrzTUgvtMpj8p3wBdJY7uix4,584 +attr/validators.py,sha256=985eTP6RHyon61YEauMJgyNy1rEOhJWiSXMJgRxPtrQ,20045 +attr/validators.pyi,sha256=LjKf7AoXZfvGSfT3LRs61Qfln94konYyMUPoJJjOxK4,2502 +attrs-24.2.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +attrs-24.2.0.dist-info/METADATA,sha256=3Jgk4lr9Y1SAqAcwOLPN_mpW0wc6VOGm-yHt1LsPIHw,11524 +attrs-24.2.0.dist-info/RECORD,, +attrs-24.2.0.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87 +attrs-24.2.0.dist-info/licenses/LICENSE,sha256=iCEVyV38KvHutnFPjsbVy8q_Znyv-HKfQkINpj9xTp8,1109 +attrs/__init__.py,sha256=5FHo-EMFOX-g4ialSK4fwOjuoHzLISJDZCwoOl02Ty8,1071 +attrs/__init__.pyi,sha256=o3l92VsD9kHz8sldEtb_tllBTs3TeL-vIBMTxo2Zc_4,7703 +attrs/converters.py,sha256=8kQljrVwfSTRu8INwEk8SI0eGrzmWftsT7rM0EqyohM,76 +attrs/exceptions.py,sha256=ACCCmg19-vDFaDPY9vFl199SPXCQMN_bENs4DALjzms,76 +attrs/filters.py,sha256=VOUMZug9uEU6dUuA0dF1jInUK0PL3fLgP0VBS5d-CDE,73 +attrs/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +attrs/setters.py,sha256=eL1YidYQV3T2h9_SYIZSZR1FAcHGb1TuCTy0E0Lv2SU,73 +attrs/validators.py,sha256=xcy6wD5TtTkdCG1f4XWbocPSO0faBjk5IfVJfP6SUj0,76 diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs-24.2.0.dist-info/WHEEL b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs-24.2.0.dist-info/WHEEL new file mode 100755 index 00000000..cdd68a49 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs-24.2.0.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: hatchling 1.25.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs-24.2.0.dist-info/licenses/LICENSE b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs-24.2.0.dist-info/licenses/LICENSE new file mode 100755 index 00000000..2bd6453d --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs-24.2.0.dist-info/licenses/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 Hynek Schlawack and the attrs contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs/__init__.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs/__init__.py new file mode 100755 index 00000000..963b1972 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs/__init__.py @@ -0,0 +1,67 @@ +# SPDX-License-Identifier: MIT + +from attr import ( + NOTHING, + Attribute, + AttrsInstance, + Converter, + Factory, + _make_getattr, + assoc, + cmp_using, + define, + evolve, + field, + fields, + fields_dict, + frozen, + has, + make_class, + mutable, + resolve_types, + validate, +) +from attr._next_gen import asdict, astuple + +from . import converters, exceptions, filters, setters, validators + + +__all__ = [ + "__author__", + "__copyright__", + "__description__", + "__doc__", + "__email__", + "__license__", + "__title__", + "__url__", + "__version__", + "__version_info__", + "asdict", + "assoc", + "astuple", + "Attribute", + "AttrsInstance", + "cmp_using", + "Converter", + "converters", + "define", + "evolve", + "exceptions", + "Factory", + "field", + "fields_dict", + "fields", + "filters", + "frozen", + "has", + "make_class", + "mutable", + "NOTHING", + "resolve_types", + "setters", + "validate", + "validators", +] + +__getattr__ = _make_getattr(__name__) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs/__init__.pyi b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs/__init__.pyi new file mode 100755 index 00000000..b2670de2 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs/__init__.pyi @@ -0,0 +1,252 @@ +import sys + +from typing import ( + Any, + Callable, + Mapping, + Sequence, + overload, + TypeVar, +) + +# Because we need to type our own stuff, we have to make everything from +# attr explicitly public too. +from attr import __author__ as __author__ +from attr import __copyright__ as __copyright__ +from attr import __description__ as __description__ +from attr import __email__ as __email__ +from attr import __license__ as __license__ +from attr import __title__ as __title__ +from attr import __url__ as __url__ +from attr import __version__ as __version__ +from attr import __version_info__ as __version_info__ +from attr import assoc as assoc +from attr import Attribute as Attribute +from attr import AttrsInstance as AttrsInstance +from attr import cmp_using as cmp_using +from attr import converters as converters +from attr import Converter as Converter +from attr import evolve as evolve +from attr import exceptions as exceptions +from attr import Factory as Factory +from attr import fields as fields +from attr import fields_dict as fields_dict +from attr import filters as filters +from attr import has as has +from attr import make_class as make_class +from attr import NOTHING as NOTHING +from attr import resolve_types as resolve_types +from attr import setters as setters +from attr import validate as validate +from attr import validators as validators +from attr import attrib, asdict as asdict, astuple as astuple + +if sys.version_info >= (3, 11): + from typing import dataclass_transform +else: + from typing_extensions import dataclass_transform + +_T = TypeVar("_T") +_C = TypeVar("_C", bound=type) + +_EqOrderType = bool | Callable[[Any], Any] +_ValidatorType = Callable[[Any, "Attribute[_T]", _T], Any] +_ConverterType = Callable[[Any], Any] +_ReprType = Callable[[Any], str] +_ReprArgType = bool | _ReprType +_OnSetAttrType = Callable[[Any, "Attribute[Any]", Any], Any] +_OnSetAttrArgType = _OnSetAttrType | list[_OnSetAttrType] | setters._NoOpType +_FieldTransformer = Callable[ + [type, list["Attribute[Any]"]], list["Attribute[Any]"] +] +# FIXME: in reality, if multiple validators are passed they must be in a list +# or tuple, but those are invariant and so would prevent subtypes of +# _ValidatorType from working when passed in a list or tuple. +_ValidatorArgType = _ValidatorType[_T] | Sequence[_ValidatorType[_T]] + +@overload +def field( + *, + default: None = ..., + validator: None = ..., + repr: _ReprArgType = ..., + hash: bool | None = ..., + init: bool = ..., + metadata: Mapping[Any, Any] | None = ..., + converter: None = ..., + factory: None = ..., + kw_only: bool = ..., + eq: bool | None = ..., + order: bool | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., + type: type | None = ..., +) -> Any: ... + +# This form catches an explicit None or no default and infers the type from the +# other arguments. +@overload +def field( + *, + default: None = ..., + validator: _ValidatorArgType[_T] | None = ..., + repr: _ReprArgType = ..., + hash: bool | None = ..., + init: bool = ..., + metadata: Mapping[Any, Any] | None = ..., + converter: _ConverterType | Converter[Any, _T] | None = ..., + factory: Callable[[], _T] | None = ..., + kw_only: bool = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., + type: type | None = ..., +) -> _T: ... + +# This form catches an explicit default argument. +@overload +def field( + *, + default: _T, + validator: _ValidatorArgType[_T] | None = ..., + repr: _ReprArgType = ..., + hash: bool | None = ..., + init: bool = ..., + metadata: Mapping[Any, Any] | None = ..., + converter: _ConverterType | Converter[Any, _T] | None = ..., + factory: Callable[[], _T] | None = ..., + kw_only: bool = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., + type: type | None = ..., +) -> _T: ... + +# This form covers type=non-Type: e.g. forward references (str), Any +@overload +def field( + *, + default: _T | None = ..., + validator: _ValidatorArgType[_T] | None = ..., + repr: _ReprArgType = ..., + hash: bool | None = ..., + init: bool = ..., + metadata: Mapping[Any, Any] | None = ..., + converter: _ConverterType | Converter[Any, _T] | None = ..., + factory: Callable[[], _T] | None = ..., + kw_only: bool = ..., + eq: _EqOrderType | None = ..., + order: _EqOrderType | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + alias: str | None = ..., + type: type | None = ..., +) -> Any: ... +@overload +@dataclass_transform(field_specifiers=(attrib, field)) +def define( + maybe_cls: _C, + *, + these: dict[str, Any] | None = ..., + repr: bool = ..., + unsafe_hash: bool | None = ..., + hash: bool | None = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., + auto_exc: bool = ..., + eq: bool | None = ..., + order: bool | None = ..., + auto_detect: bool = ..., + getstate_setstate: bool | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + field_transformer: _FieldTransformer | None = ..., + match_args: bool = ..., +) -> _C: ... +@overload +@dataclass_transform(field_specifiers=(attrib, field)) +def define( + maybe_cls: None = ..., + *, + these: dict[str, Any] | None = ..., + repr: bool = ..., + unsafe_hash: bool | None = ..., + hash: bool | None = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., + auto_exc: bool = ..., + eq: bool | None = ..., + order: bool | None = ..., + auto_detect: bool = ..., + getstate_setstate: bool | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + field_transformer: _FieldTransformer | None = ..., + match_args: bool = ..., +) -> Callable[[_C], _C]: ... + +mutable = define + +@overload +@dataclass_transform(frozen_default=True, field_specifiers=(attrib, field)) +def frozen( + maybe_cls: _C, + *, + these: dict[str, Any] | None = ..., + repr: bool = ..., + unsafe_hash: bool | None = ..., + hash: bool | None = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., + auto_exc: bool = ..., + eq: bool | None = ..., + order: bool | None = ..., + auto_detect: bool = ..., + getstate_setstate: bool | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + field_transformer: _FieldTransformer | None = ..., + match_args: bool = ..., +) -> _C: ... +@overload +@dataclass_transform(frozen_default=True, field_specifiers=(attrib, field)) +def frozen( + maybe_cls: None = ..., + *, + these: dict[str, Any] | None = ..., + repr: bool = ..., + unsafe_hash: bool | None = ..., + hash: bool | None = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., + auto_exc: bool = ..., + eq: bool | None = ..., + order: bool | None = ..., + auto_detect: bool = ..., + getstate_setstate: bool | None = ..., + on_setattr: _OnSetAttrArgType | None = ..., + field_transformer: _FieldTransformer | None = ..., + match_args: bool = ..., +) -> Callable[[_C], _C]: ... diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs/converters.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs/converters.py new file mode 100755 index 00000000..7821f6c0 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs/converters.py @@ -0,0 +1,3 @@ +# SPDX-License-Identifier: MIT + +from attr.converters import * # noqa: F403 diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs/exceptions.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs/exceptions.py new file mode 100755 index 00000000..3323f9d2 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs/exceptions.py @@ -0,0 +1,3 @@ +# SPDX-License-Identifier: MIT + +from attr.exceptions import * # noqa: F403 diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs/filters.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs/filters.py new file mode 100755 index 00000000..3080f483 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs/filters.py @@ -0,0 +1,3 @@ +# SPDX-License-Identifier: MIT + +from attr.filters import * # noqa: F403 diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs/py.typed b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs/py.typed new file mode 100755 index 00000000..e69de29b diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs/setters.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs/setters.py new file mode 100755 index 00000000..f3d73bb7 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs/setters.py @@ -0,0 +1,3 @@ +# SPDX-License-Identifier: MIT + +from attr.setters import * # noqa: F403 diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs/validators.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs/validators.py new file mode 100755 index 00000000..037e124f --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/attrs/validators.py @@ -0,0 +1,3 @@ +# SPDX-License-Identifier: MIT + +from attr.validators import * # noqa: F403 diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/bin/json b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/bin/json new file mode 100755 index 00000000..05b90236 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/bin/json @@ -0,0 +1,8 @@ +#!/venv/bin/python3.7 +# -*- coding: utf-8 -*- +import re +import sys +from jsonspec.cli import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/bin/jsonpath.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/bin/jsonpath.py new file mode 100755 index 00000000..1309e427 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/bin/jsonpath.py @@ -0,0 +1,8 @@ +#!/venv/bin/python3.7 +# -*- coding: utf-8 -*- +import re +import sys +from jsonpath_rw.bin.jsonpath import entry_point +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(entry_point()) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/bin/jsonpath_ng b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/bin/jsonpath_ng new file mode 100755 index 00000000..1018af17 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/bin/jsonpath_ng @@ -0,0 +1,8 @@ +#!/venv/bin/python3.7 +# -*- coding: utf-8 -*- +import re +import sys +from jsonpath_ng.bin.jsonpath import entry_point +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(entry_point()) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/bin/jsonschema b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/bin/jsonschema new file mode 100755 index 00000000..b928c7a5 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/bin/jsonschema @@ -0,0 +1,8 @@ +#!/venv/bin/python3.7 +# -*- coding: utf-8 -*- +import re +import sys +from jsonschema.cli import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/bin/mako-render b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/bin/mako-render new file mode 100755 index 00000000..86969098 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/bin/mako-render @@ -0,0 +1,8 @@ +#!/venv/bin/python3.7 +# -*- coding: utf-8 -*- +import re +import sys +from mako.cmd import cmdline +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(cmdline()) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/bin/normalizer b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/bin/normalizer new file mode 100755 index 00000000..061396b1 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/bin/normalizer @@ -0,0 +1,8 @@ +#!/venv/bin/python3.7 +# -*- coding: utf-8 -*- +import re +import sys +from charset_normalizer.cli.normalizer import cli_detect +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(cli_detect()) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/certifi-2025.4.26.dist-info/INSTALLER b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/certifi-2025.4.26.dist-info/INSTALLER new file mode 100755 index 00000000..a1b589e3 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/certifi-2025.4.26.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/certifi-2025.4.26.dist-info/METADATA b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/certifi-2025.4.26.dist-info/METADATA new file mode 100755 index 00000000..bba2b699 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/certifi-2025.4.26.dist-info/METADATA @@ -0,0 +1,78 @@ +Metadata-Version: 2.4 +Name: certifi +Version: 2025.4.26 +Summary: Python package for providing Mozilla's CA Bundle. +Home-page: https://github.com/certifi/python-certifi +Author: Kenneth Reitz +Author-email: me@kennethreitz.com +License: MPL-2.0 +Project-URL: Source, https://github.com/certifi/python-certifi +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0) +Classifier: Natural Language :: English +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Requires-Python: >=3.6 +License-File: LICENSE +Dynamic: author +Dynamic: author-email +Dynamic: classifier +Dynamic: description +Dynamic: home-page +Dynamic: license +Dynamic: license-file +Dynamic: project-url +Dynamic: requires-python +Dynamic: summary + +Certifi: Python SSL Certificates +================================ + +Certifi provides Mozilla's carefully curated collection of Root Certificates for +validating the trustworthiness of SSL certificates while verifying the identity +of TLS hosts. It has been extracted from the `Requests`_ project. + +Installation +------------ + +``certifi`` is available on PyPI. Simply install it with ``pip``:: + + $ pip install certifi + +Usage +----- + +To reference the installed certificate authority (CA) bundle, you can use the +built-in function:: + + >>> import certifi + + >>> certifi.where() + '/usr/local/lib/python3.7/site-packages/certifi/cacert.pem' + +Or from the command line:: + + $ python -m certifi + /usr/local/lib/python3.7/site-packages/certifi/cacert.pem + +Enjoy! + +.. _`Requests`: https://requests.readthedocs.io/en/master/ + +Addition/Removal of Certificates +-------------------------------- + +Certifi does not support any addition/removal or other modification of the +CA trust store content. This project is intended to provide a reliable and +highly portable root of trust to python deployments. Look to upstream projects +for methods to use alternate trust. diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/certifi-2025.4.26.dist-info/RECORD b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/certifi-2025.4.26.dist-info/RECORD new file mode 100755 index 00000000..72cea4f2 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/certifi-2025.4.26.dist-info/RECORD @@ -0,0 +1,11 @@ +certifi-2025.4.26.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +certifi-2025.4.26.dist-info/METADATA,sha256=Q1SDFkY5LOQAJmDltZz2wU3VTv1Kh5X-rjGI4KiPHNM,2473 +certifi-2025.4.26.dist-info/RECORD,, +certifi-2025.4.26.dist-info/WHEEL,sha256=SmOxYU7pzNKBqASvQJ7DjX3XGUF92lrGhMb3R6_iiqI,91 +certifi-2025.4.26.dist-info/licenses/LICENSE,sha256=6TcW2mucDVpKHfYP5pWzcPBpVgPSH2-D8FPkLPwQyvc,989 +certifi-2025.4.26.dist-info/top_level.txt,sha256=KMu4vUCfsjLrkPbSNdgdekS-pVJzBAJFO__nI8NF6-U,8 +certifi/__init__.py,sha256=9pyWUGr6sbAlksfOHo0BTV0Gxljjh4IK1kXAjHgjL4I,94 +certifi/__main__.py,sha256=xBBoj905TUWBLRGANOcf7oi6e-3dMP4cEoG9OyMs11g,243 +certifi/cacert.pem,sha256=K3sQJvGKKX4hSBicoMvn0-f578NvcjHMwoIKQE_rVZY,283771 +certifi/core.py,sha256=qRDDFyXVJwTB_EmoGppaXU_R9qCZvhl-EzxPMuV3nTA,4426 +certifi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/certifi-2025.4.26.dist-info/WHEEL b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/certifi-2025.4.26.dist-info/WHEEL new file mode 100755 index 00000000..8acb9559 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/certifi-2025.4.26.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: setuptools (79.0.1) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/certifi-2025.4.26.dist-info/licenses/LICENSE b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/certifi-2025.4.26.dist-info/licenses/LICENSE new file mode 100755 index 00000000..62b076cd --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/certifi-2025.4.26.dist-info/licenses/LICENSE @@ -0,0 +1,20 @@ +This package contains a modified version of ca-bundle.crt: + +ca-bundle.crt -- Bundle of CA Root Certificates + +This is a bundle of X.509 certificates of public Certificate Authorities +(CA). These were automatically extracted from Mozilla's root certificates +file (certdata.txt). This file can be found in the mozilla source tree: +https://hg.mozilla.org/mozilla-central/file/tip/security/nss/lib/ckfw/builtins/certdata.txt +It contains the certificates in PEM format and therefore +can be directly used with curl / libcurl / php_curl, or with +an Apache+mod_ssl webserver for SSL client authentication. +Just configure this file as the SSLCACertificateFile.# + +***** BEGIN LICENSE BLOCK ***** +This Source Code Form is subject to the terms of the Mozilla Public License, +v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain +one at http://mozilla.org/MPL/2.0/. + +***** END LICENSE BLOCK ***** +@(#) $RCSfile: certdata.txt,v $ $Revision: 1.80 $ $Date: 2011/11/03 15:11:58 $ diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/certifi/__init__.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/certifi/__init__.py new file mode 100755 index 00000000..bf83fa93 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/certifi/__init__.py @@ -0,0 +1,4 @@ +from .core import contents, where + +__all__ = ["contents", "where"] +__version__ = "2025.04.26" diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/certifi/__main__.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/certifi/__main__.py new file mode 100755 index 00000000..8945b5da --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/certifi/__main__.py @@ -0,0 +1,12 @@ +import argparse + +from certifi import contents, where + +parser = argparse.ArgumentParser() +parser.add_argument("-c", "--contents", action="store_true") +args = parser.parse_args() + +if args.contents: + print(contents()) +else: + print(where()) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/certifi/__pycache__/__init__.cpython-39.pyc b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/certifi/__pycache__/__init__.cpython-39.pyc new file mode 100755 index 0000000000000000000000000000000000000000..f1b10689ae3af9c0905ff88f7c5521d511943d43 GIT binary patch literal 300 zcmYk1Jx&8L5QS~;E?I&iaRk~evW}LY3L&@v4XL(ZaBKq>UfZ%AP&f#8;7V?(xB?Y+ zfyhYnjh^1~zlzu|lEroIaFQXAz#2_>#1k0_MuLdyiHwz~$67RZ zs5|(^d95R<<<>-LVo1%~v-HxJ9A9O;&xh4;-mlL3;o`PyQqAqYon`<`Yk+hF@G5;! z)&P7WKPv$RKM&NpNQ2W`^Fn3hlsOmZ`eqp{_e?OqRE8^2uG5V&G&1;e;NM|(18#Rp fx%5#zDhkgHb*I)2^?>`afX(6s(_$8vW^L`p){st@YF6^@rB0X4JI( zOf&<1vp3tHi{>a1b7JOjUW8q?OrixCg?z^9i+ouuh(!_N%jaKte1R{%@S^FlcMooz zwN#$P*$!#1JQHCmq|Un8+TbMo_38=3-GfZE`UOAkiIx=lSmvsw4@4`=l}>uSL}x|b z>J@3J6x~*u;7)4;(Qg&9m1)&Vi(HFbtF`a~Q?l8n#xJ)@aeVXfV6XvA&4SQmNI4{n zlaT|!5pa}lwwbBL8|xciZ12V!yWg82j>XeV$MHFlxY~-#A3McBchsPFoF8?BPCLn9 zpgOzjtExz4!V|fg!b& zaW>dRP#{ei z;H|#byWom^FnN-rH$ZPQ89;YY=F7Miixv3t-yS~%>o`3hYI|{*| z08?j&NQC>GN{sN{GZ2$)Xk(0^M!j!ysO@L9Lal89QNGTO#HDwvyQ`0l4|K^=-S$jn zkfcY+zCfm^;#dL;mthy<17!-SBvwU=1fM+UBLZ(Z@F^&oXnICYf$T5YZ%fbJQ+LQl zIvpaJptkR0S#Eg4Ox@9)Mbt3rgNpQG+nR)vJG0V0+;?_^y>Y)UTb*& E0&S(ar2qf` literal 0 HcmV?d00001 diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/certifi/cacert.pem b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/certifi/cacert.pem new file mode 100755 index 00000000..b1d0cfd8 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/certifi/cacert.pem @@ -0,0 +1,4676 @@ + +# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Label: "Entrust Root Certification Authority" +# Serial: 1164660820 +# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4 +# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9 +# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 +Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW +KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw +NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw +NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy +ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV +BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo +Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 +4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 +KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI +rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi +94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB +sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi +gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo +kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE +vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t +O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua +AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP +9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ +eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m +0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Label: "QuoVadis Root CA 2" +# Serial: 1289 +# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b +# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7 +# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86 +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa +GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg +Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J +WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB +rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp ++ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 +ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i +Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz +PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og +/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH +oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI +yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud +EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 +A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL +MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f +BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn +g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl +fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K +WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha +B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc +hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR +TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD +mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z +ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y +4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza +8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 3" +# Serial: 1478 +# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf +# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85 +# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35 +-----BEGIN CERTIFICATE----- +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM +V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB +4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr +H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd +8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv +vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT +mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe +btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc +T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt +WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ +c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A +4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD +VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG +CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 +aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu +dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw +czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G +A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg +Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 +7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem +d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd ++LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B +4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN +t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x +DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 +k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s +zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j +Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT +mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK +4SVhM7JZG+Ju1zdXtg2pEto= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root CA" +# Serial: 17154717934120587862167794914071425081 +# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 +# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 +# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c +JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP +mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ +wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 +VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ +AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB +AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun +pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC +dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf +fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm +NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx +H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root CA" +# Serial: 10944719598952040374951832963794454346 +# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e +# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 +# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB +CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 +nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt +43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P +T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 +gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR +TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw +DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr +hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg +06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF +PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls +YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert High Assurance EV Root CA" +# Serial: 3553400076410547919724730734378100087 +# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a +# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 +# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm ++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW +PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM +xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB +Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 +hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg +EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA +FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec +nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z +eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF +hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 +Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep ++OkuE6N36B9K +-----END CERTIFICATE----- + +# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Label: "SwissSign Gold CA - G2" +# Serial: 13492815561806991280 +# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93 +# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61 +# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95 +-----BEGIN CERTIFICATE----- +MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV +BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln +biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF +MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT +d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8 +76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+ +bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c +6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE +emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd +MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt +MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y +MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y +FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi +aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM +gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB +qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7 +lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn +8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov +L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6 +45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO +UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5 +O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC +bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv +GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a +77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC +hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3 +92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp +Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w +ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt +Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ +-----END CERTIFICATE----- + +# Issuer: CN=SecureTrust CA O=SecureTrust Corporation +# Subject: CN=SecureTrust CA O=SecureTrust Corporation +# Label: "SecureTrust CA" +# Serial: 17199774589125277788362757014266862032 +# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1 +# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11 +# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73 +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz +MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv +cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz +Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO +0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao +wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj +7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS +8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT +BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg +JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 +6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ +3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm +D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS +CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +# Issuer: CN=Secure Global CA O=SecureTrust Corporation +# Subject: CN=Secure Global CA O=SecureTrust Corporation +# Label: "Secure Global CA" +# Serial: 9751836167731051554232119481456978597 +# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de +# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b +# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69 +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx +MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg +Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ +iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa +/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ +jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI +HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 +sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w +gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw +KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG +AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L +URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO +H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm +I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY +iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO Certification Authority O=COMODO CA Limited +# Label: "COMODO Certification Authority" +# Serial: 104350513648249232941998508985834464573 +# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 +# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b +# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB +gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV +BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw +MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl +YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P +RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 +UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI +2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 +Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp ++2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ +DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O +nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW +/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g +PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u +QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY +SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv +IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 +zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd +BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB +ZQ== +-----END CERTIFICATE----- + +# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Label: "COMODO ECC Certification Authority" +# Serial: 41578283867086692638256921589707938090 +# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 +# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 +# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT +IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw +MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy +ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N +T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR +FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J +cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW +BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm +fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv +GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +# Issuer: CN=Certigna O=Dhimyotis +# Subject: CN=Certigna O=Dhimyotis +# Label: "Certigna" +# Serial: 18364802974209362175 +# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff +# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97 +# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV +BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X +DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ +BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 +QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny +gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw +zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q +130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 +JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw +ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT +AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj +AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG +9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h +bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc +fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu +HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w +t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +# Label: "ePKI Root Certification Authority" +# Serial: 28956088682735189655030529057352760477 +# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3 +# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0 +# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5 +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe +MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 +ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw +IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL +SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH +SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh +ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X +DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 +TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ +fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA +sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU +WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS +nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH +dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip +NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC +AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF +MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB +uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl +PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP +JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ +gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 +j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 +5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB +o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS +/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z +Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE +W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D +hNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +# Issuer: O=certSIGN OU=certSIGN ROOT CA +# Subject: O=certSIGN OU=certSIGN ROOT CA +# Label: "certSIGN ROOT CA" +# Serial: 35210227249154 +# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17 +# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b +# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT +AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD +QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP +MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do +0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ +UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d +RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ +OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv +JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C +AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O +BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ +LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY +MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ +44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I +Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw +i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN +9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +# Issuer: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) +# Subject: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) +# Label: "NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny" +# Serial: 80544274841616 +# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88 +# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91 +# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98 +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG +EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 +MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl +cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR +dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB +pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM +b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm +aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz +IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT +lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz +AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 +VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG +ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 +BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG +AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M +U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh +bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C ++C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F +uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 +XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Label: "Microsec e-Szigno Root CA 2009" +# Serial: 14014712776195784473 +# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1 +# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e +# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78 +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD +VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 +ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G +CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y +OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx +FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp +Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP +kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc +cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U +fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 +N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC +xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 ++rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM +Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG +SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h +mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk +ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c +2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t +HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Label: "GlobalSign Root CA - R3" +# Serial: 4835703278459759426209954 +# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 +# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad +# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 +MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 +RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT +gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm +KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd +QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ +XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o +LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU +RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp +jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK +6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX +mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs +Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH +WD9f +-----END CERTIFICATE----- + +# Issuer: CN=Izenpe.com O=IZENPE S.A. +# Subject: CN=Izenpe.com O=IZENPE S.A. +# Label: "Izenpe.com" +# Serial: 917563065490389241595536686991402621 +# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73 +# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19 +# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f +-----BEGIN CERTIFICATE----- +MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4 +MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6 +ZW5wZS5jb20wHhcNMDcxMjEzMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYD +VQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5j +b20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ03rKDx6sp4boFmVq +scIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAKClaO +xdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6H +LmYRY2xU+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFX +uaOKmMPsOzTFlUFpfnXCPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQD +yCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxTOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+ +JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbKF7jJeodWLBoBHmy+E60Q +rLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK0GqfvEyN +BjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8L +hij+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIB +QFqNeb+Lz0vPqhbBleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+ +HMh3/1uaD7euBUbl8agW7EekFwIDAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2lu +Zm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+SVpFTlBFIFMuQS4gLSBDSUYg +QTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBGNjIgUzgxQzBB +BgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx +MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUA +A4ICAQB4pgwWSp9MiDrAyw6lFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWb +laQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbgakEyrkgPH7UIBzg/YsfqikuFgba56 +awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8qhT/AQKM6WfxZSzwo +JNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Csg1lw +LDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCT +VyvehQP5aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGk +LhObNA5me0mrZJfQRsN5nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJb +UjWumDqtujWTI6cfSN01RpiyEGjkpTHCClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/ +QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZoQ0iy2+tzJOeRf1SktoA+ +naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1ZWrOZyGls +QyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== +-----END CERTIFICATE----- + +# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Label: "Go Daddy Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 +# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b +# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT +EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp +ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz +NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH +EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE +AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD +E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH +/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy +DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh +GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR +tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA +AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX +WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu +9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr +gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo +2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI +4uJEvlz36hz1 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 +# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e +# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs +ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw +MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj +aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp +Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg +nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 +HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N +Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN +dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 +HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G +CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU +sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 +4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg +8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 +mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Services Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2 +# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f +# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5 +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs +ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD +VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy +ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy +dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p +OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 +8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K +Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe +hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk +6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q +AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI +bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB +ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z +qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn +0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN +sSi6 +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Commercial O=AffirmTrust +# Subject: CN=AffirmTrust Commercial O=AffirmTrust +# Label: "AffirmTrust Commercial" +# Serial: 8608355977964138876 +# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7 +# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7 +# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7 +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP +Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr +ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL +MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 +yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr +VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ +nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG +XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj +vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt +Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g +N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC +nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Networking O=AffirmTrust +# Subject: CN=AffirmTrust Networking O=AffirmTrust +# Label: "AffirmTrust Networking" +# Serial: 8957382827206547757 +# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f +# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f +# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y +YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua +kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL +QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp +6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG +yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i +QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO +tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu +QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ +Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u +olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 +x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium O=AffirmTrust +# Subject: CN=AffirmTrust Premium O=AffirmTrust +# Label: "AffirmTrust Premium" +# Serial: 7893706540734352110 +# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57 +# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27 +# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz +dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG +A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U +cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf +qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ +JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ ++jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS +s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 +HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 +70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG +V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S +qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S +5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia +C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX +OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE +FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 +KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B +8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ +MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc +0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ +u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF +u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH +YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 +GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO +RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e +KeC2uAloGRwYQw== +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust +# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust +# Label: "AffirmTrust Premium ECC" +# Serial: 8401224907861490260 +# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d +# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb +# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23 +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC +VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ +cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ +BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt +VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D +0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 +ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G +A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs +aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I +flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Network CA" +# Serial: 279744 +# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78 +# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e +# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM +MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D +ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU +cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 +WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg +Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw +IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH +UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM +TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU +BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM +kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x +AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV +HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y +sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL +I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 +J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY +VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +# Label: "TWCA Root Certification Authority" +# Serial: 1 +# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79 +# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48 +# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44 +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES +MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU +V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz +WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO +LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE +AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH +K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX +RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z +rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx +3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq +hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC +MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls +XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D +lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn +aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ +YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +# Label: "Security Communication RootCA2" +# Serial: 0 +# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43 +# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74 +# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl +MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe +U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX +DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy +dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj +YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV +OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr +zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM +VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ +hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO +ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw +awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs +OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 +DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF +coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc +okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 +t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy +1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ +SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +# Label: "Actalis Authentication Root CA" +# Serial: 6271844772424770508 +# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6 +# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac +# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66 +-----BEGIN CERTIFICATE----- +MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE +BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w +MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 +IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC +SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 +ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv +UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX +4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 +KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ +gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb +rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ +51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F +be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe +KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F +v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn +fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 +jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz +ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt +ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL +e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 +jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz +WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V +SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j +pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX +X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok +fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R +K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU +ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU +LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT +LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +# Label: "Buypass Class 2 Root CA" +# Serial: 2 +# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29 +# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99 +# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48 +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr +6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV +L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 +1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx +MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ +QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB +arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr +Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi +FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS +P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN +9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz +uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h +9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t +OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo ++fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 +KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 +DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us +H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ +I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 +5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h +3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz +Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +# Label: "Buypass Class 3 Root CA" +# Serial: 2 +# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec +# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57 +# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y +ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E +N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 +tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX +0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c +/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X +KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY +zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS +O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D +34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP +K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv +Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj +QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS +IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 +HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa +O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv +033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u +dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE +kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 +3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD +u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq +4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= +-----END CERTIFICATE----- + +# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Label: "T-TeleSec GlobalRoot Class 3" +# Serial: 1 +# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef +# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1 +# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN +8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ +RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 +hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 +ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM +EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 +A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy +WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ +1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 +6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT +91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p +TpPDpFQUWw== +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +# Label: "D-TRUST Root Class 3 CA 2 2009" +# Serial: 623603 +# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f +# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0 +# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1 +-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha +ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM +HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 +UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 +tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R +ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM +lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp +/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G +A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G +A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy +MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl +cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js +L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL +BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni +acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K +zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 +PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y +Johw1+qRzT65ysCQblrGXnRl11z+o+I= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +# Label: "D-TRUST Root Class 3 CA 2 EV 2009" +# Serial: 623604 +# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6 +# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83 +# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81 +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw +NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV +BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn +ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 +3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z +qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR +p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 +HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw +ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea +HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw +Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh +c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E +RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt +dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku +Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp +3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF +CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na +xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX +KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 +-----END CERTIFICATE----- + +# Issuer: CN=CA Disig Root R2 O=Disig a.s. +# Subject: CN=CA Disig Root R2 O=Disig a.s. +# Label: "CA Disig Root R2" +# Serial: 10572350602393338211 +# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03 +# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71 +# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03 +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV +BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu +MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy +MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx +EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe +NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH +PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I +x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe +QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR +yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO +QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 +H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ +QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD +i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs +nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 +rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI +hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf +GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb +lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka ++elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal +TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i +nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 +gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr +G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os +zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x +L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE----- + +# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV +# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV +# Label: "ACCVRAIZ1" +# Serial: 6828503384748696800 +# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02 +# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17 +# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13 +-----BEGIN CERTIFICATE----- +MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE +AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw +CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ +BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND +VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb +qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY +HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo +G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA +lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr +IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/ +0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH +k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47 +4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO +m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa +cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl +uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI +KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls +ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG +AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 +VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT +VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG +CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA +cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA +QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA +7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA +cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA +QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA +czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu +aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt +aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud +DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF +BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp +D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU +JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m +AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD +vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms +tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH +7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h +I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA +h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF +d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H +pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 +-----END CERTIFICATE----- + +# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA +# Label: "TWCA Global Root CA" +# Serial: 3262 +# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96 +# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65 +# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx +EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT +VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5 +NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT +B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF +10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz +0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh +MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH +zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc +46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2 +yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi +laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP +oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA +BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE +qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm +4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL +1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn +LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF +H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo +RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+ +nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh +15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW +6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW +nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j +wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz +aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy +KwbQBM0= +-----END CERTIFICATE----- + +# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Label: "TeliaSonera Root CA v1" +# Serial: 199041966741090107964904287217786801558 +# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c +# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37 +# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89 +-----BEGIN CERTIFICATE----- +MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw +NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv +b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD +VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2 +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F +VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1 +7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X +Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+ +/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs +81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm +dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe +Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu +sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4 +pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs +slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ +arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD +VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG +9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl +dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx +0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj +TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed +Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7 +Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI +OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7 +vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW +t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn +HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx +SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= +-----END CERTIFICATE----- + +# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Label: "T-TeleSec GlobalRoot Class 2" +# Serial: 1 +# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a +# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9 +# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52 +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd +AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC +FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi +1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq +jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ +wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/ +WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy +NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC +uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw +IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6 +g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN +9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP +BSeOE6Fuwg== +-----END CERTIFICATE----- + +# Issuer: CN=Atos TrustedRoot 2011 O=Atos +# Subject: CN=Atos TrustedRoot 2011 O=Atos +# Label: "Atos TrustedRoot 2011" +# Serial: 6643877497813316402 +# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56 +# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21 +# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE +AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG +EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM +FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC +REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp +Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM +VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+ +SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ +4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L +cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi +eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG +A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 +DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j +vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP +DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc +maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D +lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv +KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 1 G3" +# Serial: 687049649626669250736271037606554624078720034195 +# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab +# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67 +# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00 +MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV +wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe +rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341 +68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh +4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp +UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o +abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc +3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G +KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt +hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO +Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt +zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD +ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC +MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2 +cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN +qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5 +YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv +b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2 +8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k +NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj +ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp +q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt +nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 2 G3" +# Serial: 390156079458959257446133169266079962026824725800 +# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06 +# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36 +# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00 +MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf +qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW +n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym +c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+ +O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1 +o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j +IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq +IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz +8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh +vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l +7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG +cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD +ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 +AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC +roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga +W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n +lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE ++V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV +csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd +dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg +KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM +HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4 +WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 3 G3" +# Serial: 268090761170461462463995952157327242137089239581 +# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7 +# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d +# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00 +MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR +/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu +FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR +U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c +ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR +FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k +A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw +eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl +sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp +VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q +A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ +ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD +ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px +KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI +FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv +oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg +u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP +0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf +3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl +8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+ +DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN +PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ +ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0 +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root G2" +# Serial: 15385348160840213938643033620894905419 +# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d +# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f +# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85 +-----BEGIN CERTIFICATE----- +MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA +n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc +biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp +EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA +bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu +YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB +AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW +BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI +QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I +0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni +lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9 +B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv +ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo +IhNzbM8m9Yop5w== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root G3" +# Serial: 15459312981008553731928384953135426796 +# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb +# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89 +# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2 +-----BEGIN CERTIFICATE----- +MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg +RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf +Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q +RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD +AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY +JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv +6pZjamVFkpUBtA== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G2" +# Serial: 4293743540046975378534879503202253541 +# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44 +# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4 +# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f +-----BEGIN CERTIFICATE----- +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH +MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI +2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx +1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ +q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz +tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ +vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV +5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY +1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 +NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG +Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 +8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe +pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G3" +# Serial: 7089244469030293291760083333884364146 +# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca +# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e +# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0 +-----BEGIN CERTIFICATE----- +MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe +Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw +EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x +IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF +K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG +fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO +Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd +BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx +AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ +oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 +sycX +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Trusted Root G4" +# Serial: 7451500558977370777930084869016614236 +# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49 +# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4 +# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88 +-----BEGIN CERTIFICATE----- +MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg +RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y +ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If +xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV +ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO +DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ +jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/ +CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi +EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM +fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY +uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK +chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t +9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD +ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2 +SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd ++SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc +fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa +sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N +cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N +0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie +4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI +r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1 +/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm +gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+ +-----END CERTIFICATE----- + +# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited +# Label: "COMODO RSA Certification Authority" +# Serial: 101909084537582093308941363524873193117 +# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18 +# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4 +# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34 +-----BEGIN CERTIFICATE----- +MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB +hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV +BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT +EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR +6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X +pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC +9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV +/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf +Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z ++pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w +qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah +SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC +u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf +Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq +crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E +FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB +/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl +wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM +4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV +2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna +FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ +CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK +boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke +jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL +S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb +QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl +0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB +NVOFBkpdn627G190 +-----END CERTIFICATE----- + +# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Label: "USERTrust RSA Certification Authority" +# Serial: 2645093764781058787591871645665788717 +# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5 +# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e +# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2 +-----BEGIN CERTIFICATE----- +MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB +iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl +cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV +BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw +MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV +BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B +3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY +tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ +Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 +VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT +79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 +c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT +Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l +c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee +UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE +Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd +BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G +A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF +Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO +VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 +ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs +8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR +iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze +Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ +XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ +qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB +VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB +L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG +jjxDah2nGN59PRbxYvnKkKj9 +-----END CERTIFICATE----- + +# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +# Label: "USERTrust ECC Certification Authority" +# Serial: 123013823720199481456569720443997572134 +# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1 +# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0 +# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a +-----BEGIN CERTIFICATE----- +MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl +eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT +JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT +Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg +VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo +I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng +o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G +A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB +zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW +RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +# Label: "GlobalSign ECC Root CA - R5" +# Serial: 32785792099990507226680698011560947931244 +# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08 +# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa +# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24 +-----BEGIN CERTIFICATE----- +MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk +MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH +bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX +DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD +QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc +8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke +hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI +KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg +515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO +xwy8p2Fp8fc74SrL+SvzZpA3 +-----END CERTIFICATE----- + +# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust +# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust +# Label: "IdenTrust Commercial Root CA 1" +# Serial: 13298821034946342390520003877796839426 +# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7 +# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25 +# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu +VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw +MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw +JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT +3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU ++ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp +S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1 +bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi +T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL +vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK +Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK +dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT +c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv +l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N +iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD +ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH +6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt +LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93 +nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3 ++wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK +W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT +AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq +l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG +4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ +mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A +7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H +-----END CERTIFICATE----- + +# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust +# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust +# Label: "IdenTrust Public Sector Root CA 1" +# Serial: 13298821034946342390521976156843933698 +# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba +# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd +# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu +VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN +MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0 +MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7 +ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy +RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS +bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF +/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R +3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw +EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy +9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V +GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ +2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV +WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD +W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN +AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj +t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV +DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9 +TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G +lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW +mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df +WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5 ++bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ +tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA +GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv +8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - G2" +# Serial: 1246989352 +# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2 +# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4 +# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39 +-----BEGIN CERTIFICATE----- +MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50 +cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs +IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz +dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy +NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu +dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt +dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0 +aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T +RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN +cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW +wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1 +U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0 +jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN +BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/ +jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ +Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v +1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R +nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH +VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g== +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - EC1" +# Serial: 51543124481930649114116133369 +# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc +# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47 +# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5 +-----BEGIN CERTIFICATE----- +MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG +A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3 +d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu +dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq +RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy +MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD +VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 +L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g +Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi +A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt +ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH +Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC +R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX +hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G +-----END CERTIFICATE----- + +# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority +# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority +# Label: "CFCA EV ROOT" +# Serial: 407555286 +# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30 +# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83 +# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD +TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y +aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx +MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j +aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP +T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03 +sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL +TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5 +/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp +7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz +EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt +hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP +a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot +aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg +TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV +PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv +cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL +tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd +BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB +ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT +ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL +jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS +ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy +P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19 +xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d +Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN +5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe +/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z +AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ +5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GB CA" +# Serial: 157768595616588414422159278966750757568 +# MD5 Fingerprint: a4:eb:b9:61:28:2e:b7:2f:98:b0:35:26:90:99:51:1d +# SHA1 Fingerprint: 0f:f9:40:76:18:d3:d7:6a:4b:98:f0:a8:35:9e:0c:fd:27:ac:cc:ed +# SHA256 Fingerprint: 6b:9c:08:e8:6e:b0:f7:67:cf:ad:65:cd:98:b6:21:49:e5:49:4a:67:f5:84:5e:7b:d1:ed:01:9f:27:b8:6b:d6 +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt +MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg +Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i +YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x +CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG +b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh +bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3 +HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx +WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX +1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk +u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P +99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r +M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB +BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh +cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5 +gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO +ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf +aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic +Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= +-----END CERTIFICATE----- + +# Issuer: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. +# Subject: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. +# Label: "SZAFIR ROOT CA2" +# Serial: 357043034767186914217277344587386743377558296292 +# MD5 Fingerprint: 11:64:c1:89:b0:24:b1:8c:b1:07:7e:89:9e:51:9e:99 +# SHA1 Fingerprint: e2:52:fa:95:3f:ed:db:24:60:bd:6e:28:f3:9c:cc:cf:5e:b3:3f:de +# SHA256 Fingerprint: a1:33:9d:33:28:1a:0b:56:e5:57:d3:d3:2b:1c:e7:f9:36:7e:b0:94:bd:5f:a7:2a:7e:50:04:c8:de:d7:ca:fe +-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL +BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6 +ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw +NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L +cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg +Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN +QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT +3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw +3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6 +3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5 +BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN +XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF +AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw +8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG +nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP +oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy +d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg +LvWpCz/UXeHPhJ/iGcJfitYgHuNztw== +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Network CA 2" +# Serial: 44979900017204383099463764357512596969 +# MD5 Fingerprint: 6d:46:9e:d9:25:6d:08:23:5b:5e:74:7d:1e:27:db:f2 +# SHA1 Fingerprint: d3:dd:48:3e:2b:bf:4c:05:e8:af:10:f5:fa:76:26:cf:d3:dc:30:92 +# SHA256 Fingerprint: b6:76:f2:ed:da:e8:77:5c:d3:6c:b0:f6:3c:d1:d4:60:39:61:f4:9e:62:65:ba:01:3a:2f:03:07:b6:d0:b8:04 +-----BEGIN CERTIFICATE----- +MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB +gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu +QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG +A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz +OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ +VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3 +b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA +DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn +0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB +OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE +fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E +Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m +o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i +sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW +OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez +Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS +adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n +3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ +F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf +CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29 +XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm +djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/ +WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb +AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq +P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko +b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj +XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P +5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi +DrW5viSP +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions RootCA 2015" +# Serial: 0 +# MD5 Fingerprint: ca:ff:e2:db:03:d9:cb:4b:e9:0f:ad:84:fd:7b:18:ce +# SHA1 Fingerprint: 01:0c:06:95:a6:98:19:14:ff:bf:5f:c6:b0:b6:95:ea:29:e9:12:a6 +# SHA256 Fingerprint: a0:40:92:9a:02:ce:53:b4:ac:f4:f2:ff:c6:98:1c:e4:49:6f:75:5e:6d:45:fe:0b:2a:69:2b:cd:52:52:3f:36 +-----BEGIN CERTIFICATE----- +MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix +DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k +IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT +N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v +dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG +A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh +ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx +QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 +dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA +4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0 +AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10 +4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C +ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV +9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD +gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6 +Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq +NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko +LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc +Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd +ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I +XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI +M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot +9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V +Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea +j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh +X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ +l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf +bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4 +pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK +e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0 +vm9qp/UsQu0yrbYhnr68 +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions ECC RootCA 2015" +# Serial: 0 +# MD5 Fingerprint: 81:e5:b4:17:eb:c2:f5:e1:4b:0d:41:7b:49:92:fe:ef +# SHA1 Fingerprint: 9f:f1:71:8d:92:d5:9a:f3:7d:74:97:b4:bc:6f:84:68:0b:ba:b6:66 +# SHA256 Fingerprint: 44:b5:45:aa:8a:25:e6:5a:73:ca:15:dc:27:fc:36:d2:4c:1c:b9:95:3a:06:65:39:b1:15:82:dc:48:7b:48:33 +-----BEGIN CERTIFICATE----- +MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN +BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl +bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv +b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ +BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj +YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5 +MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0 +dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg +QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa +jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi +C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep +lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof +TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR +-----END CERTIFICATE----- + +# Issuer: CN=ISRG Root X1 O=Internet Security Research Group +# Subject: CN=ISRG Root X1 O=Internet Security Research Group +# Label: "ISRG Root X1" +# Serial: 172886928669790476064670243504169061120 +# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e +# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8 +# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6 +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw +TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh +cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 +WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu +ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc +h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ +0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U +A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW +T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH +B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC +B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv +KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn +OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn +jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw +qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI +rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq +hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL +ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ +3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK +NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 +ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur +TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC +jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc +oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq +4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA +mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d +emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= +-----END CERTIFICATE----- + +# Issuer: O=FNMT-RCM OU=AC RAIZ FNMT-RCM +# Subject: O=FNMT-RCM OU=AC RAIZ FNMT-RCM +# Label: "AC RAIZ FNMT-RCM" +# Serial: 485876308206448804701554682760554759 +# MD5 Fingerprint: e2:09:04:b4:d3:bd:d1:a0:14:fd:1a:d2:47:c4:57:1d +# SHA1 Fingerprint: ec:50:35:07:b2:15:c4:95:62:19:e2:a8:9a:5b:42:99:2c:4c:2c:20 +# SHA256 Fingerprint: eb:c5:57:0c:29:01:8c:4d:67:b1:aa:12:7b:af:12:f7:03:b4:61:1e:bc:17:b7:da:b5:57:38:94:17:9b:93:fa +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx +CzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ +WiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ +BgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG +Tk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/ +yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf +BBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz +WHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF +tBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z +374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC +IfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL +mbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7 +wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS +MKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2 +ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet +UqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H +YJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3 +LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD +nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1 +RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM +LVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf +77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N +JpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm +fZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp +6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp +1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B +9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok +RqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv +uu8wd+RU4riEmViAqhOLUTpPSPaLtrM= +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 1 O=Amazon +# Subject: CN=Amazon Root CA 1 O=Amazon +# Label: "Amazon Root CA 1" +# Serial: 143266978916655856878034712317230054538369994 +# MD5 Fingerprint: 43:c6:bf:ae:ec:fe:ad:2f:18:c6:88:68:30:fc:c8:e6 +# SHA1 Fingerprint: 8d:a7:f9:65:ec:5e:fc:37:91:0f:1c:6e:59:fd:c1:cc:6a:6e:de:16 +# SHA256 Fingerprint: 8e:cd:e6:88:4f:3d:87:b1:12:5b:a3:1a:c3:fc:b1:3d:70:16:de:7f:57:cc:90:4f:e1:cb:97:c6:ae:98:19:6e +-----BEGIN CERTIFICATE----- +MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF +ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 +b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL +MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv +b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj +ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM +9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw +IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6 +VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L +93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm +jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA +A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI +U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs +N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv +o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU +5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy +rqXRfboQnoZsG4q5WTP468SQvvG5 +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 2 O=Amazon +# Subject: CN=Amazon Root CA 2 O=Amazon +# Label: "Amazon Root CA 2" +# Serial: 143266982885963551818349160658925006970653239 +# MD5 Fingerprint: c8:e5:8d:ce:a8:42:e2:7a:c0:2a:5c:7c:9e:26:bf:66 +# SHA1 Fingerprint: 5a:8c:ef:45:d7:a6:98:59:76:7a:8c:8b:44:96:b5:78:cf:47:4b:1a +# SHA256 Fingerprint: 1b:a5:b2:aa:8c:65:40:1a:82:96:01:18:f8:0b:ec:4f:62:30:4d:83:ce:c4:71:3a:19:c3:9c:01:1e:a4:6d:b4 +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF +ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 +b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL +MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv +b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK +gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ +W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg +1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K +8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r +2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me +z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR +8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj +mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz +7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6 ++XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI +0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB +Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm +UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2 +LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY ++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS +k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl +7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm +btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl +urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+ +fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63 +n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE +76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H +9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT +4PsJYGw= +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 3 O=Amazon +# Subject: CN=Amazon Root CA 3 O=Amazon +# Label: "Amazon Root CA 3" +# Serial: 143266986699090766294700635381230934788665930 +# MD5 Fingerprint: a0:d4:ef:0b:f7:b5:d8:49:95:2a:ec:f5:c4:fc:81:87 +# SHA1 Fingerprint: 0d:44:dd:8c:3c:8c:1a:1a:58:75:64:81:e9:0f:2e:2a:ff:b3:d2:6e +# SHA256 Fingerprint: 18:ce:6c:fe:7b:f1:4e:60:b2:e3:47:b8:df:e8:68:cb:31:d0:2e:bb:3a:da:27:15:69:f5:03:43:b4:6d:b3:a4 +-----BEGIN CERTIFICATE----- +MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5 +MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g +Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG +A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg +Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl +ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr +ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr +BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM +YyRIHN8wfdVoOw== +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 4 O=Amazon +# Subject: CN=Amazon Root CA 4 O=Amazon +# Label: "Amazon Root CA 4" +# Serial: 143266989758080763974105200630763877849284878 +# MD5 Fingerprint: 89:bc:27:d5:eb:17:8d:06:6a:69:d5:fd:89:47:b4:cd +# SHA1 Fingerprint: f6:10:84:07:d6:f8:bb:67:98:0c:c2:e2:44:c2:eb:ae:1c:ef:63:be +# SHA256 Fingerprint: e3:5d:28:41:9e:d0:20:25:cf:a6:90:38:cd:62:39:62:45:8d:a5:c6:95:fb:de:a3:c2:2b:0b:fb:25:89:70:92 +-----BEGIN CERTIFICATE----- +MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5 +MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g +Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG +A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg +Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi +9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk +M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB +MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw +CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW +1KyLa2tJElMzrdfkviT8tQp21KW8EA== +-----END CERTIFICATE----- + +# Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM +# Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM +# Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1" +# Serial: 1 +# MD5 Fingerprint: dc:00:81:dc:69:2f:3e:2f:b0:3b:f6:3d:5a:91:8e:49 +# SHA1 Fingerprint: 31:43:64:9b:ec:ce:27:ec:ed:3a:3f:0b:8f:0d:e4:e8:91:dd:ee:ca +# SHA256 Fingerprint: 46:ed:c3:68:90:46:d5:3a:45:3f:b3:10:4a:b8:0d:ca:ec:65:8b:26:60:ea:16:29:dd:7e:86:79:90:64:87:16 +-----BEGIN CERTIFICATE----- +MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx +GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp +bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w +KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0 +BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy +dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG +EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll +IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU +QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT +TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg +LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7 +a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr +LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr +N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X +YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/ +iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f +AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH +V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh +AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf +IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4 +lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c +8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf +lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= +-----END CERTIFICATE----- + +# Issuer: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. +# Subject: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. +# Label: "GDCA TrustAUTH R5 ROOT" +# Serial: 9009899650740120186 +# MD5 Fingerprint: 63:cc:d9:3d:34:35:5c:6f:53:a3:e2:08:70:48:1f:b4 +# SHA1 Fingerprint: 0f:36:38:5b:81:1a:25:c3:9b:31:4e:83:ca:e9:34:66:70:cc:74:b4 +# SHA256 Fingerprint: bf:ff:8f:d0:44:33:48:7d:6a:8a:a6:0c:1a:29:76:7a:9f:c2:bb:b0:5e:42:0f:71:3a:13:b9:92:89:1d:38:93 +-----BEGIN CERTIFICATE----- +MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE +BhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ +IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0 +MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNV +BAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8w +HQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJj +Dp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBj +TnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+u +KU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEj +qcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpm +MUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12 +ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloP +zgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3Gk +L30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeC +jGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoA +HQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkC +AwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg +p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZm +DRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5 +COmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ry +L3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPf +JWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svg +IHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io +2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV +09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQ +XR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrq +T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe +MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com Root Certification Authority RSA O=SSL Corporation +# Subject: CN=SSL.com Root Certification Authority RSA O=SSL Corporation +# Label: "SSL.com Root Certification Authority RSA" +# Serial: 8875640296558310041 +# MD5 Fingerprint: 86:69:12:c0:70:f1:ec:ac:ac:c2:d5:bc:a5:5b:a1:29 +# SHA1 Fingerprint: b7:ab:33:08:d1:ea:44:77:ba:14:80:12:5a:6f:bd:a9:36:49:0c:bb +# SHA256 Fingerprint: 85:66:6a:56:2e:e0:be:5c:e9:25:c1:d8:89:0a:6f:76:a8:7e:c1:6d:4d:7d:5f:29:ea:74:19:cf:20:12:3b:69 +-----BEGIN CERTIFICATE----- +MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UE +BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK +DA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYwMjEyMTczOTM5WhcNNDEwMjEyMTcz +OTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv +dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv +bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcN +AQEBBQADggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2R +xFdHaxh3a3by/ZPkPQ/CFp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aX +qhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcC +C52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/geoeOy3ZExqysdBP+lSgQ3 +6YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkpk8zruFvh +/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrF +YD3ZfBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93E +JNyAKoFBbZQ+yODJgUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVc +US4cK38acijnALXRdMbX5J+tB5O2UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8 +ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi81xtZPCvM8hnIk2snYxnP/Okm ++Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4sbE6x/c+cCbqi +M+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4G +A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGV +cpNxJK1ok1iOMq8bs3AD/CUrdIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBc +Hadm47GUBwwyOabqG7B52B2ccETjit3E+ZUfijhDPwGFpUenPUayvOUiaPd7nNgs +PgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAslu1OJD7OAUN5F7kR/ +q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjqerQ0 +cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jr +a6x+3uxjMxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90I +H37hVZkLId6Tngr75qNJvTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/Y +K9f1JmzJBjSWFupwWRoyeXkLtoh/D1JIPb9s2KJELtFOt3JY04kTlf5Eq/jXixtu +nLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406ywKBjYZC6VWg3dGq2ktuf +oYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NIWuuA8ShY +Ic2wBlX7Jz9TkHCpBB5XJ7k= +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com Root Certification Authority ECC O=SSL Corporation +# Subject: CN=SSL.com Root Certification Authority ECC O=SSL Corporation +# Label: "SSL.com Root Certification Authority ECC" +# Serial: 8495723813297216424 +# MD5 Fingerprint: 2e:da:e4:39:7f:9c:8f:37:d1:70:9f:26:17:51:3a:8e +# SHA1 Fingerprint: c3:19:7c:39:24:e6:54:af:1b:c4:ab:20:95:7a:e2:c3:0e:13:02:6a +# SHA256 Fingerprint: 34:17:bb:06:cc:60:07:da:1b:96:1c:92:0b:8a:b4:ce:3f:ad:82:0e:4a:a3:0b:9a:cb:c4:a7:4e:bd:ce:bc:65 +-----BEGIN CERTIFICATE----- +MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMC +VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T +U0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNDAzWhcNNDEwMjEyMTgxNDAz +WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0 +b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBS +b290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB +BAAiA2IABEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI +7Z4INcgn64mMU1jrYor+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPg +CemB+vNH06NjMGEwHQYDVR0OBBYEFILRhXMw5zUE044CkvvlpNHEIejNMA8GA1Ud +EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTTjgKS++Wk0cQh6M0wDgYD +VR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCWe+0F+S8T +kdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+ +gA0z5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation +# Subject: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation +# Label: "SSL.com EV Root Certification Authority RSA R2" +# Serial: 6248227494352943350 +# MD5 Fingerprint: e1:1e:31:58:1a:ae:54:53:02:f6:17:6a:11:7b:4d:95 +# SHA1 Fingerprint: 74:3a:f0:52:9b:d0:32:a0:f4:4a:83:cd:d4:ba:a9:7b:7c:2e:c4:9a +# SHA256 Fingerprint: 2e:7b:f1:6c:c2:24:85:a7:bb:e2:aa:86:96:75:07:61:b0:ae:39:be:3b:2f:e9:d0:cc:6d:4e:f7:34:91:42:5c +-----BEGIN CERTIFICATE----- +MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNV +BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UE +CgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMB4XDTE3MDUzMTE4MTQzN1oXDTQy +MDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4G +A1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQD +DC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvq +M0fNTPl9fb69LT3w23jhhqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssuf +OePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7wcXHswxzpY6IXFJ3vG2fThVUCAtZJycxa +4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTOZw+oz12WGQvE43LrrdF9 +HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+B6KjBSYR +aZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcA +b9ZhCBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQ +Gp8hLH94t2S42Oim9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQV +PWKchjgGAGYS5Fl2WlPAApiiECtoRHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMO +pgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+SlmJuwgUHfbSguPvuUCYHBBXtSu +UDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48+qvWBkofZ6aY +MBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV +HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa4 +9QaAJadz20ZpqJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBW +s47LCp1Jjr+kxJG7ZhcFUZh1++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5 +Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nxY/hoLVUE0fKNsKTPvDxeH3jnpaAg +cLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2GguDKBAdRUNf/ktUM +79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDzOFSz +/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXt +ll9ldDz7CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEm +Kf7GUmG6sXP/wwyc5WxqlD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKK +QbNmC1r7fSOl8hqw/96bg5Qu0T/fkreRrwU7ZcegbLHNYhLDkBvjJc40vG93drEQ +w/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1hlMYegouCRw2n5H9gooi +S9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX9hwJ1C07 +mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation +# Subject: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation +# Label: "SSL.com EV Root Certification Authority ECC" +# Serial: 3182246526754555285 +# MD5 Fingerprint: 59:53:22:65:83:42:01:54:c0:ce:42:b9:5a:7c:f2:90 +# SHA1 Fingerprint: 4c:dd:51:a3:d1:f5:20:32:14:b0:c6:c5:32:23:03:91:c7:46:42:6d +# SHA256 Fingerprint: 22:a2:c1:f7:bd:ed:70:4c:c1:e7:01:b5:f4:08:c3:10:88:0f:e9:56:b5:de:2a:4a:44:f9:9c:87:3a:25:a7:c8 +-----BEGIN CERTIFICATE----- +MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMC +VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T +U0wgQ29ycG9yYXRpb24xNDAyBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNTIzWhcNNDEwMjEyMTgx +NTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv +dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NMLmNv +bSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49 +AgEGBSuBBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMA +VIbc/R/fALhBYlzccBYy3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1Kthku +WnBaBu2+8KGwytAJKaNjMGEwHQYDVR0OBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZP +MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX +5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJN+vp1RPZ +ytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg +h5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 +# Label: "GlobalSign Root CA - R6" +# Serial: 1417766617973444989252670301619537 +# MD5 Fingerprint: 4f:dd:07:e4:d4:22:64:39:1e:0c:37:42:ea:d1:c6:ae +# SHA1 Fingerprint: 80:94:64:0e:b5:a7:a1:ca:11:9c:1f:dd:d5:9f:81:02:63:a7:fb:d1 +# SHA256 Fingerprint: 2c:ab:ea:fe:37:d0:6c:a2:2a:ba:73:91:c0:03:3d:25:98:29:52:c4:53:64:73:49:76:3a:3a:b5:ad:6c:cf:69 +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEg +MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2Jh +bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQx +MjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSNjET +MBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQssgrRI +xutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1k +ZguSgMpE3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxD +aNc9PIrFsmbVkJq3MQbFvuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJw +LnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqMPKq0pPbzlUoSB239jLKJz9CgYXfIWHSw +1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+azayOeSsJDa38O+2HBNX +k7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05OWgtH8wY2 +SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/h +bguyCLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4n +WUx2OVvq+aWh2IMP0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpY +rZxCRXluDocZXFSxZba/jJvcE+kNb7gu3GduyYsRtYQUigAZcIN5kZeR1Bonvzce +MgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNVHSMEGDAWgBSu +bAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN +nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGt +Ixg93eFyRJa0lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr61 +55wsTLxDKZmOMNOsIeDjHfrYBzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLj +vUYAGm0CuiVdjaExUd1URhxN25mW7xocBFymFe944Hn+Xds+qkxV/ZoVqW/hpvvf +cDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr3TsTjxKM4kEaSHpz +oHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB10jZp +nOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfs +pA9MRf/TuTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+v +JJUEeKgDu+6B5dpffItKoZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R +8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+tJDfLRVpOoERIyNiwmcUVhAn21klJwGW4 +5hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GC CA" +# Serial: 44084345621038548146064804565436152554 +# MD5 Fingerprint: a9:d6:b9:2d:2f:93:64:f8:a5:69:ca:91:e9:68:07:23 +# SHA1 Fingerprint: e0:11:84:5e:34:de:be:88:81:b9:9c:f6:16:26:d1:96:1f:c3:b9:31 +# SHA256 Fingerprint: 85:60:f9:1c:36:24:da:ba:95:70:b5:fe:a0:db:e3:6f:f1:1a:83:23:be:94:86:85:4f:b3:f3:4a:55:71:19:8d +-----BEGIN CERTIFICATE----- +MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQsw +CQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91 +bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwg +Um9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRaFw00MjA1MDkwOTU4MzNaMG0xCzAJ +BgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBGb3Vu +ZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2JhbCBS +b290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4ni +eUqjFqdrVCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4W +p2OQ0jnUsYd4XxiWD1AbNTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7T +rYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0EAwMDaAAwZQIwJsdpW9zV +57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtkAjEA2zQg +Mgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 +-----END CERTIFICATE----- + +# Issuer: CN=UCA Global G2 Root O=UniTrust +# Subject: CN=UCA Global G2 Root O=UniTrust +# Label: "UCA Global G2 Root" +# Serial: 124779693093741543919145257850076631279 +# MD5 Fingerprint: 80:fe:f0:c4:4a:f0:5c:62:32:9f:1c:ba:78:a9:50:f8 +# SHA1 Fingerprint: 28:f9:78:16:19:7a:ff:18:25:18:aa:44:fe:c1:a0:ce:5c:b6:4c:8a +# SHA256 Fingerprint: 9b:ea:11:c9:76:fe:01:47:64:c1:be:56:a6:f9:14:b5:a5:60:31:7a:bd:99:88:39:33:82:e5:16:1a:a0:49:3c +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9 +MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBH +bG9iYWwgRzIgUm9vdDAeFw0xNjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0x +CzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlUcnVzdDEbMBkGA1UEAwwSVUNBIEds +b2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxeYr +b3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmToni9 +kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzm +VHqUwCoV8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/R +VogvGjqNO7uCEeBHANBSh6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDc +C/Vkw85DvG1xudLeJ1uK6NjGruFZfc8oLTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIj +tm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/R+zvWr9LesGtOxdQXGLY +D0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBeKW4bHAyv +j5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6Dl +NaBa4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6 +iIis7nCs+dwp4wwcOxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznP +O6Q0ibd5Ei9Hxeepl2n8pndntd978XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFIHEjMz15DD/pQwIX4wV +ZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo5sOASD0Ee/oj +L3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 +1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl +1qnN3e92mI0ADs0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oU +b3n09tDh05S60FdRvScFDcH9yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LV +PtateJLbXDzz2K36uGt/xDYotgIVilQsnLAXc47QN6MUPJiVAAwpBVueSUmxX8fj +y88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHojhJi6IjMtX9Gl8Cb +EGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZkbxqg +DMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI ++Vg7RE+xygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGy +YiGqhkCyLmTTX8jjfhFnRR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bX +UB+K+wb1whnw0A== +-----END CERTIFICATE----- + +# Issuer: CN=UCA Extended Validation Root O=UniTrust +# Subject: CN=UCA Extended Validation Root O=UniTrust +# Label: "UCA Extended Validation Root" +# Serial: 106100277556486529736699587978573607008 +# MD5 Fingerprint: a1:f3:5f:43:c6:34:9b:da:bf:8c:7e:05:53:ad:96:e2 +# SHA1 Fingerprint: a3:a1:b0:6f:24:61:23:4a:e3:36:a5:c2:37:fc:a6:ff:dd:f0:d7:3a +# SHA256 Fingerprint: d4:3a:f9:b3:54:73:75:5c:96:84:fc:06:d7:d8:cb:70:ee:5c:28:e7:73:fb:29:4e:b4:1e:e7:17:22:92:4d:24 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBH +MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBF +eHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMx +MDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNV +BAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrsiWog +D4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvS +sPGP2KxFRv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aop +O2z6+I9tTcg1367r3CTueUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dk +sHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR59mzLC52LqGj3n5qiAno8geK+LLNEOfi +c0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH0mK1lTnj8/FtDw5lhIpj +VMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KRel7sFsLz +KuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/ +TuDvB0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41G +sx2VYVdWf6/wFlthWG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs +1+lvK9JKBZP8nm9rZ/+I8U6laUpSNwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQD +fwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS3H5aBZ8eNJr34RQwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBADaN +l8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR +ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQ +VBcZEhrxH9cMaVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5 +c6sq1WnIeJEmMX3ixzDx/BR4dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp +4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb+7lsq+KePRXBOy5nAliRn+/4Qh8s +t2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOWF3sGPjLtx7dCvHaj +2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwiGpWO +vpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2C +xR9GUeOcGMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmx +cmtpzyKEC2IPrNkZAJSidjzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbM +fjKaiJUINlK73nZfdklJrX+9ZSCyycErdhh2n1ax +-----END CERTIFICATE----- + +# Issuer: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 +# Subject: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 +# Label: "Certigna Root CA" +# Serial: 269714418870597844693661054334862075617 +# MD5 Fingerprint: 0e:5c:30:62:27:eb:5b:bc:d7:ae:62:ba:e9:d5:df:77 +# SHA1 Fingerprint: 2d:0d:52:14:ff:9e:ad:99:24:01:74:20:47:6e:6c:85:27:27:f5:43 +# SHA256 Fingerprint: d4:8d:3d:23:ee:db:50:a4:59:e5:51:97:60:1c:27:77:4b:9d:7b:18:c9:4d:5a:05:95:11:a1:02:50:b9:31:68 +-----BEGIN CERTIFICATE----- +MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAw +WjELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAw +MiA0ODE0NjMwODEwMDAzNjEZMBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0x +MzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjdaMFoxCzAJBgNVBAYTAkZSMRIwEAYD +VQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYzMDgxMDAwMzYxGTAX +BgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sO +ty3tRQgXstmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9M +CiBtnyN6tMbaLOQdLNyzKNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPu +I9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8JXrJhFwLrN1CTivngqIkicuQstDuI7pm +TLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16XdG+RCYyKfHx9WzMfgIh +C59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq4NYKpkDf +ePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3Yz +IoejwpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWT +Co/1VTp2lc5ZmIoJlXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1k +JWumIWmbat10TWuXekG9qxf5kBdIjzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5 +hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp//TBt2dzhauH8XwIDAQABo4IB +GjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of +1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczov +L3d3d3cuY2VydGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilo +dHRwOi8vY3JsLmNlcnRpZ25hLmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYr +aHR0cDovL2NybC5kaGlteW90aXMuY29tL2NlcnRpZ25hcm9vdGNhLmNybDANBgkq +hkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOItOoldaDgvUSILSo3L +6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxPTGRG +HVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH6 +0BGM+RFq7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncB +lA2c5uk5jR+mUYyZDDl34bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdi +o2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1 +gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS6Cvu5zHbugRqh5jnxV/v +faci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaYtlu3zM63 +Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayh +jWZSaX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw +3kAP+HwV96LOPNdeE4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= +-----END CERTIFICATE----- + +# Issuer: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI +# Subject: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI +# Label: "emSign Root CA - G1" +# Serial: 235931866688319308814040 +# MD5 Fingerprint: 9c:42:84:57:dd:cb:0b:a7:2e:95:ad:b6:f3:da:bc:ac +# SHA1 Fingerprint: 8a:c7:ad:8f:73:ac:4e:c1:b5:75:4d:a5:40:f4:fc:cf:7c:b5:8e:8c +# SHA256 Fingerprint: 40:f6:af:03:46:a9:9a:a1:cd:1d:55:5a:4e:9c:ce:62:c7:f9:63:46:03:ee:40:66:15:83:3d:c8:c8:d0:03:67 +-----BEGIN CERTIFICATE----- +MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYD +VQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBU +ZWNobm9sb2dpZXMgTGltaXRlZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBH +MTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgxODMwMDBaMGcxCzAJBgNVBAYTAklO +MRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVkaHJhIFRlY2hub2xv +Z2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQz +f2N4aLTNLnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO +8oG0x5ZOrRkVUkr+PHB1cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aq +d7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHWDV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhM +tTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ6DqS0hdW5TUaQBw+jSzt +Od9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrHhQIDAQAB +o0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQD +AgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31x +PaOfG1vR2vjTnGs2vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjM +wiI/aTvFthUvozXGaCocV685743QNcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6d +GNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q+Mri/Tm3R7nrft8EI6/6nAYH +6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeihU80Bv2noWgby +RQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx +iN66zB+Afko= +-----END CERTIFICATE----- + +# Issuer: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI +# Subject: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI +# Label: "emSign ECC Root CA - G3" +# Serial: 287880440101571086945156 +# MD5 Fingerprint: ce:0b:72:d1:9f:88:8e:d0:50:03:e8:e3:b8:8b:67:40 +# SHA1 Fingerprint: 30:43:fa:4f:f2:57:dc:a0:c3:80:ee:2e:58:ea:78:b2:3f:e6:bb:c1 +# SHA256 Fingerprint: 86:a1:ec:ba:08:9c:4a:8d:3b:be:27:34:c6:12:ba:34:1d:81:3e:04:3c:f9:e8:a8:62:cd:5c:57:a3:6b:be:6b +-----BEGIN CERTIFICATE----- +MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQG +EwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNo +bm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g +RzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4MTgzMDAwWjBrMQswCQYDVQQGEwJJ +TjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9s +b2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMw +djAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0 +WXTsuwYc58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xyS +fvalY8L1X44uT6EYGQIrMgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuB +zhccLikenEhjQjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggq +hkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+DCBeQyh+KTOgNG3qxrdWB +CUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7jHvrZQnD ++JbNR6iC8hZVdyR+EhCVBCyj +-----END CERTIFICATE----- + +# Issuer: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI +# Subject: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI +# Label: "emSign Root CA - C1" +# Serial: 825510296613316004955058 +# MD5 Fingerprint: d8:e3:5d:01:21:fa:78:5a:b0:df:ba:d2:ee:2a:5f:68 +# SHA1 Fingerprint: e7:2e:f1:df:fc:b2:09:28:cf:5d:d4:d5:67:37:b1:51:cb:86:4f:01 +# SHA256 Fingerprint: 12:56:09:aa:30:1d:a0:a2:49:b9:7a:82:39:cb:6a:34:21:6f:44:dc:ac:9f:39:54:b1:42:92:f2:e8:c8:60:8f +-----BEGIN CERTIFICATE----- +MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkG +A1UEBhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEg +SW5jMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAw +MFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln +biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNpZ24gUm9v +dCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+upufGZ +BczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZ +HdPIWoU/Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH +3DspVpNqs8FqOp099cGXOFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvH +GPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4VI5b2P/AgNBbeCsbEBEV5f6f9vtKppa+c +xSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleoomslMuoaJuvimUnzYnu3Yy1 +aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+XJGFehiq +TbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87 +/kOXSTKZEhVb3xEp/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4 +kqNPEjE2NuLe/gDEo2APJ62gsIq1NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrG +YQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9wC68AivTxEDkigcxHpvOJpkT ++xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQBmIMMMAVSKeo +WXzhriKi4gp6D/piq1JM4fHfyr6DDUI= +-----END CERTIFICATE----- + +# Issuer: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI +# Subject: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI +# Label: "emSign ECC Root CA - C3" +# Serial: 582948710642506000014504 +# MD5 Fingerprint: 3e:53:b3:a3:81:ee:d7:10:f8:d3:b0:1d:17:92:f5:d5 +# SHA1 Fingerprint: b6:af:43:c2:9b:81:53:7d:f6:ef:6b:c3:1f:1f:60:15:0c:ee:48:66 +# SHA256 Fingerprint: bc:4d:80:9b:15:18:9d:78:db:3e:1d:8c:f4:f9:72:6a:79:5d:a1:64:3c:a5:f1:35:8e:1d:db:0e:dc:0d:7e:b3 +-----BEGIN CERTIFICATE----- +MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQG +EwJVUzETMBEGA1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMx +IDAeBgNVBAMTF2VtU2lnbiBFQ0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAw +MFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln +biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQDExdlbVNpZ24gRUND +IFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd6bci +MK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4Ojavti +sIGJAnB9SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0O +BBYEFPtaSNCAIEDyqOkAB2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB +Af8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQC02C8Cif22TGK6Q04ThHK1rt0c +3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwUZOR8loMRnLDRWmFLpg9J +0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== +-----END CERTIFICATE----- + +# Issuer: CN=Hongkong Post Root CA 3 O=Hongkong Post +# Subject: CN=Hongkong Post Root CA 3 O=Hongkong Post +# Label: "Hongkong Post Root CA 3" +# Serial: 46170865288971385588281144162979347873371282084 +# MD5 Fingerprint: 11:fc:9f:bd:73:30:02:8a:fd:3f:f3:58:b9:cb:20:f0 +# SHA1 Fingerprint: 58:a2:d0:ec:20:52:81:5b:c1:f3:f8:64:02:24:4e:c2:8e:02:4b:02 +# SHA256 Fingerprint: 5a:2f:c0:3f:0c:83:b0:90:bb:fa:40:60:4b:09:88:44:6c:76:36:18:3d:f9:84:6e:17:10:1a:44:7f:b8:ef:d6 +-----BEGIN CERTIFICATE----- +MIIFzzCCA7egAwIBAgIUCBZfikyl7ADJk0DfxMauI7gcWqQwDQYJKoZIhvcNAQEL +BQAwbzELMAkGA1UEBhMCSEsxEjAQBgNVBAgTCUhvbmcgS29uZzESMBAGA1UEBxMJ +SG9uZyBLb25nMRYwFAYDVQQKEw1Ib25na29uZyBQb3N0MSAwHgYDVQQDExdIb25n +a29uZyBQb3N0IFJvb3QgQ0EgMzAeFw0xNzA2MDMwMjI5NDZaFw00MjA2MDMwMjI5 +NDZaMG8xCzAJBgNVBAYTAkhLMRIwEAYDVQQIEwlIb25nIEtvbmcxEjAQBgNVBAcT +CUhvbmcgS29uZzEWMBQGA1UEChMNSG9uZ2tvbmcgUG9zdDEgMB4GA1UEAxMXSG9u +Z2tvbmcgUG9zdCBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCziNfqzg8gTr7m1gNt7ln8wlffKWihgw4+aMdoWJwcYEuJQwy51BWy7sFO +dem1p+/l6TWZ5Mwc50tfjTMwIDNT2aa71T4Tjukfh0mtUC1Qyhi+AViiE3CWu4mI +VoBc+L0sPOFMV4i707mV78vH9toxdCim5lSJ9UExyuUmGs2C4HDaOym71QP1mbpV +9WTRYA6ziUm4ii8F0oRFKHyPaFASePwLtVPLwpgchKOesL4jpNrcyCse2m5FHomY +2vkALgbpDDtw1VAliJnLzXNg99X/NWfFobxeq81KuEXryGgeDQ0URhLj0mRiikKY +vLTGCAj4/ahMZJx2Ab0vqWwzD9g/KLg8aQFChn5pwckGyuV6RmXpwtZQQS4/t+Tt +bNe/JgERohYpSms0BpDsE9K2+2p20jzt8NYt3eEV7KObLyzJPivkaTv/ciWxNoZb +x39ri1UbSsUgYT2uy1DhCDq+sI9jQVMwCFk8mB13umOResoQUGC/8Ne8lYePl8X+ +l2oBlKN8W4UdKjk60FSh0Tlxnf0h+bV78OLgAo9uliQlLKAeLKjEiafv7ZkGL7YK +TE/bosw3Gq9HhS2KX8Q0NEwA/RiTZxPRN+ZItIsGxVd7GYYKecsAyVKvQv83j+Gj +Hno9UKtjBucVtT+2RTeUN7F+8kjDf8V1/peNRY8apxpyKBpADwIDAQABo2MwYTAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQXnc0e +i9Y5K3DTXNSguB+wAPzFYTAdBgNVHQ4EFgQUF53NHovWOStw01zUoLgfsAD8xWEw +DQYJKoZIhvcNAQELBQADggIBAFbVe27mIgHSQpsY1Q7XZiNc4/6gx5LS6ZStS6LG +7BJ8dNVI0lkUmcDrudHr9EgwW62nV3OZqdPlt9EuWSRY3GguLmLYauRwCy0gUCCk +MpXRAJi70/33MvJJrsZ64Ee+bs7Lo3I6LWldy8joRTnU+kLBEUx3XZL7av9YROXr +gZ6voJmtvqkBZss4HTzfQx/0TW60uhdG/H39h4F5ag0zD/ov+BS5gLNdTaqX4fnk +GMX41TiMJjz98iji7lpJiCzfeT2OnpA8vUFKOt1b9pq0zj8lMH8yfaIDlNDceqFS +3m6TjRgm/VWsvY+b0s+v54Ysyx8Jb6NvqYTUc79NoXQbTiNg8swOqn+knEwlqLJm +Ozj/2ZQw9nKEvmhVEA/GcywWaZMH/rFF7buiVWqw2rVKAiUnhde3t4ZEFolsgCs+ +l6mc1X5VTMbeRRAc6uk7nwNT7u56AQIWeNTowr5GdogTPyK7SBIdUgC0An4hGh6c +JfTzPV4e0hz5sy229zdcxsshTrD3mUcYhcErulWuBurQB7Lcq9CClnXO0lD+mefP +L5/ndtFhKvshuzHQqp9HpLIiyhY6UFfEW0NnxWViA0kB60PZ2Pierc+xYw5F9KBa +LJstxabArahH9CdMOA0uG0k7UvToiIMrVCjU8jVStDKDYmlkDJGcn5fqdBb9HxEG +mpv0 +-----END CERTIFICATE----- + +# Issuer: CN=Microsoft ECC Root Certificate Authority 2017 O=Microsoft Corporation +# Subject: CN=Microsoft ECC Root Certificate Authority 2017 O=Microsoft Corporation +# Label: "Microsoft ECC Root Certificate Authority 2017" +# Serial: 136839042543790627607696632466672567020 +# MD5 Fingerprint: dd:a1:03:e6:4a:93:10:d1:bf:f0:19:42:cb:fe:ed:67 +# SHA1 Fingerprint: 99:9a:64:c3:7f:f4:7d:9f:ab:95:f1:47:69:89:14:60:ee:c4:c3:c5 +# SHA256 Fingerprint: 35:8d:f3:9d:76:4a:f9:e1:b7:66:e9:c9:72:df:35:2e:e1:5c:fa:c2:27:af:6a:d1:d7:0e:8e:4a:6e:dc:ba:02 +-----BEGIN CERTIFICATE----- +MIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQsw +CQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYD +VQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIw +MTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4MjMxNjA0WjBlMQswCQYDVQQGEwJV +UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNy +b3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZR +ogPZnZH6thaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYb +hGBKia/teQ87zvH2RPUBeMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8E +BTADAQH/MB0GA1UdDgQWBBTIy5lycFIM+Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3 +FQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlfXu5gKcs68tvWMoQZP3zV +L8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaReNtUjGUB +iudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M= +-----END CERTIFICATE----- + +# Issuer: CN=Microsoft RSA Root Certificate Authority 2017 O=Microsoft Corporation +# Subject: CN=Microsoft RSA Root Certificate Authority 2017 O=Microsoft Corporation +# Label: "Microsoft RSA Root Certificate Authority 2017" +# Serial: 40975477897264996090493496164228220339 +# MD5 Fingerprint: 10:ff:00:ff:cf:c9:f8:c7:7a:c0:ee:35:8e:c9:0f:47 +# SHA1 Fingerprint: 73:a5:e6:4a:3b:ff:83:16:ff:0e:dc:cc:61:8a:90:6e:4e:ae:4d:74 +# SHA256 Fingerprint: c7:41:f7:0f:4b:2a:8d:88:bf:2e:71:c1:41:22:ef:53:ef:10:eb:a0:cf:a5:e6:4c:fa:20:f4:18:85:30:73:e0 +-----BEGIN CERTIFICATE----- +MIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBl +MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw +NAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 +IDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIwNzE4MjMwMDIzWjBlMQswCQYDVQQG +EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1N +aWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZ +Nt9GkMml7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0 +ZdDMbRnMlfl7rEqUrQ7eS0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1 +HLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw71VdyvD/IybLeS2v4I2wDwAW9lcfNcztm +gGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+dkC0zVJhUXAoP8XFWvLJ +jEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49FyGcohJUc +aDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaG +YaRSMLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6 +W6IYZVcSn2i51BVrlMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4K +UGsTuqwPN1q3ErWQgR5WrlcihtnJ0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH ++FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJClTUFLkqqNfs+avNJVgyeY+Q +W5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZC +LgLNFgVZJ8og6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OC +gMNPOsduET/m4xaRhPtthH80dK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6 +tZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk+ONVFT24bcMKpBLBaYVu32TxU5nh +SnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex/2kskZGT4d9Mozd2 +TaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDyAmH3 +pvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGR +xpl/j8nWZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiApp +GWSZI1b7rCoucL5mxAyE7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9 +dOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKTc0QWbej09+CVgI+WXTik9KveCjCHk9hN +AHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D5KbvtwEwXlGjefVwaaZB +RA+GsCyRxj3qrg+E +-----END CERTIFICATE----- + +# Issuer: CN=e-Szigno Root CA 2017 O=Microsec Ltd. +# Subject: CN=e-Szigno Root CA 2017 O=Microsec Ltd. +# Label: "e-Szigno Root CA 2017" +# Serial: 411379200276854331539784714 +# MD5 Fingerprint: de:1f:f6:9e:84:ae:a7:b4:21:ce:1e:58:7d:d1:84:98 +# SHA1 Fingerprint: 89:d4:83:03:4f:9e:9a:48:80:5f:72:37:d4:a9:a6:ef:cb:7c:1f:d1 +# SHA256 Fingerprint: be:b0:0b:30:83:9b:9b:c3:2c:32:e4:44:79:05:95:06:41:f2:64:21:b1:5e:d0:89:19:8b:51:8a:e2:ea:1b:99 +-----BEGIN CERTIFICATE----- +MIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNV +BAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRk +LjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJv +b3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZaFw00MjA4MjIxMjA3MDZaMHExCzAJ +BgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMg +THRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25v +IFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtv +xie+RJCxs1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+H +Wyx7xf58etqjYzBhMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBSHERUI0arBeAyxr87GyZDvvzAEwDAfBgNVHSMEGDAWgBSHERUI0arB +eAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEAtVfd14pVCzbhhkT61Nlo +jbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxOsvxyqltZ ++efcMQ== +-----END CERTIFICATE----- + +# Issuer: O=CERTSIGN SA OU=certSIGN ROOT CA G2 +# Subject: O=CERTSIGN SA OU=certSIGN ROOT CA G2 +# Label: "certSIGN Root CA G2" +# Serial: 313609486401300475190 +# MD5 Fingerprint: 8c:f1:75:8a:c6:19:cf:94:b7:f7:65:20:87:c3:97:c7 +# SHA1 Fingerprint: 26:f9:93:b4:ed:3d:28:27:b0:b9:4b:a7:e9:15:1d:a3:8d:92:e5:32 +# SHA256 Fingerprint: 65:7c:fe:2f:a7:3f:aa:38:46:25:71:f3:32:a2:36:3a:46:fc:e7:02:09:51:71:07:02:cd:fb:b6:ee:da:33:05 +-----BEGIN CERTIFICATE----- +MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNV +BAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04g +Uk9PVCBDQSBHMjAeFw0xNzAyMDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJ +BgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJ +R04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDF +dRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05N0Iw +vlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZ +uIt4ImfkabBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhp +n+Sc8CnTXPnGFiWeI8MgwT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKs +cpc/I1mbySKEwQdPzH/iV8oScLumZfNpdWO9lfsbl83kqK/20U6o2YpxJM02PbyW +xPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91QqhngLjYl/rNUssuHLoPj1P +rCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732jcZZroiF +DsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fx +DTvf95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgy +LcsUDFDYg2WD7rlcz8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6C +eWRgKRM+o/1Pcmqr4tTluCRVLERLiohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSCIS1mxteg4BXrzkwJ +d8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOBywaK8SJJ6ejq +kX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC +b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQl +qiCA2ClV9+BB/AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0 +OJD7uNGzcgbJceaBxXntC6Z58hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+c +NywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5BiKDUyUM/FHE5r7iOZULJK2v0ZXk +ltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklWatKcsWMy5WHgUyIO +pwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tUSxfj +03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZk +PuXaTH4MNMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE +1LlSVHJ7liXMvGnjSG4N0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MX +QRBdJ3NghVdJIgc= +-----END CERTIFICATE----- + +# Issuer: CN=Trustwave Global Certification Authority O=Trustwave Holdings, Inc. +# Subject: CN=Trustwave Global Certification Authority O=Trustwave Holdings, Inc. +# Label: "Trustwave Global Certification Authority" +# Serial: 1846098327275375458322922162 +# MD5 Fingerprint: f8:1c:18:2d:2f:ba:5f:6d:a1:6c:bc:c7:ab:91:c7:0e +# SHA1 Fingerprint: 2f:8f:36:4f:e1:58:97:44:21:59:87:a5:2a:9a:d0:69:95:26:7f:b5 +# SHA256 Fingerprint: 97:55:20:15:f5:dd:fc:3c:87:88:c0:06:94:45:55:40:88:94:45:00:84:f1:00:86:70:86:bc:1a:2b:b5:8d:c8 +-----BEGIN CERTIFICATE----- +MIIF2jCCA8KgAwIBAgIMBfcOhtpJ80Y1LrqyMA0GCSqGSIb3DQEBCwUAMIGIMQsw +CQYDVQQGEwJVUzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28x +ITAfBgNVBAoMGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1 +c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMx +OTM0MTJaFw00MjA4MjMxOTM0MTJaMIGIMQswCQYDVQQGEwJVUzERMA8GA1UECAwI +SWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2ZSBI +b2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +ALldUShLPDeS0YLOvR29zd24q88KPuFd5dyqCblXAj7mY2Hf8g+CY66j96xz0Xzn +swuvCAAJWX/NKSqIk4cXGIDtiLK0thAfLdZfVaITXdHG6wZWiYj+rDKd/VzDBcdu +7oaJuogDnXIhhpCujwOl3J+IKMujkkkP7NAP4m1ET4BqstTnoApTAbqOl5F2brz8 +1Ws25kCI1nsvXwXoLG0R8+eyvpJETNKXpP7ScoFDB5zpET71ixpZfR9oWN0EACyW +80OzfpgZdNmcc9kYvkHHNHnZ9GLCQ7mzJ7Aiy/k9UscwR7PJPrhq4ufogXBeQotP +JqX+OsIgbrv4Fo7NDKm0G2x2EOFYeUY+VM6AqFcJNykbmROPDMjWLBz7BegIlT1l +RtzuzWniTY+HKE40Cz7PFNm73bZQmq131BnW2hqIyE4bJ3XYsgjxroMwuREOzYfw +hI0Vcnyh78zyiGG69Gm7DIwLdVcEuE4qFC49DxweMqZiNu5m4iK4BUBjECLzMx10 +coos9TkpoNPnG4CELcU9402x/RpvumUHO1jsQkUm+9jaJXLE9gCxInm943xZYkqc +BW89zubWR2OZxiRvchLIrH+QtAuRcOi35hYQcRfO3gZPSEF9NUqjifLJS3tBEW1n +twiYTOURGa5CgNz7kAXU+FDKvuStx8KU1xad5hePrzb7AgMBAAGjQjBAMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFJngGWcNYtt2s9o9uFvo/ULSMQ6HMA4GA1Ud +DwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAmHNw4rDT7TnsTGDZqRKGFx6W +0OhUKDtkLSGm+J1WE2pIPU/HPinbbViDVD2HfSMF1OQc3Og4ZYbFdada2zUFvXfe +uyk3QAUHw5RSn8pk3fEbK9xGChACMf1KaA0HZJDmHvUqoai7PF35owgLEQzxPy0Q +lG/+4jSHg9bP5Rs1bdID4bANqKCqRieCNqcVtgimQlRXtpla4gt5kNdXElE1GYhB +aCXUNxeEFfsBctyV3lImIJgm4nb1J2/6ADtKYdkNy1GTKv0WBpanI5ojSP5RvbbE +sLFUzt5sQa0WZ37b/TjNuThOssFgy50X31ieemKyJo90lZvkWx3SD92YHJtZuSPT +MaCm/zjdzyBP6VhWOmfD0faZmZ26NraAL4hHT4a/RDqA5Dccprrql5gR0IRiR2Qe +qu5AvzSxnI9O4fKSTx+O856X3vOmeWqJcU9LJxdI/uz0UA9PSX3MReO9ekDFQdxh +VicGaeVyQYHTtgGJoC86cnn+OjC/QezHYj6RS8fZMXZC+fc8Y+wmjHMMfRod6qh8 +h6jCJ3zhM0EPz8/8AKAigJ5Kp28AsEFFtyLKaEjFQqKu3R3y4G5OBVixwJAWKqQ9 +EEC+j2Jjg6mcgn0tAumDMHzLJ8n9HmYAsC7TIS+OMxZsmO0QqAfWzJPP29FpHOTK +yeC2nOnOcXHebD8WpHk= +-----END CERTIFICATE----- + +# Issuer: CN=Trustwave Global ECC P256 Certification Authority O=Trustwave Holdings, Inc. +# Subject: CN=Trustwave Global ECC P256 Certification Authority O=Trustwave Holdings, Inc. +# Label: "Trustwave Global ECC P256 Certification Authority" +# Serial: 4151900041497450638097112925 +# MD5 Fingerprint: 5b:44:e3:8d:5d:36:86:26:e8:0d:05:d2:59:a7:83:54 +# SHA1 Fingerprint: b4:90:82:dd:45:0c:be:8b:5b:b1:66:d3:e2:a4:08:26:cd:ed:42:cf +# SHA256 Fingerprint: 94:5b:bc:82:5e:a5:54:f4:89:d1:fd:51:a7:3d:df:2e:a6:24:ac:70:19:a0:52:05:22:5c:22:a7:8c:cf:a8:b4 +-----BEGIN CERTIFICATE----- +MIICYDCCAgegAwIBAgIMDWpfCD8oXD5Rld9dMAoGCCqGSM49BAMCMIGRMQswCQYD +VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAf +BgNVBAoTGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3 +YXZlIEdsb2JhbCBFQ0MgUDI1NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0x +NzA4MjMxOTM1MTBaFw00MjA4MjMxOTM1MTBaMIGRMQswCQYDVQQGEwJVUzERMA8G +A1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0 +d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBF +Q0MgUDI1NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTBZMBMGByqGSM49AgEGCCqG +SM49AwEHA0IABH77bOYj43MyCMpg5lOcunSNGLB4kFKA3TjASh3RqMyTpJcGOMoN +FWLGjgEqZZ2q3zSRLoHB5DOSMcT9CTqmP62jQzBBMA8GA1UdEwEB/wQFMAMBAf8w +DwYDVR0PAQH/BAUDAwcGADAdBgNVHQ4EFgQUo0EGrJBt0UrrdaVKEJmzsaGLSvcw +CgYIKoZIzj0EAwIDRwAwRAIgB+ZU2g6gWrKuEZ+Hxbb/ad4lvvigtwjzRM4q3wgh +DDcCIC0mA6AFvWvR9lz4ZcyGbbOcNEhjhAnFjXca4syc4XR7 +-----END CERTIFICATE----- + +# Issuer: CN=Trustwave Global ECC P384 Certification Authority O=Trustwave Holdings, Inc. +# Subject: CN=Trustwave Global ECC P384 Certification Authority O=Trustwave Holdings, Inc. +# Label: "Trustwave Global ECC P384 Certification Authority" +# Serial: 2704997926503831671788816187 +# MD5 Fingerprint: ea:cf:60:c4:3b:b9:15:29:40:a1:97:ed:78:27:93:d6 +# SHA1 Fingerprint: e7:f3:a3:c8:cf:6f:c3:04:2e:6d:0e:67:32:c5:9e:68:95:0d:5e:d2 +# SHA256 Fingerprint: 55:90:38:59:c8:c0:c3:eb:b8:75:9e:ce:4e:25:57:22:5f:f5:75:8b:bd:38:eb:d4:82:76:60:1e:1b:d5:80:97 +-----BEGIN CERTIFICATE----- +MIICnTCCAiSgAwIBAgIMCL2Fl2yZJ6SAaEc7MAoGCCqGSM49BAMDMIGRMQswCQYD +VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAf +BgNVBAoTGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3 +YXZlIEdsb2JhbCBFQ0MgUDM4NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0x +NzA4MjMxOTM2NDNaFw00MjA4MjMxOTM2NDNaMIGRMQswCQYDVQQGEwJVUzERMA8G +A1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0 +d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBF +Q0MgUDM4NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTB2MBAGByqGSM49AgEGBSuB +BAAiA2IABGvaDXU1CDFHBa5FmVXxERMuSvgQMSOjfoPTfygIOiYaOs+Xgh+AtycJ +j9GOMMQKmw6sWASr9zZ9lCOkmwqKi6vr/TklZvFe/oyujUF5nQlgziip04pt89ZF +1PKYhDhloKNDMEEwDwYDVR0TAQH/BAUwAwEB/zAPBgNVHQ8BAf8EBQMDBwYAMB0G +A1UdDgQWBBRVqYSJ0sEyvRjLbKYHTsjnnb6CkDAKBggqhkjOPQQDAwNnADBkAjA3 +AZKXRRJ+oPM+rRk6ct30UJMDEr5E0k9BpIycnR+j9sKS50gU/k6bpZFXrsY3crsC +MGclCrEMXu6pY5Jv5ZAL/mYiykf9ijH3g/56vxC+GCsej/YpHpRZ744hN8tRmKVu +Sw== +-----END CERTIFICATE----- + +# Issuer: CN=NAVER Global Root Certification Authority O=NAVER BUSINESS PLATFORM Corp. +# Subject: CN=NAVER Global Root Certification Authority O=NAVER BUSINESS PLATFORM Corp. +# Label: "NAVER Global Root Certification Authority" +# Serial: 9013692873798656336226253319739695165984492813 +# MD5 Fingerprint: c8:7e:41:f6:25:3b:f5:09:b3:17:e8:46:3d:bf:d0:9b +# SHA1 Fingerprint: 8f:6b:f2:a9:27:4a:da:14:a0:c4:f4:8e:61:27:f9:c0:1e:78:5d:d1 +# SHA256 Fingerprint: 88:f4:38:dc:f8:ff:d1:fa:8f:42:91:15:ff:e5:f8:2a:e1:e0:6e:0c:70:c3:75:fa:ad:71:7b:34:a4:9e:72:65 +-----BEGIN CERTIFICATE----- +MIIFojCCA4qgAwIBAgIUAZQwHqIL3fXFMyqxQ0Rx+NZQTQ0wDQYJKoZIhvcNAQEM +BQAwaTELMAkGA1UEBhMCS1IxJjAkBgNVBAoMHU5BVkVSIEJVU0lORVNTIFBMQVRG +T1JNIENvcnAuMTIwMAYDVQQDDClOQVZFUiBHbG9iYWwgUm9vdCBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eTAeFw0xNzA4MTgwODU4NDJaFw0zNzA4MTgyMzU5NTlaMGkx +CzAJBgNVBAYTAktSMSYwJAYDVQQKDB1OQVZFUiBCVVNJTkVTUyBQTEFURk9STSBD +b3JwLjEyMDAGA1UEAwwpTkFWRVIgR2xvYmFsIFJvb3QgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC21PGTXLVA +iQqrDZBbUGOukJR0F0Vy1ntlWilLp1agS7gvQnXp2XskWjFlqxcX0TM62RHcQDaH +38dq6SZeWYp34+hInDEW+j6RscrJo+KfziFTowI2MMtSAuXaMl3Dxeb57hHHi8lE +HoSTGEq0n+USZGnQJoViAbbJAh2+g1G7XNr4rRVqmfeSVPc0W+m/6imBEtRTkZaz +kVrd/pBzKPswRrXKCAfHcXLJZtM0l/aM9BhK4dA9WkW2aacp+yPOiNgSnABIqKYP +szuSjXEOdMWLyEz59JuOuDxp7W87UC9Y7cSw0BwbagzivESq2M0UXZR4Yb8Obtoq +vC8MC3GmsxY/nOb5zJ9TNeIDoKAYv7vxvvTWjIcNQvcGufFt7QSUqP620wbGQGHf +nZ3zVHbOUzoBppJB7ASjjw2i1QnK1sua8e9DXcCrpUHPXFNwcMmIpi3Ua2FzUCaG +YQ5fG8Ir4ozVu53BA0K6lNpfqbDKzE0K70dpAy8i+/Eozr9dUGWokG2zdLAIx6yo +0es+nPxdGoMuK8u180SdOqcXYZaicdNwlhVNt0xz7hlcxVs+Qf6sdWA7G2POAN3a +CJBitOUt7kinaxeZVL6HSuOpXgRM6xBtVNbv8ejyYhbLgGvtPe31HzClrkvJE+2K +AQHJuFFYwGY6sWZLxNUxAmLpdIQM201GLQIDAQABo0IwQDAdBgNVHQ4EFgQU0p+I +36HNLL3s9TsBAZMzJ7LrYEswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB +Af8wDQYJKoZIhvcNAQEMBQADggIBADLKgLOdPVQG3dLSLvCkASELZ0jKbY7gyKoN +qo0hV4/GPnrK21HUUrPUloSlWGB/5QuOH/XcChWB5Tu2tyIvCZwTFrFsDDUIbatj +cu3cvuzHV+YwIHHW1xDBE1UBjCpD5EHxzzp6U5LOogMFDTjfArsQLtk70pt6wKGm ++LUx5vR1yblTmXVHIloUFcd4G7ad6Qz4G3bxhYTeodoS76TiEJd6eN4MUZeoIUCL +hr0N8F5OSza7OyAfikJW4Qsav3vQIkMsRIz75Sq0bBwcupTgE34h5prCy8VCZLQe +lHsIJchxzIdFV4XTnyliIoNRlwAYl3dqmJLJfGBs32x9SuRwTMKeuB330DTHD8z7 +p/8Dvq1wkNoL3chtl1+afwkyQf3NosxabUzyqkn+Zvjp2DXrDige7kgvOtB5CTh8 +piKCk5XQA76+AqAF3SAi428diDRgxuYKuQl1C/AH6GmWNcf7I4GOODm4RStDeKLR +LBT/DShycpWbXgnbiUSYqqFJu3FS8r/2/yehNq+4tneI3TqkbZs0kNwUXTC/t+sX +5Ie3cdCh13cV1ELX8vMxmV2b3RZtP+oGI/hGoiLtk/bdmuYqh7GYVPEi92tF4+KO +dh2ajcQGjTa3FPOdVGm3jjzVpG2Tgbet9r1ke8LJaDmgkpzNNIaRkPpkUZ3+/uul +9XXeifdy +-----END CERTIFICATE----- + +# Issuer: CN=AC RAIZ FNMT-RCM SERVIDORES SEGUROS O=FNMT-RCM OU=Ceres +# Subject: CN=AC RAIZ FNMT-RCM SERVIDORES SEGUROS O=FNMT-RCM OU=Ceres +# Label: "AC RAIZ FNMT-RCM SERVIDORES SEGUROS" +# Serial: 131542671362353147877283741781055151509 +# MD5 Fingerprint: 19:36:9c:52:03:2f:d2:d1:bb:23:cc:dd:1e:12:55:bb +# SHA1 Fingerprint: 62:ff:d9:9e:c0:65:0d:03:ce:75:93:d2:ed:3f:2d:32:c9:e3:e5:4a +# SHA256 Fingerprint: 55:41:53:b1:3d:2c:f9:dd:b7:53:bf:be:1a:4e:0a:e0:8d:0a:a4:18:70:58:fe:60:a2:b8:62:b2:e4:b8:7b:cb +-----BEGIN CERTIFICATE----- +MIICbjCCAfOgAwIBAgIQYvYybOXE42hcG2LdnC6dlTAKBggqhkjOPQQDAzB4MQsw +CQYDVQQGEwJFUzERMA8GA1UECgwIRk5NVC1SQ00xDjAMBgNVBAsMBUNlcmVzMRgw +FgYDVQRhDA9WQVRFUy1RMjgyNjAwNEoxLDAqBgNVBAMMI0FDIFJBSVogRk5NVC1S +Q00gU0VSVklET1JFUyBTRUdVUk9TMB4XDTE4MTIyMDA5MzczM1oXDTQzMTIyMDA5 +MzczM1oweDELMAkGA1UEBhMCRVMxETAPBgNVBAoMCEZOTVQtUkNNMQ4wDAYDVQQL +DAVDZXJlczEYMBYGA1UEYQwPVkFURVMtUTI4MjYwMDRKMSwwKgYDVQQDDCNBQyBS +QUlaIEZOTVQtUkNNIFNFUlZJRE9SRVMgU0VHVVJPUzB2MBAGByqGSM49AgEGBSuB +BAAiA2IABPa6V1PIyqvfNkpSIeSX0oNnnvBlUdBeh8dHsVnyV0ebAAKTRBdp20LH +sbI6GA60XYyzZl2hNPk2LEnb80b8s0RpRBNm/dfF/a82Tc4DTQdxz69qBdKiQ1oK +Um8BA06Oi6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD +VR0OBBYEFAG5L++/EYZg8k/QQW6rcx/n0m5JMAoGCCqGSM49BAMDA2kAMGYCMQCu +SuMrQMN0EfKVrRYj3k4MGuZdpSRea0R7/DjiT8ucRRcRTBQnJlU5dUoDzBOQn5IC +MQD6SmxgiHPz7riYYqnOK8LZiqZwMR2vsJRM60/G49HzYqc8/5MuB1xJAWdpEgJy +v+c= +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign Root R46 O=GlobalSign nv-sa +# Subject: CN=GlobalSign Root R46 O=GlobalSign nv-sa +# Label: "GlobalSign Root R46" +# Serial: 1552617688466950547958867513931858518042577 +# MD5 Fingerprint: c4:14:30:e4:fa:66:43:94:2a:6a:1b:24:5f:19:d0:ef +# SHA1 Fingerprint: 53:a2:b0:4b:ca:6b:d6:45:e6:39:8a:8e:c4:0d:d2:bf:77:c3:a2:90 +# SHA256 Fingerprint: 4f:a3:12:6d:8d:3a:11:d1:c4:85:5a:4f:80:7c:ba:d6:cf:91:9d:3a:5a:88:b0:3b:ea:2c:63:72:d9:3c:40:c9 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgISEdK7udcjGJ5AXwqdLdDfJWfRMA0GCSqGSIb3DQEBDAUA +MEYxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYD +VQQDExNHbG9iYWxTaWduIFJvb3QgUjQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMy +MDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYt +c2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCsrHQy6LNl5brtQyYdpokNRbopiLKkHWPd08EsCVeJ +OaFV6Wc0dwxu5FUdUiXSE2te4R2pt32JMl8Nnp8semNgQB+msLZ4j5lUlghYruQG +vGIFAha/r6gjA7aUD7xubMLL1aa7DOn2wQL7Id5m3RerdELv8HQvJfTqa1VbkNud +316HCkD7rRlr+/fKYIje2sGP1q7Vf9Q8g+7XFkyDRTNrJ9CG0Bwta/OrffGFqfUo +0q3v84RLHIf8E6M6cqJaESvWJ3En7YEtbWaBkoe0G1h6zD8K+kZPTXhc+CtI4wSE +y132tGqzZfxCnlEmIyDLPRT5ge1lFgBPGmSXZgjPjHvjK8Cd+RTyG/FWaha/LIWF +zXg4mutCagI0GIMXTpRW+LaCtfOW3T3zvn8gdz57GSNrLNRyc0NXfeD412lPFzYE ++cCQYDdF3uYM2HSNrpyibXRdQr4G9dlkbgIQrImwTDsHTUB+JMWKmIJ5jqSngiCN +I/onccnfxkF0oE32kRbcRoxfKWMxWXEM2G/CtjJ9++ZdU6Z+Ffy7dXxd7Pj2Fxzs +x2sZy/N78CsHpdlseVR2bJ0cpm4O6XkMqCNqo98bMDGfsVR7/mrLZqrcZdCinkqa +ByFrgY/bxFn63iLABJzjqls2k+g9vXqhnQt2sQvHnf3PmKgGwvgqo6GDoLclcqUC +4wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUA1yrc4GHqMywptWU4jaWSf8FmSwwDQYJKoZIhvcNAQEMBQADggIBAHx4 +7PYCLLtbfpIrXTncvtgdokIzTfnvpCo7RGkerNlFo048p9gkUbJUHJNOxO97k4Vg +JuoJSOD1u8fpaNK7ajFxzHmuEajwmf3lH7wvqMxX63bEIaZHU1VNaL8FpO7XJqti +2kM3S+LGteWygxk6x9PbTZ4IevPuzz5i+6zoYMzRx6Fcg0XERczzF2sUyQQCPtIk +pnnpHs6i58FZFZ8d4kuaPp92CC1r2LpXFNqD6v6MVenQTqnMdzGxRBF6XLE+0xRF +FRhiJBPSy03OXIPBNvIQtQ6IbbjhVp+J3pZmOUdkLG5NrmJ7v2B0GbhWrJKsFjLt +rWhV/pi60zTe9Mlhww6G9kuEYO4Ne7UyWHmRVSyBQ7N0H3qqJZ4d16GLuc1CLgSk +ZoNNiTW2bKg2SnkheCLQQrzRQDGQob4Ez8pn7fXwgNNgyYMqIgXQBztSvwyeqiv5 +u+YfjyW6hY0XHgL+XVAEV8/+LbzvXMAaq7afJMbfc2hIkCwU9D9SGuTSyxTDYWnP +4vkYxboznxSjBF25cfe1lNj2M8FawTSLfJvdkzrnE6JwYZ+vj+vYxXX4M2bUdGc6 +N3ec592kD3ZDZopD8p/7DEJ4Y9HiD2971KE9dJeFt0g5QdYg/NA6s/rob8SKunE3 +vouXsXgxT7PntgMTzlSdriVZzH81Xwj3QEUxeCp6 +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign Root E46 O=GlobalSign nv-sa +# Subject: CN=GlobalSign Root E46 O=GlobalSign nv-sa +# Label: "GlobalSign Root E46" +# Serial: 1552617690338932563915843282459653771421763 +# MD5 Fingerprint: b5:b8:66:ed:de:08:83:e3:c9:e2:01:34:06:ac:51:6f +# SHA1 Fingerprint: 39:b4:6c:d5:fe:80:06:eb:e2:2f:4a:bb:08:33:a0:af:db:b9:dd:84 +# SHA256 Fingerprint: cb:b9:c4:4d:84:b8:04:3e:10:50:ea:31:a6:9f:51:49:55:d7:bf:d2:e2:c6:b4:93:01:01:9a:d6:1d:9f:50:58 +-----BEGIN CERTIFICATE----- +MIICCzCCAZGgAwIBAgISEdK7ujNu1LzmJGjFDYQdmOhDMAoGCCqGSM49BAMDMEYx +CzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQD +ExNHbG9iYWxTaWduIFJvb3QgRTQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAw +MDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2Ex +HDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAScDrHPt+ieUnd1NPqlRqetMhkytAepJ8qUuwzSChDH2omwlwxwEwkBjtjq +R+q+soArzfwoDdusvKSGN+1wCAB16pMLey5SnCNoIwZD7JIvU4Tb+0cUB+hflGdd +yXqBPCCjQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBQxCpCPtsad0kRLgLWi5h+xEk8blTAKBggqhkjOPQQDAwNoADBlAjEA31SQ +7Zvvi5QCkxeCmb6zniz2C5GMn0oUsfZkvLtoURMMA/cVi4RguYv/Uo7njLwcAjA8 ++RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+CAezNIm8BZ/3Hobui3A= +-----END CERTIFICATE----- + +# Issuer: CN=GLOBALTRUST 2020 O=e-commerce monitoring GmbH +# Subject: CN=GLOBALTRUST 2020 O=e-commerce monitoring GmbH +# Label: "GLOBALTRUST 2020" +# Serial: 109160994242082918454945253 +# MD5 Fingerprint: 8a:c7:6f:cb:6d:e3:cc:a2:f1:7c:83:fa:0e:78:d7:e8 +# SHA1 Fingerprint: d0:67:c1:13:51:01:0c:aa:d0:c7:6a:65:37:31:16:26:4f:53:71:a2 +# SHA256 Fingerprint: 9a:29:6a:51:82:d1:d4:51:a2:e3:7f:43:9b:74:da:af:a2:67:52:33:29:f9:0f:9a:0d:20:07:c3:34:e2:3c:9a +-----BEGIN CERTIFICATE----- +MIIFgjCCA2qgAwIBAgILWku9WvtPilv6ZeUwDQYJKoZIhvcNAQELBQAwTTELMAkG +A1UEBhMCQVQxIzAhBgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkw +FwYDVQQDExBHTE9CQUxUUlVTVCAyMDIwMB4XDTIwMDIxMDAwMDAwMFoXDTQwMDYx +MDAwMDAwMFowTTELMAkGA1UEBhMCQVQxIzAhBgNVBAoTGmUtY29tbWVyY2UgbW9u +aXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVTVCAyMDIwMIICIjANBgkq +hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAri5WrRsc7/aVj6B3GyvTY4+ETUWiD59b +RatZe1E0+eyLinjF3WuvvcTfk0Uev5E4C64OFudBc/jbu9G4UeDLgztzOG53ig9Z +YybNpyrOVPu44sB8R85gfD+yc/LAGbaKkoc1DZAoouQVBGM+uq/ufF7MpotQsjj3 +QWPKzv9pj2gOlTblzLmMCcpL3TGQlsjMH/1WljTbjhzqLL6FLmPdqqmV0/0plRPw +yJiT2S0WR5ARg6I6IqIoV6Lr/sCMKKCmfecqQjuCgGOlYx8ZzHyyZqjC0203b+J+ +BlHZRYQfEs4kUmSFC0iAToexIiIwquuuvuAC4EDosEKAA1GqtH6qRNdDYfOiaxaJ +SaSjpCuKAsR49GiKweR6NrFvG5Ybd0mN1MkGco/PU+PcF4UgStyYJ9ORJitHHmkH +r96i5OTUawuzXnzUJIBHKWk7buis/UDr2O1xcSvy6Fgd60GXIsUf1DnQJ4+H4xj0 +4KlGDfV0OoIu0G4skaMxXDtG6nsEEFZegB31pWXogvziB4xiRfUg3kZwhqG8k9Me +dKZssCz3AwyIDMvUclOGvGBG85hqwvG/Q/lwIHfKN0F5VVJjjVsSn8VoxIidrPIw +q7ejMZdnrY8XD2zHc+0klGvIg5rQmjdJBKuxFshsSUktq6HQjJLyQUp5ISXbY9e2 +nKd+Qmn7OmMCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFNwuH9FhN3nkq9XVsxJxaD1qaJwiMB8GA1UdIwQYMBaAFNwu +H9FhN3nkq9XVsxJxaD1qaJwiMA0GCSqGSIb3DQEBCwUAA4ICAQCR8EICaEDuw2jA +VC/f7GLDw56KoDEoqoOOpFaWEhCGVrqXctJUMHytGdUdaG/7FELYjQ7ztdGl4wJC +XtzoRlgHNQIw4Lx0SsFDKv/bGtCwr2zD/cuz9X9tAy5ZVp0tLTWMstZDFyySCstd +6IwPS3BD0IL/qMy/pJTAvoe9iuOTe8aPmxadJ2W8esVCgmxcB9CpwYhgROmYhRZf ++I/KARDOJcP5YBugxZfD0yyIMaK9MOzQ0MAS8cE54+X1+NZK3TTN+2/BT+MAi1bi +kvcoskJ3ciNnxz8RFbLEAwW+uxF7Cr+obuf/WEPPm2eggAe2HcqtbepBEX4tdJP7 +wry+UUTF72glJ4DjyKDUEuzZpTcdN3y0kcra1LGWge9oXHYQSa9+pTeAsRxSvTOB +TI/53WXZFM2KJVj04sWDpQmQ1GwUY7VA3+vA/MRYfg0UFodUJ25W5HCEuGwyEn6C +MUO+1918oa2u1qsgEu8KwxCMSZY13At1XrFP1U80DhEgB3VDRemjEdqso5nCtnkn +4rnvyOL2NSl6dPrFf4IFYqYK6miyeUcGbvJXqBUzxvd4Sj1Ce2t+/vdG6tHrju+I +aFvowdlxfv1k7/9nR4hYJS8+hge9+6jlgqispdNpQ80xiEmEU5LAsTkbOYMBMMTy +qfrQA71yN2BWHzZ8vTmR9W0Nv3vXkg== +-----END CERTIFICATE----- + +# Issuer: CN=ANF Secure Server Root CA O=ANF Autoridad de Certificacion OU=ANF CA Raiz +# Subject: CN=ANF Secure Server Root CA O=ANF Autoridad de Certificacion OU=ANF CA Raiz +# Label: "ANF Secure Server Root CA" +# Serial: 996390341000653745 +# MD5 Fingerprint: 26:a6:44:5a:d9:af:4e:2f:b2:1d:b6:65:b0:4e:e8:96 +# SHA1 Fingerprint: 5b:6e:68:d0:cc:15:b6:a0:5f:1e:c1:5f:ae:02:fc:6b:2f:5d:6f:74 +# SHA256 Fingerprint: fb:8f:ec:75:91:69:b9:10:6b:1e:51:16:44:c6:18:c5:13:04:37:3f:6c:06:43:08:8d:8b:ef:fd:1b:99:75:99 +-----BEGIN CERTIFICATE----- +MIIF7zCCA9egAwIBAgIIDdPjvGz5a7EwDQYJKoZIhvcNAQELBQAwgYQxEjAQBgNV +BAUTCUc2MzI4NzUxMDELMAkGA1UEBhMCRVMxJzAlBgNVBAoTHkFORiBBdXRvcmlk +YWQgZGUgQ2VydGlmaWNhY2lvbjEUMBIGA1UECxMLQU5GIENBIFJhaXoxIjAgBgNV +BAMTGUFORiBTZWN1cmUgU2VydmVyIFJvb3QgQ0EwHhcNMTkwOTA0MTAwMDM4WhcN +MzkwODMwMTAwMDM4WjCBhDESMBAGA1UEBRMJRzYzMjg3NTEwMQswCQYDVQQGEwJF +UzEnMCUGA1UEChMeQU5GIEF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uMRQwEgYD +VQQLEwtBTkYgQ0EgUmFpejEiMCAGA1UEAxMZQU5GIFNlY3VyZSBTZXJ2ZXIgUm9v +dCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANvrayvmZFSVgpCj +cqQZAZ2cC4Ffc0m6p6zzBE57lgvsEeBbphzOG9INgxwruJ4dfkUyYA8H6XdYfp9q +yGFOtibBTI3/TO80sh9l2Ll49a2pcbnvT1gdpd50IJeh7WhM3pIXS7yr/2WanvtH +2Vdy8wmhrnZEE26cLUQ5vPnHO6RYPUG9tMJJo8gN0pcvB2VSAKduyK9o7PQUlrZX +H1bDOZ8rbeTzPvY1ZNoMHKGESy9LS+IsJJ1tk0DrtSOOMspvRdOoiXsezx76W0OL +zc2oD2rKDF65nkeP8Nm2CgtYZRczuSPkdxl9y0oukntPLxB3sY0vaJxizOBQ+OyR +p1RMVwnVdmPF6GUe7m1qzwmd+nxPrWAI/VaZDxUse6mAq4xhj0oHdkLePfTdsiQz +W7i1o0TJrH93PB0j7IKppuLIBkwC/qxcmZkLLxCKpvR/1Yd0DVlJRfbwcVw5Kda/ +SiOL9V8BY9KHcyi1Swr1+KuCLH5zJTIdC2MKF4EA/7Z2Xue0sUDKIbvVgFHlSFJn +LNJhiQcND85Cd8BEc5xEUKDbEAotlRyBr+Qc5RQe8TZBAQIvfXOn3kLMTOmJDVb3 +n5HUA8ZsyY/b2BzgQJhdZpmYgG4t/wHFzstGH6wCxkPmrqKEPMVOHj1tyRRM4y5B +u8o5vzY8KhmqQYdOpc5LMnndkEl/AgMBAAGjYzBhMB8GA1UdIwQYMBaAFJxf0Gxj +o1+TypOYCK2Mh6UsXME3MB0GA1UdDgQWBBScX9BsY6Nfk8qTmAitjIelLFzBNzAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC +AgEATh65isagmD9uw2nAalxJUqzLK114OMHVVISfk/CHGT0sZonrDUL8zPB1hT+L +9IBdeeUXZ701guLyPI59WzbLWoAAKfLOKyzxj6ptBZNscsdW699QIyjlRRA96Gej +rw5VD5AJYu9LWaL2U/HANeQvwSS9eS9OICI7/RogsKQOLHDtdD+4E5UGUcjohybK +pFtqFiGS3XNgnhAY3jyB6ugYw3yJ8otQPr0R4hUDqDZ9MwFsSBXXiJCZBMXM5gf0 +vPSQ7RPi6ovDj6MzD8EpTBNO2hVWcXNyglD2mjN8orGoGjR0ZVzO0eurU+AagNjq +OknkJjCb5RyKqKkVMoaZkgoQI1YS4PbOTOK7vtuNknMBZi9iPrJyJ0U27U1W45eZ +/zo1PqVUSlJZS2Db7v54EX9K3BR5YLZrZAPbFYPhor72I5dQ8AkzNqdxliXzuUJ9 +2zg/LFis6ELhDtjTO0wugumDLmsx2d1Hhk9tl5EuT+IocTUW0fJz/iUrB0ckYyfI ++PbZa/wSMVYIwFNCr5zQM378BvAxRAMU8Vjq8moNqRGyg77FGr8H6lnco4g175x2 +MjxNBiLOFeXdntiP2t7SxDnlF4HPOEfrf4htWRvfn0IUrn7PqLBmZdo3r5+qPeoo +tt7VMVgWglvquxl1AnMaykgaIZOQCo6ThKd9OyMYkomgjaw= +-----END CERTIFICATE----- + +# Issuer: CN=Certum EC-384 CA O=Asseco Data Systems S.A. OU=Certum Certification Authority +# Subject: CN=Certum EC-384 CA O=Asseco Data Systems S.A. OU=Certum Certification Authority +# Label: "Certum EC-384 CA" +# Serial: 160250656287871593594747141429395092468 +# MD5 Fingerprint: b6:65:b3:96:60:97:12:a1:ec:4e:e1:3d:a3:c6:c9:f1 +# SHA1 Fingerprint: f3:3e:78:3c:ac:df:f4:a2:cc:ac:67:55:69:56:d7:e5:16:3c:e1:ed +# SHA256 Fingerprint: 6b:32:80:85:62:53:18:aa:50:d1:73:c9:8d:8b:da:09:d5:7e:27:41:3d:11:4c:f7:87:a0:f5:d0:6c:03:0c:f6 +-----BEGIN CERTIFICATE----- +MIICZTCCAeugAwIBAgIQeI8nXIESUiClBNAt3bpz9DAKBggqhkjOPQQDAzB0MQsw +CQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScw +JQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGTAXBgNVBAMT +EENlcnR1bSBFQy0zODQgQ0EwHhcNMTgwMzI2MDcyNDU0WhcNNDMwMzI2MDcyNDU0 +WjB0MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBT +LkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGTAX +BgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATE +KI6rGFtqvm5kN2PkzeyrOvfMobgOgknXhimfoZTy42B4mIF4Bk3y7JoOV2CDn7Tm +Fy8as10CW4kjPMIRBSqniBMY81CE1700LCeJVf/OTOffph8oxPBUw7l8t1Ot68Kj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI0GZnQkdjrzife81r1HfS+8 +EF9LMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNoADBlAjADVS2m5hjEfO/J +UG7BJw+ch69u1RsIGL2SKcHvlJF40jocVYli5RsJHrpka/F2tNQCMQC0QoSZ/6vn +nvuRlydd3LBbMHHOXjgaatkl5+r3YZJW+OraNsKHZZYuciUvf9/DE8k= +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Root CA O=Asseco Data Systems S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Root CA O=Asseco Data Systems S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Root CA" +# Serial: 40870380103424195783807378461123655149 +# MD5 Fingerprint: 51:e1:c2:e7:fe:4c:84:af:59:0e:2f:f4:54:6f:ea:29 +# SHA1 Fingerprint: c8:83:44:c0:18:ae:9f:cc:f1:87:b7:8f:22:d1:c5:d7:45:84:ba:e5 +# SHA256 Fingerprint: fe:76:96:57:38:55:77:3e:37:a9:5e:7a:d4:d9:cc:96:c3:01:57:c1:5d:31:76:5b:a9:b1:57:04:e1:ae:78:fd +-----BEGIN CERTIFICATE----- +MIIFwDCCA6igAwIBAgIQHr9ZULjJgDdMBvfrVU+17TANBgkqhkiG9w0BAQ0FADB6 +MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEu +MScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHzAdBgNV +BAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0EwHhcNMTgwMzE2MTIxMDEzWhcNNDMw +MzE2MTIxMDEzWjB6MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEg +U3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkxHzAdBgNVBAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0EwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQDRLY67tzbqbTeRn06TpwXkKQMlzhyC93yZ +n0EGze2jusDbCSzBfN8pfktlL5On1AFrAygYo9idBcEq2EXxkd7fO9CAAozPOA/q +p1x4EaTByIVcJdPTsuclzxFUl6s1wB52HO8AU5853BSlLCIls3Jy/I2z5T4IHhQq +NwuIPMqw9MjCoa68wb4pZ1Xi/K1ZXP69VyywkI3C7Te2fJmItdUDmj0VDT06qKhF +8JVOJVkdzZhpu9PMMsmN74H+rX2Ju7pgE8pllWeg8xn2A1bUatMn4qGtg/BKEiJ3 +HAVz4hlxQsDsdUaakFjgao4rpUYwBI4Zshfjvqm6f1bxJAPXsiEodg42MEx51UGa +mqi4NboMOvJEGyCI98Ul1z3G4z5D3Yf+xOr1Uz5MZf87Sst4WmsXXw3Hw09Omiqi +7VdNIuJGmj8PkTQkfVXjjJU30xrwCSss0smNtA0Aq2cpKNgB9RkEth2+dv5yXMSF +ytKAQd8FqKPVhJBPC/PgP5sZ0jeJP/J7UhyM9uH3PAeXjA6iWYEMspA90+NZRu0P +qafegGtaqge2Gcu8V/OXIXoMsSt0Puvap2ctTMSYnjYJdmZm/Bo/6khUHL4wvYBQ +v3y1zgD2DGHZ5yQD4OMBgQ692IU0iL2yNqh7XAjlRICMb/gv1SHKHRzQ+8S1h9E6 +Tsd2tTVItQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSM+xx1 +vALTn04uSNn5YFSqxLNP+jAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQENBQAD +ggIBAEii1QALLtA/vBzVtVRJHlpr9OTy4EA34MwUe7nJ+jW1dReTagVphZzNTxl4 +WxmB82M+w85bj/UvXgF2Ez8sALnNllI5SW0ETsXpD4YN4fqzX4IS8TrOZgYkNCvo +zMrnadyHncI013nR03e4qllY/p0m+jiGPp2Kh2RX5Rc64vmNueMzeMGQ2Ljdt4NR +5MTMI9UGfOZR0800McD2RrsLrfw9EAUqO0qRJe6M1ISHgCq8CYyqOhNf6DR5UMEQ +GfnTKB7U0VEwKbOukGfWHwpjscWpxkIxYxeU72nLL/qMFH3EQxiJ2fAyQOaA4kZf +5ePBAFmo+eggvIksDkc0C+pXwlM2/KfUrzHN/gLldfq5Jwn58/U7yn2fqSLLiMmq +0Uc9NneoWWRrJ8/vJ8HjJLWG965+Mk2weWjROeiQWMODvA8s1pfrzgzhIMfatz7D +P78v3DSk+yshzWePS/Tj6tQ/50+6uaWTRRxmHyH6ZF5v4HaUMst19W7l9o/HuKTM +qJZ9ZPskWkoDbGs4xugDQ5r3V7mzKWmTOPQD8rv7gmsHINFSH5pkAnuYZttcTVoP +0ISVoDwUQwbKytu4QTbaakRnh6+v40URFWkIsr4WOZckbxJF0WddCajJFdr60qZf +E2Efv4WstK2tBZQIgx51F9NxO5NQI1mg7TyRVJ12AMXDuDjb +-----END CERTIFICATE----- + +# Issuer: CN=TunTrust Root CA O=Agence Nationale de Certification Electronique +# Subject: CN=TunTrust Root CA O=Agence Nationale de Certification Electronique +# Label: "TunTrust Root CA" +# Serial: 108534058042236574382096126452369648152337120275 +# MD5 Fingerprint: 85:13:b9:90:5b:36:5c:b6:5e:b8:5a:f8:e0:31:57:b4 +# SHA1 Fingerprint: cf:e9:70:84:0f:e0:73:0f:9d:f6:0c:7f:2c:4b:ee:20:46:34:9c:bb +# SHA256 Fingerprint: 2e:44:10:2a:b5:8c:b8:54:19:45:1c:8e:19:d9:ac:f3:66:2c:af:bc:61:4b:6a:53:96:0a:30:f7:d0:e2:eb:41 +-----BEGIN CERTIFICATE----- +MIIFszCCA5ugAwIBAgIUEwLV4kBMkkaGFmddtLu7sms+/BMwDQYJKoZIhvcNAQEL +BQAwYTELMAkGA1UEBhMCVE4xNzA1BgNVBAoMLkFnZW5jZSBOYXRpb25hbGUgZGUg +Q2VydGlmaWNhdGlvbiBFbGVjdHJvbmlxdWUxGTAXBgNVBAMMEFR1blRydXN0IFJv +b3QgQ0EwHhcNMTkwNDI2MDg1NzU2WhcNNDQwNDI2MDg1NzU2WjBhMQswCQYDVQQG +EwJUTjE3MDUGA1UECgwuQWdlbmNlIE5hdGlvbmFsZSBkZSBDZXJ0aWZpY2F0aW9u +IEVsZWN0cm9uaXF1ZTEZMBcGA1UEAwwQVHVuVHJ1c3QgUm9vdCBDQTCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMPN0/y9BFPdDCA61YguBUtB9YOCfvdZ +n56eY+hz2vYGqU8ftPkLHzmMmiDQfgbU7DTZhrx1W4eI8NLZ1KMKsmwb60ksPqxd +2JQDoOw05TDENX37Jk0bbjBU2PWARZw5rZzJJQRNmpA+TkBuimvNKWfGzC3gdOgF +VwpIUPp6Q9p+7FuaDmJ2/uqdHYVy7BG7NegfJ7/Boce7SBbdVtfMTqDhuazb1YMZ +GoXRlJfXyqNlC/M4+QKu3fZnz8k/9YosRxqZbwUN/dAdgjH8KcwAWJeRTIAAHDOF +li/LQcKLEITDCSSJH7UP2dl3RxiSlGBcx5kDPP73lad9UKGAwqmDrViWVSHbhlnU +r8a83YFuB9tgYv7sEG7aaAH0gxupPqJbI9dkxt/con3YS7qC0lH4Zr8GRuR5KiY2 +eY8fTpkdso8MDhz/yV3A/ZAQprE38806JG60hZC/gLkMjNWb1sjxVj8agIl6qeIb +MlEsPvLfe/ZdeikZjuXIvTZxi11Mwh0/rViizz1wTaZQmCXcI/m4WEEIcb9PuISg +jwBUFfyRbVinljvrS5YnzWuioYasDXxU5mZMZl+QviGaAkYt5IPCgLnPSz7ofzwB +7I9ezX/SKEIBlYrilz0QIX32nRzFNKHsLA4KUiwSVXAkPcvCFDVDXSdOvsC9qnyW +5/yeYa1E0wCXAgMBAAGjYzBhMB0GA1UdDgQWBBQGmpsfU33x9aTI04Y+oXNZtPdE +ITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFAaamx9TffH1pMjThj6hc1m0 +90QhMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAqgVutt0Vyb+z +xiD2BkewhpMl0425yAA/l/VSJ4hxyXT968pk21vvHl26v9Hr7lxpuhbI87mP0zYu +QEkHDVneixCwSQXi/5E/S7fdAo74gShczNxtr18UnH1YeA32gAm56Q6XKRm4t+v4 +FstVEuTGfbvE7Pi1HE4+Z7/FXxttbUcoqgRYYdZ2vyJ/0Adqp2RT8JeNnYA/u8EH +22Wv5psymsNUk8QcCMNE+3tjEUPRahphanltkE8pjkcFwRJpadbGNjHh/PqAulxP +xOu3Mqz4dWEX1xAZufHSCe96Qp1bWgvUxpVOKs7/B9dPfhgGiPEZtdmYu65xxBzn +dFlY7wyJz4sfdZMaBBSSSFCp61cpABbjNhzI+L/wM9VBD8TMPN3pM0MBkRArHtG5 +Xc0yGYuPjCB31yLEQtyEFpslbei0VXF/sHyz03FJuc9SpAQ/3D2gu68zngowYI7b +nV2UqL1g52KAdoGDDIzMMEZJ4gzSqK/rYXHv5yJiqfdcZGyfFoxnNidF9Ql7v/YQ +CvGwjVRDjAS6oz/v4jXH+XTgbzRB0L9zZVcg+ZtnemZoJE6AZb0QmQZZ8mWvuMZH +u/2QeItBcy6vVR/cO5JyboTT0GFMDcx2V+IthSIVNg3rAZ3r2OvEhJn7wAzMMujj +d9qDRIueVSjAi1jTkD5OGwDxFa2DK5o= +-----END CERTIFICATE----- + +# Issuer: CN=HARICA TLS RSA Root CA 2021 O=Hellenic Academic and Research Institutions CA +# Subject: CN=HARICA TLS RSA Root CA 2021 O=Hellenic Academic and Research Institutions CA +# Label: "HARICA TLS RSA Root CA 2021" +# Serial: 76817823531813593706434026085292783742 +# MD5 Fingerprint: 65:47:9b:58:86:dd:2c:f0:fc:a2:84:1f:1e:96:c4:91 +# SHA1 Fingerprint: 02:2d:05:82:fa:88:ce:14:0c:06:79:de:7f:14:10:e9:45:d7:a5:6d +# SHA256 Fingerprint: d9:5d:0e:8e:da:79:52:5b:f9:be:b1:1b:14:d2:10:0d:32:94:98:5f:0c:62:d9:fa:bd:9c:d9:99:ec:cb:7b:1d +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIQOcqTHO9D88aOk8f0ZIk4fjANBgkqhkiG9w0BAQsFADBs +MQswCQYDVQQGEwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBSU0Eg +Um9vdCBDQSAyMDIxMB4XDTIxMDIxOTEwNTUzOFoXDTQ1MDIxMzEwNTUzN1owbDEL +MAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl +YXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgUlNBIFJv +b3QgQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIvC569l +mwVnlskNJLnQDmT8zuIkGCyEf3dRywQRNrhe7Wlxp57kJQmXZ8FHws+RFjZiPTgE +4VGC/6zStGndLuwRo0Xua2s7TL+MjaQenRG56Tj5eg4MmOIjHdFOY9TnuEFE+2uv +a9of08WRiFukiZLRgeaMOVig1mlDqa2YUlhu2wr7a89o+uOkXjpFc5gH6l8Cct4M +pbOfrqkdtx2z/IpZ525yZa31MJQjB/OCFks1mJxTuy/K5FrZx40d/JiZ+yykgmvw +Kh+OC19xXFyuQnspiYHLA6OZyoieC0AJQTPb5lh6/a6ZcMBaD9YThnEvdmn8kN3b +LW7R8pv1GmuebxWMevBLKKAiOIAkbDakO/IwkfN4E8/BPzWr8R0RI7VDIp4BkrcY +AuUR0YLbFQDMYTfBKnya4dC6s1BG7oKsnTH4+yPiAwBIcKMJJnkVU2DzOFytOOqB +AGMUuTNe3QvboEUHGjMJ+E20pwKmafTCWQWIZYVWrkvL4N48fS0ayOn7H6NhStYq +E613TBoYm5EPWNgGVMWX+Ko/IIqmhaZ39qb8HOLubpQzKoNQhArlT4b4UEV4AIHr +W2jjJo3Me1xR9BQsQL4aYB16cmEdH2MtiKrOokWQCPxrvrNQKlr9qEgYRtaQQJKQ +CoReaDH46+0N0x3GfZkYVVYnZS6NRcUk7M7jAgMBAAGjQjBAMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFApII6ZgpJIKM+qTW8VX6iVNvRLuMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAPpBIqm5iFSVmewzVjIuJndftTgfvnNAU +X15QvWiWkKQUEapobQk1OUAJ2vQJLDSle1mESSmXdMgHHkdt8s4cUCbjnj1AUz/3 +f5Z2EMVGpdAgS1D0NTsY9FVqQRtHBmg8uwkIYtlfVUKqrFOFrJVWNlar5AWMxaja +H6NpvVMPxP/cyuN+8kyIhkdGGvMA9YCRotxDQpSbIPDRzbLrLFPCU3hKTwSUQZqP +JzLB5UkZv/HywouoCjkxKLR9YjYsTewfM7Z+d21+UPCfDtcRj88YxeMn/ibvBZ3P +zzfF0HvaO7AWhAw6k9a+F9sPPg4ZeAnHqQJyIkv3N3a6dcSFA1pj1bF1BcK5vZSt +jBWZp5N99sXzqnTPBIWUmAD04vnKJGW/4GKvyMX6ssmeVkjaef2WdhW+o45WxLM0 +/L5H9MG0qPzVMIho7suuyWPEdr6sOBjhXlzPrjoiUevRi7PzKzMHVIf6tLITe7pT +BGIBnfHAT+7hOtSLIBD6Alfm78ELt5BGnBkpjNxvoEppaZS3JGWg/6w/zgH7IS79 +aPib8qXPMThcFarmlwDB31qlpzmq6YR/PFGoOtmUW4y/Twhx5duoXNTSpv4Ao8YW +xw/ogM4cKGR0GQjTQuPOAF1/sdwTsOEFy9EgqoZ0njnnkf3/W9b3raYvAwtt41dU +63ZTGI0RmLo= +-----END CERTIFICATE----- + +# Issuer: CN=HARICA TLS ECC Root CA 2021 O=Hellenic Academic and Research Institutions CA +# Subject: CN=HARICA TLS ECC Root CA 2021 O=Hellenic Academic and Research Institutions CA +# Label: "HARICA TLS ECC Root CA 2021" +# Serial: 137515985548005187474074462014555733966 +# MD5 Fingerprint: ae:f7:4c:e5:66:35:d1:b7:9b:8c:22:93:74:d3:4b:b0 +# SHA1 Fingerprint: bc:b0:c1:9d:e9:98:92:70:19:38:57:e9:8d:a7:b4:5d:6e:ee:01:48 +# SHA256 Fingerprint: 3f:99:cc:47:4a:cf:ce:4d:fe:d5:87:94:66:5e:47:8d:15:47:73:9f:2e:78:0f:1b:b4:ca:9b:13:30:97:d4:01 +-----BEGIN CERTIFICATE----- +MIICVDCCAdugAwIBAgIQZ3SdjXfYO2rbIvT/WeK/zjAKBggqhkjOPQQDAzBsMQsw +CQYDVQQGEwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2Vh +cmNoIEluc3RpdHV0aW9ucyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBFQ0MgUm9v +dCBDQSAyMDIxMB4XDTIxMDIxOTExMDExMFoXDTQ1MDIxMzExMDEwOVowbDELMAkG +A1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj +aCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgRUNDIFJvb3Qg +Q0EgMjAyMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDgI/rGgltJ6rK9JOtDA4MM7 +KKrxcm1lAEeIhPyaJmuqS7psBAqIXhfyVYf8MLA04jRYVxqEU+kw2anylnTDUR9Y +STHMmE5gEYd103KUkE+bECUqqHgtvpBBWJAVcqeht6NCMEAwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUyRtTgRL+BNUW0aq8mm+3oJUZbsowDgYDVR0PAQH/BAQD +AgGGMAoGCCqGSM49BAMDA2cAMGQCMBHervjcToiwqfAircJRQO9gcS3ujwLEXQNw +SaSS6sUUiHCm0w2wqsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/QwCZ61IygN +nxS2PFOiTAZpffpskcYqSUXm7LcT4Tps +-----END CERTIFICATE----- + +# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068" +# Serial: 1977337328857672817 +# MD5 Fingerprint: 4e:6e:9b:54:4c:ca:b7:fa:48:e4:90:b1:15:4b:1c:a3 +# SHA1 Fingerprint: 0b:be:c2:27:22:49:cb:39:aa:db:35:5c:53:e3:8c:ae:78:ff:b6:fe +# SHA256 Fingerprint: 57:de:05:83:ef:d2:b2:6e:03:61:da:99:da:9d:f4:64:8d:ef:7e:e8:44:1c:3b:72:8a:fa:9b:cd:e0:f9:b2:6a +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIG3Dp0v+ubHEwDQYJKoZIhvcNAQELBQAwUTELMAkGA1UE +BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h +cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0xNDA5MjMxNTIyMDdaFw0zNjA1 +MDUxNTIyMDdaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg +Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 +thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM +cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG +L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i +NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h +X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b +m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy +Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja +EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T +KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF +6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh +OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMB0GA1UdDgQWBBRlzeurNR4APn7VdMAc +tHNHDhpkLzASBgNVHRMBAf8ECDAGAQH/AgEBMIGmBgNVHSAEgZ4wgZswgZgGBFUd +IAAwgY8wLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuZmlybWFwcm9mZXNpb25hbC5j +b20vY3BzMFwGCCsGAQUFBwICMFAeTgBQAGEAcwBlAG8AIABkAGUAIABsAGEAIABC +AG8AbgBhAG4AbwB2AGEAIAA0ADcAIABCAGEAcgBjAGUAbABvAG4AYQAgADAAOAAw +ADEANzAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggIBAHSHKAIrdx9m +iWTtj3QuRhy7qPj4Cx2Dtjqn6EWKB7fgPiDL4QjbEwj4KKE1soCzC1HA01aajTNF +Sa9J8OA9B3pFE1r/yJfY0xgsfZb43aJlQ3CTkBW6kN/oGbDbLIpgD7dvlAceHabJ +hfa9NPhAeGIQcDq+fUs5gakQ1JZBu/hfHAsdCPKxsIl68veg4MSPi3i1O1ilI45P +Vf42O+AMt8oqMEEgtIDNrvx2ZnOorm7hfNoD6JQg5iKj0B+QXSBTFCZX2lSX3xZE +EAEeiGaPcjiT3SC3NL7X8e5jjkd5KAb881lFJWAiMxujX6i6KtoaPc1A6ozuBRWV +1aUsIC+nmCjuRfzxuIgALI9C2lHVnOUTaHFFQ4ueCyE8S1wF3BqfmI7avSKecs2t +CsvMo2ebKHTEm9caPARYpoKdrcd7b/+Alun4jWq9GJAd/0kakFI3ky88Al2CdgtR +5xbHV/g4+afNmyJU72OwFW1TZQNKXkqgsqeOSQBZONXH9IBk9W6VULgRfhVwOEqw +f9DEMnDAGf/JOC0ULGb0QkTmVXYbgBVX/8Cnp6o5qtjTcNAuuuuUavpfNIbnYrX9 +ivAwhZTJryQCL2/W3Wf+47BVTwSYT6RBVuKT0Gro1vP7ZeDOdcQxWQzugsgMYDNK +GbqEZycPvEJdvSRUDewdcAZfpLz6IHxV +-----END CERTIFICATE----- + +# Issuer: CN=vTrus ECC Root CA O=iTrusChina Co.,Ltd. +# Subject: CN=vTrus ECC Root CA O=iTrusChina Co.,Ltd. +# Label: "vTrus ECC Root CA" +# Serial: 630369271402956006249506845124680065938238527194 +# MD5 Fingerprint: de:4b:c1:f5:52:8c:9b:43:e1:3e:8f:55:54:17:8d:85 +# SHA1 Fingerprint: f6:9c:db:b0:fc:f6:02:13:b6:52:32:a6:a3:91:3f:16:70:da:c3:e1 +# SHA256 Fingerprint: 30:fb:ba:2c:32:23:8e:2a:98:54:7a:f9:79:31:e5:50:42:8b:9b:3f:1c:8e:eb:66:33:dc:fa:86:c5:b2:7d:d3 +-----BEGIN CERTIFICATE----- +MIICDzCCAZWgAwIBAgIUbmq8WapTvpg5Z6LSa6Q75m0c1towCgYIKoZIzj0EAwMw +RzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAY +BgNVBAMTEXZUcnVzIEVDQyBSb290IENBMB4XDTE4MDczMTA3MjY0NFoXDTQzMDcz +MTA3MjY0NFowRzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28u +LEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBSb290IENBMHYwEAYHKoZIzj0CAQYF +K4EEACIDYgAEZVBKrox5lkqqHAjDo6LN/llWQXf9JpRCux3NCNtzslt188+cToL0 +v/hhJoVs1oVbcnDS/dtitN9Ti72xRFhiQgnH+n9bEOf+QP3A2MMrMudwpremIFUd +e4BdS49nTPEQo0IwQDAdBgNVHQ4EFgQUmDnNvtiyjPeyq+GtJK97fKHbH88wDwYD +VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwCgYIKoZIzj0EAwMDaAAwZQIw +V53dVvHH4+m4SVBrm2nDb+zDfSXkV5UTQJtS0zvzQBm8JsctBp61ezaf9SXUY2sA +AjEA6dPGnlaaKsyh2j/IZivTWJwghfqrkYpwcBE4YGQLYgmRWAD5Tfs0aNoJrSEG +GJTO +-----END CERTIFICATE----- + +# Issuer: CN=vTrus Root CA O=iTrusChina Co.,Ltd. +# Subject: CN=vTrus Root CA O=iTrusChina Co.,Ltd. +# Label: "vTrus Root CA" +# Serial: 387574501246983434957692974888460947164905180485 +# MD5 Fingerprint: b8:c9:37:df:fa:6b:31:84:64:c5:ea:11:6a:1b:75:fc +# SHA1 Fingerprint: 84:1a:69:fb:f5:cd:1a:25:34:13:3d:e3:f8:fc:b8:99:d0:c9:14:b7 +# SHA256 Fingerprint: 8a:71:de:65:59:33:6f:42:6c:26:e5:38:80:d0:0d:88:a1:8d:a4:c6:a9:1f:0d:cb:61:94:e2:06:c5:c9:63:87 +-----BEGIN CERTIFICATE----- +MIIFVjCCAz6gAwIBAgIUQ+NxE9izWRRdt86M/TX9b7wFjUUwDQYJKoZIhvcNAQEL +BQAwQzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4x +FjAUBgNVBAMTDXZUcnVzIFJvb3QgQ0EwHhcNMTgwNzMxMDcyNDA1WhcNNDMwNzMx +MDcyNDA1WjBDMQswCQYDVQQGEwJDTjEcMBoGA1UEChMTaVRydXNDaGluYSBDby4s +THRkLjEWMBQGA1UEAxMNdlRydXMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAL1VfGHTuB0EYgWgrmy3cLRB6ksDXhA/kFocizuwZotsSKYc +IrrVQJLuM7IjWcmOvFjai57QGfIvWcaMY1q6n6MLsLOaXLoRuBLpDLvPbmyAhykU +AyyNJJrIZIO1aqwTLDPxn9wsYTwaP3BVm60AUn/PBLn+NvqcwBauYv6WTEN+VRS+ +GrPSbcKvdmaVayqwlHeFXgQPYh1jdfdr58tbmnDsPmcF8P4HCIDPKNsFxhQnL4Z9 +8Cfe/+Z+M0jnCx5Y0ScrUw5XSmXX+6KAYPxMvDVTAWqXcoKv8R1w6Jz1717CbMdH +flqUhSZNO7rrTOiwCcJlwp2dCZtOtZcFrPUGoPc2BX70kLJrxLT5ZOrpGgrIDajt +J8nU57O5q4IikCc9Kuh8kO+8T/3iCiSn3mUkpF3qwHYw03dQ+A0Em5Q2AXPKBlim +0zvc+gRGE1WKyURHuFE5Gi7oNOJ5y1lKCn+8pu8fA2dqWSslYpPZUxlmPCdiKYZN +pGvu/9ROutW04o5IWgAZCfEF2c6Rsffr6TlP9m8EQ5pV9T4FFL2/s1m02I4zhKOQ +UqqzApVg+QxMaPnu1RcN+HFXtSXkKe5lXa/R7jwXC1pDxaWG6iSe4gUH3DRCEpHW +OXSuTEGC2/KmSNGzm/MzqvOmwMVO9fSddmPmAsYiS8GVP1BkLFTltvA8Kc9XAgMB +AAGjQjBAMB0GA1UdDgQWBBRUYnBj8XWEQ1iO0RYgscasGrz2iTAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAKbqSSaet +8PFww+SX8J+pJdVrnjT+5hpk9jprUrIQeBqfTNqK2uwcN1LgQkv7bHbKJAs5EhWd +nxEt/Hlk3ODg9d3gV8mlsnZwUKT+twpw1aA08XXXTUm6EdGz2OyC/+sOxL9kLX1j +bhd47F18iMjrjld22VkE+rxSH0Ws8HqA7Oxvdq6R2xCOBNyS36D25q5J08FsEhvM +Kar5CKXiNxTKsbhm7xqC5PD48acWabfbqWE8n/Uxy+QARsIvdLGx14HuqCaVvIiv +TDUHKgLKeBRtRytAVunLKmChZwOgzoy8sHJnxDHO2zTlJQNgJXtxmOTAGytfdELS +S8VZCAeHvsXDf+eW2eHcKJfWjwXj9ZtOyh1QRwVTsMo554WgicEFOwE30z9J4nfr +I8iIZjs9OXYhRvHsXyO466JmdXTBQPfYaJqT4i2pLr0cox7IdMakLXogqzu4sEb9 +b91fUlV1YvCXoHzXOP0l382gmxDPi7g4Xl7FtKYCNqEeXxzP4padKar9mK5S4fNB +UvupLnKWnyfjqnN9+BojZns7q2WwMgFLFT49ok8MKzWixtlnEjUwzXYuFrOZnk1P +Ti07NEPhmg4NpGaXutIcSkwsKouLgU9xGqndXHt7CMUADTdA43x7VF8vhV929ven +sBxXVsFy6K2ir40zSbofitzmdHxghm+Hl3s= +-----END CERTIFICATE----- + +# Issuer: CN=ISRG Root X2 O=Internet Security Research Group +# Subject: CN=ISRG Root X2 O=Internet Security Research Group +# Label: "ISRG Root X2" +# Serial: 87493402998870891108772069816698636114 +# MD5 Fingerprint: d3:9e:c4:1e:23:3c:a6:df:cf:a3:7e:6d:e0:14:e6:e5 +# SHA1 Fingerprint: bd:b1:b9:3c:d5:97:8d:45:c6:26:14:55:f8:db:95:c7:5a:d1:53:af +# SHA256 Fingerprint: 69:72:9b:8e:15:a8:6e:fc:17:7a:57:af:b7:17:1d:fc:64:ad:d2:8c:2f:ca:8c:f1:50:7e:34:45:3c:cb:14:70 +-----BEGIN CERTIFICATE----- +MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQsw +CQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2gg +R3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00 +MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVTMSkwJwYDVQQKEyBJbnRlcm5ldCBT +ZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNSRyBSb290IFgyMHYw +EAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0HttwW ++1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9 +ItgKbppbd9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zAdBgNVHQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZI +zj0EAwMDaAAwZQIwe3lORlCEwkSHRhtFcP9Ymd70/aTSVaYgLXTWNLxBo1BfASdW +tL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5U6VR5CmD1/iQMVtCnwr1 +/q4AaOeMSQ+2b1tbFfLn +-----END CERTIFICATE----- + +# Issuer: CN=HiPKI Root CA - G1 O=Chunghwa Telecom Co., Ltd. +# Subject: CN=HiPKI Root CA - G1 O=Chunghwa Telecom Co., Ltd. +# Label: "HiPKI Root CA - G1" +# Serial: 60966262342023497858655262305426234976 +# MD5 Fingerprint: 69:45:df:16:65:4b:e8:68:9a:8f:76:5f:ff:80:9e:d3 +# SHA1 Fingerprint: 6a:92:e4:a8:ee:1b:ec:96:45:37:e3:29:57:49:cd:96:e3:e5:d2:60 +# SHA256 Fingerprint: f0:15:ce:3c:c2:39:bf:ef:06:4b:e9:f1:d2:c4:17:e1:a0:26:4a:0a:94:be:1f:0c:8d:12:18:64:eb:69:49:cc +-----BEGIN CERTIFICATE----- +MIIFajCCA1KgAwIBAgIQLd2szmKXlKFD6LDNdmpeYDANBgkqhkiG9w0BAQsFADBP +MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 +ZC4xGzAZBgNVBAMMEkhpUEtJIFJvb3QgQ0EgLSBHMTAeFw0xOTAyMjIwOTQ2MDRa +Fw0zNzEyMzExNTU5NTlaME8xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3 +YSBUZWxlY29tIENvLiwgTHRkLjEbMBkGA1UEAwwSSGlQS0kgUm9vdCBDQSAtIEcx +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA9B5/UnMyDHPkvRN0o9Qw +qNCuS9i233VHZvR85zkEHmpwINJaR3JnVfSl6J3VHiGh8Ge6zCFovkRTv4354twv +Vcg3Px+kwJyz5HdcoEb+d/oaoDjq7Zpy3iu9lFc6uux55199QmQ5eiY29yTw1S+6 +lZgRZq2XNdZ1AYDgr/SEYYwNHl98h5ZeQa/rh+r4XfEuiAU+TCK72h8q3VJGZDnz +Qs7ZngyzsHeXZJzA9KMuH5UHsBffMNsAGJZMoYFL3QRtU6M9/Aes1MU3guvklQgZ +KILSQjqj2FPseYlgSGDIcpJQ3AOPgz+yQlda22rpEZfdhSi8MEyr48KxRURHH+CK +FgeW0iEPU8DtqX7UTuybCeyvQqww1r/REEXgphaypcXTT3OUM3ECoWqj1jOXTyFj +HluP2cFeRXF3D4FdXyGarYPM+l7WjSNfGz1BryB1ZlpK9p/7qxj3ccC2HTHsOyDr +y+K49a6SsvfhhEvyovKTmiKe0xRvNlS9H15ZFblzqMF8b3ti6RZsR1pl8w4Rm0bZ +/W3c1pzAtH2lsN0/Vm+h+fbkEkj9Bn8SV7apI09bA8PgcSojt/ewsTu8mL3WmKgM +a/aOEmem8rJY5AIJEzypuxC00jBF8ez3ABHfZfjcK0NVvxaXxA/VLGGEqnKG/uY6 +fsI/fe78LxQ+5oXdUG+3Se0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQU8ncX+l6o/vY9cdVouslGDDjYr7AwDgYDVR0PAQH/BAQDAgGGMA0GCSqG +SIb3DQEBCwUAA4ICAQBQUfB13HAE4/+qddRxosuej6ip0691x1TPOhwEmSKsxBHi +7zNKpiMdDg1H2DfHb680f0+BazVP6XKlMeJ45/dOlBhbQH3PayFUhuaVevvGyuqc +SE5XCV0vrPSltJczWNWseanMX/mF+lLFjfiRFOs6DRfQUsJ748JzjkZ4Bjgs6Fza +ZsT0pPBWGTMpWmWSBUdGSquEwx4noR8RkpkndZMPvDY7l1ePJlsMu5wP1G4wB9Tc +XzZoZjmDlicmisjEOf6aIW/Vcobpf2Lll07QJNBAsNB1CI69aO4I1258EHBGG3zg +iLKecoaZAeO/n0kZtCW+VmWuF2PlHt/o/0elv+EmBYTksMCv5wiZqAxeJoBF1Pho +L5aPruJKHJwWDBNvOIf2u8g0X5IDUXlwpt/L9ZlNec1OvFefQ05rLisY+GpzjLrF +Ne85akEez3GoorKGB1s6yeHvP2UEgEcyRHCVTjFnanRbEEV16rCf0OY1/k6fi8wr +kkVbbiVghUbN0aqwdmaTd5a+g744tiROJgvM7XpWGuDpWsZkrUx6AEhEL7lAuxM+ +vhV4nYWBSipX3tUZQ9rbyltHhoMLP7YNdnhzeSJesYAfz77RP1YQmCuVh6EfnWQU +YDksswBVLuT1sw5XxJFBAJw/6KXf6vb/yPCtbVKoF6ubYfwSUTXkJf2vqmqGOQ== +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +# Label: "GlobalSign ECC Root CA - R4" +# Serial: 159662223612894884239637590694 +# MD5 Fingerprint: 26:29:f8:6d:e1:88:bf:a2:65:7f:aa:c4:cd:0f:7f:fc +# SHA1 Fingerprint: 6b:a0:b0:98:e1:71:ef:5a:ad:fe:48:15:80:77:10:f4:bd:6f:0b:28 +# SHA256 Fingerprint: b0:85:d7:0b:96:4f:19:1a:73:e4:af:0d:54:ae:7a:0e:07:aa:fd:af:9b:71:dd:08:62:13:8a:b7:32:5a:24:a2 +-----BEGIN CERTIFICATE----- +MIIB3DCCAYOgAwIBAgINAgPlfvU/k/2lCSGypjAKBggqhkjOPQQDAjBQMSQwIgYD +VQQLExtHbG9iYWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2Jh +bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTIxMTEzMDAwMDAwWhcNMzgw +MTE5MDMxNDA3WjBQMSQwIgYDVQQLExtHbG9iYWxTaWduIEVDQyBSb290IENBIC0g +UjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wWTAT +BgcqhkjOPQIBBggqhkjOPQMBBwNCAAS4xnnTj2wlDp8uORkcA6SumuU5BwkWymOx +uYb4ilfBV85C+nOh92VC/x7BALJucw7/xyHlGKSq2XE/qNS5zowdo0IwQDAOBgNV +HQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVLB7rUW44kB/ ++wpu+74zyTyjhNUwCgYIKoZIzj0EAwIDRwAwRAIgIk90crlgr/HmnKAWBVBfw147 +bmF0774BxL4YSFlhgjICICadVGNA3jdgUM/I2O2dgq43mLyjj0xMqTQrbO/7lZsm +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R1 O=Google Trust Services LLC +# Subject: CN=GTS Root R1 O=Google Trust Services LLC +# Label: "GTS Root R1" +# Serial: 159662320309726417404178440727 +# MD5 Fingerprint: 05:fe:d0:bf:71:a8:a3:76:63:da:01:e0:d8:52:dc:40 +# SHA1 Fingerprint: e5:8c:1c:c4:91:3b:38:63:4b:e9:10:6e:e3:ad:8e:6b:9d:d9:81:4a +# SHA256 Fingerprint: d9:47:43:2a:bd:e7:b7:fa:90:fc:2e:6b:59:10:1b:12:80:e0:e1:c7:e4:e4:0f:a3:c6:88:7f:ff:57:a7:f4:cf +-----BEGIN CERTIFICATE----- +MIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw +MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp +Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaMf/vo +27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7w +Cl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjw +TcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0Pfybl +qAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtcvfaH +szVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4Zor8 +Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUspzBmk +MiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92 +wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70p +aDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrN +VjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQID +AQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBAJ+qQibb +C5u+/x6Wki4+omVKapi6Ist9wTrYggoGxval3sBOh2Z5ofmmWJyq+bXmYOfg6LEe +QkEzCzc9zolwFcq1JKjPa7XSQCGYzyI0zzvFIoTgxQ6KfF2I5DUkzps+GlQebtuy +h6f88/qBVRRiClmpIgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM4 +7HLwEXWdyzRSjeZ2axfG34arJ45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8J +ZgfIPxz88NtFMN9iiMG1D53Dn0reWVlHxYciNuaCp+0KueIHoI17eko8cdLiA6Ef +MgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/bal8xa5meLMFrUKTX5hgUvYU/ +Z6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJFfbdT +6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLsQBqvFAnZ +0E6yove+7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm +2tIMPNuzjsmhDYAPexZ3FL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bb +bP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3gm3c +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R2 O=Google Trust Services LLC +# Subject: CN=GTS Root R2 O=Google Trust Services LLC +# Label: "GTS Root R2" +# Serial: 159662449406622349769042896298 +# MD5 Fingerprint: 1e:39:c0:53:e6:1e:29:82:0b:ca:52:55:36:5d:57:dc +# SHA1 Fingerprint: 9a:44:49:76:32:db:de:fa:d0:bc:fb:5a:7b:17:bd:9e:56:09:24:94 +# SHA256 Fingerprint: 8d:25:cd:97:22:9d:bf:70:35:6b:da:4e:b3:cc:73:40:31:e2:4c:f0:0f:af:cf:d3:2d:c7:6e:b5:84:1c:7e:a8 +-----BEGIN CERTIFICATE----- +MIIFVzCCAz+gAwIBAgINAgPlrsWNBCUaqxElqjANBgkqhkiG9w0BAQwFADBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw +MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp +Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3LvCvpt +nfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY +6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAu +MC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7k +RXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXuPuWg +f9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1mKPV ++3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K8Yzo +dDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RW +Ir9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKa +G73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCq +gc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwID +AQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBAB/Kzt3H +vqGf2SdMC9wXmBFqiN495nFWcrKeGk6c1SuYJF2ba3uwM4IJvd8lRuqYnrYb/oM8 +0mJhwQTtzuDFycgTE1XnqGOtjHsB/ncw4c5omwX4Eu55MaBBRTUoCnGkJE+M3DyC +B19m3H0Q/gxhswWV7uGugQ+o+MePTagjAiZrHYNSVc61LwDKgEDg4XSsYPWHgJ2u +NmSRXbBoGOqKYcl3qJfEycel/FVL8/B/uWU9J2jQzGv6U53hkRrJXRqWbTKH7QMg +yALOWr7Z6v2yTcQvG99fevX4i8buMTolUVVnjWQye+mew4K6Ki3pHrTgSAai/Gev +HyICc/sgCq+dVEuhzf9gR7A/Xe8bVr2XIZYtCtFenTgCR2y59PYjJbigapordwj6 +xLEokCZYCDzifqrXPW+6MYgKBesntaFJ7qBFVHvmJ2WZICGoo7z7GJa7Um8M7YNR +TOlZ4iBgxcJlkoKM8xAfDoqXvneCbT+PHV28SSe9zE8P4c52hgQjxcCMElv924Sg +JPFI/2R80L5cFtHvma3AH/vLrrw4IgYmZNralw4/KBVEqE8AyvCazM90arQ+POuV +7LXTWtiBmelDGDfrs7vRWGJB82bSj6p4lVQgw1oudCvV0b4YacCs1aTPObpRhANl +6WLAYv7YTVWW4tAR+kg0Eeye7QUd5MjWHYbL +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R3 O=Google Trust Services LLC +# Subject: CN=GTS Root R3 O=Google Trust Services LLC +# Label: "GTS Root R3" +# Serial: 159662495401136852707857743206 +# MD5 Fingerprint: 3e:e7:9d:58:02:94:46:51:94:e5:e0:22:4a:8b:e7:73 +# SHA1 Fingerprint: ed:e5:71:80:2b:c8:92:b9:5b:83:3c:d2:32:68:3f:09:cd:a0:1e:46 +# SHA256 Fingerprint: 34:d8:a7:3e:e2:08:d9:bc:db:0d:95:65:20:93:4b:4e:40:e6:94:82:59:6e:8b:6f:73:c8:42:6b:01:0a:6f:48 +-----BEGIN CERTIFICATE----- +MIICCTCCAY6gAwIBAgINAgPluILrIPglJ209ZjAKBggqhkjOPQQDAzBHMQswCQYD +VQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIG +A1UEAxMLR1RTIFJvb3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAw +WjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2Vz +IExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjOPQIBBgUrgQQAIgNi +AAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout736G +jOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL2 +4CejQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEA9uEglRR7 +VKOQFhG/hMjqb2sXnh5GmCCbn9MN2azTL818+FsuVbu/3ZL3pAzcMeGiAjEA/Jdm +ZuVDFhOD3cffL74UOO0BzrEXGhF16b0DjyZ+hOXJYKaV11RZt+cRLInUue4X +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R4 O=Google Trust Services LLC +# Subject: CN=GTS Root R4 O=Google Trust Services LLC +# Label: "GTS Root R4" +# Serial: 159662532700760215368942768210 +# MD5 Fingerprint: 43:96:83:77:19:4d:76:b3:9d:65:52:e4:1d:22:a5:e8 +# SHA1 Fingerprint: 77:d3:03:67:b5:e0:0c:15:f6:0c:38:61:df:7c:e1:3b:92:46:4d:47 +# SHA256 Fingerprint: 34:9d:fa:40:58:c5:e2:63:12:3b:39:8a:e7:95:57:3c:4e:13:13:c8:3f:e6:8f:93:55:6c:d5:e8:03:1b:3c:7d +-----BEGIN CERTIFICATE----- +MIICCTCCAY6gAwIBAgINAgPlwGjvYxqccpBQUjAKBggqhkjOPQQDAzBHMQswCQYD +VQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIG +A1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAw +WjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2Vz +IExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQAIgNi +AATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzuhXyi +QHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvR +HYqjQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNpADBmAjEA6ED/g94D +9J+uHXqnLrmvT/aDHQ4thQEd0dlq7A/Cr8deVl5c1RxYIigL9zC2L7F8AjEA8GE8 +p/SgguMh1YQdc4acLa/KNJvxn7kjNuK8YAOdgLOaVsjh4rsUecrNIdSUtUlD +-----END CERTIFICATE----- + +# Issuer: CN=Telia Root CA v2 O=Telia Finland Oyj +# Subject: CN=Telia Root CA v2 O=Telia Finland Oyj +# Label: "Telia Root CA v2" +# Serial: 7288924052977061235122729490515358 +# MD5 Fingerprint: 0e:8f:ac:aa:82:df:85:b1:f4:dc:10:1c:fc:99:d9:48 +# SHA1 Fingerprint: b9:99:cd:d1:73:50:8a:c4:47:05:08:9c:8c:88:fb:be:a0:2b:40:cd +# SHA256 Fingerprint: 24:2b:69:74:2f:cb:1e:5b:2a:bf:98:89:8b:94:57:21:87:54:4e:5b:4d:99:11:78:65:73:62:1f:6a:74:b8:2c +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIPAWdfJ9b+euPkrL4JWwWeMA0GCSqGSIb3DQEBCwUAMEQx +CzAJBgNVBAYTAkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UE +AwwQVGVsaWEgUm9vdCBDQSB2MjAeFw0xODExMjkxMTU1NTRaFw00MzExMjkxMTU1 +NTRaMEQxCzAJBgNVBAYTAkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZ +MBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2MjCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBALLQPwe84nvQa5n44ndp586dpAO8gm2h/oFlH0wnrI4AuhZ76zBq +AMCzdGh+sq/H1WKzej9Qyow2RCRj0jbpDIX2Q3bVTKFgcmfiKDOlyzG4OiIjNLh9 +vVYiQJ3q9HsDrWj8soFPmNB06o3lfc1jw6P23pLCWBnglrvFxKk9pXSW/q/5iaq9 +lRdU2HhE8Qx3FZLgmEKnpNaqIJLNwaCzlrI6hEKNfdWV5Nbb6WLEWLN5xYzTNTOD +n3WhUidhOPFZPY5Q4L15POdslv5e2QJltI5c0BE0312/UqeBAMN/mUWZFdUXyApT +7GPzmX3MaRKGwhfwAZ6/hLzRUssbkmbOpFPlob/E2wnW5olWK8jjfN7j/4nlNW4o +6GwLI1GpJQXrSPjdscr6bAhR77cYbETKJuFzxokGgeWKrLDiKca5JLNrRBH0pUPC +TEPlcDaMtjNXepUugqD0XBCzYYP2AgWGLnwtbNwDRm41k9V6lS/eINhbfpSQBGq6 +WT0EBXWdN6IOLj3rwaRSg/7Qa9RmjtzG6RJOHSpXqhC8fF6CfaamyfItufUXJ63R +DolUK5X6wK0dmBR4M0KGCqlztft0DbcbMBnEWg4cJ7faGND/isgFuvGqHKI3t+ZI +pEYslOqodmJHixBTB0hXbOKSTbauBcvcwUpej6w9GU7C7WB1K9vBykLVAgMBAAGj +YzBhMB8GA1UdIwQYMBaAFHKs5DN5qkWH9v2sHZ7Wxy+G2CQ5MB0GA1UdDgQWBBRy +rOQzeapFh/b9rB2e1scvhtgkOTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw +AwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAoDtZpwmUPjaE0n4vOaWWl/oRrfxn83EJ +8rKJhGdEr7nv7ZbsnGTbMjBvZ5qsfl+yqwE2foH65IRe0qw24GtixX1LDoJt0nZi +0f6X+J8wfBj5tFJ3gh1229MdqfDBmgC9bXXYfef6xzijnHDoRnkDry5023X4blMM +A8iZGok1GTzTyVR8qPAs5m4HeW9q4ebqkYJpCh3DflminmtGFZhb069GHWLIzoBS +SRE/yQQSwxN8PzuKlts8oB4KtItUsiRnDe+Cy748fdHif64W1lZYudogsYMVoe+K +TTJvQS8TUoKU1xrBeKJR3Stwbbca+few4GeXVtt8YVMJAygCQMez2P2ccGrGKMOF +6eLtGpOg3kuYooQ+BXcBlj37tCAPnHICehIv1aO6UXivKitEZU61/Qrowc15h2Er +3oBXRb9n8ZuRXqWk7FlIEA04x7D6w0RtBPV4UBySllva9bguulvP5fBqnUsvWHMt +Ty3EHD70sz+rFQ47GUGKpMFXEmZxTPpT41frYpUJnlTd0cI8Vzy9OK2YZLe4A5pT +VmBds9hCG1xLEooc6+t9xnppxyd/pPiL8uSUZodL6ZQHCRJ5irLrdATczvREWeAW +ysUsWNc8e89ihmpQfTU2Zqf7N+cox9jQraVplI/owd8k+BsHMYeB2F326CjYSlKA +rBPuUBQemMc= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST BR Root CA 1 2020 O=D-Trust GmbH +# Subject: CN=D-TRUST BR Root CA 1 2020 O=D-Trust GmbH +# Label: "D-TRUST BR Root CA 1 2020" +# Serial: 165870826978392376648679885835942448534 +# MD5 Fingerprint: b5:aa:4b:d5:ed:f7:e3:55:2e:8f:72:0a:f3:75:b8:ed +# SHA1 Fingerprint: 1f:5b:98:f0:e3:b5:f7:74:3c:ed:e6:b0:36:7d:32:cd:f4:09:41:67 +# SHA256 Fingerprint: e5:9a:aa:81:60:09:c2:2b:ff:5b:25:ba:d3:7d:f3:06:f0:49:79:7c:1f:81:d8:5a:b0:89:e6:57:bd:8f:00:44 +-----BEGIN CERTIFICATE----- +MIIC2zCCAmCgAwIBAgIQfMmPK4TX3+oPyWWa00tNljAKBggqhkjOPQQDAzBIMQsw +CQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRS +VVNUIEJSIFJvb3QgQ0EgMSAyMDIwMB4XDTIwMDIxMTA5NDUwMFoXDTM1MDIxMTA5 +NDQ1OVowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEiMCAG +A1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDEgMjAyMDB2MBAGByqGSM49AgEGBSuB +BAAiA2IABMbLxyjR+4T1mu9CFCDhQ2tuda38KwOE1HaTJddZO0Flax7mNCq7dPYS +zuht56vkPE4/RAiLzRZxy7+SmfSk1zxQVFKQhYN4lGdnoxwJGT11NIXe7WB9xwy0 +QVK5buXuQqOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHOREKv/ +VbNafAkl1bK6CKBrqx9tMA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6g +PKA6hjhodHRwOi8vY3JsLmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X2JyX3Jvb3Rf +Y2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVjdG9yeS5kLXRydXN0Lm5l +dC9DTj1ELVRSVVNUJTIwQlIlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxPPUQtVHJ1 +c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjO +PQQDAwNpADBmAjEAlJAtE/rhY/hhY+ithXhUkZy4kzg+GkHaQBZTQgjKL47xPoFW +wKrY7RjEsK70PvomAjEA8yjixtsrmfu3Ubgko6SUeho/5jbiA1czijDLgsfWFBHV +dWNbFJWcHwHP2NVypw87 +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST EV Root CA 1 2020 O=D-Trust GmbH +# Subject: CN=D-TRUST EV Root CA 1 2020 O=D-Trust GmbH +# Label: "D-TRUST EV Root CA 1 2020" +# Serial: 126288379621884218666039612629459926992 +# MD5 Fingerprint: 8c:2d:9d:70:9f:48:99:11:06:11:fb:e9:cb:30:c0:6e +# SHA1 Fingerprint: 61:db:8c:21:59:69:03:90:d8:7c:9c:12:86:54:cf:9d:3d:f4:dd:07 +# SHA256 Fingerprint: 08:17:0d:1a:a3:64:53:90:1a:2f:95:92:45:e3:47:db:0c:8d:37:ab:aa:bc:56:b8:1a:a1:00:dc:95:89:70:db +-----BEGIN CERTIFICATE----- +MIIC2zCCAmCgAwIBAgIQXwJB13qHfEwDo6yWjfv/0DAKBggqhkjOPQQDAzBIMQsw +CQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRS +VVNUIEVWIFJvb3QgQ0EgMSAyMDIwMB4XDTIwMDIxMTEwMDAwMFoXDTM1MDIxMTA5 +NTk1OVowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEiMCAG +A1UEAxMZRC1UUlVTVCBFViBSb290IENBIDEgMjAyMDB2MBAGByqGSM49AgEGBSuB +BAAiA2IABPEL3YZDIBnfl4XoIkqbz52Yv7QFJsnL46bSj8WeeHsxiamJrSc8ZRCC +/N/DnU7wMyPE0jL1HLDfMxddxfCxivnvubcUyilKwg+pf3VlSSowZ/Rk99Yad9rD +wpdhQntJraOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFH8QARY3 +OqQo5FD4pPfsazK2/umLMA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6g +PKA6hjhodHRwOi8vY3JsLmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X2V2X3Jvb3Rf +Y2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVjdG9yeS5kLXRydXN0Lm5l +dC9DTj1ELVRSVVNUJTIwRVYlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxPPUQtVHJ1 +c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjO +PQQDAwNpADBmAjEAyjzGKnXCXnViOTYAYFqLwZOZzNnbQTs7h5kXO9XMT8oi96CA +y/m0sRtW9XLS/BnRAjEAkfcwkz8QRitxpNA7RJvAKQIFskF3UfN5Wp6OFKBOQtJb +gfM0agPnIjhQW+0ZT0MW +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert TLS ECC P384 Root G5 O=DigiCert, Inc. +# Subject: CN=DigiCert TLS ECC P384 Root G5 O=DigiCert, Inc. +# Label: "DigiCert TLS ECC P384 Root G5" +# Serial: 13129116028163249804115411775095713523 +# MD5 Fingerprint: d3:71:04:6a:43:1c:db:a6:59:e1:a8:a3:aa:c5:71:ed +# SHA1 Fingerprint: 17:f3:de:5e:9f:0f:19:e9:8e:f6:1f:32:26:6e:20:c4:07:ae:30:ee +# SHA256 Fingerprint: 01:8e:13:f0:77:25:32:cf:80:9b:d1:b1:72:81:86:72:83:fc:48:c6:e1:3b:e9:c6:98:12:85:4a:49:0c:1b:05 +-----BEGIN CERTIFICATE----- +MIICGTCCAZ+gAwIBAgIQCeCTZaz32ci5PhwLBCou8zAKBggqhkjOPQQDAzBOMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJjAkBgNVBAMTHURp +Z2lDZXJ0IFRMUyBFQ0MgUDM4NCBSb290IEc1MB4XDTIxMDExNTAwMDAwMFoXDTQ2 +MDExNDIzNTk1OVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJ +bmMuMSYwJAYDVQQDEx1EaWdpQ2VydCBUTFMgRUNDIFAzODQgUm9vdCBHNTB2MBAG +ByqGSM49AgEGBSuBBAAiA2IABMFEoc8Rl1Ca3iOCNQfN0MsYndLxf3c1TzvdlHJS +7cI7+Oz6e2tYIOyZrsn8aLN1udsJ7MgT9U7GCh1mMEy7H0cKPGEQQil8pQgO4CLp +0zVozptjn4S1mU1YoI71VOeVyaNCMEAwHQYDVR0OBBYEFMFRRVBZqz7nLFr6ICIS +B4CIfBFqMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49 +BAMDA2gAMGUCMQCJao1H5+z8blUD2WdsJk6Dxv3J+ysTvLd6jLRl0mlpYxNjOyZQ +LgGheQaRnUi/wr4CMEfDFXuxoJGZSZOoPHzoRgaLLPIxAJSdYsiJvRmEFOml+wG4 +DXZDjC5Ty3zfDBeWUA== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert TLS RSA4096 Root G5 O=DigiCert, Inc. +# Subject: CN=DigiCert TLS RSA4096 Root G5 O=DigiCert, Inc. +# Label: "DigiCert TLS RSA4096 Root G5" +# Serial: 11930366277458970227240571539258396554 +# MD5 Fingerprint: ac:fe:f7:34:96:a9:f2:b3:b4:12:4b:e4:27:41:6f:e1 +# SHA1 Fingerprint: a7:88:49:dc:5d:7c:75:8c:8c:de:39:98:56:b3:aa:d0:b2:a5:71:35 +# SHA256 Fingerprint: 37:1a:00:dc:05:33:b3:72:1a:7e:eb:40:e8:41:9e:70:79:9d:2b:0a:0f:2c:1d:80:69:31:65:f7:ce:c4:ad:75 +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCPm0eKj6ftpqMzeJ3nzPijANBgkqhkiG9w0BAQwFADBN +MQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMT +HERpZ2lDZXJ0IFRMUyBSU0E0MDk2IFJvb3QgRzUwHhcNMjEwMTE1MDAwMDAwWhcN +NDYwMTE0MjM1OTU5WjBNMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQs +IEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0MDk2IFJvb3QgRzUwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz0PTJeRGd/fxmgefM1eS87IE+ +ajWOLrfn3q/5B03PMJ3qCQuZvWxX2hhKuHisOjmopkisLnLlvevxGs3npAOpPxG0 +2C+JFvuUAT27L/gTBaF4HI4o4EXgg/RZG5Wzrn4DReW+wkL+7vI8toUTmDKdFqgp +wgscONyfMXdcvyej/Cestyu9dJsXLfKB2l2w4SMXPohKEiPQ6s+d3gMXsUJKoBZM +pG2T6T867jp8nVid9E6P/DsjyG244gXazOvswzH016cpVIDPRFtMbzCe88zdH5RD +nU1/cHAN1DrRN/BsnZvAFJNY781BOHW8EwOVfH/jXOnVDdXifBBiqmvwPXbzP6Po +sMH976pXTayGpxi0KcEsDr9kvimM2AItzVwv8n/vFfQMFawKsPHTDU9qTXeXAaDx +Zre3zu/O7Oyldcqs4+Fj97ihBMi8ez9dLRYiVu1ISf6nL3kwJZu6ay0/nTvEF+cd +Lvvyz6b84xQslpghjLSR6Rlgg/IwKwZzUNWYOwbpx4oMYIwo+FKbbuH2TbsGJJvX +KyY//SovcfXWJL5/MZ4PbeiPT02jP/816t9JXkGPhvnxd3lLG7SjXi/7RgLQZhNe +XoVPzthwiHvOAbWWl9fNff2C+MIkwcoBOU+NosEUQB+cZtUMCUbW8tDRSHZWOkPL +tgoRObqME2wGtZ7P6wIDAQABo0IwQDAdBgNVHQ4EFgQUUTMc7TZArxfTJc1paPKv +TiM+s0EwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcN +AQEMBQADggIBAGCmr1tfV9qJ20tQqcQjNSH/0GEwhJG3PxDPJY7Jv0Y02cEhJhxw +GXIeo8mH/qlDZJY6yFMECrZBu8RHANmfGBg7sg7zNOok992vIGCukihfNudd5N7H +PNtQOa27PShNlnx2xlv0wdsUpasZYgcYQF+Xkdycx6u1UQ3maVNVzDl92sURVXLF +O4uJ+DQtpBflF+aZfTCIITfNMBc9uPK8qHWgQ9w+iUuQrm0D4ByjoJYJu32jtyoQ +REtGBzRj7TG5BO6jm5qu5jF49OokYTurWGT/u4cnYiWB39yhL/btp/96j1EuMPik +AdKFOV8BmZZvWltwGUb+hmA+rYAQCd05JS9Yf7vSdPD3Rh9GOUrYU9DzLjtxpdRv +/PNn5AeP3SYZ4Y1b+qOTEZvpyDrDVWiakuFSdjjo4bq9+0/V77PnSIMx8IIh47a+ +p6tv75/fTM8BuGJqIz3nCU2AG3swpMPdB380vqQmsvZB6Akd4yCYqjdP//fx4ilw +MUc/dNAUFvohigLVigmUdy7yWSiLfFCSCmZ4OIN1xLVaqBHG5cGdZlXPU8Sv13WF +qUITVuwhd4GTWgzqltlJyqEI8pc7bZsEGCREjnwB8twl2F6GmrE52/WRMmrRpnCK +ovfepEWFJqgejF0pW8hL2JpqA15w8oVPbEtoL8pU9ozaMv7Da4M/OMZ+ +-----END CERTIFICATE----- + +# Issuer: CN=Certainly Root R1 O=Certainly +# Subject: CN=Certainly Root R1 O=Certainly +# Label: "Certainly Root R1" +# Serial: 188833316161142517227353805653483829216 +# MD5 Fingerprint: 07:70:d4:3e:82:87:a0:fa:33:36:13:f4:fa:33:e7:12 +# SHA1 Fingerprint: a0:50:ee:0f:28:71:f4:27:b2:12:6d:6f:50:96:25:ba:cc:86:42:af +# SHA256 Fingerprint: 77:b8:2c:d8:64:4c:43:05:f7:ac:c5:cb:15:6b:45:67:50:04:03:3d:51:c6:0c:62:02:a8:e0:c3:34:67:d3:a0 +-----BEGIN CERTIFICATE----- +MIIFRzCCAy+gAwIBAgIRAI4P+UuQcWhlM1T01EQ5t+AwDQYJKoZIhvcNAQELBQAw +PTELMAkGA1UEBhMCVVMxEjAQBgNVBAoTCUNlcnRhaW5seTEaMBgGA1UEAxMRQ2Vy +dGFpbmx5IFJvb3QgUjEwHhcNMjEwNDAxMDAwMDAwWhcNNDYwNDAxMDAwMDAwWjA9 +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0 +YWlubHkgUm9vdCBSMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANA2 +1B/q3avk0bbm+yLA3RMNansiExyXPGhjZjKcA7WNpIGD2ngwEc/csiu+kr+O5MQT +vqRoTNoCaBZ0vrLdBORrKt03H2As2/X3oXyVtwxwhi7xOu9S98zTm/mLvg7fMbed +aFySpvXl8wo0tf97ouSHocavFwDvA5HtqRxOcT3Si2yJ9HiG5mpJoM610rCrm/b0 +1C7jcvk2xusVtyWMOvwlDbMicyF0yEqWYZL1LwsYpfSt4u5BvQF5+paMjRcCMLT5 +r3gajLQ2EBAHBXDQ9DGQilHFhiZ5shGIXsXwClTNSaa/ApzSRKft43jvRl5tcdF5 +cBxGX1HpyTfcX35pe0HfNEXgO4T0oYoKNp43zGJS4YkNKPl6I7ENPT2a/Z2B7yyQ +wHtETrtJ4A5KVpK8y7XdeReJkd5hiXSSqOMyhb5OhaRLWcsrxXiOcVTQAjeZjOVJ +6uBUcqQRBi8LjMFbvrWhsFNunLhgkR9Za/kt9JQKl7XsxXYDVBtlUrpMklZRNaBA +2CnbrlJ2Oy0wQJuK0EJWtLeIAaSHO1OWzaMWj/Nmqhexx2DgwUMFDO6bW2BvBlyH +Wyf5QBGenDPBt+U1VwV/J84XIIwc/PH72jEpSe31C4SnT8H2TsIonPru4K8H+zMR +eiFPCyEQtkA6qyI6BJyLm4SGcprSp6XEtHWRqSsjAgMBAAGjQjBAMA4GA1UdDwEB +/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTgqj8ljZ9EXME66C6u +d0yEPmcM9DANBgkqhkiG9w0BAQsFAAOCAgEAuVevuBLaV4OPaAszHQNTVfSVcOQr +PbA56/qJYv331hgELyE03fFo8NWWWt7CgKPBjcZq91l3rhVkz1t5BXdm6ozTaw3d +8VkswTOlMIAVRQdFGjEitpIAq5lNOo93r6kiyi9jyhXWx8bwPWz8HA2YEGGeEaIi +1wrykXprOQ4vMMM2SZ/g6Q8CRFA3lFV96p/2O7qUpUzpvD5RtOjKkjZUbVwlKNrd +rRT90+7iIgXr0PK3aBLXWopBGsaSpVo7Y0VPv+E6dyIvXL9G+VoDhRNCX8reU9di +taY1BMJH/5n9hN9czulegChB8n3nHpDYT3Y+gjwN/KUD+nsa2UUeYNrEjvn8K8l7 +lcUq/6qJ34IxD3L/DCfXCh5WAFAeDJDBlrXYFIW7pw0WwfgHJBu6haEaBQmAupVj +yTrsJZ9/nbqkRxWbRHDxakvWOF5D8xh+UG7pWijmZeZ3Gzr9Hb4DJqPb1OG7fpYn +Kx3upPvaJVQTA945xsMfTZDsjxtK0hzthZU4UHlG1sGQUDGpXJpuHfUzVounmdLy +yCwzk5Iwx06MZTMQZBf9JBeW0Y3COmor6xOLRPIh80oat3df1+2IpHLlOR+Vnb5n +wXARPbv0+Em34yaXOp/SX3z7wJl8OSngex2/DaeP0ik0biQVy96QXr8axGbqwua6 +OV+KmalBWQewLK8= +-----END CERTIFICATE----- + +# Issuer: CN=Certainly Root E1 O=Certainly +# Subject: CN=Certainly Root E1 O=Certainly +# Label: "Certainly Root E1" +# Serial: 8168531406727139161245376702891150584 +# MD5 Fingerprint: 0a:9e:ca:cd:3e:52:50:c6:36:f3:4b:a3:ed:a7:53:e9 +# SHA1 Fingerprint: f9:e1:6d:dc:01:89:cf:d5:82:45:63:3e:c5:37:7d:c2:eb:93:6f:2b +# SHA256 Fingerprint: b4:58:5f:22:e4:ac:75:6a:4e:86:12:a1:36:1c:5d:9d:03:1a:93:fd:84:fe:bb:77:8f:a3:06:8b:0f:c4:2d:c2 +-----BEGIN CERTIFICATE----- +MIIB9zCCAX2gAwIBAgIQBiUzsUcDMydc+Y2aub/M+DAKBggqhkjOPQQDAzA9MQsw +CQYDVQQGEwJVUzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0YWlu +bHkgUm9vdCBFMTAeFw0yMTA0MDEwMDAwMDBaFw00NjA0MDEwMDAwMDBaMD0xCzAJ +BgNVBAYTAlVTMRIwEAYDVQQKEwlDZXJ0YWlubHkxGjAYBgNVBAMTEUNlcnRhaW5s +eSBSb290IEUxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE3m/4fxzf7flHh4axpMCK ++IKXgOqPyEpeKn2IaKcBYhSRJHpcnqMXfYqGITQYUBsQ3tA3SybHGWCA6TS9YBk2 +QNYphwk8kXr2vBMj3VlOBF7PyAIcGFPBMdjaIOlEjeR2o0IwQDAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ygYy2R17ikq6+2uI1g4 +hevIIgcwCgYIKoZIzj0EAwMDaAAwZQIxALGOWiDDshliTd6wT99u0nCK8Z9+aozm +ut6Dacpps6kFtZaSF4fC0urQe87YQVt8rgIwRt7qy12a7DLCZRawTDBcMPPaTnOG +BtjOiQRINzf43TNRnXCve1XYAS59BWQOhriR +-----END CERTIFICATE----- + +# Issuer: CN=Security Communication ECC RootCA1 O=SECOM Trust Systems CO.,LTD. +# Subject: CN=Security Communication ECC RootCA1 O=SECOM Trust Systems CO.,LTD. +# Label: "Security Communication ECC RootCA1" +# Serial: 15446673492073852651 +# MD5 Fingerprint: 7e:43:b0:92:68:ec:05:43:4c:98:ab:5d:35:2e:7e:86 +# SHA1 Fingerprint: b8:0e:26:a9:bf:d2:b2:3b:c0:ef:46:c9:ba:c7:bb:f6:1d:0d:41:41 +# SHA256 Fingerprint: e7:4f:bd:a5:5b:d5:64:c4:73:a3:6b:44:1a:a7:99:c8:a6:8e:07:74:40:e8:28:8b:9f:a1:e5:0e:4b:ba:ca:11 +-----BEGIN CERTIFICATE----- +MIICODCCAb6gAwIBAgIJANZdm7N4gS7rMAoGCCqGSM49BAMDMGExCzAJBgNVBAYT +AkpQMSUwIwYDVQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMSswKQYD +VQQDEyJTZWN1cml0eSBDb21tdW5pY2F0aW9uIEVDQyBSb290Q0ExMB4XDTE2MDYx +NjA1MTUyOFoXDTM4MDExODA1MTUyOFowYTELMAkGA1UEBhMCSlAxJTAjBgNVBAoT +HFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKzApBgNVBAMTIlNlY3VyaXR5 +IENvbW11bmljYXRpb24gRUNDIFJvb3RDQTEwdjAQBgcqhkjOPQIBBgUrgQQAIgNi +AASkpW9gAwPDvTH00xecK4R1rOX9PVdu12O/5gSJko6BnOPpR27KkBLIE+Cnnfdl +dB9sELLo5OnvbYUymUSxXv3MdhDYW72ixvnWQuRXdtyQwjWpS4g8EkdtXP9JTxpK +ULGjQjBAMB0GA1UdDgQWBBSGHOf+LaVKiwj+KBH6vqNm+GBZLzAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjAVXUI9/Lbu +9zuxNuie9sRGKEkz0FhDKmMpzE2xtHqiuQ04pV1IKv3LsnNdo4gIxwwCMQDAqy0O +be0YottT6SXbVQjgUMzfRGEWgqtJsLKB7HOHeLRMsmIbEvoWTSVLY70eN9k= +-----END CERTIFICATE----- + +# Issuer: CN=BJCA Global Root CA1 O=BEIJING CERTIFICATE AUTHORITY +# Subject: CN=BJCA Global Root CA1 O=BEIJING CERTIFICATE AUTHORITY +# Label: "BJCA Global Root CA1" +# Serial: 113562791157148395269083148143378328608 +# MD5 Fingerprint: 42:32:99:76:43:33:36:24:35:07:82:9b:28:f9:d0:90 +# SHA1 Fingerprint: d5:ec:8d:7b:4c:ba:79:f4:e7:e8:cb:9d:6b:ae:77:83:10:03:21:6a +# SHA256 Fingerprint: f3:89:6f:88:fe:7c:0a:88:27:66:a7:fa:6a:d2:74:9f:b5:7a:7f:3e:98:fb:76:9c:1f:a7:b0:9c:2c:44:d5:ae +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIQVW9l47TZkGobCdFsPsBsIDANBgkqhkiG9w0BAQsFADBU +MQswCQYDVQQGEwJDTjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRI +T1JJVFkxHTAbBgNVBAMMFEJKQ0EgR2xvYmFsIFJvb3QgQ0ExMB4XDTE5MTIxOTAz +MTYxN1oXDTQ0MTIxMjAzMTYxN1owVDELMAkGA1UEBhMCQ04xJjAkBgNVBAoMHUJF +SUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQDDBRCSkNBIEdsb2Jh +bCBSb290IENBMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAPFmCL3Z +xRVhy4QEQaVpN3cdwbB7+sN3SJATcmTRuHyQNZ0YeYjjlwE8R4HyDqKYDZ4/N+AZ +spDyRhySsTphzvq3Rp4Dhtczbu33RYx2N95ulpH3134rhxfVizXuhJFyV9xgw8O5 +58dnJCNPYwpj9mZ9S1WnP3hkSWkSl+BMDdMJoDIwOvqfwPKcxRIqLhy1BDPapDgR +at7GGPZHOiJBhyL8xIkoVNiMpTAK+BcWyqw3/XmnkRd4OJmtWO2y3syJfQOcs4ll +5+M7sSKGjwZteAf9kRJ/sGsciQ35uMt0WwfCyPQ10WRjeulumijWML3mG90Vr4Tq +nMfK9Q7q8l0ph49pczm+LiRvRSGsxdRpJQaDrXpIhRMsDQa4bHlW/KNnMoH1V6XK +V0Jp6VwkYe/iMBhORJhVb3rCk9gZtt58R4oRTklH2yiUAguUSiz5EtBP6DF+bHq/ +pj+bOT0CFqMYs2esWz8sgytnOYFcuX6U1WTdno9uruh8W7TXakdI136z1C2OVnZO +z2nxbkRs1CTqjSShGL+9V/6pmTW12xB3uD1IutbB5/EjPtffhZ0nPNRAvQoMvfXn +jSXWgXSHRtQpdaJCbPdzied9v3pKH9MiyRVVz99vfFXQpIsHETdfg6YmV6YBW37+ +WGgHqel62bno/1Afq8K0wM7o6v0PvY1NuLxxAgMBAAGjQjBAMB0GA1UdDgQWBBTF +7+3M2I0hxkjk49cULqcWk+WYATAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE +AwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAUoKsITQfI/Ki2Pm4rzc2IInRNwPWaZ+4 +YRC6ojGYWUfo0Q0lHhVBDOAqVdVXUsv45Mdpox1NcQJeXyFFYEhcCY5JEMEE3Kli +awLwQ8hOnThJdMkycFRtwUf8jrQ2ntScvd0g1lPJGKm1Vrl2i5VnZu69mP6u775u ++2D2/VnGKhs/I0qUJDAnyIm860Qkmss9vk/Ves6OF8tiwdneHg56/0OGNFK8YT88 +X7vZdrRTvJez/opMEi4r89fO4aL/3Xtw+zuhTaRjAv04l5U/BXCga99igUOLtFkN +SoxUnMW7gZ/NfaXvCyUeOiDbHPwfmGcCCtRzRBPbUYQaVQNW4AB+dAb/OMRyHdOo +P2gxXdMJxy6MW2Pg6Nwe0uxhHvLe5e/2mXZgLR6UcnHGCyoyx5JO1UbXHfmpGQrI ++pXObSOYqgs4rZpWDW+N8TEAiMEXnM0ZNjX+VVOg4DwzX5Ze4jLp3zO7Bkqp2IRz +znfSxqxx4VyjHQy7Ct9f4qNx2No3WqB4K/TUfet27fJhcKVlmtOJNBir+3I+17Q9 +eVzYH6Eze9mCUAyTF6ps3MKCuwJXNq+YJyo5UOGwifUll35HaBC07HPKs5fRJNz2 +YqAo07WjuGS3iGJCz51TzZm+ZGiPTx4SSPfSKcOYKMryMguTjClPPGAyzQWWYezy +r/6zcCwupvI= +-----END CERTIFICATE----- + +# Issuer: CN=BJCA Global Root CA2 O=BEIJING CERTIFICATE AUTHORITY +# Subject: CN=BJCA Global Root CA2 O=BEIJING CERTIFICATE AUTHORITY +# Label: "BJCA Global Root CA2" +# Serial: 58605626836079930195615843123109055211 +# MD5 Fingerprint: 5e:0a:f6:47:5f:a6:14:e8:11:01:95:3f:4d:01:eb:3c +# SHA1 Fingerprint: f4:27:86:eb:6e:b8:6d:88:31:67:02:fb:ba:66:a4:53:00:aa:7a:a6 +# SHA256 Fingerprint: 57:4d:f6:93:1e:27:80:39:66:7b:72:0a:fd:c1:60:0f:c2:7e:b6:6d:d3:09:29:79:fb:73:85:64:87:21:28:82 +-----BEGIN CERTIFICATE----- +MIICJTCCAaugAwIBAgIQLBcIfWQqwP6FGFkGz7RK6zAKBggqhkjOPQQDAzBUMQsw +CQYDVQQGEwJDTjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJ +VFkxHTAbBgNVBAMMFEJKQ0EgR2xvYmFsIFJvb3QgQ0EyMB4XDTE5MTIxOTAzMTgy +MVoXDTQ0MTIxMjAzMTgyMVowVDELMAkGA1UEBhMCQ04xJjAkBgNVBAoMHUJFSUpJ +TkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQDDBRCSkNBIEdsb2JhbCBS +b290IENBMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABJ3LgJGNU2e1uVCxA/jlSR9B +IgmwUVJY1is0j8USRhTFiy8shP8sbqjV8QnjAyEUxEM9fMEsxEtqSs3ph+B99iK+ ++kpRuDCK/eHeGBIK9ke35xe/J4rUQUyWPGCWwf0VHKNCMEAwHQYDVR0OBBYEFNJK +sVF/BvDRgh9Obl+rg/xI1LCRMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMAoGCCqGSM49BAMDA2gAMGUCMBq8W9f+qdJUDkpd0m2xQNz0Q9XSSpkZElaA +94M04TVOSG0ED1cxMDAtsaqdAzjbBgIxAMvMh1PLet8gUXOQwKhbYdDFUDn9hf7B +43j4ptZLvZuHjw/l1lOWqzzIQNph91Oj9w== +-----END CERTIFICATE----- + +# Issuer: CN=Sectigo Public Server Authentication Root E46 O=Sectigo Limited +# Subject: CN=Sectigo Public Server Authentication Root E46 O=Sectigo Limited +# Label: "Sectigo Public Server Authentication Root E46" +# Serial: 88989738453351742415770396670917916916 +# MD5 Fingerprint: 28:23:f8:b2:98:5c:37:16:3b:3e:46:13:4e:b0:b3:01 +# SHA1 Fingerprint: ec:8a:39:6c:40:f0:2e:bc:42:75:d4:9f:ab:1c:1a:5b:67:be:d2:9a +# SHA256 Fingerprint: c9:0f:26:f0:fb:1b:40:18:b2:22:27:51:9b:5c:a2:b5:3e:2c:a5:b3:be:5c:f1:8e:fe:1b:ef:47:38:0c:53:83 +-----BEGIN CERTIFICATE----- +MIICOjCCAcGgAwIBAgIQQvLM2htpN0RfFf51KBC49DAKBggqhkjOPQQDAzBfMQsw +CQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1T +ZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwHhcN +MjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1OTU5WjBfMQswCQYDVQQGEwJHQjEYMBYG +A1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1YmxpYyBT +ZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAR2+pmpbiDt+dd34wc7qNs9Xzjoq1WmVk/WSOrsfy2qw7LFeeyZYX8QeccC +WvkEN/U0NSt3zn8gj1KjAIns1aeibVvjS5KToID1AZTc8GgHHs3u/iVStSBDHBv+ +6xnOQ6OjQjBAMB0GA1UdDgQWBBTRItpMWfFLXyY4qp3W7usNw/upYTAOBgNVHQ8B +Af8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNnADBkAjAn7qRa +qCG76UeXlImldCBteU/IvZNeWBj7LRoAasm4PdCkT0RHlAFWovgzJQxC36oCMB3q +4S6ILuH5px0CMk7yn2xVdOOurvulGu7t0vzCAxHrRVxgED1cf5kDW21USAGKcw== +-----END CERTIFICATE----- + +# Issuer: CN=Sectigo Public Server Authentication Root R46 O=Sectigo Limited +# Subject: CN=Sectigo Public Server Authentication Root R46 O=Sectigo Limited +# Label: "Sectigo Public Server Authentication Root R46" +# Serial: 156256931880233212765902055439220583700 +# MD5 Fingerprint: 32:10:09:52:00:d5:7e:6c:43:df:15:c0:b1:16:93:e5 +# SHA1 Fingerprint: ad:98:f9:f3:e4:7d:75:3b:65:d4:82:b3:a4:52:17:bb:6e:f5:e4:38 +# SHA256 Fingerprint: 7b:b6:47:a6:2a:ee:ac:88:bf:25:7a:a5:22:d0:1f:fe:a3:95:e0:ab:45:c7:3f:93:f6:56:54:ec:38:f2:5a:06 +-----BEGIN CERTIFICATE----- +MIIFijCCA3KgAwIBAgIQdY39i658BwD6qSWn4cetFDANBgkqhkiG9w0BAQwFADBf +MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQD +Ey1TZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYw +HhcNMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1OTU5WjBfMQswCQYDVQQGEwJHQjEY +MBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1Ymxp +YyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCTvtU2UnXYASOgHEdCSe5jtrch/cSV1UgrJnwUUxDa +ef0rty2k1Cz66jLdScK5vQ9IPXtamFSvnl0xdE8H/FAh3aTPaE8bEmNtJZlMKpnz +SDBh+oF8HqcIStw+KxwfGExxqjWMrfhu6DtK2eWUAtaJhBOqbchPM8xQljeSM9xf +iOefVNlI8JhD1mb9nxc4Q8UBUQvX4yMPFF1bFOdLvt30yNoDN9HWOaEhUTCDsG3X +ME6WW5HwcCSrv0WBZEMNvSE6Lzzpng3LILVCJ8zab5vuZDCQOc2TZYEhMbUjUDM3 +IuM47fgxMMxF/mL50V0yeUKH32rMVhlATc6qu/m1dkmU8Sf4kaWD5QazYw6A3OAS +VYCmO2a0OYctyPDQ0RTp5A1NDvZdV3LFOxxHVp3i1fuBYYzMTYCQNFu31xR13NgE +SJ/AwSiItOkcyqex8Va3e0lMWeUgFaiEAin6OJRpmkkGj80feRQXEgyDet4fsZfu ++Zd4KKTIRJLpfSYFplhym3kT2BFfrsU4YjRosoYwjviQYZ4ybPUHNs2iTG7sijbt +8uaZFURww3y8nDnAtOFr94MlI1fZEoDlSfB1D++N6xybVCi0ITz8fAr/73trdf+L +HaAZBav6+CuBQug4urv7qv094PPK306Xlynt8xhW6aWWrL3DkJiy4Pmi1KZHQ3xt +zwIDAQABo0IwQDAdBgNVHQ4EFgQUVnNYZJX5khqwEioEYnmhQBWIIUkwDgYDVR0P +AQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAC9c +mTz8Bl6MlC5w6tIyMY208FHVvArzZJ8HXtXBc2hkeqK5Duj5XYUtqDdFqij0lgVQ +YKlJfp/imTYpE0RHap1VIDzYm/EDMrraQKFz6oOht0SmDpkBm+S8f74TlH7Kph52 +gDY9hAaLMyZlbcp+nv4fjFg4exqDsQ+8FxG75gbMY/qB8oFM2gsQa6H61SilzwZA +Fv97fRheORKkU55+MkIQpiGRqRxOF3yEvJ+M0ejf5lG5Nkc/kLnHvALcWxxPDkjB +JYOcCj+esQMzEhonrPcibCTRAUH4WAP+JWgiH5paPHxsnnVI84HxZmduTILA7rpX +DhjvLpr3Etiga+kFpaHpaPi8TD8SHkXoUsCjvxInebnMMTzD9joiFgOgyY9mpFui +TdaBJQbpdqQACj7LzTWb4OE4y2BThihCQRxEV+ioratF4yUQvNs+ZUH7G6aXD+u5 +dHn5HrwdVw1Hr8Mvn4dGp+smWg9WY7ViYG4A++MnESLn/pmPNPW56MORcr3Ywx65 +LvKRRFHQV80MNNVIIb/bE/FmJUNS0nAiNs2fxBx1IK1jcmMGDw4nztJqDby1ORrp +0XZ60Vzk50lJLVU3aPAaOpg+VBeHVOmmJ1CJeyAvP/+/oYtKR5j/K3tJPsMpRmAY +QqszKbrAKbkTidOIijlBO8n9pu0f9GBj39ItVQGL +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com TLS RSA Root CA 2022 O=SSL Corporation +# Subject: CN=SSL.com TLS RSA Root CA 2022 O=SSL Corporation +# Label: "SSL.com TLS RSA Root CA 2022" +# Serial: 148535279242832292258835760425842727825 +# MD5 Fingerprint: d8:4e:c6:59:30:d8:fe:a0:d6:7a:5a:2c:2c:69:78:da +# SHA1 Fingerprint: ec:2c:83:40:72:af:26:95:10:ff:0e:f2:03:ee:31:70:f6:78:9d:ca +# SHA256 Fingerprint: 8f:af:7d:2e:2c:b4:70:9b:b8:e0:b3:36:66:bf:75:a5:dd:45:b5:de:48:0f:8e:a8:d4:bf:e6:be:bc:17:f2:ed +-----BEGIN CERTIFICATE----- +MIIFiTCCA3GgAwIBAgIQb77arXO9CEDii02+1PdbkTANBgkqhkiG9w0BAQsFADBO +MQswCQYDVQQGEwJVUzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQD +DBxTU0wuY29tIFRMUyBSU0EgUm9vdCBDQSAyMDIyMB4XDTIyMDgyNTE2MzQyMloX +DTQ2MDgxOTE2MzQyMVowTjELMAkGA1UEBhMCVVMxGDAWBgNVBAoMD1NTTCBDb3Jw +b3JhdGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgUlNBIFJvb3QgQ0EgMjAyMjCC +AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANCkCXJPQIgSYT41I57u9nTP +L3tYPc48DRAokC+X94xI2KDYJbFMsBFMF3NQ0CJKY7uB0ylu1bUJPiYYf7ISf5OY +t6/wNr/y7hienDtSxUcZXXTzZGbVXcdotL8bHAajvI9AI7YexoS9UcQbOcGV0ins +S657Lb85/bRi3pZ7QcacoOAGcvvwB5cJOYF0r/c0WRFXCsJbwST0MXMwgsadugL3 +PnxEX4MN8/HdIGkWCVDi1FW24IBydm5MR7d1VVm0U3TZlMZBrViKMWYPHqIbKUBO +L9975hYsLfy/7PO0+r4Y9ptJ1O4Fbtk085zx7AGL0SDGD6C1vBdOSHtRwvzpXGk3 +R2azaPgVKPC506QVzFpPulJwoxJF3ca6TvvC0PeoUidtbnm1jPx7jMEWTO6Af77w +dr5BUxIzrlo4QqvXDz5BjXYHMtWrifZOZ9mxQnUjbvPNQrL8VfVThxc7wDNY8VLS ++YCk8OjwO4s4zKTGkH8PnP2L0aPP2oOnaclQNtVcBdIKQXTbYxE3waWglksejBYS +d66UNHsef8JmAOSqg+qKkK3ONkRN0VHpvB/zagX9wHQfJRlAUW7qglFA35u5CCoG +AtUjHBPW6dvbxrB6y3snm/vg1UYk7RBLY0ulBY+6uB0rpvqR4pJSvezrZ5dtmi2f +gTIFZzL7SAg/2SW4BCUvAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j +BBgwFoAU+y437uOEeicuzRk1sTN8/9REQrkwHQYDVR0OBBYEFPsuN+7jhHonLs0Z +NbEzfP/UREK5MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAjYlt +hEUY8U+zoO9opMAdrDC8Z2awms22qyIZZtM7QbUQnRC6cm4pJCAcAZli05bg4vsM +QtfhWsSWTVTNj8pDU/0quOr4ZcoBwq1gaAafORpR2eCNJvkLTqVTJXojpBzOCBvf +R4iyrT7gJ4eLSYwfqUdYe5byiB0YrrPRpgqU+tvT5TgKa3kSM/tKWTcWQA673vWJ +DPFs0/dRa1419dvAJuoSc06pkZCmF8NsLzjUo3KUQyxi4U5cMj29TH0ZR6LDSeeW +P4+a0zvkEdiLA9z2tmBVGKaBUfPhqBVq6+AL8BQx1rmMRTqoENjwuSfr98t67wVy +lrXEj5ZzxOhWc5y8aVFjvO9nHEMaX3cZHxj4HCUp+UmZKbaSPaKDN7EgkaibMOlq +bLQjk2UEqxHzDh1TJElTHaE/nUiSEeJ9DU/1172iWD54nR4fK/4huxoTtrEoZP2w +AgDHbICivRZQIA9ygV/MlP+7mea6kMvq+cYMwq7FGc4zoWtcu358NFcXrfA/rs3q +r5nsLFR+jM4uElZI7xc7P0peYNLcdDa8pUNjyw9bowJWCZ4kLOGGgYz+qxcs+sji +Mho6/4UIyYOf8kpIEFR3N+2ivEC+5BB09+Rbu7nzifmPQdjH5FCQNYA+HLhNkNPU +98OwoX6EyneSMSy4kLGCenROmxMmtNVQZlR4rmA= +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com TLS ECC Root CA 2022 O=SSL Corporation +# Subject: CN=SSL.com TLS ECC Root CA 2022 O=SSL Corporation +# Label: "SSL.com TLS ECC Root CA 2022" +# Serial: 26605119622390491762507526719404364228 +# MD5 Fingerprint: 99:d7:5c:f1:51:36:cc:e9:ce:d9:19:2e:77:71:56:c5 +# SHA1 Fingerprint: 9f:5f:d9:1a:54:6d:f5:0c:71:f0:ee:7a:bd:17:49:98:84:73:e2:39 +# SHA256 Fingerprint: c3:2f:fd:9f:46:f9:36:d1:6c:36:73:99:09:59:43:4b:9a:d6:0a:af:bb:9e:7c:f3:36:54:f1:44:cc:1b:a1:43 +-----BEGIN CERTIFICATE----- +MIICOjCCAcCgAwIBAgIQFAP1q/s3ixdAW+JDsqXRxDAKBggqhkjOPQQDAzBOMQsw +CQYDVQQGEwJVUzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQDDBxT +U0wuY29tIFRMUyBFQ0MgUm9vdCBDQSAyMDIyMB4XDTIyMDgyNTE2MzM0OFoXDTQ2 +MDgxOTE2MzM0N1owTjELMAkGA1UEBhMCVVMxGDAWBgNVBAoMD1NTTCBDb3Jwb3Jh +dGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgRUNDIFJvb3QgQ0EgMjAyMjB2MBAG +ByqGSM49AgEGBSuBBAAiA2IABEUpNXP6wrgjzhR9qLFNoFs27iosU8NgCTWyJGYm +acCzldZdkkAZDsalE3D07xJRKF3nzL35PIXBz5SQySvOkkJYWWf9lCcQZIxPBLFN +SeR7T5v15wj4A4j3p8OSSxlUgaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSME +GDAWgBSJjy+j6CugFFR781a4Jl9nOAuc0DAdBgNVHQ4EFgQUiY8vo+groBRUe/NW +uCZfZzgLnNAwDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMDA2gAMGUCMFXjIlbp +15IkWE8elDIPDAI2wv2sdDJO4fscgIijzPvX6yv/N33w7deedWo1dlJF4AIxAMeN +b0Igj762TVntd00pxCAgRWSGOlDGxK0tk/UYfXLtqc/ErFc2KAhl3zx5Zn6g6g== +-----END CERTIFICATE----- + +# Issuer: CN=Atos TrustedRoot Root CA ECC TLS 2021 O=Atos +# Subject: CN=Atos TrustedRoot Root CA ECC TLS 2021 O=Atos +# Label: "Atos TrustedRoot Root CA ECC TLS 2021" +# Serial: 81873346711060652204712539181482831616 +# MD5 Fingerprint: 16:9f:ad:f1:70:ad:79:d6:ed:29:b4:d1:c5:79:70:a8 +# SHA1 Fingerprint: 9e:bc:75:10:42:b3:02:f3:81:f4:f7:30:62:d4:8f:c3:a7:51:b2:dd +# SHA256 Fingerprint: b2:fa:e5:3e:14:cc:d7:ab:92:12:06:47:01:ae:27:9c:1d:89:88:fa:cb:77:5f:a8:a0:08:91:4e:66:39:88:a8 +-----BEGIN CERTIFICATE----- +MIICFTCCAZugAwIBAgIQPZg7pmY9kGP3fiZXOATvADAKBggqhkjOPQQDAzBMMS4w +LAYDVQQDDCVBdG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgRUNDIFRMUyAyMDIxMQ0w +CwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0yMTA0MjIwOTI2MjNaFw00MTA0 +MTcwOTI2MjJaMEwxLjAsBgNVBAMMJUF0b3MgVHJ1c3RlZFJvb3QgUm9vdCBDQSBF +Q0MgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNVBAYTAkRFMHYwEAYHKoZI +zj0CAQYFK4EEACIDYgAEloZYKDcKZ9Cg3iQZGeHkBQcfl+3oZIK59sRxUM6KDP/X +tXa7oWyTbIOiaG6l2b4siJVBzV3dscqDY4PMwL502eCdpO5KTlbgmClBk1IQ1SQ4 +AjJn8ZQSb+/Xxd4u/RmAo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR2 +KCXWfeBmmnoJsmo7jjPXNtNPojAOBgNVHQ8BAf8EBAMCAYYwCgYIKoZIzj0EAwMD +aAAwZQIwW5kp85wxtolrbNa9d+F851F+uDrNozZffPc8dz7kUK2o59JZDCaOMDtu +CCrCp1rIAjEAmeMM56PDr9NJLkaCI2ZdyQAUEv049OGYa3cpetskz2VAv9LcjBHo +9H1/IISpQuQo +-----END CERTIFICATE----- + +# Issuer: CN=Atos TrustedRoot Root CA RSA TLS 2021 O=Atos +# Subject: CN=Atos TrustedRoot Root CA RSA TLS 2021 O=Atos +# Label: "Atos TrustedRoot Root CA RSA TLS 2021" +# Serial: 111436099570196163832749341232207667876 +# MD5 Fingerprint: d4:d3:46:b8:9a:c0:9c:76:5d:9e:3a:c3:b9:99:31:d2 +# SHA1 Fingerprint: 18:52:3b:0d:06:37:e4:d6:3a:df:23:e4:98:fb:5b:16:fb:86:74:48 +# SHA256 Fingerprint: 81:a9:08:8e:a5:9f:b3:64:c5:48:a6:f8:55:59:09:9b:6f:04:05:ef:bf:18:e5:32:4e:c9:f4:57:ba:00:11:2f +-----BEGIN CERTIFICATE----- +MIIFZDCCA0ygAwIBAgIQU9XP5hmTC/srBRLYwiqipDANBgkqhkiG9w0BAQwFADBM +MS4wLAYDVQQDDCVBdG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgUlNBIFRMUyAyMDIx +MQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0yMTA0MjIwOTIxMTBaFw00 +MTA0MTcwOTIxMDlaMEwxLjAsBgNVBAMMJUF0b3MgVHJ1c3RlZFJvb3QgUm9vdCBD +QSBSU0EgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNVBAYTAkRFMIICIjAN +BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtoAOxHm9BYx9sKOdTSJNy/BBl01Z +4NH+VoyX8te9j2y3I49f1cTYQcvyAh5x5en2XssIKl4w8i1mx4QbZFc4nXUtVsYv +Ye+W/CBGvevUez8/fEc4BKkbqlLfEzfTFRVOvV98r61jx3ncCHvVoOX3W3WsgFWZ +kmGbzSoXfduP9LVq6hdKZChmFSlsAvFr1bqjM9xaZ6cF4r9lthawEO3NUDPJcFDs +GY6wx/J0W2tExn2WuZgIWWbeKQGb9Cpt0xU6kGpn8bRrZtkh68rZYnxGEFzedUln +nkL5/nWpo63/dgpnQOPF943HhZpZnmKaau1Fh5hnstVKPNe0OwANwI8f4UDErmwh +3El+fsqyjW22v5MvoVw+j8rtgI5Y4dtXz4U2OLJxpAmMkokIiEjxQGMYsluMWuPD +0xeqqxmjLBvk1cbiZnrXghmmOxYsL3GHX0WelXOTwkKBIROW1527k2gV+p2kHYzy +geBYBr3JtuP2iV2J+axEoctr+hbxx1A9JNr3w+SH1VbxT5Aw+kUJWdo0zuATHAR8 +ANSbhqRAvNncTFd+rrcztl524WWLZt+NyteYr842mIycg5kDcPOvdO3GDjbnvezB +c6eUWsuSZIKmAMFwoW4sKeFYV+xafJlrJaSQOoD0IJ2azsct+bJLKZWD6TWNp0lI +pw9MGZHQ9b8Q4HECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU +dEmZ0f+0emhFdcN+tNzMzjkz2ggwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB +DAUAA4ICAQAjQ1MkYlxt/T7Cz1UAbMVWiLkO3TriJQ2VSpfKgInuKs1l+NsW4AmS +4BjHeJi78+xCUvuppILXTdiK/ORO/auQxDh1MoSf/7OwKwIzNsAQkG8dnK/haZPs +o0UvFJ/1TCplQ3IM98P4lYsU84UgYt1UU90s3BiVaU+DR3BAM1h3Egyi61IxHkzJ +qM7F78PRreBrAwA0JrRUITWXAdxfG/F851X6LWh3e9NpzNMOa7pNdkTWwhWaJuyw +xfW70Xp0wmzNxbVe9kzmWy2B27O3Opee7c9GslA9hGCZcbUztVdF5kJHdWoOsAgM +rr3e97sPWD2PAzHoPYJQyi9eDF20l74gNAf0xBLh7tew2VktafcxBPTy+av5EzH4 +AXcOPUIjJsyacmdRIXrMPIWo6iFqO9taPKU0nprALN+AnCng33eU0aKAQv9qTFsR +0PXNor6uzFFcw9VUewyu1rkGd4Di7wcaaMxZUa1+XGdrudviB0JbuAEFWDlN5LuY +o7Ey7Nmj1m+UI/87tyll5gfp77YZ6ufCOB0yiJA8EytuzO+rdwY0d4RPcuSBhPm5 +dDTedk+SKlOxJTnbPP/lPqYO5Wue/9vsL3SD3460s6neFE3/MaNFcyT6lSnMEpcE +oji2jbDwN/zIIX8/syQbPYtuzE2wFg2WHYMfRsCbvUOZ58SWLs5fyQ== +-----END CERTIFICATE----- + +# Issuer: CN=TrustAsia Global Root CA G3 O=TrustAsia Technologies, Inc. +# Subject: CN=TrustAsia Global Root CA G3 O=TrustAsia Technologies, Inc. +# Label: "TrustAsia Global Root CA G3" +# Serial: 576386314500428537169965010905813481816650257167 +# MD5 Fingerprint: 30:42:1b:b7:bb:81:75:35:e4:16:4f:53:d2:94:de:04 +# SHA1 Fingerprint: 63:cf:b6:c1:27:2b:56:e4:88:8e:1c:23:9a:b6:2e:81:47:24:c3:c7 +# SHA256 Fingerprint: e0:d3:22:6a:eb:11:63:c2:e4:8f:f9:be:3b:50:b4:c6:43:1b:e7:bb:1e:ac:c5:c3:6b:5d:5e:c5:09:03:9a:08 +-----BEGIN CERTIFICATE----- +MIIFpTCCA42gAwIBAgIUZPYOZXdhaqs7tOqFhLuxibhxkw8wDQYJKoZIhvcNAQEM +BQAwWjELMAkGA1UEBhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dp +ZXMsIEluYy4xJDAiBgNVBAMMG1RydXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHMzAe +Fw0yMTA1MjAwMjEwMTlaFw00NjA1MTkwMjEwMTlaMFoxCzAJBgNVBAYTAkNOMSUw +IwYDVQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMSQwIgYDVQQDDBtU +cnVzdEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzMwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQDAMYJhkuSUGwoqZdC+BqmHO1ES6nBBruL7dOoKjbmzTNyPtxNS +T1QY4SxzlZHFZjtqz6xjbYdT8PfxObegQ2OwxANdV6nnRM7EoYNl9lA+sX4WuDqK +AtCWHwDNBSHvBm3dIZwZQ0WhxeiAysKtQGIXBsaqvPPW5vxQfmZCHzyLpnl5hkA1 +nyDvP+uLRx+PjsXUjrYsyUQE49RDdT/VP68czH5GX6zfZBCK70bwkPAPLfSIC7Ep +qq+FqklYqL9joDiR5rPmd2jE+SoZhLsO4fWvieylL1AgdB4SQXMeJNnKziyhWTXA +yB1GJ2Faj/lN03J5Zh6fFZAhLf3ti1ZwA0pJPn9pMRJpxx5cynoTi+jm9WAPzJMs +hH/x/Gr8m0ed262IPfN2dTPXS6TIi/n1Q1hPy8gDVI+lhXgEGvNz8teHHUGf59gX +zhqcD0r83ERoVGjiQTz+LISGNzzNPy+i2+f3VANfWdP3kXjHi3dqFuVJhZBFcnAv +kV34PmVACxmZySYgWmjBNb9Pp1Hx2BErW+Canig7CjoKH8GB5S7wprlppYiU5msT +f9FkPz2ccEblooV7WIQn3MSAPmeamseaMQ4w7OYXQJXZRe0Blqq/DPNL0WP3E1jA +uPP6Z92bfW1K/zJMtSU7/xxnD4UiWQWRkUF3gdCFTIcQcf+eQxuulXUtgQIDAQAB +o2MwYTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEDk5PIj7zjKsK5Xf/Ih +MBY027ySMB0GA1UdDgQWBBRA5OTyI+84yrCuV3/yITAWNNu8kjAOBgNVHQ8BAf8E +BAMCAQYwDQYJKoZIhvcNAQEMBQADggIBACY7UeFNOPMyGLS0XuFlXsSUT9SnYaP4 +wM8zAQLpw6o1D/GUE3d3NZ4tVlFEbuHGLige/9rsR82XRBf34EzC4Xx8MnpmyFq2 +XFNFV1pF1AWZLy4jVe5jaN/TG3inEpQGAHUNcoTpLrxaatXeL1nHo+zSh2bbt1S1 +JKv0Q3jbSwTEb93mPmY+KfJLaHEih6D4sTNjduMNhXJEIlU/HHzp/LgV6FL6qj6j +ITk1dImmasI5+njPtqzn59ZW/yOSLlALqbUHM/Q4X6RJpstlcHboCoWASzY9M/eV +VHUl2qzEc4Jl6VL1XP04lQJqaTDFHApXB64ipCz5xUG3uOyfT0gA+QEEVcys+TIx +xHWVBqB/0Y0n3bOppHKH/lmLmnp0Ft0WpWIp6zqW3IunaFnT63eROfjXy9mPX1on +AX1daBli2MjN9LdyR75bl87yraKZk62Uy5P2EgmVtqvXO9A/EcswFi55gORngS1d +7XB4tmBZrOFdRWOPyN9yaFvqHbgB8X7754qz41SgOAngPN5C8sLtLpvzHzW2Ntjj +gKGLzZlkD8Kqq7HK9W+eQ42EVJmzbsASZthwEPEGNTNDqJwuuhQxzhB/HIbjj9LV ++Hfsm6vxL2PZQl/gZ4FkkfGXL/xuJvYz+NO1+MRiqzFRJQJ6+N1rZdVtTTDIZbpo +FGWsJwt0ivKH +-----END CERTIFICATE----- + +# Issuer: CN=TrustAsia Global Root CA G4 O=TrustAsia Technologies, Inc. +# Subject: CN=TrustAsia Global Root CA G4 O=TrustAsia Technologies, Inc. +# Label: "TrustAsia Global Root CA G4" +# Serial: 451799571007117016466790293371524403291602933463 +# MD5 Fingerprint: 54:dd:b2:d7:5f:d8:3e:ed:7c:e0:0b:2e:cc:ed:eb:eb +# SHA1 Fingerprint: 57:73:a5:61:5d:80:b2:e6:ac:38:82:fc:68:07:31:ac:9f:b5:92:5a +# SHA256 Fingerprint: be:4b:56:cb:50:56:c0:13:6a:52:6d:f4:44:50:8d:aa:36:a0:b5:4f:42:e4:ac:38:f7:2a:f4:70:e4:79:65:4c +-----BEGIN CERTIFICATE----- +MIICVTCCAdygAwIBAgIUTyNkuI6XY57GU4HBdk7LKnQV1tcwCgYIKoZIzj0EAwMw +WjELMAkGA1UEBhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dpZXMs +IEluYy4xJDAiBgNVBAMMG1RydXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHNDAeFw0y +MTA1MjAwMjEwMjJaFw00NjA1MTkwMjEwMjJaMFoxCzAJBgNVBAYTAkNOMSUwIwYD +VQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMSQwIgYDVQQDDBtUcnVz +dEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATx +s8045CVD5d4ZCbuBeaIVXxVjAd7Cq92zphtnS4CDr5nLrBfbK5bKfFJV4hrhPVbw +LxYI+hW8m7tH5j/uqOFMjPXTNvk4XatwmkcN4oFBButJ+bAp3TPsUKV/eSm4IJij +YzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUpbtKl86zK3+kMd6Xg1mD +pm9xy94wHQYDVR0OBBYEFKW7SpfOsyt/pDHel4NZg6ZvccveMA4GA1UdDwEB/wQE +AwIBBjAKBggqhkjOPQQDAwNnADBkAjBe8usGzEkxn0AAbbd+NvBNEU/zy4k6LHiR +UKNbwMp1JvK/kF0LgoxgKJ/GcJpo5PECMFxYDlZ2z1jD1xCMuo6u47xkdUfFVZDj +/bpV6wfEU6s3qe4hsiFbYI89MvHVI5TWWA== +-----END CERTIFICATE----- + +# Issuer: CN=CommScope Public Trust ECC Root-01 O=CommScope +# Subject: CN=CommScope Public Trust ECC Root-01 O=CommScope +# Label: "CommScope Public Trust ECC Root-01" +# Serial: 385011430473757362783587124273108818652468453534 +# MD5 Fingerprint: 3a:40:a7:fc:03:8c:9c:38:79:2f:3a:a2:6c:b6:0a:16 +# SHA1 Fingerprint: 07:86:c0:d8:dd:8e:c0:80:98:06:98:d0:58:7a:ef:de:a6:cc:a2:5d +# SHA256 Fingerprint: 11:43:7c:da:7b:b4:5e:41:36:5f:45:b3:9a:38:98:6b:0d:e0:0d:ef:34:8e:0c:7b:b0:87:36:33:80:0b:c3:8b +-----BEGIN CERTIFICATE----- +MIICHTCCAaOgAwIBAgIUQ3CCd89NXTTxyq4yLzf39H91oJ4wCgYIKoZIzj0EAwMw +TjELMAkGA1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29t +bVNjb3BlIFB1YmxpYyBUcnVzdCBFQ0MgUm9vdC0wMTAeFw0yMTA0MjgxNzM1NDNa +Fw00NjA0MjgxNzM1NDJaME4xCzAJBgNVBAYTAlVTMRIwEAYDVQQKDAlDb21tU2Nv +cGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3QgRUNDIFJvb3QtMDEw +djAQBgcqhkjOPQIBBgUrgQQAIgNiAARLNumuV16ocNfQj3Rid8NeeqrltqLxeP0C +flfdkXmcbLlSiFS8LwS+uM32ENEp7LXQoMPwiXAZu1FlxUOcw5tjnSCDPgYLpkJE +hRGnSjot6dZoL0hOUysHP029uax3OVejQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSOB2LAUN3GGQYARnQE9/OufXVNMDAKBggq +hkjOPQQDAwNoADBlAjEAnDPfQeMjqEI2Jpc1XHvr20v4qotzVRVcrHgpD7oh2MSg +2NED3W3ROT3Ek2DS43KyAjB8xX6I01D1HiXo+k515liWpDVfG2XqYZpwI7UNo5uS +Um9poIyNStDuiw7LR47QjRE= +-----END CERTIFICATE----- + +# Issuer: CN=CommScope Public Trust ECC Root-02 O=CommScope +# Subject: CN=CommScope Public Trust ECC Root-02 O=CommScope +# Label: "CommScope Public Trust ECC Root-02" +# Serial: 234015080301808452132356021271193974922492992893 +# MD5 Fingerprint: 59:b0:44:d5:65:4d:b8:5c:55:19:92:02:b6:d1:94:b2 +# SHA1 Fingerprint: 3c:3f:ef:57:0f:fe:65:93:86:9e:a0:fe:b0:f6:ed:8e:d1:13:c7:e5 +# SHA256 Fingerprint: 2f:fb:7f:81:3b:bb:b3:c8:9a:b4:e8:16:2d:0f:16:d7:15:09:a8:30:cc:9d:73:c2:62:e5:14:08:75:d1:ad:4a +-----BEGIN CERTIFICATE----- +MIICHDCCAaOgAwIBAgIUKP2ZYEFHpgE6yhR7H+/5aAiDXX0wCgYIKoZIzj0EAwMw +TjELMAkGA1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29t +bVNjb3BlIFB1YmxpYyBUcnVzdCBFQ0MgUm9vdC0wMjAeFw0yMTA0MjgxNzQ0NTRa +Fw00NjA0MjgxNzQ0NTNaME4xCzAJBgNVBAYTAlVTMRIwEAYDVQQKDAlDb21tU2Nv +cGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3QgRUNDIFJvb3QtMDIw +djAQBgcqhkjOPQIBBgUrgQQAIgNiAAR4MIHoYx7l63FRD/cHB8o5mXxO1Q/MMDAL +j2aTPs+9xYa9+bG3tD60B8jzljHz7aRP+KNOjSkVWLjVb3/ubCK1sK9IRQq9qEmU +v4RDsNuESgMjGWdqb8FuvAY5N9GIIvejQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTmGHX/72DehKT1RsfeSlXjMjZ59TAKBggq +hkjOPQQDAwNnADBkAjAmc0l6tqvmSfR9Uj/UQQSugEODZXW5hYA4O9Zv5JOGq4/n +ich/m35rChJVYaoR4HkCMHfoMXGsPHED1oQmHhS48zs73u1Z/GtMMH9ZzkXpc2AV +mkzw5l4lIhVtwodZ0LKOag== +-----END CERTIFICATE----- + +# Issuer: CN=CommScope Public Trust RSA Root-01 O=CommScope +# Subject: CN=CommScope Public Trust RSA Root-01 O=CommScope +# Label: "CommScope Public Trust RSA Root-01" +# Serial: 354030733275608256394402989253558293562031411421 +# MD5 Fingerprint: 0e:b4:15:bc:87:63:5d:5d:02:73:d4:26:38:68:73:d8 +# SHA1 Fingerprint: 6d:0a:5f:f7:b4:23:06:b4:85:b3:b7:97:64:fc:ac:75:f5:33:f2:93 +# SHA256 Fingerprint: 02:bd:f9:6e:2a:45:dd:9b:f1:8f:c7:e1:db:df:21:a0:37:9b:a3:c9:c2:61:03:44:cf:d8:d6:06:fe:c1:ed:81 +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIUPgNJgXUWdDGOTKvVxZAplsU5EN0wDQYJKoZIhvcNAQEL +BQAwTjELMAkGA1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwi +Q29tbVNjb3BlIFB1YmxpYyBUcnVzdCBSU0EgUm9vdC0wMTAeFw0yMTA0MjgxNjQ1 +NTRaFw00NjA0MjgxNjQ1NTNaME4xCzAJBgNVBAYTAlVTMRIwEAYDVQQKDAlDb21t +U2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3QgUlNBIFJvb3Qt +MDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwSGWjDR1C45FtnYSk +YZYSwu3D2iM0GXb26v1VWvZVAVMP8syMl0+5UMuzAURWlv2bKOx7dAvnQmtVzslh +suitQDy6uUEKBU8bJoWPQ7VAtYXR1HHcg0Hz9kXHgKKEUJdGzqAMxGBWBB0HW0al +DrJLpA6lfO741GIDuZNqihS4cPgugkY4Iw50x2tBt9Apo52AsH53k2NC+zSDO3Oj +WiE260f6GBfZumbCk6SP/F2krfxQapWsvCQz0b2If4b19bJzKo98rwjyGpg/qYFl +P8GMicWWMJoKz/TUyDTtnS+8jTiGU+6Xn6myY5QXjQ/cZip8UlF1y5mO6D1cv547 +KI2DAg+pn3LiLCuz3GaXAEDQpFSOm117RTYm1nJD68/A6g3czhLmfTifBSeolz7p +UcZsBSjBAg/pGG3svZwG1KdJ9FQFa2ww8esD1eo9anbCyxooSU1/ZOD6K9pzg4H/ +kQO9lLvkuI6cMmPNn7togbGEW682v3fuHX/3SZtS7NJ3Wn2RnU3COS3kuoL4b/JO +Hg9O5j9ZpSPcPYeoKFgo0fEbNttPxP/hjFtyjMcmAyejOQoBqsCyMWCDIqFPEgkB +Ea801M/XrmLTBQe0MXXgDW1XT2mH+VepuhX2yFJtocucH+X8eKg1mp9BFM6ltM6U +CBwJrVbl2rZJmkrqYxhTnCwuwwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUN12mmnQywsL5x6YVEFm45P3luG0wDQYJ +KoZIhvcNAQELBQADggIBAK+nz97/4L1CjU3lIpbfaOp9TSp90K09FlxD533Ahuh6 +NWPxzIHIxgvoLlI1pKZJkGNRrDSsBTtXAOnTYtPZKdVUvhwQkZyybf5Z/Xn36lbQ +nmhUQo8mUuJM3y+Xpi/SB5io82BdS5pYV4jvguX6r2yBS5KPQJqTRlnLX3gWsWc+ +QgvfKNmwrZggvkN80V4aCRckjXtdlemrwWCrWxhkgPut4AZ9HcpZuPN4KWfGVh2v +trV0KnahP/t1MJ+UXjulYPPLXAziDslg+MkfFoom3ecnf+slpoq9uC02EJqxWE2a +aE9gVOX2RhOOiKy8IUISrcZKiX2bwdgt6ZYD9KJ0DLwAHb/WNyVntHKLr4W96ioD +j8z7PEQkguIBpQtZtjSNMgsSDesnwv1B10A8ckYpwIzqug/xBpMu95yo9GA+o/E4 +Xo4TwbM6l4c/ksp4qRyv0LAbJh6+cOx69TOY6lz/KwsETkPdY34Op054A5U+1C0w +lREQKC6/oAI+/15Z0wUOlV9TRe9rh9VIzRamloPh37MG88EU26fsHItdkJANclHn +YfkUyq+Dj7+vsQpZXdxc1+SWrVtgHdqul7I52Qb1dgAT+GhMIbA1xNxVssnBQVoc +icCMb3SgazNNtQEo/a2tiRc7ppqEvOuM6sRxJKi6KfkIsidWNTJf6jn7MZrVGczw +-----END CERTIFICATE----- + +# Issuer: CN=CommScope Public Trust RSA Root-02 O=CommScope +# Subject: CN=CommScope Public Trust RSA Root-02 O=CommScope +# Label: "CommScope Public Trust RSA Root-02" +# Serial: 480062499834624527752716769107743131258796508494 +# MD5 Fingerprint: e1:29:f9:62:7b:76:e2:96:6d:f3:d4:d7:0f:ae:1f:aa +# SHA1 Fingerprint: ea:b0:e2:52:1b:89:93:4c:11:68:f2:d8:9a:ac:22:4c:a3:8a:57:ae +# SHA256 Fingerprint: ff:e9:43:d7:93:42:4b:4f:7c:44:0c:1c:3d:64:8d:53:63:f3:4b:82:dc:87:aa:7a:9f:11:8f:c5:de:e1:01:f1 +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIUVBa/O345lXGN0aoApYYNK496BU4wDQYJKoZIhvcNAQEL +BQAwTjELMAkGA1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwi +Q29tbVNjb3BlIFB1YmxpYyBUcnVzdCBSU0EgUm9vdC0wMjAeFw0yMTA0MjgxNzE2 +NDNaFw00NjA0MjgxNzE2NDJaME4xCzAJBgNVBAYTAlVTMRIwEAYDVQQKDAlDb21t +U2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3QgUlNBIFJvb3Qt +MDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDh+g77aAASyE3VrCLE +NQE7xVTlWXZjpX/rwcRqmL0yjReA61260WI9JSMZNRTpf4mnG2I81lDnNJUDMrG0 +kyI9p+Kx7eZ7Ti6Hmw0zdQreqjXnfuU2mKKuJZ6VszKWpCtYHu8//mI0SFHRtI1C +rWDaSWqVcN3SAOLMV2MCe5bdSZdbkk6V0/nLKR8YSvgBKtJjCW4k6YnS5cciTNxz +hkcAqg2Ijq6FfUrpuzNPDlJwnZXjfG2WWy09X6GDRl224yW4fKcZgBzqZUPckXk2 +LHR88mcGyYnJ27/aaL8j7dxrrSiDeS/sOKUNNwFnJ5rpM9kzXzehxfCrPfp4sOcs +n/Y+n2Dg70jpkEUeBVF4GiwSLFworA2iI540jwXmojPOEXcT1A6kHkIfhs1w/tku +FT0du7jyU1fbzMZ0KZwYszZ1OC4PVKH4kh+Jlk+71O6d6Ts2QrUKOyrUZHk2EOH5 +kQMreyBUzQ0ZGshBMjTRsJnhkB4BQDa1t/qp5Xd1pCKBXbCL5CcSD1SIxtuFdOa3 +wNemKfrb3vOTlycEVS8KbzfFPROvCgCpLIscgSjX74Yxqa7ybrjKaixUR9gqiC6v +wQcQeKwRoi9C8DfF8rhW3Q5iLc4tVn5V8qdE9isy9COoR+jUKgF4z2rDN6ieZdIs +5fq6M8EGRPbmz6UNp2YINIos8wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUR9DnsSL/nSz12Vdgs7GxcJXvYXowDQYJ +KoZIhvcNAQELBQADggIBAIZpsU0v6Z9PIpNojuQhmaPORVMbc0RTAIFhzTHjCLqB +KCh6krm2qMhDnscTJk3C2OVVnJJdUNjCK9v+5qiXz1I6JMNlZFxHMaNlNRPDk7n3 ++VGXu6TwYofF1gbTl4MgqX67tiHCpQ2EAOHyJxCDut0DgdXdaMNmEMjRdrSzbyme +APnCKfWxkxlSaRosTKCL4BWaMS/TiJVZbuXEs1DIFAhKm4sTg7GkcrI7djNB3Nyq +pgdvHSQSn8h2vS/ZjvQs7rfSOBAkNlEv41xdgSGn2rtO/+YHqP65DSdsu3BaVXoT +6fEqSWnHX4dXTEN5bTpl6TBcQe7rd6VzEojov32u5cSoHw2OHG1QAk8mGEPej1WF +sQs3BWDJVTkSBKEqz3EWnzZRSb9wO55nnPt7eck5HHisd5FUmrh1CoFSl+NmYWvt +PjgelmFV4ZFUjO2MJB+ByRCac5krFk5yAD9UG/iNuovnFNa2RU9g7Jauwy8CTl2d +lklyALKrdVwPaFsdZcJfMw8eD/A7hvWwTruc9+olBdytoptLFwG+Qt81IR2tq670 +v64fG9PiO/yzcnMcmyiQiRM9HcEARwmWmjgb3bHPDcK0RPOWlc4yOo80nOAXx17O +rg3bhzjlP1v9mxnhMUF6cKojawHhRUzNlM47ni3niAIi9G7oyOzWPPO5std3eqx7 +-----END CERTIFICATE----- + +# Issuer: CN=Telekom Security TLS ECC Root 2020 O=Deutsche Telekom Security GmbH +# Subject: CN=Telekom Security TLS ECC Root 2020 O=Deutsche Telekom Security GmbH +# Label: "Telekom Security TLS ECC Root 2020" +# Serial: 72082518505882327255703894282316633856 +# MD5 Fingerprint: c1:ab:fe:6a:10:2c:03:8d:bc:1c:22:32:c0:85:a7:fd +# SHA1 Fingerprint: c0:f8:96:c5:a9:3b:01:06:21:07:da:18:42:48:bc:e9:9d:88:d5:ec +# SHA256 Fingerprint: 57:8a:f4:de:d0:85:3f:4e:59:98:db:4a:ea:f9:cb:ea:8d:94:5f:60:b6:20:a3:8d:1a:3c:13:b2:bc:7b:a8:e1 +-----BEGIN CERTIFICATE----- +MIICQjCCAcmgAwIBAgIQNjqWjMlcsljN0AFdxeVXADAKBggqhkjOPQQDAzBjMQsw +CQYDVQQGEwJERTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0eSBH +bWJIMSswKQYDVQQDDCJUZWxla29tIFNlY3VyaXR5IFRMUyBFQ0MgUm9vdCAyMDIw +MB4XDTIwMDgyNTA3NDgyMFoXDTQ1MDgyNTIzNTk1OVowYzELMAkGA1UEBhMCREUx +JzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJpdHkgR21iSDErMCkGA1UE +AwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgRUNDIFJvb3QgMjAyMDB2MBAGByqGSM49 +AgEGBSuBBAAiA2IABM6//leov9Wq9xCazbzREaK9Z0LMkOsVGJDZos0MKiXrPk/O +tdKPD/M12kOLAoC+b1EkHQ9rK8qfwm9QMuU3ILYg/4gND21Ju9sGpIeQkpT0CdDP +f8iAC8GXs7s1J8nCG6NCMEAwHQYDVR0OBBYEFONyzG6VmUex5rNhTNHLq+O6zd6f +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2cA +MGQCMHVSi7ekEE+uShCLsoRbQuHmKjYC2qBuGT8lv9pZMo7k+5Dck2TOrbRBR2Di +z6fLHgIwN0GMZt9Ba9aDAEH9L1r3ULRn0SyocddDypwnJJGDSA3PzfdUga/sf+Rn +27iQ7t0l +-----END CERTIFICATE----- + +# Issuer: CN=Telekom Security TLS RSA Root 2023 O=Deutsche Telekom Security GmbH +# Subject: CN=Telekom Security TLS RSA Root 2023 O=Deutsche Telekom Security GmbH +# Label: "Telekom Security TLS RSA Root 2023" +# Serial: 44676229530606711399881795178081572759 +# MD5 Fingerprint: bf:5b:eb:54:40:cd:48:71:c4:20:8d:7d:de:0a:42:f2 +# SHA1 Fingerprint: 54:d3:ac:b3:bd:57:56:f6:85:9d:ce:e5:c3:21:e2:d4:ad:83:d0:93 +# SHA256 Fingerprint: ef:c6:5c:ad:bb:59:ad:b6:ef:e8:4d:a2:23:11:b3:56:24:b7:1b:3b:1e:a0:da:8b:66:55:17:4e:c8:97:86:46 +-----BEGIN CERTIFICATE----- +MIIFszCCA5ugAwIBAgIQIZxULej27HF3+k7ow3BXlzANBgkqhkiG9w0BAQwFADBj +MQswCQYDVQQGEwJERTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0 +eSBHbWJIMSswKQYDVQQDDCJUZWxla29tIFNlY3VyaXR5IFRMUyBSU0EgUm9vdCAy +MDIzMB4XDTIzMDMyODEyMTY0NVoXDTQ4MDMyNzIzNTk1OVowYzELMAkGA1UEBhMC +REUxJzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJpdHkgR21iSDErMCkG +A1UEAwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgUlNBIFJvb3QgMjAyMzCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAO01oYGA88tKaVvC+1GDrib94W7zgRJ9 +cUD/h3VCKSHtgVIs3xLBGYSJwb3FKNXVS2xE1kzbB5ZKVXrKNoIENqil/Cf2SfHV +cp6R+SPWcHu79ZvB7JPPGeplfohwoHP89v+1VmLhc2o0mD6CuKyVU/QBoCcHcqMA +U6DksquDOFczJZSfvkgdmOGjup5czQRxUX11eKvzWarE4GC+j4NSuHUaQTXtvPM6 +Y+mpFEXX5lLRbtLevOP1Czvm4MS9Q2QTps70mDdsipWol8hHD/BeEIvnHRz+sTug +BTNoBUGCwQMrAcjnj02r6LX2zWtEtefdi+zqJbQAIldNsLGyMcEWzv/9FIS3R/qy +8XDe24tsNlikfLMR0cN3f1+2JeANxdKz+bi4d9s3cXFH42AYTyS2dTd4uaNir73J +co4vzLuu2+QVUhkHM/tqty1LkCiCc/4YizWN26cEar7qwU02OxY2kTLvtkCJkUPg +8qKrBC7m8kwOFjQgrIfBLX7JZkcXFBGk8/ehJImr2BrIoVyxo/eMbcgByU/J7MT8 +rFEz0ciD0cmfHdRHNCk+y7AO+oMLKFjlKdw/fKifybYKu6boRhYPluV75Gp6SG12 +mAWl3G0eQh5C2hrgUve1g8Aae3g1LDj1H/1Joy7SWWO/gLCMk3PLNaaZlSJhZQNg ++y+TS/qanIA7AgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtqeX +gj10hZv3PJ+TmpV5dVKMbUcwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS2 +p5eCPXSFm/c8n5OalXl1UoxtRzANBgkqhkiG9w0BAQwFAAOCAgEAqMxhpr51nhVQ +pGv7qHBFfLp+sVr8WyP6Cnf4mHGCDG3gXkaqk/QeoMPhk9tLrbKmXauw1GLLXrtm +9S3ul0A8Yute1hTWjOKWi0FpkzXmuZlrYrShF2Y0pmtjxrlO8iLpWA1WQdH6DErw +M807u20hOq6OcrXDSvvpfeWxm4bu4uB9tPcy/SKE8YXJN3nptT+/XOR0so8RYgDd +GGah2XsjX/GO1WfoVNpbOms2b/mBsTNHM3dA+VKq3dSDz4V4mZqTuXNnQkYRIer+ +CqkbGmVps4+uFrb2S1ayLfmlyOw7YqPta9BO1UAJpB+Y1zqlklkg5LB9zVtzaL1t +xKITDmcZuI1CfmwMmm6gJC3VRRvcxAIU/oVbZZfKTpBQCHpCNfnqwmbU+AGuHrS+ +w6jv/naaoqYfRvaE7fzbzsQCzndILIyy7MMAo+wsVRjBfhnu4S/yrYObnqsZ38aK +L4x35bcF7DvB7L6Gs4a8wPfc5+pbrrLMtTWGS9DiP7bY+A4A7l3j941Y/8+LN+lj +X273CXE2whJdV/LItM3z7gLfEdxquVeEHVlNjM7IDiPCtyaaEBRx/pOyiriA8A4Q +ntOoUAw3gi/q4Iqd4Sw5/7W0cwDk90imc6y/st53BIe0o82bNSQ3+pCTE4FCxpgm +dTdmQRCsu/WU48IxK63nI1bMNSWSs1A= +-----END CERTIFICATE----- + +# Issuer: CN=FIRMAPROFESIONAL CA ROOT-A WEB O=Firmaprofesional SA +# Subject: CN=FIRMAPROFESIONAL CA ROOT-A WEB O=Firmaprofesional SA +# Label: "FIRMAPROFESIONAL CA ROOT-A WEB" +# Serial: 65916896770016886708751106294915943533 +# MD5 Fingerprint: 82:b2:ad:45:00:82:b0:66:63:f8:5f:c3:67:4e:ce:a3 +# SHA1 Fingerprint: a8:31:11:74:a6:14:15:0d:ca:77:dd:0e:e4:0c:5d:58:fc:a0:72:a5 +# SHA256 Fingerprint: be:f2:56:da:f2:6e:9c:69:bd:ec:16:02:35:97:98:f3:ca:f7:18:21:a0:3e:01:82:57:c5:3c:65:61:7f:3d:4a +-----BEGIN CERTIFICATE----- +MIICejCCAgCgAwIBAgIQMZch7a+JQn81QYehZ1ZMbTAKBggqhkjOPQQDAzBuMQsw +CQYDVQQGEwJFUzEcMBoGA1UECgwTRmlybWFwcm9mZXNpb25hbCBTQTEYMBYGA1UE +YQwPVkFURVMtQTYyNjM0MDY4MScwJQYDVQQDDB5GSVJNQVBST0ZFU0lPTkFMIENB +IFJPT1QtQSBXRUIwHhcNMjIwNDA2MDkwMTM2WhcNNDcwMzMxMDkwMTM2WjBuMQsw +CQYDVQQGEwJFUzEcMBoGA1UECgwTRmlybWFwcm9mZXNpb25hbCBTQTEYMBYGA1UE +YQwPVkFURVMtQTYyNjM0MDY4MScwJQYDVQQDDB5GSVJNQVBST0ZFU0lPTkFMIENB +IFJPT1QtQSBXRUIwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARHU+osEaR3xyrq89Zf +e9MEkVz6iMYiuYMQYneEMy3pA4jU4DP37XcsSmDq5G+tbbT4TIqk5B/K6k84Si6C +cyvHZpsKjECcfIr28jlgst7L7Ljkb+qbXbdTkBgyVcUgt5SjYzBhMA8GA1UdEwEB +/wQFMAMBAf8wHwYDVR0jBBgwFoAUk+FDY1w8ndYn81LsF7Kpryz3dvgwHQYDVR0O +BBYEFJPhQ2NcPJ3WJ/NS7Beyqa8s93b4MA4GA1UdDwEB/wQEAwIBBjAKBggqhkjO +PQQDAwNoADBlAjAdfKR7w4l1M+E7qUW/Runpod3JIha3RxEL2Jq68cgLcFBTApFw +hVmpHqTm6iMxoAACMQD94vizrxa5HnPEluPBMBnYfubDl94cT7iJLzPrSA8Z94dG +XSaQpYXFuXqUPoeovQA= +-----END CERTIFICATE----- + +# Issuer: CN=TWCA CYBER Root CA O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA CYBER Root CA O=TAIWAN-CA OU=Root CA +# Label: "TWCA CYBER Root CA" +# Serial: 85076849864375384482682434040119489222 +# MD5 Fingerprint: 0b:33:a0:97:52:95:d4:a9:fd:bb:db:6e:a3:55:5b:51 +# SHA1 Fingerprint: f6:b1:1c:1a:83:38:e9:7b:db:b3:a8:c8:33:24:e0:2d:9c:7f:26:66 +# SHA256 Fingerprint: 3f:63:bb:28:14:be:17:4e:c8:b6:43:9c:f0:8d:6d:56:f0:b7:c4:05:88:3a:56:48:a3:34:42:4d:6b:3e:c5:58 +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIQQAE0jMIAAAAAAAAAATzyxjANBgkqhkiG9w0BAQwFADBQ +MQswCQYDVQQGEwJUVzESMBAGA1UEChMJVEFJV0FOLUNBMRAwDgYDVQQLEwdSb290 +IENBMRswGQYDVQQDExJUV0NBIENZQkVSIFJvb3QgQ0EwHhcNMjIxMTIyMDY1NDI5 +WhcNNDcxMTIyMTU1OTU5WjBQMQswCQYDVQQGEwJUVzESMBAGA1UEChMJVEFJV0FO +LUNBMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJUV0NBIENZQkVSIFJvb3Qg +Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDG+Moe2Qkgfh1sTs6P +40czRJzHyWmqOlt47nDSkvgEs1JSHWdyKKHfi12VCv7qze33Kc7wb3+szT3vsxxF +avcokPFhV8UMxKNQXd7UtcsZyoC5dc4pztKFIuwCY8xEMCDa6pFbVuYdHNWdZsc/ +34bKS1PE2Y2yHer43CdTo0fhYcx9tbD47nORxc5zb87uEB8aBs/pJ2DFTxnk684i +JkXXYJndzk834H/nY62wuFm40AZoNWDTNq5xQwTxaWV4fPMf88oon1oglWa0zbfu +j3ikRRjpJi+NmykosaS3Om251Bw4ckVYsV7r8Cibt4LK/c/WMw+f+5eesRycnupf +Xtuq3VTpMCEobY5583WSjCb+3MX2w7DfRFlDo7YDKPYIMKoNM+HvnKkHIuNZW0CP +2oi3aQiotyMuRAlZN1vH4xfyIutuOVLF3lSnmMlLIJXcRolftBL5hSmO68gnFSDA +S9TMfAxsNAwmmyYxpjyn9tnQS6Jk/zuZQXLB4HCX8SS7K8R0IrGsayIyJNN4KsDA +oS/xUgXJP+92ZuJF2A09rZXIx4kmyA+upwMu+8Ff+iDhcK2wZSA3M2Cw1a/XDBzC +kHDXShi8fgGwsOsVHkQGzaRP6AzRwyAQ4VRlnrZR0Bp2a0JaWHY06rc3Ga4udfmW +5cFZ95RXKSWNOkyrTZpB0F8mAwIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBSdhWEUfMFib5do5E83QOGt4A1WNzAd +BgNVHQ4EFgQUnYVhFHzBYm+XaORPN0DhreANVjcwDQYJKoZIhvcNAQEMBQADggIB +AGSPesRiDrWIzLjHhg6hShbNcAu3p4ULs3a2D6f/CIsLJc+o1IN1KriWiLb73y0t +tGlTITVX1olNc79pj3CjYcya2x6a4CD4bLubIp1dhDGaLIrdaqHXKGnK/nZVekZn +68xDiBaiA9a5F/gZbG0jAn/xX9AKKSM70aoK7akXJlQKTcKlTfjF/biBzysseKNn +TKkHmvPfXvt89YnNdJdhEGoHK4Fa0o635yDRIG4kqIQnoVesqlVYL9zZyvpoBJ7t +RCT5dEA7IzOrg1oYJkK2bVS1FmAwbLGg+LhBoF1JSdJlBTrq/p1hvIbZv97Tujqx +f36SNI7JAG7cmL3c7IAFrQI932XtCwP39xaEBDG6k5TY8hL4iuO/Qq+n1M0RFxbI +Qh0UqEL20kCGoE8jypZFVmAGzbdVAaYBlGX+bgUJurSkquLvWL69J1bY73NxW0Qz +8ppy6rBePm6pUlvscG21h483XjyMnM7k8M4MZ0HMzvaAq07MTFb1wWFZk7Q+ptq4 +NxKfKjLji7gh7MMrZQzvIt6IKTtM1/r+t+FHvpw+PoP7UV31aPcuIYXcv/Fa4nzX +xeSDwWrruoBa3lwtcHb4yOWHh8qgnaHlIhInD0Q9HWzq1MKLL295q39QpsQZp6F6 +t5b5wR9iWqJDB0BeJsas7a5wFsWqynKKTbDPAYsDP27X +-----END CERTIFICATE----- + +# Issuer: CN=SecureSign Root CA12 O=Cybertrust Japan Co., Ltd. +# Subject: CN=SecureSign Root CA12 O=Cybertrust Japan Co., Ltd. +# Label: "SecureSign Root CA12" +# Serial: 587887345431707215246142177076162061960426065942 +# MD5 Fingerprint: c6:89:ca:64:42:9b:62:08:49:0b:1e:7f:e9:07:3d:e8 +# SHA1 Fingerprint: 7a:22:1e:3d:de:1b:06:ac:9e:c8:47:70:16:8e:3c:e5:f7:6b:06:f4 +# SHA256 Fingerprint: 3f:03:4b:b5:70:4d:44:b2:d0:85:45:a0:20:57:de:93:eb:f3:90:5f:ce:72:1a:cb:c7:30:c0:6d:da:ee:90:4e +-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUZvnHwa/swlG07VOX5uaCwysckBYwDQYJKoZIhvcNAQEL +BQAwUTELMAkGA1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28u +LCBMdGQuMR0wGwYDVQQDExRTZWN1cmVTaWduIFJvb3QgQ0ExMjAeFw0yMDA0MDgw +NTM2NDZaFw00MDA0MDgwNTM2NDZaMFExCzAJBgNVBAYTAkpQMSMwIQYDVQQKExpD +eWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2VjdXJlU2lnbiBS +b290IENBMTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6OcE3emhF +KxS06+QT61d1I02PJC0W6K6OyX2kVzsqdiUzg2zqMoqUm048luT9Ub+ZyZN+v/mt +p7JIKwccJ/VMvHASd6SFVLX9kHrko+RRWAPNEHl57muTH2SOa2SroxPjcf59q5zd +J1M3s6oYwlkm7Fsf0uZlfO+TvdhYXAvA42VvPMfKWeP+bl+sg779XSVOKik71gur +FzJ4pOE+lEa+Ym6b3kaosRbnhW70CEBFEaCeVESE99g2zvVQR9wsMJvuwPWW0v4J +hscGWa5Pro4RmHvzC1KqYiaqId+OJTN5lxZJjfU+1UefNzFJM3IFTQy2VYzxV4+K +h9GtxRESOaCtAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBRXNPN0zwRL1SXm8UC2LEzZLemgrTANBgkqhkiG9w0BAQsF +AAOCAQEAPrvbFxbS8hQBICw4g0utvsqFepq2m2um4fylOqyttCg6r9cBg0krY6Ld +mmQOmFxv3Y67ilQiLUoT865AQ9tPkbeGGuwAtEGBpE/6aouIs3YIcipJQMPTw4WJ +mBClnW8Zt7vPemVV2zfrPIpyMpcemik+rY3moxtt9XUa5rBouVui7mlHJzWhhpmA +8zNL4WukJsPvdFlseqJkth5Ew1DgDzk9qTPxpfPSvWKErI4cqc1avTc7bgoitPQV +55FYxTpE05Uo2cBl6XLK0A+9H7MV2anjpEcJnuDLN/v9vZfVvhgaaaI5gdka9at/ +yOPiZwud9AzqVN/Ssq+xIvEg37xEHA== +-----END CERTIFICATE----- + +# Issuer: CN=SecureSign Root CA14 O=Cybertrust Japan Co., Ltd. +# Subject: CN=SecureSign Root CA14 O=Cybertrust Japan Co., Ltd. +# Label: "SecureSign Root CA14" +# Serial: 575790784512929437950770173562378038616896959179 +# MD5 Fingerprint: 71:0d:72:fa:92:19:65:5e:89:04:ac:16:33:f0:bc:d5 +# SHA1 Fingerprint: dd:50:c0:f7:79:b3:64:2e:74:a2:b8:9d:9f:d3:40:dd:bb:f0:f2:4f +# SHA256 Fingerprint: 4b:00:9c:10:34:49:4f:9a:b5:6b:ba:3b:a1:d6:27:31:fc:4d:20:d8:95:5a:dc:ec:10:a9:25:60:72:61:e3:38 +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIUZNtaDCBO6Ncpd8hQJ6JaJ90t8sswDQYJKoZIhvcNAQEM +BQAwUTELMAkGA1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28u +LCBMdGQuMR0wGwYDVQQDExRTZWN1cmVTaWduIFJvb3QgQ0ExNDAeFw0yMDA0MDgw +NzA2MTlaFw00NTA0MDgwNzA2MTlaMFExCzAJBgNVBAYTAkpQMSMwIQYDVQQKExpD +eWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2VjdXJlU2lnbiBS +b290IENBMTQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDF0nqh1oq/ +FjHQmNE6lPxauG4iwWL3pwon71D2LrGeaBLwbCRjOfHw3xDG3rdSINVSW0KZnvOg +vlIfX8xnbacuUKLBl422+JX1sLrcneC+y9/3OPJH9aaakpUqYllQC6KxNedlsmGy +6pJxaeQp8E+BgQQ8sqVb1MWoWWd7VRxJq3qdwudzTe/NCcLEVxLbAQ4jeQkHO6Lo +/IrPj8BGJJw4J+CDnRugv3gVEOuGTgpa/d/aLIJ+7sr2KeH6caH3iGicnPCNvg9J +kdjqOvn90Ghx2+m1K06Ckm9mH+Dw3EzsytHqunQG+bOEkJTRX45zGRBdAuVwpcAQ +0BB8b8VYSbSwbprafZX1zNoCr7gsfXmPvkPx+SgojQlD+Ajda8iLLCSxjVIHvXib +y8posqTdDEx5YMaZ0ZPxMBoH064iwurO8YQJzOAUbn8/ftKChazcqRZOhaBgy/ac +18izju3Gm5h1DVXoX+WViwKkrkMpKBGk5hIwAUt1ax5mnXkvpXYvHUC0bcl9eQjs +0Wq2XSqypWa9a4X0dFbD9ed1Uigspf9mR6XU/v6eVL9lfgHWMI+lNpyiUBzuOIAB +SMbHdPTGrMNASRZhdCyvjG817XsYAFs2PJxQDcqSMxDxJklt33UkN4Ii1+iW/RVL +ApY+B3KVfqs9TC7XyvDf4Fg/LS8EmjijAQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUBpOjCl4oaTeqYR3r6/wtbyPk +86AwDQYJKoZIhvcNAQEMBQADggIBAJaAcgkGfpzMkwQWu6A6jZJOtxEaCnFxEM0E +rX+lRVAQZk5KQaID2RFPeje5S+LGjzJmdSX7684/AykmjbgWHfYfM25I5uj4V7Ib +ed87hwriZLoAymzvftAj63iP/2SbNDefNWWipAA9EiOWWF3KY4fGoweITedpdopT +zfFP7ELyk+OZpDc8h7hi2/DsHzc/N19DzFGdtfCXwreFamgLRB7lUe6TzktuhsHS +DCRZNhqfLJGP4xjblJUK7ZGqDpncllPjYYPGFrojutzdfhrGe0K22VoF3Jpf1d+4 +2kd92jjbrDnVHmtsKheMYc2xbXIBw8MgAGJoFjHVdqqGuw6qnsb58Nn4DSEC5MUo +FlkRudlpcyqSeLiSV5sI8jrlL5WwWLdrIBRtFO8KvH7YVdiI2i/6GaX7i+B/OfVy +K4XELKzvGUWSTLNhB9xNH27SgRNcmvMSZ4PPmz+Ln52kuaiWA3rF7iDeM9ovnhp6 +dB7h7sxaOgTdsxoEqBRjrLdHEoOabPXm6RUVkRqEGQ6UROcSjiVbgGcZ3GOTEAtl +Lor6CZpO2oYofaphNdgOpygau1LgePhsumywbrmHXumZNTfxPWQrqaA0k89jL9WB +365jJ6UeTo3cKXhZ+PmhIIynJkBugnLNeLLIjzwec+fBH7/PzqUqm9tEZDKgu39c +JRNItX+S +-----END CERTIFICATE----- + +# Issuer: CN=SecureSign Root CA15 O=Cybertrust Japan Co., Ltd. +# Subject: CN=SecureSign Root CA15 O=Cybertrust Japan Co., Ltd. +# Label: "SecureSign Root CA15" +# Serial: 126083514594751269499665114766174399806381178503 +# MD5 Fingerprint: 13:30:fc:c4:62:a6:a9:de:b5:c1:68:af:b5:d2:31:47 +# SHA1 Fingerprint: cb:ba:83:c8:c1:5a:5d:f1:f9:73:6f:ca:d7:ef:28:13:06:4a:07:7d +# SHA256 Fingerprint: e7:78:f0:f0:95:fe:84:37:29:cd:1a:00:82:17:9e:53:14:a9:c2:91:44:28:05:e1:fb:1d:8f:b6:b8:88:6c:3a +-----BEGIN CERTIFICATE----- +MIICIzCCAamgAwIBAgIUFhXHw9hJp75pDIqI7fBw+d23PocwCgYIKoZIzj0EAwMw +UTELMAkGA1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBM +dGQuMR0wGwYDVQQDExRTZWN1cmVTaWduIFJvb3QgQ0ExNTAeFw0yMDA0MDgwODMy +NTZaFw00NTA0MDgwODMyNTZaMFExCzAJBgNVBAYTAkpQMSMwIQYDVQQKExpDeWJl +cnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2VjdXJlU2lnbiBSb290 +IENBMTUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQLUHSNZDKZmbPSYAi4Io5GdCx4 +wCtELW1fHcmuS1Iggz24FG1Th2CeX2yF2wYUleDHKP+dX+Sq8bOLbe1PL0vJSpSR +ZHX+AezB2Ot6lHhWGENfa4HL9rzatAy2KZMIaY+jQjBAMA8GA1UdEwEB/wQFMAMB +Af8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTrQciu/NWeUUj1vYv0hyCTQSvT +9DAKBggqhkjOPQQDAwNoADBlAjEA2S6Jfl5OpBEHvVnCB96rMjhTKkZEBhd6zlHp +4P9mLQlO4E/0BdGF9jVg3PVys0Z9AjBEmEYagoUeYWmJSwdLZrWeqrqgHkHZAXQ6 +bkU6iYAZezKYVWOr62Nuk22rGwlgMU4= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST BR Root CA 2 2023 O=D-Trust GmbH +# Subject: CN=D-TRUST BR Root CA 2 2023 O=D-Trust GmbH +# Label: "D-TRUST BR Root CA 2 2023" +# Serial: 153168538924886464690566649552453098598 +# MD5 Fingerprint: e1:09:ed:d3:60:d4:56:1b:47:1f:b7:0c:5f:1b:5f:85 +# SHA1 Fingerprint: 2d:b0:70:ee:71:94:af:69:68:17:db:79:ce:58:9f:a0:6b:96:f7:87 +# SHA256 Fingerprint: 05:52:e6:f8:3f:df:65:e8:fa:96:70:e6:66:df:28:a4:e2:13:40:b5:10:cb:e5:25:66:f9:7c:4f:b9:4b:2b:d1 +-----BEGIN CERTIFICATE----- +MIIFqTCCA5GgAwIBAgIQczswBEhb2U14LnNLyaHcZjANBgkqhkiG9w0BAQ0FADBI +MQswCQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlE +LVRSVVNUIEJSIFJvb3QgQ0EgMiAyMDIzMB4XDTIzMDUwOTA4NTYzMVoXDTM4MDUw +OTA4NTYzMFowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEi +MCAGA1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDIgMjAyMzCCAiIwDQYJKoZIhvcN +AQEBBQADggIPADCCAgoCggIBAK7/CVmRgApKaOYkP7in5Mg6CjoWzckjYaCTcfKr +i3OPoGdlYNJUa2NRb0kz4HIHE304zQaSBylSa053bATTlfrdTIzZXcFhfUvnKLNE +gXtRr90zsWh81k5M/itoucpmacTsXld/9w3HnDY25QdgrMBM6ghs7wZ8T1soegj8 +k12b9py0i4a6Ibn08OhZWiihNIQaJZG2tY/vsvmA+vk9PBFy2OMvhnbFeSzBqZCT +Rphny4NqoFAjpzv2gTng7fC5v2Xx2Mt6++9zA84A9H3X4F07ZrjcjrqDy4d2A/wl +2ecjbwb9Z/Pg/4S8R7+1FhhGaRTMBffb00msa8yr5LULQyReS2tNZ9/WtT5PeB+U +cSTq3nD88ZP+npNa5JRal1QMNXtfbO4AHyTsA7oC9Xb0n9Sa7YUsOCIvx9gvdhFP +/Wxc6PWOJ4d/GUohR5AdeY0cW/jPSoXk7bNbjb7EZChdQcRurDhaTyN0dKkSw/bS +uREVMweR2Ds3OmMwBtHFIjYoYiMQ4EbMl6zWK11kJNXuHA7e+whadSr2Y23OC0K+ +0bpwHJwh5Q8xaRfX/Aq03u2AnMuStIv13lmiWAmlY0cL4UEyNEHZmrHZqLAbWt4N +DfTisl01gLmB1IRpkQLLddCNxbU9CZEJjxShFHR5PtbJFR2kWVki3PaKRT08EtY+ +XTIvAgMBAAGjgY4wgYswDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUZ5Dw1t61 +GNVGKX5cq/ieCLxklRAwDgYDVR0PAQH/BAQDAgEGMEkGA1UdHwRCMEAwPqA8oDqG +OGh0dHA6Ly9jcmwuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3RfYnJfcm9vdF9jYV8y +XzIwMjMuY3JsMA0GCSqGSIb3DQEBDQUAA4ICAQA097N3U9swFrktpSHxQCF16+tI +FoE9c+CeJyrrd6kTpGoKWloUMz1oH4Guaf2Mn2VsNELZLdB/eBaxOqwjMa1ef67n +riv6uvw8l5VAk1/DLQOj7aRvU9f6QA4w9QAgLABMjDu0ox+2v5Eyq6+SmNMW5tTR +VFxDWy6u71cqqLRvpO8NVhTaIasgdp4D/Ca4nj8+AybmTNudX0KEPUUDAxxZiMrc +LmEkWqTqJwtzEr5SswrPMhfiHocaFpVIbVrg0M8JkiZmkdijYQ6qgYF/6FKC0ULn +4B0Y+qSFNueG4A3rvNTJ1jxD8V1Jbn6Bm2m1iWKPiFLY1/4nwSPFyysCu7Ff/vtD +hQNGvl3GyiEm/9cCnnRK3PgTFbGBVzbLZVzRHTF36SXDw7IyN9XxmAnkbWOACKsG +koHU6XCPpz+y7YaMgmo1yEJagtFSGkUPFaUA8JR7ZSdXOUPPfH/mvTWze/EZTN46 +ls/pdu4D58JDUjxqgejBWoC9EV2Ta/vH5mQ/u2kc6d0li690yVRAysuTEwrt+2aS +Ecr1wPrYg1UDfNPFIkZ1cGt5SAYqgpq/5usWDiJFAbzdNpQ0qTUmiteXue4Icr80 +knCDgKs4qllo3UCkGJCy89UDyibK79XH4I9TjvAA46jtn/mtd+ArY0+ew+43u3gJ +hJ65bvspmZDogNOfJA== +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST EV Root CA 2 2023 O=D-Trust GmbH +# Subject: CN=D-TRUST EV Root CA 2 2023 O=D-Trust GmbH +# Label: "D-TRUST EV Root CA 2 2023" +# Serial: 139766439402180512324132425437959641711 +# MD5 Fingerprint: 96:b4:78:09:f0:09:cb:77:eb:bb:1b:4d:6f:36:bc:b6 +# SHA1 Fingerprint: a5:5b:d8:47:6c:8f:19:f7:4c:f4:6d:6b:b6:c2:79:82:22:df:54:8b +# SHA256 Fingerprint: 8e:82:21:b2:e7:d4:00:78:36:a1:67:2f:0d:cc:29:9c:33:bc:07:d3:16:f1:32:fa:1a:20:6d:58:71:50:f1:ce +-----BEGIN CERTIFICATE----- +MIIFqTCCA5GgAwIBAgIQaSYJfoBLTKCnjHhiU19abzANBgkqhkiG9w0BAQ0FADBI +MQswCQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlE +LVRSVVNUIEVWIFJvb3QgQ0EgMiAyMDIzMB4XDTIzMDUwOTA5MTAzM1oXDTM4MDUw +OTA5MTAzMlowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEi +MCAGA1UEAxMZRC1UUlVTVCBFViBSb290IENBIDIgMjAyMzCCAiIwDQYJKoZIhvcN +AQEBBQADggIPADCCAgoCggIBANiOo4mAC7JXUtypU0w3uX9jFxPvp1sjW2l1sJkK +F8GLxNuo4MwxusLyzV3pt/gdr2rElYfXR8mV2IIEUD2BCP/kPbOx1sWy/YgJ25yE +7CUXFId/MHibaljJtnMoPDT3mfd/06b4HEV8rSyMlD/YZxBTfiLNTiVR8CUkNRFe +EMbsh2aJgWi6zCudR3Mfvc2RpHJqnKIbGKBv7FD0fUDCqDDPvXPIEysQEx6Lmqg6 +lHPTGGkKSv/BAQP/eX+1SH977ugpbzZMlWGG2Pmic4ruri+W7mjNPU0oQvlFKzIb +RlUWaqZLKfm7lVa/Rh3sHZMdwGWyH6FDrlaeoLGPaxK3YG14C8qKXO0elg6DpkiV +jTujIcSuWMYAsoS0I6SWhjW42J7YrDRJmGOVxcttSEfi8i4YHtAxq9107PncjLgc +jmgjutDzUNzPZY9zOjLHfP7KgiJPvo5iR2blzYfi6NUPGJ/lBHJLRjwQ8kTCZFZx +TnXonMkmdMV9WdEKWw9t/p51HBjGGjp82A0EzM23RWV6sY+4roRIPrN6TagD4uJ+ +ARZZaBhDM7DS3LAaQzXupdqpRlyuhoFBAUp0JuyfBr/CBTdkdXgpaP3F9ev+R/nk +hbDhezGdpn9yo7nELC7MmVcOIQxFAZRl62UJxmMiCzNJkkg8/M3OsD6Onov4/knF +NXJHAgMBAAGjgY4wgYswDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUqvyREBuH +kV8Wub9PS5FeAByxMoAwDgYDVR0PAQH/BAQDAgEGMEkGA1UdHwRCMEAwPqA8oDqG +OGh0dHA6Ly9jcmwuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3RfZXZfcm9vdF9jYV8y +XzIwMjMuY3JsMA0GCSqGSIb3DQEBDQUAA4ICAQCTy6UfmRHsmg1fLBWTxj++EI14 +QvBukEdHjqOSMo1wj/Zbjb6JzkcBahsgIIlbyIIQbODnmaprxiqgYzWRaoUlrRc4 +pZt+UPJ26oUFKidBK7GB0aL2QHWpDsvxVUjY7NHss+jOFKE17MJeNRqrphYBBo7q +3C+jisosketSjl8MmxfPy3MHGcRqwnNU73xDUmPBEcrCRbH0O1P1aa4846XerOhU +t7KR/aypH/KH5BfGSah82ApB9PI+53c0BFLd6IHyTS9URZ0V4U/M5d40VxDJI3IX +cI1QcB9WbMy5/zpaT2N6w25lBx2Eof+pDGOJbbJAiDnXH3dotfyc1dZnaVuodNv8 +ifYbMvekJKZ2t0dT741Jj6m2g1qllpBFYfXeA08mD6iL8AOWsKwV0HFaanuU5nCT +2vFp4LJiTZ6P/4mdm13NRemUAiKN4DV/6PEEeXFsVIP4M7kFMhtYVRFP0OUnR3Hs +7dpn1mKmS00PaaLJvOwiS5THaJQXfuKOKD62xur1NGyfN4gHONuGcfrNlUhDbqNP +gofXNJhuS5N5YHVpD/Aa1VP6IQzCP+k/HxiMkl14p3ZnGbuy6n/pcAlWVqOwDAst +Nl7F6cTVg8uGF5csbBNvh1qvSaYd2804BC5f4ko1Di1L+KIkBI3Y4WNeApI02phh +XBxvWHZks/wCuPWdCg== +-----END CERTIFICATE----- diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/certifi/core.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/certifi/core.py new file mode 100755 index 00000000..91f538bb --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/certifi/core.py @@ -0,0 +1,114 @@ +""" +certifi.py +~~~~~~~~~~ + +This module returns the installation location of cacert.pem or its contents. +""" +import sys +import atexit + +def exit_cacert_ctx() -> None: + _CACERT_CTX.__exit__(None, None, None) # type: ignore[union-attr] + + +if sys.version_info >= (3, 11): + + from importlib.resources import as_file, files + + _CACERT_CTX = None + _CACERT_PATH = None + + def where() -> str: + # This is slightly terrible, but we want to delay extracting the file + # in cases where we're inside of a zipimport situation until someone + # actually calls where(), but we don't want to re-extract the file + # on every call of where(), so we'll do it once then store it in a + # global variable. + global _CACERT_CTX + global _CACERT_PATH + if _CACERT_PATH is None: + # This is slightly janky, the importlib.resources API wants you to + # manage the cleanup of this file, so it doesn't actually return a + # path, it returns a context manager that will give you the path + # when you enter it and will do any cleanup when you leave it. In + # the common case of not needing a temporary file, it will just + # return the file system location and the __exit__() is a no-op. + # + # We also have to hold onto the actual context manager, because + # it will do the cleanup whenever it gets garbage collected, so + # we will also store that at the global level as well. + _CACERT_CTX = as_file(files("certifi").joinpath("cacert.pem")) + _CACERT_PATH = str(_CACERT_CTX.__enter__()) + atexit.register(exit_cacert_ctx) + + return _CACERT_PATH + + def contents() -> str: + return files("certifi").joinpath("cacert.pem").read_text(encoding="ascii") + +elif sys.version_info >= (3, 7): + + from importlib.resources import path as get_path, read_text + + _CACERT_CTX = None + _CACERT_PATH = None + + def where() -> str: + # This is slightly terrible, but we want to delay extracting the + # file in cases where we're inside of a zipimport situation until + # someone actually calls where(), but we don't want to re-extract + # the file on every call of where(), so we'll do it once then store + # it in a global variable. + global _CACERT_CTX + global _CACERT_PATH + if _CACERT_PATH is None: + # This is slightly janky, the importlib.resources API wants you + # to manage the cleanup of this file, so it doesn't actually + # return a path, it returns a context manager that will give + # you the path when you enter it and will do any cleanup when + # you leave it. In the common case of not needing a temporary + # file, it will just return the file system location and the + # __exit__() is a no-op. + # + # We also have to hold onto the actual context manager, because + # it will do the cleanup whenever it gets garbage collected, so + # we will also store that at the global level as well. + _CACERT_CTX = get_path("certifi", "cacert.pem") + _CACERT_PATH = str(_CACERT_CTX.__enter__()) + atexit.register(exit_cacert_ctx) + + return _CACERT_PATH + + def contents() -> str: + return read_text("certifi", "cacert.pem", encoding="ascii") + +else: + import os + import types + from typing import Union + + Package = Union[types.ModuleType, str] + Resource = Union[str, "os.PathLike"] + + # This fallback will work for Python versions prior to 3.7 that lack the + # importlib.resources module but relies on the existing `where` function + # so won't address issues with environments like PyOxidizer that don't set + # __file__ on modules. + def read_text( + package: Package, + resource: Resource, + encoding: str = 'utf-8', + errors: str = 'strict' + ) -> str: + with open(where(), encoding=encoding) as data: + return data.read() + + # If we don't have importlib.resources, then we will just do the old logic + # of assuming we're on the filesystem and munge the path directly. + def where() -> str: + f = os.path.dirname(__file__) + + return os.path.join(f, "cacert.pem") + + def contents() -> str: + return read_text("certifi", "cacert.pem", encoding="ascii") diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/certifi/py.typed b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/certifi/py.typed new file mode 100755 index 00000000..e69de29b diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer-2.0.12.dist-info/INSTALLER b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer-2.0.12.dist-info/INSTALLER new file mode 100755 index 00000000..a1b589e3 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer-2.0.12.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer-2.0.12.dist-info/LICENSE b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer-2.0.12.dist-info/LICENSE new file mode 100755 index 00000000..ad82355b --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer-2.0.12.dist-info/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 TAHRI Ahmed R. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer-2.0.12.dist-info/METADATA b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer-2.0.12.dist-info/METADATA new file mode 100755 index 00000000..1b04ed4c --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer-2.0.12.dist-info/METADATA @@ -0,0 +1,269 @@ +Metadata-Version: 2.1 +Name: charset-normalizer +Version: 2.0.12 +Summary: The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet. +Home-page: https://github.com/ousret/charset_normalizer +Author: Ahmed TAHRI @Ousret +Author-email: ahmed.tahri@cloudnursery.dev +License: MIT +Project-URL: Bug Reports, https://github.com/Ousret/charset_normalizer/issues +Project-URL: Documentation, https://charset-normalizer.readthedocs.io/en/latest +Keywords: encoding,i18n,txt,text,charset,charset-detector,normalization,unicode,chardet +Platform: UNKNOWN +Classifier: License :: OSI Approved :: MIT License +Classifier: Intended Audience :: Developers +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Topic :: Text Processing :: Linguistic +Classifier: Topic :: Utilities +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Typing :: Typed +Requires-Python: >=3.5.0 +Description-Content-Type: text/markdown +License-File: LICENSE +Provides-Extra: unicode_backport +Requires-Dist: unicodedata2 ; extra == 'unicode_backport' + + +

Charset Detection, for Everyone 👋

+ +

+ The Real First Universal Charset Detector
+ + + + + + + + Download Count Total + +

+ +> A library that helps you read text from an unknown charset encoding.
Motivated by `chardet`, +> I'm trying to resolve the issue by taking a new approach. +> All IANA character set names for which the Python core library provides codecs are supported. + +

+ >>>>> 👉 Try Me Online Now, Then Adopt Me 👈 <<<<< +

+ +This project offers you an alternative to **Universal Charset Encoding Detector**, also known as **Chardet**. + +| Feature | [Chardet](https://github.com/chardet/chardet) | Charset Normalizer | [cChardet](https://github.com/PyYoshi/cChardet) | +| ------------- | :-------------: | :------------------: | :------------------: | +| `Fast` | ❌
| ✅
| ✅
| +| `Universal**` | ❌ | ✅ | ❌ | +| `Reliable` **without** distinguishable standards | ❌ | ✅ | ✅ | +| `Reliable` **with** distinguishable standards | ✅ | ✅ | ✅ | +| `Free & Open` | ✅ | ✅ | ✅ | +| `License` | LGPL-2.1 | MIT | MPL-1.1 +| `Native Python` | ✅ | ✅ | ❌ | +| `Detect spoken language` | ❌ | ✅ | N/A | +| `Supported Encoding` | 30 | :tada: [93](https://charset-normalizer.readthedocs.io/en/latest/user/support.html#supported-encodings) | 40 + +

+Reading Normalized TextCat Reading Text + +*\*\* : They are clearly using specific code for a specific encoding even if covering most of used one*
+Did you got there because of the logs? See [https://charset-normalizer.readthedocs.io/en/latest/user/miscellaneous.html](https://charset-normalizer.readthedocs.io/en/latest/user/miscellaneous.html) + +## ⭐ Your support + +*Fork, test-it, star-it, submit your ideas! We do listen.* + +## ⚡ Performance + +This package offer better performance than its counterpart Chardet. Here are some numbers. + +| Package | Accuracy | Mean per file (ms) | File per sec (est) | +| ------------- | :-------------: | :------------------: | :------------------: | +| [chardet](https://github.com/chardet/chardet) | 92 % | 220 ms | 5 file/sec | +| charset-normalizer | **98 %** | **40 ms** | 25 file/sec | + +| Package | 99th percentile | 95th percentile | 50th percentile | +| ------------- | :-------------: | :------------------: | :------------------: | +| [chardet](https://github.com/chardet/chardet) | 1115 ms | 300 ms | 27 ms | +| charset-normalizer | 460 ms | 240 ms | 18 ms | + +Chardet's performance on larger file (1MB+) are very poor. Expect huge difference on large payload. + +> Stats are generated using 400+ files using default parameters. More details on used files, see GHA workflows. +> And yes, these results might change at any time. The dataset can be updated to include more files. +> The actual delays heavily depends on your CPU capabilities. The factors should remain the same. + +[cchardet](https://github.com/PyYoshi/cChardet) is a non-native (cpp binding) and unmaintained faster alternative with +a better accuracy than chardet but lower than this package. If speed is the most important factor, you should try it. + +## ✨ Installation + +Using PyPi for latest stable +```sh +pip install charset-normalizer -U +``` + +If you want a more up-to-date `unicodedata` than the one available in your Python setup. +```sh +pip install charset-normalizer[unicode_backport] -U +``` + +## 🚀 Basic Usage + +### CLI +This package comes with a CLI. + +``` +usage: normalizer [-h] [-v] [-a] [-n] [-m] [-r] [-f] [-t THRESHOLD] + file [file ...] + +The Real First Universal Charset Detector. Discover originating encoding used +on text file. Normalize text to unicode. + +positional arguments: + files File(s) to be analysed + +optional arguments: + -h, --help show this help message and exit + -v, --verbose Display complementary information about file if any. + Stdout will contain logs about the detection process. + -a, --with-alternative + Output complementary possibilities if any. Top-level + JSON WILL be a list. + -n, --normalize Permit to normalize input file. If not set, program + does not write anything. + -m, --minimal Only output the charset detected to STDOUT. Disabling + JSON output. + -r, --replace Replace file when trying to normalize it instead of + creating a new one. + -f, --force Replace file without asking if you are sure, use this + flag with caution. + -t THRESHOLD, --threshold THRESHOLD + Define a custom maximum amount of chaos allowed in + decoded content. 0. <= chaos <= 1. + --version Show version information and exit. +``` + +```bash +normalizer ./data/sample.1.fr.srt +``` + +:tada: Since version 1.4.0 the CLI produce easily usable stdout result in JSON format. + +```json +{ + "path": "/home/default/projects/charset_normalizer/data/sample.1.fr.srt", + "encoding": "cp1252", + "encoding_aliases": [ + "1252", + "windows_1252" + ], + "alternative_encodings": [ + "cp1254", + "cp1256", + "cp1258", + "iso8859_14", + "iso8859_15", + "iso8859_16", + "iso8859_3", + "iso8859_9", + "latin_1", + "mbcs" + ], + "language": "French", + "alphabets": [ + "Basic Latin", + "Latin-1 Supplement" + ], + "has_sig_or_bom": false, + "chaos": 0.149, + "coherence": 97.152, + "unicode_path": null, + "is_preferred": true +} +``` + +### Python +*Just print out normalized text* +```python +from charset_normalizer import from_path + +results = from_path('./my_subtitle.srt') + +print(str(results.best())) +``` + +*Normalize any text file* +```python +from charset_normalizer import normalize +try: + normalize('./my_subtitle.srt') # should write to disk my_subtitle-***.srt +except IOError as e: + print('Sadly, we are unable to perform charset normalization.', str(e)) +``` + +*Upgrade your code without effort* +```python +from charset_normalizer import detect +``` + +The above code will behave the same as **chardet**. We ensure that we offer the best (reasonable) BC result possible. + +See the docs for advanced usage : [readthedocs.io](https://charset-normalizer.readthedocs.io/en/latest/) + +## 😇 Why + +When I started using Chardet, I noticed that it was not suited to my expectations, and I wanted to propose a +reliable alternative using a completely different method. Also! I never back down on a good challenge! + +I **don't care** about the **originating charset** encoding, because **two different tables** can +produce **two identical rendered string.** +What I want is to get readable text, the best I can. + +In a way, **I'm brute forcing text decoding.** How cool is that ? 😎 + +Don't confuse package **ftfy** with charset-normalizer or chardet. ftfy goal is to repair unicode string whereas charset-normalizer to convert raw file in unknown encoding to unicode. + +## 🍰 How + + - Discard all charset encoding table that could not fit the binary content. + - Measure chaos, or the mess once opened (by chunks) with a corresponding charset encoding. + - Extract matches with the lowest mess detected. + - Additionally, we measure coherence / probe for a language. + +**Wait a minute**, what is chaos/mess and coherence according to **YOU ?** + +*Chaos :* I opened hundred of text files, **written by humans**, with the wrong encoding table. **I observed**, then +**I established** some ground rules about **what is obvious** when **it seems like** a mess. + I know that my interpretation of what is chaotic is very subjective, feel free to contribute in order to + improve or rewrite it. + +*Coherence :* For each language there is on earth, we have computed ranked letter appearance occurrences (the best we can). So I thought +that intel is worth something here. So I use those records against decoded text to check if I can detect intelligent design. + +## ⚡ Known limitations + + - Language detection is unreliable when text contains two or more languages sharing identical letters. (eg. HTML (english tags) + Turkish content (Sharing Latin characters)) + - Every charset detector heavily depends on sufficient content. In common cases, do not bother run detection on very tiny content. + +## 👤 Contributing + +Contributions, issues and feature requests are very much welcome.
+Feel free to check [issues page](https://github.com/ousret/charset_normalizer/issues) if you want to contribute. + +## 📝 License + +Copyright © 2019 [Ahmed TAHRI @Ousret](https://github.com/Ousret).
+This project is [MIT](https://github.com/Ousret/charset_normalizer/blob/master/LICENSE) licensed. + +Characters frequencies used in this project © 2012 [Denny Vrandečić](http://simia.net/letters/) + + diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer-2.0.12.dist-info/RECORD b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer-2.0.12.dist-info/RECORD new file mode 100755 index 00000000..2195329e --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer-2.0.12.dist-info/RECORD @@ -0,0 +1,22 @@ +../../bin/normalizer,sha256=ogoCfwDXKDWFNNXUVlqX7bTuxYv9AWxMpBCyxiw-pNk,247 +charset_normalizer-2.0.12.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +charset_normalizer-2.0.12.dist-info/LICENSE,sha256=6zGgxaT7Cbik4yBV0lweX5w1iidS_vPNcgIT0cz-4kE,1070 +charset_normalizer-2.0.12.dist-info/METADATA,sha256=eX-U3s7nb6wcvXZFyM1mdBf1yz4I0msVBgNvLEscAbo,11713 +charset_normalizer-2.0.12.dist-info/RECORD,, +charset_normalizer-2.0.12.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +charset_normalizer-2.0.12.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92 +charset_normalizer-2.0.12.dist-info/entry_points.txt,sha256=5AJq_EPtGGUwJPgQLnBZfbVr-FYCIwT0xP7dIEZO3NI,77 +charset_normalizer-2.0.12.dist-info/top_level.txt,sha256=7ASyzePr8_xuZWJsnqJjIBtyV8vhEo0wBCv1MPRRi3Q,19 +charset_normalizer/__init__.py,sha256=x2A2OW29MBcqdxsvy6t1wzkUlH3ma0guxL6ZCfS8J94,1790 +charset_normalizer/api.py,sha256=r__Wz85F5pYOkRwEY5imXY_pCZ2Nil1DkdaAJY7T5o0,20303 +charset_normalizer/assets/__init__.py,sha256=FPnfk8limZRb8ZIUQcTvPEcbuM1eqOdWGw0vbWGycDs,25485 +charset_normalizer/cd.py,sha256=a9Kzzd9tHl_W08ExbCFMmRJqdo2k7EBQ8Z_3y9DmYsg,11076 +charset_normalizer/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +charset_normalizer/cli/normalizer.py,sha256=LkeFIRc1l28rOgXpEby695x0bcKQv4D8z9FmA3Z2c3A,9364 +charset_normalizer/constant.py,sha256=51u_RS10I1vYVpBao__xHqf--HHNrR6me1A1se5r5Y0,19449 +charset_normalizer/legacy.py,sha256=XKeZOts_HdYQU_Jb3C9ZfOjY2CiUL132k9_nXer8gig,3384 +charset_normalizer/md.py,sha256=WEwnu2MyIiMeEaorRduqcTxGjIBclWIG3i-9_UL6LLs,18191 +charset_normalizer/models.py,sha256=XrGpVxfonhcilIWC1WeiP3-ZORGEe_RG3sgrfPLl9qM,13303 +charset_normalizer/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +charset_normalizer/utils.py,sha256=AWSL0z1B42IwdLfjX4ZMASA9cTUsTp0PweCdW98SI-4,9308 +charset_normalizer/version.py,sha256=uxO2cT0YIavQv4dQlNGmHPIOOwOa-exspxXi3IR7dck,80 diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer-2.0.12.dist-info/REQUESTED b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer-2.0.12.dist-info/REQUESTED new file mode 100755 index 00000000..e69de29b diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer-2.0.12.dist-info/WHEEL b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer-2.0.12.dist-info/WHEEL new file mode 100755 index 00000000..becc9a66 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer-2.0.12.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.37.1) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/__init__.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/__init__.py new file mode 100755 index 00000000..1aea851a --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/__init__.py @@ -0,0 +1,56 @@ +# -*- coding: utf_8 -*- +""" +Charset-Normalizer +~~~~~~~~~~~~~~ +The Real First Universal Charset Detector. +A library that helps you read text from an unknown charset encoding. +Motivated by chardet, This package is trying to resolve the issue by taking a new approach. +All IANA character set names for which the Python core library provides codecs are supported. + +Basic usage: + >>> from charset_normalizer import from_bytes + >>> results = from_bytes('Bсеки човек има право на образование. Oбразованието!'.encode('utf_8')) + >>> best_guess = results.best() + >>> str(best_guess) + 'Bсеки човек има право на образование. Oбразованието!' + +Others methods and usages are available - see the full documentation +at . +:copyright: (c) 2021 by Ahmed TAHRI +:license: MIT, see LICENSE for more details. +""" +import logging + +from .api import from_bytes, from_fp, from_path, normalize +from .legacy import ( + CharsetDetector, + CharsetDoctor, + CharsetNormalizerMatch, + CharsetNormalizerMatches, + detect, +) +from .models import CharsetMatch, CharsetMatches +from .utils import set_logging_handler +from .version import VERSION, __version__ + +__all__ = ( + "from_fp", + "from_path", + "from_bytes", + "normalize", + "detect", + "CharsetMatch", + "CharsetMatches", + "CharsetNormalizerMatch", + "CharsetNormalizerMatches", + "CharsetDetector", + "CharsetDoctor", + "__version__", + "VERSION", + "set_logging_handler", +) + +# Attach a NullHandler to the top level logger by default +# https://docs.python.org/3.3/howto/logging.html#configuring-logging-for-a-library + +logging.getLogger("charset_normalizer").addHandler(logging.NullHandler()) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/__pycache__/__init__.cpython-39.pyc b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/__pycache__/__init__.cpython-39.pyc new file mode 100755 index 0000000000000000000000000000000000000000..60fc7f889e5de14edc00c351d1d57a50489124d0 GIT binary patch literal 1734 zcmcIk&2QsG6t~lSI!)W%mZeA_4W~BJHiqSbqNO6c6m6w#irT`#7i(fqW2-YBYi67h z4hZ%Fe*x$1ky}ApQ6VV*f_t4Sr~MZ=Al}$%Q$(*=^3%MpdA~RB19v)(1z++*EB?D~ zS$`Vl_E!bwWBBFwKtjv2LOZNb+q1)kuu3az!CPQeugYp(jn%!nZGpT-8?5OyS<7oN z$8%WQYqLdfvC!3Nhb?(aY}s2b_y%2J_q=<>xk>M{Rd1E8d27J8yf=vb@+mqPB)yFihjGh;Y9C*XJBX1RW4e(WkMH3Voi$6Cxz= zGgtHpQ6x}Y^qc{r@kn4XMJmDyMTDjjO?id{!68!QONEXFX9y=KOHLAgnxLSJk4O^m zFiyrjXOF9Rf)xqTXj-U4q8_57D3&P2!3iD{1V<&NV2u=qyCtU+0wIk;X2kd@d}7oX zCFB(0G!+~N5dfqV?GA>6;$9pmA`m2x63mE1$6TP(C=R0Hs?Vk>;((6}a+4KYGl@em z1*{~H2!l>$Y03q_?K#d9EaL!W5-|21gwXc(cA4-jOFy}JWfU{xR;c~aR1taY0QqE8 zN%YYz-R8!Vt8epH`LFo}y814^%zriv$}jTY@^h5`arI4p4zf#>|8Drp{HH?lOJR8q z!i)S>5AEM2zIu^gzPr&Y-k)r4Wa`-eaHHG3Ml&K(`Qwa8184@VXM~$KCQ^ybxmh9p zzu`L0K9pNX#0XR=gi0h~`R-*=@C3&ck0?P~P~fsRjx#8J$b*cLL}3;4#DN}t94VE` zzUz)-6=kDdz?r+BNkNqR-=b~zoPNO5sffps>Z8q|iypoA=zY_0gNQ-L9u1xy>^glK z2PBcCkM?$t9u@$e?>^lb9_|!9#!O2=Qv*cVb6&$zu!gT~pxvr=%zTvnpc}>cIMuD< zkYW|-)=dX>YkGM$f!715JJ$kk=21VGvGdv9!zzgM`rUFObsb>AEO#q5Fnm@%iEa;} z?Pko6mUstz3i8*9%Twjbl)@%-i3(iUQqnydY)Kvn9AdE*Cjl&*L`ioPC$7T&wZ@-o xFdzBp^n*Kk)%C$FR=(d$r@HwV^2#XLu0VWgfLGU=m38~=#)`dYuT-jQ{{R}SViN!W literal 0 HcmV?d00001 diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/__pycache__/api.cpython-39.pyc b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/__pycache__/api.cpython-39.pyc new file mode 100755 index 0000000000000000000000000000000000000000..63bfa25252d493da2a68ba19ce9eec28a0fa52eb GIT binary patch literal 11266 zcmb_iO>7+3eV>_~o&DgFT7HufMU5y?A}w+$$+7GxiW6Cq9RjlCm{e6y>THHPv&#|Z zWA$cMGFP){5V}QBBrOZHK^x>i0Yw4#&_mFJYvj;FQJ_E%J{EJxAuZ6ThazYXb==tM z@BiNHE+tukl9t5I&U^3w{_p?w{vYqHIXGC9@aKQO;9S2hN&iBP{eJ^!d>NncJF+BM zk|n#6LEnlidy1iW86zW8JL9Te*2sFAp?NtY=jDyOEVauRQQd-9G>WoxQ}QQN$sXAL zEm@*}yJQsKl6>W~WMwVQ9rT8bA@6{3z$+VNZ`c?H-mH~#N4!yE)EhI#ym4dPn=mGL zf8L$+ri>~6UT~+qgT_Jcka38&i|&kf*f{LX8nfOJdhH*SXJ6PW)0kz zjpKNmzb_dl>=Sz@@xEY{?#uUOV3@TR?dR}+%GT`Cw3I%V>?QkCiL zBX;(waN~fRuqFXlv2?rmRJbX?O4?9w0+aFlYH28oydMCT2zz#D~@ln?bYjvdesS|B!9gbIe~AwNoLKC7Ud-Wh8b;M zb++sWP^*L)2Wr8l&1}DBSD6XeWCZVl<@k-NYx<3r*|5W8+}o&rM)!ngvxZ%L3_}R4 zL#r3BU97I%c;k)hZ?0dtoRrtEU$4Hh`dW4E%2#h(xpwJFGD1CTuV1`+wcnRrfAiv{ zE1duo)8r5$XR9r@dGoMSIX+O1qCA8C8}s6bl?Z^a0k3~wcZ>=fdH zrEDqe4>2-mWoQKR?w~c)pAqMqEIM$j%;yb9BQcx@xrT;h<#x0NR$G%|)ylVI_5o&& zMgvyCD(;QNDmE^;p#iJ(E+8(`imIdVAIsCt;@Piyao5Bxq_$-Ida`LI*Hbc}oS%dCZUxNwKmeQ7al3ZBU>H-lK^vsZ&hf zC%3Ylfw%}rH^n`?rvkHlUy&t$DjvYdyXnYCe*~PAVhv;8kETeTzGCG&gYh8ohTb2? zrM>BRkjqWTWfUz)Bs#bwb%rqe06t~R8OCP>pV4R-BV*Aa!uC5#XS_2Jk8^AaD|2k) z`>>6H`iUJm9>1?bZ&=IXqm~+%?#R0etMEQ(fkva5N$Ik*tG)dPoyl0m=o>MI-cHDf&qC@(VixAtdnIwjZeV$sr(IePD|E_tt_>o z#aOXUg5Sk>ijOW>`FN3A#uWAoK@e9btRqvBwXl86$KoQh8gp2DA{yyVz7;&OL4rFuUFJDH1? z;#1brm}D(mmG3DO0YLRQJl|kF!~M^>_!#`pIf_<*&rr02)oYz4v z$7mjJ|2EpgzKZ7v-&bOic&LV0q-{)}zJ9j0nfcF*B_-^j@-$$q8 z3ijja`1Ed`jiswRk5x`%-|`jWG1!UV_*6WNesIj~1w4~cZ#6`RT%b@i+ znh&mW=%M)cNbINi(QphoO-mH(6_f~w_meS6O=0Iah8Ol>`0HoGz-3&D$6$BJKz0i( zibrQ!UfY-C8?<6?=>WXzHaKwysJ}o8|vLG zb4eGupdM}7`i31wdNT+^XTt?dn&0ZJ&_r900>Ju~&2*%~da!ZJu0>&m<6o`Qd}ixT zsQUyKB9RW4bSI)7lO_ayLw9`3shLs00Bs^JW62PSX^qd@;HAroA7B90j6nR#wr<&V z6WEqGc#{Rlj6?md05fQ zSRrUrZ*akMg(23w2r!PH2K81GU`>-nPOXJ90SGJ`?S`$J^$4;!dwQNwdA1q0m~HWu zD*F0n5ZZc;p)g~Pshbc@trbRr=d`&j!96WeDRS|xgTj8s4mI$Mo#~gaUs=&C>WkXJ70C973n_86KKQSf(jzN z4$U-}=|{Fz(Jz_4?syP5gh1;yZH95rL}`+e{Z`P@J#$;Xiy0*EdH^2vZD>?CqlgMF z5QhFR@W6ggZUI{%O^~7kAZDu+lCW>zlB#ddp7* zL6*U5HBR-~>T57N!GO8#2Bx*r)wWK&Z|hX7!IWxt6ZH7{jrCWT&zxK0-_M_Y+zL4& z*V$mGvUMxKCLuOZoRXRN+xjLrb0JaA7=R%|lHIkI>wZNHK|ytr5q4KVHbU~T#a=j> z)@LUrSJ^t9LGL)3TuUwTRiKmo7?_@U0lO zoQNABsoJtPT8#!ueZl1=ZlD}3`bgp)CXuSTT-CtN2KFrIg&nj^*WDIV+n>Ag4hnGC zP3jkDOGMjExD@Vfuo%6VjG5a@dLxL=>-SD~7@a}1FI-6v9QIi=^g!k7wwS&|JGtc% zQLU(6eF+Lpt*eq`c~1j~_}{CEbgli3M@$LE0fH;s#v*PiuF1LU^RIUeN_TM>KwP*u zJs}>trye?Z4eny#ygnaR+RBn%BjUS%sNyB6=hyHFC-6WrAiX`*k&(*Fmb9b%v2t5o zlirhGeGk7#Nwf>47)mF@AGhA7}xEuyG?0Azc zJAREHV}vVkl`D~1?T%FYBWAEsZEiom^5oG3@Hv&{c2c}Ryww7)`SROX_rLIw+Ou^Q zc>LTWtXzOEHQn%KymSHECM4S5i~m0o<@l_wNPiP?vgbfMJ4KHrdXOB&V};&M%v{!G0G~G4Z+dRlx zwm6H!uB(~kB)KCNevBgPZER;a0u#q@OOK)Y@?{1dfT|$UT#7kw5JEz>5Bc zh!xxVsWWLbB-cPjzS_e8Zvr=p?pLnAE>M8@y2G$X`a<~?sFExW#T@5l+9rucJNEgr z;`_|G_Sbs*e;#oik|!5~6os~-87_m%F7r?V!{L~NU}_R675yeT`v|U>hnTRnvCKCt zyyDd>E3aIsw9oEG-t*TK)W{Ox&Q|>zvpvKr)4fc>#)&3~l)m-u>_s{*?e72f=P&i* z7s%{kBEt|l#G`2y0-%nw%?bp$-oA+$V8gN7;FY1zWA=|6$#BjqH>}M8~bw^wSAY;e1`6pRYWyh_4JDkZBHSbHjI!%MVf_-1!h)h2fr3PT!4Oe9|?TplPe;Rbk{*Z7a7)ujYP&L zTLllaR?ow=uU|tpMkB~O^Z-e33eh8%^h8xfMHlY(;@YLv)fGwvUs_q~-Ye*JqyQUc zZL89L@hKee{0zgU8v~O7dGH|myzgMj%7ynB2T>2cu4*>+9a3HlTe?B6aexc2Yy zLSy8~%RNIA8GzN;u^p=)MU>!#zP5PxJK4C+yDV5qw(t9G%S&AV>-r%-%}mTe#{+n5yiT02f zCm31zA2p}Ssxl>)loCD~AH)2I%BPyPzXiBV`Jtj>z3%)^R1TpkzyKVYQd0V(nyma% z%@wIf8B)p^rw`^TMZo9r4-QoH2|7Mev#O%VC3$3DPYFF`aH2gNQ$~O`{GSLR==u;#rlrkvJ zV;-$h`n1@mm9IuTpHOF&Vg`IDL!YYZm@H-tfmZO1`9qjrBtB`yOfgH4%BN~Z0k?`g z3yL12KQr}E$&7U+jI|Yc=wr2567y8hL3p^8dvNy`(E z_0YaiRg7X}-~Y#;uS9EU;0F9*EpA`(2$v1y1iD4f1b9m|^(plc9V%u)V=1?QRUy}G z5f-NXLM;@bEn%$!8W#JBrjee=LYNEN#_tG}dh;3lH#-UFM}7xDc|Fy#m+%QGXwmNg z_T>9G$iQ8ACdSQrti`#VJWiP9_V4qfsx?%>NV+J;>K%FY4&?fKPp1<{QBWW?a*%B_ z5lO{ymN=eDs~nVhRO@iuyu_nJwwlY2%aGdbpDKVB1>1>A6BqN$1KrQU{i7!aNsiN6 zZz}K)Aw_*@NP(#LDOOfKVgdRgV6};#(mcx|Pl%YrOEH*>_%dEd#Fo6H{Lu;gm_m;8 zkBj;yekNims-#LgxB^&{&Pd_8)BLwoGA@8|U9LbGnf9Ol+RC5=niqfkD4m~-RP^h} zVMvu!Fp@m!UDUWj@L-#c5X5;sa(oL1v2@8m2gb~Fa7wXyoo6VbJ5ksM{bETCfHxH$ zYl7=%ksVj$V_GV3Es^wRNKbT}CJmJy)e^NnVj)Ig4bQL`*HMlzrGJzt^|ry^pg}s? zua})%CkI_gxG>8{N|cH7J2Ku2k&4YBTQYw1@=BDolszrZcYiRmm%ERjgy0fe&Puor z&cwxA`AO+TDI;BwqJpLFX;G0d?hV9wE4x<`KM=VuTN-R*7C#^v*c*(Cdqejny8gL| zpT~4;7A z5g^3fffH2{dAY6J>##+LJ5lb!Y7TG}G78s;O2?5bgI9Kq+PT!q*lW~f(}U7k#^~`i zJScJF*CuS8TG_jF80)f~*{m?3;pHk6Xm+&}` z8){DiFOs321v07hh%=FuU#P`A&lq@g&!7=A)(i5f*C58{Trz~ZGAo#{L1ppuFomWxt~ z${k)n@lq-&;QZn$zX4&Z7)b`#_Fs6gtJGJ5iM`6NF%V>uLhqGbAzU{IB#TQklggeT zaCzwD9!i)UNq%1{$+b%-%SrwMXhsS5GTi}$Kf)u=^F_*xN{GQz8nQsV>jRWCAV+(s p=2CYpeuMN;-wKdJ3D@=CrQen4f8!Y-XPyD(@IIJdJh9$K{|gp{cIf~B literal 0 HcmV?d00001 diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/__pycache__/cd.cpython-39.pyc b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/__pycache__/cd.cpython-39.pyc new file mode 100755 index 0000000000000000000000000000000000000000..e0842e049fa44855b44561011f0df65add5bd5e7 GIT binary patch literal 8854 zcmd5?&2Jn>cJJ!x?)fA&{18Q1vfS2}HMUIJ^2YWi3N2Zp{3TJl7VYdd)*dvcnq*tu zGsCJLN#yqAu+qZT#s)T*MKU;`yZcw~E-glbM+_7#m@A)TMX8C^Aax^Fg zQ+)0#hWTp2vEbOciT519ob&vk>T#T()^A6vUd5rW3;ZyD_KxkH7_1^V$&aA+IqqT| zFAQq=^O)x-KZd$f7<=HL5gg#hQFnr$L|r2&@)zjc{AG+d8C2;T(WCLT#b4wv-LbLq z7dg9TG!`Dv-mNrPHvL|^C4x9;Cw_D>XmxlX8fI3!(CM|4KxEac0yP1@7`77hE=Qu* zZ27ItpkZYeRc6-ZP$pUFYBvcxZ9mHF)m}FW9zY8W45(iEaQXWmEw5a7Z}}RAls>rH zTsePb`C2xA`TWW|ADw?^xq0oQ?|tv;hpWpMn-{Krw6dB_uU@^{ymsaM<;%@$dhBvm z^4`_sFr^#HrtHaX*a|y68ExaC)e58xZv;)@w>JXxsbA=9V%hChaK%rsTG_C(NsRN+ zvz_$(B;Z*I&yk;m?Q9NraW6{3=Gt}=G%>8h!}dn@4C;IBkc6UVZc0d~&3&<*O^h`_ zWaZFr`^~l=2bm*+q$k=flEL85!HtcpfJ^=sMPj7JZ6@jonqkbL*p*v_FW@!$Rci=7mZIo?H5vWx0saD!Uo3QV|^>N#8OgDp`U#_ zwRx#$h|R5~q>^Iac^OYjsr?1J!NeVo-_$;9P-z>`&&nHE7@pPLT?3=4pBtaEb(2?l z?M~?nb`fj6O`0>YbE)Fu??d&8t}kV$6_PyNTp+I61L=ls*LNkv7zHkg)g>{yU4J83 zP!sGdT~3len_i?REssg9^17FOQGfsSWl;F8sKkIpIdTBWSOkK!}czf~5W6 z92JjHtXvWVSYvx&qQb&8gG;(7Hn0bu%=a1Ozz*W;4*{jF+rmoOpPO42zLssgrvCo+ zt@{S{*j#ue+t=Fkh2Mg4Xq~ukj#jnEZoH}tg0^m!;#s`tn_#iiO%`Q0>b0*g21#qt z?{?+l>iL%;KH)>7UJl!>kV84;;#$~VO#J4crMcJQch;KS?bjA*2{K5UkU;E5;Z7hH zTYRCromI|8u*Oy=?k>GbA4yv0m?o<~+<9>zzHyaaI2(0Zek7N0GZ@;aiCGNHitk-r zCfP!_W7?c3T+1f(Z8PrhUIbNNrzIqUM4Q=a>obQd9La3jKq=!EjwuTnD_s|G$t4sUMxQ0dF1u&I{7(PK z?3*yb0`8CWt;8g=OO5NMm`~X*O!FRN1~ay5Tk~7BlnjUMER7mY*j|U;Lfs=kRu5Jo z-JZnb%`n-7;fxuRHkgJbs#r#5he;4?v1Sg`C}{JBEoi#|&x6Ub(%?3$3>8*p<>9>+ zv68bA@qsZs12E>R`YwI`Bnrc_%sOOQV-?6&yos7Id68iexG8y^#f=8IKH#lyrT~yn zX8QoRv;Y9Ar-eQ!!Pd#GdTMe8X!;HZj9oJlmYND?tevlww5}-t(NHi@f}zNU=mQX0 zaIbaZ5s-0x5xARye9{vJCRVAo$=fHpK`UGj1D-3N z+J?Qom>zuT-Zs38$>cN&!zn?v1Jsi|8rPz)ehPcFwytHBFEoHR)04*k3KIIh}v0*^Ht2@6^8+L{K z=>NO@@*KGtt|!f`63Wh*SI(Sie%AHupx0`C2Hfd>_q8)w>3zTJw*whu=EfQb&}K*v zJ5v`T__z=d>E=~?b6gjh^8uWY-)u#99lE5;UZHVO*v z1S!2Bj}4QeFU@8k=M6Z&O&^3WpDCNlD`_6h>ckr~@G;App@DhV^}q*93*;91$vO(d zCht)L!ddVb5cNB#yM%STj^C`V2?u;`JAZ+4872+P{|KIk9Ph930G9!AbBO&8*oEd$ z{X)WaP31%)I1#IFCk1jIxOe)+l!8T$AKSQ_#te$wQhP z@Nu6Z7ExObeLjM2Pu;!p*^Qtb-0F&@pP|dY<1%(m_)&M$U&FQzS2;py2K_HRv8W*r zq+L`zuuhEo3j??|w<L; z*4WAjxk+T#aLE#i6xwr;1Z1u#KC51PpJnXU-r6)rDxHn|c#Zo@_b^N^<@mQRMR#8X zfh}AQwzHxLZUmr}V+*3ikf_vxh;J!T)l_f-6dBNDMZVRFazS}BL_*;r*CMht+r3 zL97$-O|<)wWf2dpqfPt(y#OW(!=^hrtR7w36L3QNPXu1s&nr+3xLpJ6X^uk1U6TSu z3LFX3iC_JkeWDnt#&`5P1EW`1&vVQNFNMSZDH0N3tg1zqx}FzQi;b`o^X>J$3$qwJ z>ppiWG#mhsMewm}aZrZ7qkyTn2TXZ=F##08rivgx7V6FdNhKw%60qaOwOk?A4cdJg1W&>fJ_r@kjo*cY@_P0Kx~h>Echbd&E-D= zULc7waZjynyPa062g(Psr#)KSK?4zO#C=o=$M2PMy3+^d@O?IMQ5`d<*JCBjghVqcFqE{O)ce{aDhog1Z!z8DyZwEJt z=O&xJntw=M@h%lqCju!Nil~Xm>czretBxvd`A>ys>4B|y;o0xtOr6p3*gaePYr_fLVF zCdKoL>mJ^!fcYZ&q^O>oAYcny6<{mK0Qx?oXqpXXtmD!b=KIb&@ZLgbgfRc;cdXFUFV)AUj-j&aE(;&C|2dW`Nz3Qa0}_N z{0mP5O(?erC{cLTS$Ab37Tk|?no=j<+(mcbsxT0SK;Epa0crWx0>-L2b2?78zKk?o zC^r{%G@Iuj)$(vR+1In-RQ(m2ivIXNo_T}mE_l$byFi(c8U6}kcX4APQhr({{ z;YmFajN{pSgnyO}$tgUi_Bm5*ViXh=)QVhye7b%PLk8+i`gs?=89MhSu`K*9ke(tu zApI%;KH=F@YXej@EkL`b>GvS=QmI8br>*I&it@tnwn*HnpaZ&VA|Z@qGRVKpov#Y; zjm4cmQ~NZY^@sz+R{4G+Dg!0dN%oxU!#mQJ4gE}OkY1AHuSTb96}~B7gM%cU{&Gs@HzqUL95Wx9$fhbm0e#25 zMLx~pjC~rWdpf}vD`?SPc{bmI$=_ z<;2!;a$3$~YsA!v15(=EI!CcHVrJFSucl7-XGt-wg4~*z>-~NW=P|XkdfV(zq!TH- zZiwG(ec7(36TFI;{I@W|8YnN^$Zk2U;bdllPmtcyiqJNRK3~Fw&ux9VbuOvG4ejG~ zn5@I6l*vx-{MC@lg4Ug1`Qb2$2@3-SZ24_)OIMvEsQe-Uw2smT4rIYyC0oqhiH3Cy z!P!-`P5Eb7xCT*e%jflz`^U(B<;NZ_{1F|1(8&#Y4?K-r)CWH~glkgx4LdC;gFH^U zXh-RibPbXM060n%n|nzC@gCZh`rR++q`+lVWGoNN_Kf3wRG%Fh$I-`(a>OPF>3}hl zq?J4+#Ld@}p9E&|rjOtXF zKB){_P-;yGDhO`GyC}Rl*;`-7*)5K`#%brMqM%$c)j!-2>S#x~d`(Bv-eRvIsf6Zp*>I`(WyeLz-ib)rZIT2cvCvz)T> zr=3nD1#yAQf!hR`5=34F{l^MHm?z38JO?Sb08By!5G4>Sq@58f)TqM*6>4KB0iBsK z7m6}DIIIgW`4rXKy(Gl_H1#D1tB(5A`J5tIaF&VKJI7Fm3o7TFS!-CKO3J8x&+PT6 zgOfkv;#yM(;FTCgggrFUtaMf%87`4h%ePSwORD3Vhmhy-TVsdIvnOWvS!`|w*KCPB eGi5w7A!O%a?F2U9VeRbf3$uqyCe^~XJp3Rwo21B>8>uX+k3B7+VnL=`daq&EmhMdYSPyvOq=xk{~0W_ zmDK0FbKW`coG0pj-*@lax%bXp{`=nWtE&y_2rt>rd+eyoNG~Aa;<8skFPal{kb-^O>}cMkZV`lMYm)-a-C{tu1nn@ z@z!j2Zlk&}*Q562HmRF(o7K%o_fuPTOKz*W)u-rf6wrO=ny5XkP{*^ZI;l%<(Oc6^ z&>Qq7y_r?I^+}()jk?wC`VQI%y_0&>UHU7i`$-=oZF;f^yoojoZ>BB6TWG8BR@x@K zjkXJKryasOXs7T_+9kY;ULpJn+AX}B_6YBxy~2BGpYT4qN%$rT3J2+C;hSl{@P4{Q z_!c@Kd@J21d>h>^d^;T!K1jX7y>y509dtYd z2oKPp@E{!#K0-snLo_TrOh<)}(unW~9TPrAcMIQ5_XyuZ_X^)j_X*!e$Ayp6{lfRt zsPHI-g~JpPj?kF!7>x^$Q&c!gCxlPXgzyAS3Qtl@I7TOhPtug|6io|H(~R&8%?i)b zobVjQg{K8R0YZi0~uy zD&bdAQaDLxh0l^EtkI(IBBg{=M8ZV6uukWM&rw=9O&Q?~8Nvpg7d}r*!b_AD&QeY| zM|t5qnZhO&gbVa);a8I-Y>_Q&Q&G4`CE*fX5WYYcg)h>h!jICj@G?2Vuc60;AEU>G zAE(y}zm}d5euB!vWqO_P>*)2uucs%4pQNXRpQ1Mizk%K;{6>0{@SEt(!f&Rx2)~8i zD*RS@oABG{?ZR)TcL=|O-YNV}dYACK=#uaydbjYq={>^lq4x^Em);T{2}_V@Q3Lm!XKfJ3V)QI7JiyOCj2q_xbVm66T+XM72y?nM)(2t!Lqt6R}o_-=r@IblYUG1x9GQp{{#Jw@bA#?3jZ$sp78I{ z?+gDv{ekcw(0>&EPxPOK|B(Jj_>btS@KySX@K@-Mh5v-UD*RRYQ{g|Q|04Wn^flqH z(Vq+dIaP!!^mXB{(_aYxSNcogzofqs{wrD)UZuYl{%iVg!hb{mUHE^{{}ldT^tZy- z=3hQ8r#0a<`hoBd=wF2Yh5l9ehx8-nOFmK%e4cKCZuWFDbc?53q5Yn2gARB)0Nw8C z4(Lu#cR_FP^aki|Pj^Fa^mGsOCQomM-s0)4(Azw{4SKt$cR=s-^iJqqp5|xR?dd(x zdp*4udY`BFLEq%*AoR_iz8QMIr*DBi;OSeTZ}aqR(6@W~Aat*%d!g^}^c~QLJbfp0 zpQrnv@AC9v=#ZyF(EXksfFAVp5$GXL4?`dI^a%7ZPu~rFkEic}zSq66e?o}Pl9 z_VhILjHhRyXFWX!9ryGrq31oFfL?f#XXdF(zNdGnyVE>lPe1EZ_vk#g9?&uC)V=yX z{U*d7M0n^aMGxvX>+LK1pHZIl;jan)-7We7{TA@8a=-elPx#?yeYoRH+KoLTu~(%z zEs1b8-6Xj*NniAGxv`WNBd;Xg<8vOTJk*zrcnaYS2yaAq6T+Jj-h%K}gtsBQ9pN1a??iYP!X<=vBfJOUy$J6^ct64i5I%_T zA%qVjd<5a62u~w?4B_JlpFmhacn0Cwr-SP48J-EB{G?AkDC$#Cy`nx1b%)H3=P=@j zF!Ec$yfU9xc};#Mp&Wbxr;}@ZTK{%& z(OzGrbIu~&(rMgC6%lRIvW8~sc5hRqBQ`NRHy<4fC!&?Ml$k3SS-rQV(!x0_Ez^cw ztTZR|Vx{#|-Z1mm&@P3`J24-9<*DfGSS*^Tw3dqJk|Qo1?QOMNkmu0h3nNu=tSSyw z#bLYE%hQJ@w51pOM?!-kx%yQ9`v)t2E^%lGn5&wFem}QD8pHX0>cV}(hevyC^%6X zWd@~_6@!A)qfus1Hn3t)x>+$O8yR{4D-6mehRuNT7EWVOwsLekM;VkIfFQ#t!&!zh zgR&EFnL*hFh%=NKRvDC60D=sc8I;|CGQ$-HWe*_EP-eKqaE0M2gR&P;X1Kzj>|?lz zAqXfitT0?`x$OwH~<)BILn~i3MezIFetY%+zz8Zi1CV1+?>9uQaG62DD-*0Y zK!HK=1Il=Hf&~T`WjM=FX1L6-%AnwliVvkYa16^1JeN+)2H;VeU$ z;WC5L1&A}085F#mG0t{#ltJlX#c-8D*#w9)lo?hT6uh-D;tXYm%M8jEjxs2Ck7JY> zRz+>&wC#Yi3}uF^49X6`D8tH5j^c$AmMI|4aGBu>gR+}p51_zsg+bX1ILn{}84du- z4Dnkz8Uloluo?%HPq4}WM$ZEZ3|ASHCBP*H#RRM{tTHGChBq_3jo~uG7XTrK0)z5J zhF<}!FkEI(t}=Xu;g11v2IWrxXBo;2%2ye_2Dn^dwF(F^D1QrBWl*jG&N3+9WcU`t zbwG$=g+cj8hHo=`hvA`>+8QfZX{-f+;saa<9K>KL&ZaRlU$o3@FqP3PEmhPlr!%72Mk+Y16^*>JS*Wi+ zm?#wrSv{xci%yTE1*4A^^*rg+7k)`f#OaR3!)^{68>#K=Ocb<~kxvI_Oft?Hx)q$( zi>S?Zc8{64MI+DG#tkiH8AT(dWrH)CwPZUz6PB(o1+_c{$IJq*sDZI%%gAPpl(VI( z8rr4?!WP} zgmQx6Mbk3UMjiu^Sk7j-18p=rok5#g=Sz9?XWIgvG;5~SHq=?lo2J?tDP;^&1GuoL zr^JETX-HbpElux<(<1;R!z03rM6BRxy6#>U(gIp7^ibqzZeu<(wz-bI@*_8 zG_$rEh?LM^-PRp6zzCwha?XLDFt_TJ1R@wHz7u0#!hnlxjc7$}N%c?b1uP9GFqaLE zWsD`GVcJ!PJ~-xVt=-tr!%oj>ov@N5pSujU#4~1I$2@LK+;@Y-#$s;!Nl($RE_bb8 zm%%U*7L$oVbh_PjRBf@dWkS#E7DhK-%BPAYOiDBF>_%BwkywI-qAhDKQCjq(PS04$ zvh;jvx!U2*?LVnm=S-`XakIPBv&NEMOY52~AZA>vpt$mWlbA%J)A9MFmW+KF}Gp#%twRcmUa<#$mxz`&D2sb>e@TDLb{pLi^v#E zWV8Zm*|xqxwK+JB+ZVN>?HpL2Vcm0ixnVcA)khC4b~}O1X~fcCzY#U;^6uQdu^0i;I>Qcn8<3pjM2R>G5BMu-?h&?vs_!$FoR(dU|(Pv zGtQ=(C92QGnjNnup$m4dYjfi)-7$7@DmV`_g+aC(DseW#ex@HaYS*0oG1ASnr4=$5 zxN+T`$(ZQ%slmGsN^5-BhN{%Sq+!9xVP^j= zeom?y+1m5lb#oI8J3AgS&hvIVsXwZrdvew1ceda7W~b{R19^BG$fD7mh*kSvWrnj050}G$#qw-N8%>52 zh-b94-B-}mj)YdSG&@tYG-peF3$AxL25(u*1g8zvKd+z1ByqMkY?HNoePK0lQo|0; zd&uS)cWC$xp8K9 zH5Tghc#W@*$c-N-;%uBW(is#4mNKcjm&3hw~`|{StJy<7)E8 zYO-gDoDG=Vco${baEWcWuG7n?HxC=jy_DyU;7u+Vg->0q72YwIrC_WGUj}zfnDG5l zj- zEa7a^63&=8r}F_c1G~r=#>VMUu{SPi4%S5C)g{fsq)C{|IM|s^XIv{GQ$9GUmDKhK zTDoMHq;(qFt>>K$Gnibw4NaIZ^J@E8DX$ywA9K#lHCdhHvMw98XlG|sv$D&<@#VZ` z^Bk$&;cShjm$6DPR~zRIRv=tTK8vhN?vZV(@mZT^EYoSnQP|dCJu*%g23Wh82~J`^ zN~4zy&2(<5SwGbLry zYhp)ob|o@AhxtIvMoBB8JUPJI&aTL^gRzBW3eJ>pg0IgpXXA?#_Ejy8Yly0sXHC~+ zJKOjO^P)tso7ef2jgEEg&drHZv51{KVWjg9uoc2C zyshp~Hg>{>8Gfx0oHCZQr4kOyVZuq+xlI;w3P!)-gwU|#RGWy|lsS(f3NGN)zU_34 zn>izIda(_09IUzdFr;KV!J31$zRmRksk>n7hPs~N)*tUS^O3}LKXI^$=HS(&@Fpb4 zi$*_)_<5t(*)nJ4HGZjr!K$4db}b-}UBEcI&Yo7NcVjqmurrD2lceG0rsXWtFn zj)q*l8{u5m#v1Qayf6(shth>31-lHJ<;m=5bd=Sm%3ry)WJUN zo<89+^XU`stK_JucGX*;Wi5QOP@GpCy#H?e$7vi@=hMB9A%ZQyvh|{?-Q->*KYZry z`+|?WrvJ|V(Bp1=|C!q#xxe?|!&;vc?o&g3$IkR6A34-`Erl0@wSTPfc}W>Vu<^}C zc?_Qm$oGtono5ef^)ZE-FZdElZ_BLePoh0~>cnx*U-1{=oEUbcCAXNeD}Ku?Ci@5R zF)e`AZC}Jz2km?G1;xVm6lHDcFkG6$b|G8JFCEs4sl!^KU>{xx_t|EOcRQ=kfa^qT zHV@-%;o+i|tX@ghuW06CvamdO*z1gBo=s%daCGZ1uRUyr#k&g2mB78QD2t>WKaHoe z@fl6&_F4FFgQuwYQ-%J}z_4)tkx->IRTwxr$TSoR;W|WU@Ti4PI*N6Wp%=iZBg4bJ zE!G{JgwH>X7uyZn92prpmc%E%C8s}hWTetoD59RBBfZU)j_TF^p-L_1u}WJO?r=WY zUr#&QkacifRni!4M{k?7WJsDlGK8;`+%7jZ-0#K)T#`o`86J9RLHtzigB}??>XvuZ z8sbN~o3Aum_&;#{A@}b4k)^k_ z;T|coUR;Y?os?8d^@k}bT8Lm zY0qh?q-ElaQR!rf7k5jBopB=u-t)n`Y3Szu-h&Ox>OQVSCj11elMM0%ldSkLtT2PD zO_`XyFdAm(kDD7ZyRAcD%Ry=L28HOo_X$E|` zRjg5f(-}+5^$mmu2KuJv8zLv;jz4;8j1$`yVu?P?ILD74LG%p{xEDCX)Ld+&Z{F$P zBG{bt^*88&20hfEha2?K20h}I-w#6V7hPZT)w@UX)_g6JD@+PRG*eTmpar9CkjJF$>F8B0`JB1U@1>B6g2!b{yg%=pl{ zSijTtK>galx@&{$V(Uv8UU%OSY15Hoy+N5P+^NYWtFF%%Dt^6`LYj2FgP@djHwZ1E7+FO68+IL@XO-PXl3IOTnls`%53+;0|s>mWJMXYQ2R zBt^(iN0PRYuC&`3<6JR$o;S!vbeDC5+3c;yA&-aMMT&Zl9XWPTfBQ(%?w5R6g-w}%kz)loXOpE{?R;Mc=jyO@_!08U9QY8+ z1vofXCtvMi*uc;YsQ7U-(~Gv%gNWLVALq=C$7UyzGvWEEL}l~B+*~p-6P}(bO1|L)p>fe0X*unn;e# z%|v3e(Q);r>V-sfY;JZuJpYiJB{>y+=z+O;WSEa8<8z5bEHWKU)*2X_9glf6_-*+3 zI#vAV41R}DY01hDknmU){{<~u((OujEIb=dCQilUbMp()@k(=6&#PP4C!$HGW*5}$ zFG@|sW@6Lfd3F2PWO#l&x`1r+^U*{cZAD|E>K;7F%-n1;5k3)3h7)74Sdw#w#}=aV ziArEX!4IAS>ZGgGZL@O=$@qM1b|K7<6b~;T>uhD`GmkG{(5{no4T5tn*2>oKK~D!I+}bPzK(A<{itP2 zi!adB((LyI{{P?qqdmam`+xPXtdx~&9Zx7vD0@3LH~Ct8O+RdDZSrAGHFf_h=2Rfi z!n29zlpph~s%|{P++4swpaVh10I@FIhv5GCKNnD2P|yFt-)i7M#}<@^sUK+mH{_zc AqW}N^ literal 0 HcmV?d00001 diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/__pycache__/legacy.cpython-39.pyc b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/__pycache__/legacy.cpython-39.pyc new file mode 100755 index 0000000000000000000000000000000000000000..21a675f546ed9c214e2135960a4414e56a7439eb GIT binary patch literal 3048 zcmb_e&5s*36d!vglSww&ZkJLDLc$a%1lmpc5~xB@w7UW%NKsjYGzUhLv6BotU)WBU zlq?6fXO5gWY$Yz0_yag_;?MAv6F1HvRNnJsKWLXqAV%`bdw#ax&(F_4C+>FJ4t&M8 zt@QP-(x zIebZU_uTLyusgg9c2_KeeFp4hehTbU;tbdigT2B}gMHfCXF2)E>8<_>=$%2&HQq*= zXcJtkbXpd1W*Q$Cp!`a}-SbR)B+EP+&a_abY4uTMT2`rIJu$7KlzE(`H${(_v+M7^ zeSKqdD_XyH{rcudA6^@5Y!22pd(?E+C$UsQe-P_rVwR6vLV-WP2$9m#_)_SpEE0@= z@HIfewhm4G1VTG=M-xp)bdM^gT~78r-IzOjrvggLF5l}TKKv%hXb6ubB_n#xsdu+{4;E>&EQKQD_m%niE*6FST6LWfR6^1uOAF|MeSvR{A>t~FivmJG zHvKp-~pMVzO_B9Av;+5DmcaIj`M zv?%d_W>q~;F^Gc;#8Sq9d|c`)?90o$1JnGt*e)Q)#u-B?!}r@;rZLr{==IQxR62$` z862Fs2>|tY8jpo(!`??JM<~6nX{RbJl#anNt-~;;fvPgCEr78pWeNAGPJ{6fne-u? z@rDAnxeBU$2<--xVX2HeEOUw6*K0^1KF1JwG)SI-o;!|w0)Bo^`(>s3s>-Itc35>U57VNr9eLt%7*(^E`*;a}8lpock^TBUtW`7P zLqS50TM$+~2f}GD6G}Yd-=%lGMwz7;DFGiC9A<5IF2a78jm8=j-tHe(+u@a6n#F8v)W@5b4)M@ zAkTxi3{6oG0kQUdm|XB(#X)a?IKU);(m1^ZlofiQ!%JfI2Ivj$Tipk}$pfo5c?*c8 zZO)y%2ciBJ714Omu3^;2Kxk*5aG=xMlsMX*JE=1#-;;0Pow!2>H@Bh8beh!U#1?PB z#aglDw$SlCuy^|KAXzNMeHT8N2uz^8>%dm_DuR_3?B%t~@ZtnOS_M##G9GGXbz{L8 zaFai&T@v5mJJfiwgke6?+*sY4d>r#C?$AEx)FYJAKfT6HOLI_f_nfm(Ym2S@*IY@g z&z>iH@FSl`@d66Ga`GYyygRjEsG;LcX!inq>Yom=253|MKVu9K&q)~3@y-bt&p#L= zmcsuG5gFh_i0Jt6UqL*q&p|JcPvg4Jptu0SbdDFht+V<7ZH6p{qf@jR!>P}LcmBRi#kg^m*6G8`C=YXJ0({5e@zVCaF+Omr$dp{d zQAo}55j!3K4>m?w8EZ@DmOpJaC2mt9f|HVBf;VcCeiM_d@SzLH8G4R%$cp>)vn$@p Hg%$5Fo_6xy literal 0 HcmV?d00001 diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/__pycache__/md.cpython-39.pyc b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/__pycache__/md.cpython-39.pyc new file mode 100755 index 0000000000000000000000000000000000000000..b6e066ec412e749cae4efca617ad42cf8aea4975 GIT binary patch literal 14742 zcmc&*TWlQHd7j%YcbDXnqNuxMjb!;kHmqifC2HGO63j_gT7=;z|p+aAZJ|%q!&=hD?w(9{TtIeTt%&VMfd_y6ZV|M;V$1p|NeZ{{mwFB!(aFwy@vgv41q(P`5# z0wXZ1M$IglCgWDss@WyG=9C6>DRqvD$cPytb>ft2R-ZsO>K8u1%IEYkNw2YI{q2Yx_$3OyeaZ$Oc1qj9}=t zRoahKF32O55BJ};O9zlH1j9%VOZp(vBf%)rqmn*^bTJr1dQ8%Xksc3rA-zk|N06Qf zb|bx8(vKlM8SFuNkED+xy*Jp0^gc1a5HbPUf~*dLlSJYfPQE&v~6PlYCV*y|Q0k3a6~Zd8HD?N$%=u zTxrz(>V3?zf$YQQuU@%wb;g@LH+|7NH+%l_W$*l@bJxzDpSyT%HaYs*%;ob}FI@Cy zFP^_TbK%^zFMHR{&AfEcd->v*-?)11!qiw&tVEt)E{FBF>BnJ^SlN$4 z?}o1`{(Ln|vdmdtNrv$o)*5l8+^8pcB$oX8VzVmwOBLlW`gLCtD}L;+Fu_)4^flhPhIHe(^avzvMJ}4lS3-e(? z(!;^X9S3VO9AvOIqshdTFp4gOaaabuuU4Cjm3r$|!NuQ;m@C(xk7DJQW4B!OqsVPW zVc;$_lv~4FZXmB=)b6Uh7@d?C&sD2wQA0)UmDgtH-0D^SY1#D z(BVBp9mUUs@Kj?pJ{4i;^_5d$Tt4Nmu12Tk&OIA7%E}LX^=zeHt^^oqbZWj*KNb64 zr^M@(_>FmQ_0}g(k-R93y?R5{{A#5Ys#CS#QhXIAWO!r*&xas-5iA zn|b8<`t9y~%`Js)&9Bs5)o5Z@hi=^9{Dg0Zx*RIwZ5^=f0W zQpRk$H!E>@NwQ)ryL+=U*`R2k{`Rb z8cl^=9tKZOxl4ZJMq${u-LEvG*qymL$EB_|ZiWi2`E~cXlb?5IWG-S=DHGM)#TdEW zzSGs>qHG>CsrcpYptG%kgJz|vktFANb-xyRUQ+P9S|eyy86WYy>rKC!mJE4b&?qC@ z1`;LCe4|lS$Jq0622UVJa;vJbihX!1$t+YGeypBkQEwkf%w^s_1pDzsBM5S)lNryB z4;8bPDJ5HjZwb|V;0xF_Q`prooB<4L*d+{`0n-%Ogke)^Q($*sm~T^HYZxYU6%%)^ z(YWH*Z_SFZxT;?5i4+aWGwN~BuxXn*4da-;KhrS9Eq zs6Y+cAy{*AljnUNbVQg7Gk?? z-Zs@|r5<*V)N|@5L4M{gl+C7rI$5c+5D)QJ=SlrsU`zcR+x4IvV2zy_l|jGL_c@TM zy!sXVs82G;GT6o7IRsQm0?3wF?PeBPLXmR^&JOq2G@gi1XP8Ah_mO2~A6ib%9JdNO zZWn%LWr|koi5*vwkhJw)-isav?PV;brT6cYEhErF6PgEXH35e&k!FtDkX_b#a!1-W zBQocak1Q!?4oe6ES1eTwtXZbGsMbEoKV+<#ZNS4yMt!0U=4K5p3EA$)c;s*Klk)eE zFJK_DJZx1af65YJQkoPv_ZkcRT-t|eE?*$deFcxenPC-7$Hw!}aUNxu#Nc})>M1t# zG=nJypJG6vr9Q!6J<_UYnRk)_yY3^W2eGG6@Hspw#1?bo_V`3G1Bhiw8PB>u2dT4o zqK_S7_opj=u6H_kG-w?MdF!?#m`rhq_bgdFAZg!;Lj&a?=##l!=2$ss?#I@#t!Vnc z;GFt2TE#gFZ0%Q9p-&D_r({9vq=6e6D7Q5QJEI$S&3bf;vGsvvCnOig6u~A)Ad^R8Fs%FaNK0~-GzE=%g%Rzi)YZx zK)5jafa1xGK%poc7Z>F3hc5`B9bnkg1%~dXgND|}iY{Ii_WVsmw16ct5TxzaHsc^3 zsMCCTkmmFS6ja!t)|`qC*g9Kuz}77J1+w+7*Xmul{&Vs(><<%Ov)5e8$^y`Xwh6KF zUCv2&n;hIk%npo9sUTv7P4E~C2{)$~U=Uvrj(>+errbNAzn$6kEE>?dQD8#3prTu?zyvgK7QGIbha6-R?3w|GrG`Rtyao7Mr%3zXe_%)Bg9MY6>D-0BcWcfeF)7h{)QnWJw#At54+@=Z}7)?_x$CgNN{vr>ud>LfhcMbJL zraLjfLHDE*XZQv}sSl-iS=#QF_f97296FxLYF2m|aYf!Bcr;gWepg>))*c31;l`h! zFyhG%ClD(=f!H}9#{|-N%+`sW7HoSo*J4F%+?b-(enR`H0rbH zzk@U~mxBl;(tNK=s79Kd3EdudE}^}(+FZw0Q=yuOnaWryXT zvXkS$nGTfoLylPQ`+;YZrG&P(fm?^T^VgicF7BAE{Tm2>RGcA0X`D&%MLmz4f&4^Z z`CE2Nkitn|Qd0+t|JVbAuS7!~_MHz%TTU3jz$1 zC*T2d*qWumWX*=b!)n{NEmfEHVMddq1k4{DQ<7P(NK13N3h+2IATm1X(3mvSIB}nZaN4v+H-m>YdF|Qf< zi{Zw}=bZmL2bF4*FoD3X3lj)JtF?J}+XLAZwDebOEd{a+fb4((8B2bFK!*JS3He4? zQNbIqtUj97L>t9A!v&eg5^HeBCd{0S)X4@m;$Sp{xsDytL<`dijEKpwSadbOC1c*a zAM|JJ_HZc}Ru=1CwNYP8YfXA!zH(E+G#u;7cq`dZ^`?*8B4OfWQd-?;aUSyKn+prL z4Med-Qe#VswSzV~0rh8iq6q}r?nmo#=V=`oG?_afEN4P6j{wMnn!13<_9wMrywpM0 z!F>*dSi&oNk?wwkHZ-8CZv+5WFdsCuMeDAtWokQqF4ed!Z97JtOke|I-_v$u#-o|E z?t7^XS(n3Z412PU=lkM?zW8u29yqdJpm&pw=nuJ1K;6h)Bl=D}%6j-M^7lPc{SoWv zU+9Ztfu?RO9%nwmUZ~#H*7^7iGAkL>{~XGlwsix%s@^U!;FnG7-LXmFv(z=fm{ucY1C^761xhGMb52XV%{qZ-eB-L0~&1A zuQK5E0YnfF#&Sbm8cjJB?=Qwn8zGzWvPjmrfrw$|%n3YNorfWSmkPW{a0)-QGKK%K zvV{lMP~pF=JY=ZIQAk%)KaK^Uw~J=MDnhD`n_1h%5g?295W-|wG$%FFn>j1{5#%sx zXMg5ECbtd@gn;dZFkvNyQ(may8U`W!FA%~u!flXl48}Wf3I?I|p9?%KOE{I&t0Pk? z3nR113DFfsVL78r<{fJ>? zknZ~fTeCTG>_d7S_i1gBVTd?~-XwGjwL-V-mO*q=PS23;EFy+AN$I==wcCs6S-k#J zJRK2Tgou8=Sb&X#C0mQ=-#}^a3bzCS7}&Uoh1U!&X5mW{W`iuQZHIy!uWjjDBk9zC zCao>rGbQ-agv0XoXi$`E+!49u8A~S5FRxs#-+%*0FdH{kwU}=H8M>Cs^Os(H`uq~y zE23~Jy{HfC@cpUO7v07JJY?X1P=|+vT=RKYviLnjPQy0f9L%IJGh+;`Xve2^6UdC;@_)W3e` zou|Y*2eCU(>6`wY&Pv>XDLYUW$=zdmEdp!IO+`h3gXn4laJA}LV0IASZ*r>;3FVsP z$e?Nc7zFlP?3KDMjzfd{94N5)28Ff=Y@!5&fr(SkK@lOi0Ti%@=isc7UXW;k4OOg9 z4A?Vg*ie%#VLj5{JKDr*t17aUz;}(Ytt=$GRZVZz34jiuwRK?N^lcAzTduBJVfTYr zoY1tqZru(J?05$_I*4XcID&xcyI{qQ3Bc5zxi6B8HzYVf$YjXe3?hlBQzuCpb#M)0 zwzeROs53RX@jCPwH1PA^i7um+*GUHDE!|G!`eaD1Pgu4!Y7ta>sP!>8p6ojZSnw<5 z*Jy!zg-$?^cDCR_aDXtRNbH;~u!=ZaXkn?b;7F}}fH$-+ zlC+dTOW%(5X@jkPTlN%A8OuXrkA8^0hhcsG9&_ZJ@ejzsc|-k|uoB7H%S zOJ7-OD|h{&^qH%t>GkwT%1Wt&UM_TVw+_wd-Fp8lrcXe4P8(Q9mE?#f#5-!O12-9q z7$^oYgH;Bi5#<@9{!C-H?BITrQ;AN)km|TUtA{}e9soJjN7TPk2_&K|BL204gS}&BC{vcB@@@1Gnvdmcuo=Xr+vKGr~S5$Y&DQampAJj zdOGr^Pv1?i@r2w#^ike?m-KbzjkOJ3+bg;awAEx=BZxqjk3!LXrkIDK%MzToehokB z8Uu>VbxvqJCX($%BWa_NwyP`spPG&9J&P3m9XVnjQ$Oa{UhhM(?1L-BBeuT0g2~`Ct|49HK zxxr(%tKWFfj2!(A^581RF$cpdFiJ#+(T~K^@kpxs~aW^5(xo(|4)9^YD@tuU* zfS#`0RHg6ppQa~o*QlLp>vPjd<`wLydMSS~{gxpr<>4j_-*c$_iRr?& zUjE{7U}-VHzF~<3Y%;I0C@-^(IbrVX_O=Dz#<}Uwr_9 zmKxO{$pqnib5XM^C35GFYCWw#!mj^}2)%~y;L`>=W?X>13l}0lQ(Efw8Ea19tYz9b zxWdf-T##MM)+dk}f}}nZ378LdwF&OT)d7I1^ylJfst>xM_;``U~?fi$C zHrNz4vHXWw#!Tb-TkRa!!co81&b709g;}Ea5r=7GzX7nAi-+{bMr;M`nxF*m0B6TJ zy#43b=h~L~q4Y4ZR)}-$!g3x@;kJd+@5jUKOi;Y7S>mR!M8}QY*I$%qA9np=h>z2& zOsPA6E5=E;GqES#IhFVZdF#3jJ{(#h75IFa-(J~$%w;NlK1pH;tkS= z%J4xCriRsRR=>mG9R#JkwqoF8q9m&=ipf|l^y^-a!qPGLqvI=%FsS(I77Est;{%iQ1o_aFLFVL|c-!Mc9EgMNTzO@Q;R-8^niJjz#^RZu# zwYN5*HOb(k9J~SeF_fs1qI?oHwAZ#6bj6k{R^4$H>|($zt-ZUsL$q(jUdHw@IK|)# z3|?e#iNO^HvkZ7J6;-3p9hfkv{eL;IzIl@wbdi_jPU{aj&H$s0=othfn22%n!tUbn f@l)f6@&Cm5^Y{ev==hZp(|R~EowE!=Hsb#ad1b2L literal 0 HcmV?d00001 diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/__pycache__/models.cpython-39.pyc b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/__pycache__/models.cpython-39.pyc new file mode 100755 index 0000000000000000000000000000000000000000..415b97c5fcec42e878fd54468858288f746ce881 GIT binary patch literal 13181 zcmb7LON<=HdG6OdclN>ME}s(Bq-2pJlS`ShWZ9-Dl1s{FEUsj6X(eMT?cV9y-P!G# z9#;2|+|e*bv`U-@^047JP9OwikP9!q1PF4>A*UR22y#gyIT!&FC_sP!aS}L4qI~~f z-96K@v$DKI*Hl+kSN-+B|G$dv^mJ9jU+4Rk)_=XAY5zzsqkkq|F5?Mf6rSekzSf{$ z!`ItJ!_cX2`exf|SX{UKLc7=~a=qY}+T})>>qWoPt~RP%FZomLTBFvUZcMjl8Z+(L z#%z18G1orOIMAMN%wtU1tM~`o3yp>LVq=lttNx+(;l^REPx(jMM;k}m#~R1l#~a6W z?Ms?h^QPa|yy;z|@dVyxyji@>;_XRsK%5Xyts6(RhAn1=jo*_PG3On?hyxgL%F}OY z_4yC6KW(M1$ED?<*NKFrs_VDhP=u%!!%g?Xi!Y&8@OteoHJM>=tzL@FE1jL#y4Gq& zarp+mbE81U*6Xbh?{9RYR?u<%xUkym`XVme?%@4H9ZS`XcyZ;8Rp-sOZmg_cx%&Eb z=gljttJmLJiRV_|c*D7R<4ex1>tDTneP#JN)~dEe7&@4{71YhR(sDbl({bA(KGX`G zcF&Jm&e~2S9MNe8UaPYaPxm@4R0Y22Y=|apZuGB=m&= z9Mm$CwGjHLWfm=S{MEd7kXsH2i{BT#Ma(*%ydClmWqbUr_ae7Gooju``y97E1B}sZFMFQ{zCM+_eZl)8-k$ZAL2c7}1vI_n zy$Twi#vE$5m%S_e{TUXHYjJIP)0Lr!Zn{x(6D+zMYzhfx6Wjm^DaNI)yWGUIGpxE*K6!tul#5mz6;gEmcp0^cySxjLG<~ zJ{6bKwd2Zg4|9M&zlo|d0<|-?qgf{>fMHy6eBs^|VPjEE)J!p`q&l8;f?m|^McLYO zX+tK{B`1s|gd0l73WdKe4+CO(go>k79HZhm6;GgetjRil{=0QP=tk$muHWlypBGW{ zyxZ-D=U1Cp%4| zb^1s3A|9swB~&6%Khk%N@Y%@l^oM3-4fL(Tu8v=gejgdT`g@@IRuS#RZ6mmddI|N? zw!t*-KkGQ+j^o%(x6=tCdrjD_&fQ>Jcy`dS-+f@a9S=WC^>SQog{@8)x!`!Yh_&O& z>P}Z&mlC?ZxK6l;U=Jb*j&Yj43tjER<&1Ds>!6yDT@WvNY{)a1K%S+72&9VVXwssB zhx)@A6q;Vu4c*e`J~BSC3jKp)SR>eTD6;Sg8Ei(;T~sm@%|ym~dISO4A|zQyv|asy z!S4k^8o!$ZpmAH1TLaTGwk`Y`p1EzvUnF$WsHCpYY2AWYCGD!tGjEePS^ck8?d0!9 z8-}k9?gCb$z;3(S!VUvTukKy9<-2RXuzOt~d~|mrv|EvAhfCQ!8}Bas@Jm1HzyE4d z`QEGYN$jv*l1uneM5%tw^?M0bOm{7e3t-nEj4PS2#d9OZvKK<*)U6>s8go3}@mlNa zO1(7}vQI}^C(z9Y*MA0pg!3pgtEyYZoIYpH84G$%uNix2N8=ys@*D;?$sI`ls7_>L z5|TiBdZb0*;$0n_O(+LfAJ>lLwAR193a7yIMMn|{u_@hqn48%w&tdY5=)Z<1WXUr6 zPmUseX&g5n4_Tx=)B&CG2wq@B(gzqlW0z#h?EhItxaCdJ+=f6kh3#&*t&Yt&hNRhv zrne(;KRRoR`%Te}>}azU+EJ@5&f51{(WbrL^L@J+fPXsCkQ;7?LUlLY9=TX&)prnN zlH$8U?%1Ip+#7zd5=5=0_=5d*3)5kU6z$+Hco1N`u=IQeZ2uL-0U?Y~2fA?w>No^1 zh5)uJMbl-zg<7~baUMx}sa}Z7_gvY5%!jc>wRrwo@-;wxTXo3;7|QgLSE!aJRJ`u@* z=fflI*r^=^k|NP06t&jvD=WY7v!nmwP~0#*3@lCmiLuWL!IW1CpCmw%SbZXT4^CL; zHU=x~7BlSTl+x0Kk8;Q*p(@~E;Uxt>id+&A&xqij?CKATkF;I$fgZseJuIV6A&A*` zGQ__fNDo}kfe3h1Ssp_FsLcHA=)G{y$tL}TEFJ51y)uqcvcr;$yizy?h?5)Zz<`j@pcz$t zUhgmDfJ_GM4(Q!F!Z=Bu`!(oyR`??t{}d1$NbqOhVl_P7foLqSyC$Txvwldm!>i`=PVQSToeU3F>n zn>~~x24k@%nq$M*=3^b{f_*uKiL{Hssj1ETys2-PTZpiqQQ#V0HZRo8h2ORBZHkT^3RgBasT*FeedFrQmtTBQ^|YeXq3t8> zL7rV`FTaVNp@xEpnb=TVV7E?j@Cq6d_p34O`eEQOFpe9>dN0(_MnQvnP zbcIBp3JwuPv<19Hu;R&A?9;b9%si)u z3+J$qDz{sN!vz$S6?muiKp#Mf9o4>L+(8fnaVB11zC$o-EIl9VNCc)$l7qDBMS_-) zbLo%K^Y3`H{&P8Uq%em|7yY0K&c1|7`VqM5B+Yn*iu~Lhynldp#Z|>I)0a(~+Zid0 zjJ{pGkah~!DBrQA-__&-d3B!YS-#PR%h9$TkiX7Kdsmk)Q|@G|xT|-{q~xjgz=T_3 z!k33S3BTqQ1}0`{ctr$!re_|7=A#v;rrzqM{&zF}xfy_xpwt>`{}ken;S>ADI(d?C z=MixY9Y`pbRtG_t6dw8ZVn}`VycG*%tDZ`ze`-kmxZsA(Rx2)D?`#0~n@m{{bv{!E zDR5!D*j~#LJ;S6;Q0fr=nH%&1*$I^&j7jTy0 znZE@Yd2FqG=%MFBGE~U9mpWc+qZNgemXf6BBw=6@RPi(vQxgFyu|W|26^5lqI+jCH zZrINXpCsVmSZ@*(golZs9LUy46O4a70?vua;G{$MfHZ+m;7@!y6TCMhP=o^x8<9%T zYi>f9v%5N!LvR#()RTyL8Ib)=23=vyh$4&eN#IHO_8Ckx5hLZ)5&XMssc|_;N9WgC@I)Fs(YFyYVR zC$_-ua@>YB(DP3;6TuB9J8v3Yzq{$KiD;r}+yfO!Vg}VFHm)qTM5^(-Y_W%nr!eW` z0L7JyIJjVY{V$kKejP=>o|A(~K&9V6LqAQQab~TkGMBMM);x`Iablse9_p+u9Kxg= zhDtX5k1&z)R}nOFD*U6Ob!1$DWy5pmAW0;2Fc+lSbOXGYICD(r!@w5u2!Ef+=PE4c z9zQO%fUv7>WUFHbwz1;A+l=g6S8iUn5#++p3URW?S#ZkA3wZoA8wCXL)5s_XO8k+e z*~pemXCJD7RZ8g*#%wR3#BQhQ_dGR0I(Q@(3}-U)^iHS!ALrI(OhRg%-MT8dbz6y3 zmohHd+>A-uV?>g~wLiwA*yE)fdrY+SlUzGY{}j!!pDK`R=>1nb$~u(#r+)f6dzc_o z$)pnoAoydwe<{QMS15-{q1n}C^0vdE6E5wO^c)gMA!CAujtiXX`_BwytDm>}-2Kx* zl$46te-&#@gwg+uEOH=+7wU}*y=dKe85kxys=PTVnDj5FBq>wCN>cAZp;2w1Z=3S0 zIxSR+@}U9GAGvF&MGC1+7Mveuc)W?wBH$B?4MB0sIp)OFyxGa&WD+TFv?yAMTuEb7 zmR+*1iFKC*2sx13tFN7Vd5Caa8L;8o1~SYN$zco8){foUz{wgfqa>2zbs=rs6aWxi z-)#zSIL%62N*bZ1p2emUEu~`2B-2P~ie3Go@raa=-oKaO5@DWfA)wMZtl96P{cTvQZO>rMy92jVlYrr|QY1%%sQlWn& z$9E&Ac6FU{J@+wXy-vrRls>@`U)6DN`q@KT(}`=2a|e-b(oLvUhPu>f|_PHYZ(lMA} zp^O=d^QiIqw7c9Nk^M5B@Q+Yrms<3O=^dtPEqt9tPp-2RalwUJintu1F0{}Em#Ube zn?ktYQNg8%syBse5;alfQFOz|!ljlOe&Z`GxV}Rc3-7ivN22`^DI6o=aF zT>K5qLuT5?eT<=yT!D@ETR4Vw*(jeuMov<+UbokJiHW9M4e293xJ9xSXJ%61Fa`@! z&L!}YgIT^WrQC#YPcE65cA3a=2*p5`HRVor48D+ow973``R<0igAov`WTsSS{VH0= z?KDXaZhR#YtM?C&;zoqoT>|+E2JX>W1QM|gr-R8ZTt~wC%ZP?EV33`mtl}hX!Pgsr zE5|wU@c{4`M2!~ZI`^6?6Z6xDSlPz$v3Km1w7x69S^;&d@ z3Z}}emr4+y;Y4einM2x+Qo&NxhbHJPw}qqFuZSJK3!x73aft%oQCiRw_w$p2uW*bS zB2=cNVM6cWY_F{(=lQXTs}hP5&NByiNjWt< zk-u`IPJ<%48B)SEh4Qv8zX{Y-z^!M&t;SXrJyo1eTtIya^(j?x>sek~2bMIWB zZyrvowrGalIBu;ZeEmxqU*G72NCn#&SMy2I(9y+l6S~2zZnFtZNu0k!ZW!~PgeO9A z+>q^-)wO})SEJ`s!(sh%7)Yv7ojieqlS3^&ro;4kU9?i4op_GL3{5Vo;+D%)BfeDZ z{#mNA&1M5n`hnGBj@=8q-!Vc<8v7#A_!uh0<#gCp=EJTT@cR)wWgL;@bA({IRqtT~CL*+aQOJ1t^_W^ooUcRLEZqNrj2?U26W_`18=@^2j_3ep@7A2kEdd*>qeW(O(qXHUUYq!=MED4cZav7LrMEkZZOHt&}WWo=`~K8C$8bPHFStN zmuS*n(?6bje25NCoLT_nMMp+(IP*w(0DEVfp za*(Fv_c5dV0Tt}=v$OyE^tvD5@(<8kuPGDBUw_gMc@_G4T)mL%^$zg^`E%M#cC9nL z-ihD-@x4U&DJ~fyZW&LQ2JKKX?CIc_0&~91iC zvQP?u<(#zzD}Z07<%p2-eJV%`$`Ta}2gOYzR3EB>@1f%x1PG<_%LvI7@#$9uefa%x z?U@^?<2;AM1~y1HV&le5ttqIpDWb8fD+Q*n|^DJWB1sioil=B zLkdY+J}yQ(T^Mo&E(2acv(kjTOX4Kfe{mU?_sBFy>W&f-C^p(2U%8`1Qp*pOM|qGw zS)hW9A8Ry)Ho{Y5W;s0Drh-PQL OrF~1Q%q-XRvibk#6)7YD literal 0 HcmV?d00001 diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/__pycache__/utils.cpython-39.pyc b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/__pycache__/utils.cpython-39.pyc new file mode 100755 index 0000000000000000000000000000000000000000..9704ea8adb49b04cac1880ef278c2cd8268ce8ab GIT binary patch literal 8012 zcmcIp&2t+^cAuUZfB^U*ilV+LdDfOJL9$3$vL)G)wT4Mhf=Pl}lCrFc9b||el4A`9 zP|rXzX)xt7wb@i9-m0ynHmQma|S?&;Ul{rY{sN2k9(r{Nd;HtT(HM$`U{UUvU7c=;Glc)`%LwLYmy;cK>dpamyP z&DB@m78?EWys*VXEzmC~Z-#B~tZAF*bw5>0+i6~D_&v3Zo#C|-XC}mQ z8EWlVh1T#~E^_3vxo9WXRbr$cQ|}khi-a zr{xAj4Kd96s#&Qz)fJcKm%KnazMoIU=Cl_^ab~s= zdG)~YV`JWp;?zR3;k$9_et=1=KRMI%BX4mva=VXtA%H?Y9S;=C6bYU)jW3E`aH#3mZvPn5~ zgq@0&xkC9)alSG>JM&4YT%3sC*aplO$7jnEg}H~xlFC%^;e*+^34FOQc>~9PUYaRP zR|?b9v&oipzlnTYU;(Td-?LY!8&5hrmnVc?u-u`rIY5+W9kEqcLNeI0Vv zGM;E^u%+wpjPu&#LAD6`+EmWMZ_bUB=RR?*XvMXl#)O}xoM73t>Pt&r)pLA{gu_}= z^_t~ap%*OsuGLYEQQoDTH)5l%q$2XfDKBzsVctxx-``nV!HPJ?n^$O0JBx`5zjslj zEu9JUee9Z0B$d$zMMi)kdCcvh$R2%s2hjh$K7z$YdD2cz!?2Xq5qzsi*7hTnfjIh3 zn(Ahp1iMXYluXu-t50maDxF#|iXN$FZ1g#C=yP3fG#B!@^_~wMUNMT4X5g|kf^Iz(e^otw0%G3eMC#Q0e>9TRSOH+s1q?^3??zN2X#`u z4(eo-64cR(E$tDQ{9KfwTR_6EKZS$GpxJ1+N|ATifA}B{uOd9EJaLrgEc))BVNpnY z(scDH+C4|peCOyPyzEFDxF{Y$m-2eq*2n8$75NdqyeiUYp9CGk!42g-fdW;UIKLkF ztABxYAz6Qotl$*-uG2eK=l@~_V`Kc&DYk)ae%J#$YDrdmKay#p&R36qLwN16iMlHP z;%r=y#}k<{|Bt53JZm){}HQ4h_xO8tG|B@ zR`-5-tkQQ87~h}%aY~VeT7j=``v346jDGRcV`MJeEtGy7A827ET5-I8d<`~pn1jNQ zBUOj@V@B$}9TA1(za#Be+7h%)>d!Kfm_TI2ft*q9QWjEGvOfG-OZ#$Q9Zv7hwI|wV z2$vqi+0AR}4&W?hFd6#j<+$gOyZRKd%X5+7!)lw@{9DUz;C|guxBms-{3jl5?GkRa zC!B#LgTY3iygGWzuU8#Eygl0a4o4VHu&NHynfIyT-Fd`EocQtW{u#@+?b1VxUuZCW zu(g@cecVJC;l{n8>!|8VWvw2#2^rapVJ-c7+Rr%pa1#x=pGa)z;XtH+Cn6&W0U|R> zkqd~@Eu=FW`Y#bHf7K&(X-M;XeFH%!RvJjGQ;&3Ymt0oMKtNhvH(TarW=q@5%Czj+ z($~!>x7o|V>SYA0sr7U#)iUwTvsRjd)g)kTrFm{;_uS)^$I~3fX4W2X09yPyqEyXl zQhaI^=EqB=OJprAioKEJS|F(vHr%SW+o%Jymr?VA zIGtb=r`nE3xecG(AjzRRhbG^n{)on3ps{&Mhk2w}=O}M-|TF zdVur@)2m*yvOW%YrZ6Ox^3c|EOKG9hF1+(%qS9wdTmKR#iHpi;F z7)H}IsxnwaZVPg3Ey6cTj4Us*sF=VB3-5J1i<9GQGg_*=d#$qQCc~>&Iz!B&evwWV zB+wg`&|8jEG<73^T)ooyj*1-wx&E?mo5tbjH|r>CKoY{{V%2xTFwT0&3RUELi*bK4 ztkmkVNhd8)nj0z7I@OB?Q5zF*pXWaUCFfgK=$0K$|2w`2`_O2qOimYrLVu$R8I zBcv!0WJA#)C(;n;oEX;CcbEg|zD4(X874+C=_sgT8K#1OUcSv7d_v!a)DZu`%Wt>G z30iEhkA^GtrY|cYGVR7LtWa8RTWg^<@ZADM#nlF<#&McfSEFtlP5h*Xk)i}IiEKC7 z*}{JL_iI9_mn17HJzAJUYp|mB>1ZB#>)P zr>w_0s{4?X!`J8FwKz;*f1fvF19d6Rso;^Nj7=XEP+aL(*w#*Sh8iaM_qEsDs$J&@ zt4?rg=UOCql&0!>pROpB2hV#u_pdm+UlzNWPv)$n%zufOBtHxXNtriL4Is7LZ(r%! zZHo(gOBNRdNSw8ROE%bTi}jR*1CCNMy@7b?%M0s0aPK|K*mXSvx82jqY>8GX>EWV3 zZ^4CM*VfaIX_Prh!jmm8110{cRdni0YW|oSP(XX}2O5#}dhrTPKEsAfeM7S?YDi?* zGRCPS|F6;n?U~Oix~=*ijh$`#^op}HT(nJ3VuISm`0!4~0%MDCr&@0YQ7k;WKdQs_ zSK5NKUlRMFeW6$LeB^o2>P2E38D|Zy&(w#+5G)5IQioiMVamS#3a}~}g6$uTNe@^# zsm_7$387?ts72;hJB~5vB-Vb-W^=+tZ5c6vYk5mn^t5hq@vY&Y_U0%&k>$G%;*uMe z&!X#mkt62`)M>Vy`>pU9Ho5IGj&gQ&K*M1>QSWvo4SY};a?Nb6t-J5=r> z4II+Wmmd>p$h~W67}8hjuQ7_bq_ek_yOuwD9+jxbtGW5mYFTH``=~Ygr0ebXnj40= zaGuJAL~F!Fv?A_L93>mgU^&qQqU`pMw4kF2dulpRZm2X@*^qg|6mr;UVvHIN$-h82 zx{08YMxF3J-xK%v_2p#*g>iP-jixb1T>z1DG@T$cA1T+V-Gz(u0q6sO>OW3I{~yTi z40A9Q?M0{)vv2<`a8-YUCQj24RBk}lMceGB@*yH$8x6|LXw4MSniK0Zi67!Gp|-FY zyp7G>LjEJWubp5}HUCOdck3;25W8s~&2|FDkN2ig2_KBw-6hEqo9MIj8}mK!qqdN_;&D8;8VP zFHTY&s+7RuMk+QJaWEJ0x$Mmrn9Hk*YL{HzQ#Wb!5jB(4P+Y^c5H2|=%J3B>)QWOg zMX955siCBZgADZ+jVO#wjL>&9+MtGf4O`|owdB_ks*#c>0&bSdle0|wU3_C_b_#3a z%&jEIyA6hEAz3sX|D))G1B1=y5xtGT@>{u#7&?Fl{gHn3nZXR&f%cO{PmehW?c&k) k4EKG296JTb@W{}hIov-yFm!mRPshIs^xsp=&VRrAZ@Ug5XaE2J literal 0 HcmV?d00001 diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/__pycache__/version.cpython-39.pyc b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/__pycache__/version.cpython-39.pyc new file mode 100755 index 0000000000000000000000000000000000000000..c8b612729fc7168bda55014c473d025d9ce916d5 GIT binary patch literal 283 zcmYjMF-`+95VUh9fkTm~sMDs%IfND=C{oY_L=eR_E628k;bL31gUCIE8p?dhEx$;` z1_i-LJFC%*G`phTFA2iFADKJcUpw(11&S-2c#5P*O%$!ErXL;E`J{EBia8mw_N1J? zc^CEIRflMtE!*y-8dqnNOsm?0@+qHj#fy~pYO{N{GHA)$*UKeT=3 z&L@t6m3`qlNiMvP{NZ{OoeV;WFfvverEQ9QVJuGqejWI8gj;}LpL6*nLevSY3ro?M aRtLU6qw?!~c(HV9)#yvQdz2wD#^^UdD^Y;} literal 0 HcmV?d00001 diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/api.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/api.py new file mode 100755 index 00000000..bdc8ed98 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/api.py @@ -0,0 +1,608 @@ +import logging +from os.path import basename, splitext +from typing import BinaryIO, List, Optional, Set + +try: + from os import PathLike +except ImportError: # pragma: no cover + PathLike = str # type: ignore + +from .cd import ( + coherence_ratio, + encoding_languages, + mb_encoding_languages, + merge_coherence_ratios, +) +from .constant import IANA_SUPPORTED, TOO_BIG_SEQUENCE, TOO_SMALL_SEQUENCE, TRACE +from .md import mess_ratio +from .models import CharsetMatch, CharsetMatches +from .utils import ( + any_specified_encoding, + iana_name, + identify_sig_or_bom, + is_cp_similar, + is_multi_byte_encoding, + should_strip_sig_or_bom, +) + +# Will most likely be controversial +# logging.addLevelName(TRACE, "TRACE") +logger = logging.getLogger("charset_normalizer") +explain_handler = logging.StreamHandler() +explain_handler.setFormatter( + logging.Formatter("%(asctime)s | %(levelname)s | %(message)s") +) + + +def from_bytes( + sequences: bytes, + steps: int = 5, + chunk_size: int = 512, + threshold: float = 0.2, + cp_isolation: List[str] = None, + cp_exclusion: List[str] = None, + preemptive_behaviour: bool = True, + explain: bool = False, +) -> CharsetMatches: + """ + Given a raw bytes sequence, return the best possibles charset usable to render str objects. + If there is no results, it is a strong indicator that the source is binary/not text. + By default, the process will extract 5 blocs of 512o each to assess the mess and coherence of a given sequence. + And will give up a particular code page after 20% of measured mess. Those criteria are customizable at will. + + The preemptive behavior DOES NOT replace the traditional detection workflow, it prioritize a particular code page + but never take it for granted. Can improve the performance. + + You may want to focus your attention to some code page or/and not others, use cp_isolation and cp_exclusion for that + purpose. + + This function will strip the SIG in the payload/sequence every time except on UTF-16, UTF-32. + By default the library does not setup any handler other than the NullHandler, if you choose to set the 'explain' + toggle to True it will alter the logger configuration to add a StreamHandler that is suitable for debugging. + Custom logging format and handler can be set manually. + """ + + if not isinstance(sequences, (bytearray, bytes)): + raise TypeError( + "Expected object of type bytes or bytearray, got: {0}".format( + type(sequences) + ) + ) + + if explain: + previous_logger_level = logger.level # type: int + logger.addHandler(explain_handler) + logger.setLevel(TRACE) + + length = len(sequences) # type: int + + if length == 0: + logger.debug("Encoding detection on empty bytes, assuming utf_8 intention.") + if explain: + logger.removeHandler(explain_handler) + logger.setLevel(previous_logger_level or logging.WARNING) + return CharsetMatches([CharsetMatch(sequences, "utf_8", 0.0, False, [], "")]) + + if cp_isolation is not None: + logger.log( + TRACE, + "cp_isolation is set. use this flag for debugging purpose. " + "limited list of encoding allowed : %s.", + ", ".join(cp_isolation), + ) + cp_isolation = [iana_name(cp, False) for cp in cp_isolation] + else: + cp_isolation = [] + + if cp_exclusion is not None: + logger.log( + TRACE, + "cp_exclusion is set. use this flag for debugging purpose. " + "limited list of encoding excluded : %s.", + ", ".join(cp_exclusion), + ) + cp_exclusion = [iana_name(cp, False) for cp in cp_exclusion] + else: + cp_exclusion = [] + + if length <= (chunk_size * steps): + logger.log( + TRACE, + "override steps (%i) and chunk_size (%i) as content does not fit (%i byte(s) given) parameters.", + steps, + chunk_size, + length, + ) + steps = 1 + chunk_size = length + + if steps > 1 and length / steps < chunk_size: + chunk_size = int(length / steps) + + is_too_small_sequence = len(sequences) < TOO_SMALL_SEQUENCE # type: bool + is_too_large_sequence = len(sequences) >= TOO_BIG_SEQUENCE # type: bool + + if is_too_small_sequence: + logger.log( + TRACE, + "Trying to detect encoding from a tiny portion of ({}) byte(s).".format( + length + ), + ) + elif is_too_large_sequence: + logger.log( + TRACE, + "Using lazy str decoding because the payload is quite large, ({}) byte(s).".format( + length + ), + ) + + prioritized_encodings = [] # type: List[str] + + specified_encoding = ( + any_specified_encoding(sequences) if preemptive_behaviour else None + ) # type: Optional[str] + + if specified_encoding is not None: + prioritized_encodings.append(specified_encoding) + logger.log( + TRACE, + "Detected declarative mark in sequence. Priority +1 given for %s.", + specified_encoding, + ) + + tested = set() # type: Set[str] + tested_but_hard_failure = [] # type: List[str] + tested_but_soft_failure = [] # type: List[str] + + fallback_ascii = None # type: Optional[CharsetMatch] + fallback_u8 = None # type: Optional[CharsetMatch] + fallback_specified = None # type: Optional[CharsetMatch] + + results = CharsetMatches() # type: CharsetMatches + + sig_encoding, sig_payload = identify_sig_or_bom(sequences) + + if sig_encoding is not None: + prioritized_encodings.append(sig_encoding) + logger.log( + TRACE, + "Detected a SIG or BOM mark on first %i byte(s). Priority +1 given for %s.", + len(sig_payload), + sig_encoding, + ) + + prioritized_encodings.append("ascii") + + if "utf_8" not in prioritized_encodings: + prioritized_encodings.append("utf_8") + + for encoding_iana in prioritized_encodings + IANA_SUPPORTED: + + if cp_isolation and encoding_iana not in cp_isolation: + continue + + if cp_exclusion and encoding_iana in cp_exclusion: + continue + + if encoding_iana in tested: + continue + + tested.add(encoding_iana) + + decoded_payload = None # type: Optional[str] + bom_or_sig_available = sig_encoding == encoding_iana # type: bool + strip_sig_or_bom = bom_or_sig_available and should_strip_sig_or_bom( + encoding_iana + ) # type: bool + + if encoding_iana in {"utf_16", "utf_32"} and not bom_or_sig_available: + logger.log( + TRACE, + "Encoding %s wont be tested as-is because it require a BOM. Will try some sub-encoder LE/BE.", + encoding_iana, + ) + continue + + try: + is_multi_byte_decoder = is_multi_byte_encoding(encoding_iana) # type: bool + except (ModuleNotFoundError, ImportError): + logger.log( + TRACE, + "Encoding %s does not provide an IncrementalDecoder", + encoding_iana, + ) + continue + + try: + if is_too_large_sequence and is_multi_byte_decoder is False: + str( + sequences[: int(50e4)] + if strip_sig_or_bom is False + else sequences[len(sig_payload) : int(50e4)], + encoding=encoding_iana, + ) + else: + decoded_payload = str( + sequences + if strip_sig_or_bom is False + else sequences[len(sig_payload) :], + encoding=encoding_iana, + ) + except (UnicodeDecodeError, LookupError) as e: + if not isinstance(e, LookupError): + logger.log( + TRACE, + "Code page %s does not fit given bytes sequence at ALL. %s", + encoding_iana, + str(e), + ) + tested_but_hard_failure.append(encoding_iana) + continue + + similar_soft_failure_test = False # type: bool + + for encoding_soft_failed in tested_but_soft_failure: + if is_cp_similar(encoding_iana, encoding_soft_failed): + similar_soft_failure_test = True + break + + if similar_soft_failure_test: + logger.log( + TRACE, + "%s is deemed too similar to code page %s and was consider unsuited already. Continuing!", + encoding_iana, + encoding_soft_failed, + ) + continue + + r_ = range( + 0 if not bom_or_sig_available else len(sig_payload), + length, + int(length / steps), + ) + + multi_byte_bonus = ( + is_multi_byte_decoder + and decoded_payload is not None + and len(decoded_payload) < length + ) # type: bool + + if multi_byte_bonus: + logger.log( + TRACE, + "Code page %s is a multi byte encoding table and it appear that at least one character " + "was encoded using n-bytes.", + encoding_iana, + ) + + max_chunk_gave_up = int(len(r_) / 4) # type: int + + max_chunk_gave_up = max(max_chunk_gave_up, 2) + early_stop_count = 0 # type: int + lazy_str_hard_failure = False + + md_chunks = [] # type: List[str] + md_ratios = [] + + for i in r_: + if i + chunk_size > length + 8: + continue + + cut_sequence = sequences[i : i + chunk_size] + + if bom_or_sig_available and strip_sig_or_bom is False: + cut_sequence = sig_payload + cut_sequence + + try: + chunk = cut_sequence.decode( + encoding_iana, + errors="ignore" if is_multi_byte_decoder else "strict", + ) # type: str + except UnicodeDecodeError as e: # Lazy str loading may have missed something there + logger.log( + TRACE, + "LazyStr Loading: After MD chunk decode, code page %s does not fit given bytes sequence at ALL. %s", + encoding_iana, + str(e), + ) + early_stop_count = max_chunk_gave_up + lazy_str_hard_failure = True + break + + # multi-byte bad cutting detector and adjustment + # not the cleanest way to perform that fix but clever enough for now. + if is_multi_byte_decoder and i > 0 and sequences[i] >= 0x80: + + chunk_partial_size_chk = min(chunk_size, 16) # type: int + + if ( + decoded_payload + and chunk[:chunk_partial_size_chk] not in decoded_payload + ): + for j in range(i, i - 4, -1): + cut_sequence = sequences[j : i + chunk_size] + + if bom_or_sig_available and strip_sig_or_bom is False: + cut_sequence = sig_payload + cut_sequence + + chunk = cut_sequence.decode(encoding_iana, errors="ignore") + + if chunk[:chunk_partial_size_chk] in decoded_payload: + break + + md_chunks.append(chunk) + + md_ratios.append(mess_ratio(chunk, threshold)) + + if md_ratios[-1] >= threshold: + early_stop_count += 1 + + if (early_stop_count >= max_chunk_gave_up) or ( + bom_or_sig_available and strip_sig_or_bom is False + ): + break + + # We might want to check the sequence again with the whole content + # Only if initial MD tests passes + if ( + not lazy_str_hard_failure + and is_too_large_sequence + and not is_multi_byte_decoder + ): + try: + sequences[int(50e3) :].decode(encoding_iana, errors="strict") + except UnicodeDecodeError as e: + logger.log( + TRACE, + "LazyStr Loading: After final lookup, code page %s does not fit given bytes sequence at ALL. %s", + encoding_iana, + str(e), + ) + tested_but_hard_failure.append(encoding_iana) + continue + + mean_mess_ratio = ( + sum(md_ratios) / len(md_ratios) if md_ratios else 0.0 + ) # type: float + if mean_mess_ratio >= threshold or early_stop_count >= max_chunk_gave_up: + tested_but_soft_failure.append(encoding_iana) + logger.log( + TRACE, + "%s was excluded because of initial chaos probing. Gave up %i time(s). " + "Computed mean chaos is %f %%.", + encoding_iana, + early_stop_count, + round(mean_mess_ratio * 100, ndigits=3), + ) + # Preparing those fallbacks in case we got nothing. + if ( + encoding_iana in ["ascii", "utf_8", specified_encoding] + and not lazy_str_hard_failure + ): + fallback_entry = CharsetMatch( + sequences, encoding_iana, threshold, False, [], decoded_payload + ) + if encoding_iana == specified_encoding: + fallback_specified = fallback_entry + elif encoding_iana == "ascii": + fallback_ascii = fallback_entry + else: + fallback_u8 = fallback_entry + continue + + logger.log( + TRACE, + "%s passed initial chaos probing. Mean measured chaos is %f %%", + encoding_iana, + round(mean_mess_ratio * 100, ndigits=3), + ) + + if not is_multi_byte_decoder: + target_languages = encoding_languages(encoding_iana) # type: List[str] + else: + target_languages = mb_encoding_languages(encoding_iana) + + if target_languages: + logger.log( + TRACE, + "{} should target any language(s) of {}".format( + encoding_iana, str(target_languages) + ), + ) + + cd_ratios = [] + + # We shall skip the CD when its about ASCII + # Most of the time its not relevant to run "language-detection" on it. + if encoding_iana != "ascii": + for chunk in md_chunks: + chunk_languages = coherence_ratio( + chunk, 0.1, ",".join(target_languages) if target_languages else None + ) + + cd_ratios.append(chunk_languages) + + cd_ratios_merged = merge_coherence_ratios(cd_ratios) + + if cd_ratios_merged: + logger.log( + TRACE, + "We detected language {} using {}".format( + cd_ratios_merged, encoding_iana + ), + ) + + results.append( + CharsetMatch( + sequences, + encoding_iana, + mean_mess_ratio, + bom_or_sig_available, + cd_ratios_merged, + decoded_payload, + ) + ) + + if ( + encoding_iana in [specified_encoding, "ascii", "utf_8"] + and mean_mess_ratio < 0.1 + ): + logger.debug( + "Encoding detection: %s is most likely the one.", encoding_iana + ) + if explain: + logger.removeHandler(explain_handler) + logger.setLevel(previous_logger_level) + return CharsetMatches([results[encoding_iana]]) + + if encoding_iana == sig_encoding: + logger.debug( + "Encoding detection: %s is most likely the one as we detected a BOM or SIG within " + "the beginning of the sequence.", + encoding_iana, + ) + if explain: + logger.removeHandler(explain_handler) + logger.setLevel(previous_logger_level) + return CharsetMatches([results[encoding_iana]]) + + if len(results) == 0: + if fallback_u8 or fallback_ascii or fallback_specified: + logger.log( + TRACE, + "Nothing got out of the detection process. Using ASCII/UTF-8/Specified fallback.", + ) + + if fallback_specified: + logger.debug( + "Encoding detection: %s will be used as a fallback match", + fallback_specified.encoding, + ) + results.append(fallback_specified) + elif ( + (fallback_u8 and fallback_ascii is None) + or ( + fallback_u8 + and fallback_ascii + and fallback_u8.fingerprint != fallback_ascii.fingerprint + ) + or (fallback_u8 is not None) + ): + logger.debug("Encoding detection: utf_8 will be used as a fallback match") + results.append(fallback_u8) + elif fallback_ascii: + logger.debug("Encoding detection: ascii will be used as a fallback match") + results.append(fallback_ascii) + + if results: + logger.debug( + "Encoding detection: Found %s as plausible (best-candidate) for content. With %i alternatives.", + results.best().encoding, # type: ignore + len(results) - 1, + ) + else: + logger.debug("Encoding detection: Unable to determine any suitable charset.") + + if explain: + logger.removeHandler(explain_handler) + logger.setLevel(previous_logger_level) + + return results + + +def from_fp( + fp: BinaryIO, + steps: int = 5, + chunk_size: int = 512, + threshold: float = 0.20, + cp_isolation: List[str] = None, + cp_exclusion: List[str] = None, + preemptive_behaviour: bool = True, + explain: bool = False, +) -> CharsetMatches: + """ + Same thing than the function from_bytes but using a file pointer that is already ready. + Will not close the file pointer. + """ + return from_bytes( + fp.read(), + steps, + chunk_size, + threshold, + cp_isolation, + cp_exclusion, + preemptive_behaviour, + explain, + ) + + +def from_path( + path: PathLike, + steps: int = 5, + chunk_size: int = 512, + threshold: float = 0.20, + cp_isolation: List[str] = None, + cp_exclusion: List[str] = None, + preemptive_behaviour: bool = True, + explain: bool = False, +) -> CharsetMatches: + """ + Same thing than the function from_bytes but with one extra step. Opening and reading given file path in binary mode. + Can raise IOError. + """ + with open(path, "rb") as fp: + return from_fp( + fp, + steps, + chunk_size, + threshold, + cp_isolation, + cp_exclusion, + preemptive_behaviour, + explain, + ) + + +def normalize( + path: PathLike, + steps: int = 5, + chunk_size: int = 512, + threshold: float = 0.20, + cp_isolation: List[str] = None, + cp_exclusion: List[str] = None, + preemptive_behaviour: bool = True, +) -> CharsetMatch: + """ + Take a (text-based) file path and try to create another file next to it, this time using UTF-8. + """ + results = from_path( + path, + steps, + chunk_size, + threshold, + cp_isolation, + cp_exclusion, + preemptive_behaviour, + ) + + filename = basename(path) + target_extensions = list(splitext(filename)) + + if len(results) == 0: + raise IOError( + 'Unable to normalize "{}", no encoding charset seems to fit.'.format( + filename + ) + ) + + result = results.best() + + target_extensions[0] += "-" + result.encoding # type: ignore + + with open( + "{}".format(str(path).replace(filename, "".join(target_extensions))), "wb" + ) as fp: + fp.write(result.output()) # type: ignore + + return result # type: ignore diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/assets/__init__.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/assets/__init__.py new file mode 100755 index 00000000..b2e56ff3 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/assets/__init__.py @@ -0,0 +1,1244 @@ +# -*- coding: utf_8 -*- +from collections import OrderedDict + +FREQUENCIES = OrderedDict( + [ + ( + "English", + [ + "e", + "a", + "t", + "i", + "o", + "n", + "s", + "r", + "h", + "l", + "d", + "c", + "u", + "m", + "f", + "p", + "g", + "w", + "y", + "b", + "v", + "k", + "x", + "j", + "z", + "q", + ], + ), + ( + "German", + [ + "e", + "n", + "i", + "r", + "s", + "t", + "a", + "d", + "h", + "u", + "l", + "g", + "o", + "c", + "m", + "b", + "f", + "k", + "w", + "z", + "p", + "v", + "ü", + "ä", + "ö", + "j", + ], + ), + ( + "French", + [ + "e", + "a", + "s", + "n", + "i", + "t", + "r", + "l", + "u", + "o", + "d", + "c", + "p", + "m", + "é", + "v", + "g", + "f", + "b", + "h", + "q", + "à", + "x", + "è", + "y", + "j", + ], + ), + ( + "Dutch", + [ + "e", + "n", + "a", + "i", + "r", + "t", + "o", + "d", + "s", + "l", + "g", + "h", + "v", + "m", + "u", + "k", + "c", + "p", + "b", + "w", + "j", + "z", + "f", + "y", + "x", + "ë", + ], + ), + ( + "Italian", + [ + "e", + "i", + "a", + "o", + "n", + "l", + "t", + "r", + "s", + "c", + "d", + "u", + "p", + "m", + "g", + "v", + "f", + "b", + "z", + "h", + "q", + "è", + "à", + "k", + "y", + "ò", + ], + ), + ( + "Polish", + [ + "a", + "i", + "o", + "e", + "n", + "r", + "z", + "w", + "s", + "c", + "t", + "k", + "y", + "d", + "p", + "m", + "u", + "l", + "j", + "ł", + "g", + "b", + "h", + "ą", + "ę", + "ó", + ], + ), + ( + "Spanish", + [ + "e", + "a", + "o", + "n", + "s", + "r", + "i", + "l", + "d", + "t", + "c", + "u", + "m", + "p", + "b", + "g", + "v", + "f", + "y", + "ó", + "h", + "q", + "í", + "j", + "z", + "á", + ], + ), + ( + "Russian", + [ + "о", + "а", + "е", + "и", + "н", + "с", + "т", + "р", + "в", + "л", + "к", + "м", + "д", + "п", + "у", + "г", + "я", + "ы", + "з", + "б", + "й", + "ь", + "ч", + "х", + "ж", + "ц", + ], + ), + ( + "Japanese", + [ + "の", + "に", + "る", + "た", + "は", + "ー", + "と", + "し", + "を", + "で", + "て", + "が", + "い", + "ン", + "れ", + "な", + "年", + "ス", + "っ", + "ル", + "か", + "ら", + "あ", + "さ", + "も", + "り", + ], + ), + ( + "Portuguese", + [ + "a", + "e", + "o", + "s", + "i", + "r", + "d", + "n", + "t", + "m", + "u", + "c", + "l", + "p", + "g", + "v", + "b", + "f", + "h", + "ã", + "q", + "é", + "ç", + "á", + "z", + "í", + ], + ), + ( + "Swedish", + [ + "e", + "a", + "n", + "r", + "t", + "s", + "i", + "l", + "d", + "o", + "m", + "k", + "g", + "v", + "h", + "f", + "u", + "p", + "ä", + "c", + "b", + "ö", + "å", + "y", + "j", + "x", + ], + ), + ( + "Chinese", + [ + "的", + "一", + "是", + "不", + "了", + "在", + "人", + "有", + "我", + "他", + "这", + "个", + "们", + "中", + "来", + "上", + "大", + "为", + "和", + "国", + "地", + "到", + "以", + "说", + "时", + "要", + "就", + "出", + "会", + ], + ), + ( + "Ukrainian", + [ + "о", + "а", + "н", + "і", + "и", + "р", + "в", + "т", + "е", + "с", + "к", + "л", + "у", + "д", + "м", + "п", + "з", + "я", + "ь", + "б", + "г", + "й", + "ч", + "х", + "ц", + "ї", + ], + ), + ( + "Norwegian", + [ + "e", + "r", + "n", + "t", + "a", + "s", + "i", + "o", + "l", + "d", + "g", + "k", + "m", + "v", + "f", + "p", + "u", + "b", + "h", + "å", + "y", + "j", + "ø", + "c", + "æ", + "w", + ], + ), + ( + "Finnish", + [ + "a", + "i", + "n", + "t", + "e", + "s", + "l", + "o", + "u", + "k", + "ä", + "m", + "r", + "v", + "j", + "h", + "p", + "y", + "d", + "ö", + "g", + "c", + "b", + "f", + "w", + "z", + ], + ), + ( + "Vietnamese", + [ + "n", + "h", + "t", + "i", + "c", + "g", + "a", + "o", + "u", + "m", + "l", + "r", + "à", + "đ", + "s", + "e", + "v", + "p", + "b", + "y", + "ư", + "d", + "á", + "k", + "ộ", + "ế", + ], + ), + ( + "Czech", + [ + "o", + "e", + "a", + "n", + "t", + "s", + "i", + "l", + "v", + "r", + "k", + "d", + "u", + "m", + "p", + "í", + "c", + "h", + "z", + "á", + "y", + "j", + "b", + "ě", + "é", + "ř", + ], + ), + ( + "Hungarian", + [ + "e", + "a", + "t", + "l", + "s", + "n", + "k", + "r", + "i", + "o", + "z", + "á", + "é", + "g", + "m", + "b", + "y", + "v", + "d", + "h", + "u", + "p", + "j", + "ö", + "f", + "c", + ], + ), + ( + "Korean", + [ + "이", + "다", + "에", + "의", + "는", + "로", + "하", + "을", + "가", + "고", + "지", + "서", + "한", + "은", + "기", + "으", + "년", + "대", + "사", + "시", + "를", + "리", + "도", + "인", + "스", + "일", + ], + ), + ( + "Indonesian", + [ + "a", + "n", + "e", + "i", + "r", + "t", + "u", + "s", + "d", + "k", + "m", + "l", + "g", + "p", + "b", + "o", + "h", + "y", + "j", + "c", + "w", + "f", + "v", + "z", + "x", + "q", + ], + ), + ( + "Turkish", + [ + "a", + "e", + "i", + "n", + "r", + "l", + "ı", + "k", + "d", + "t", + "s", + "m", + "y", + "u", + "o", + "b", + "ü", + "ş", + "v", + "g", + "z", + "h", + "c", + "p", + "ç", + "ğ", + ], + ), + ( + "Romanian", + [ + "e", + "i", + "a", + "r", + "n", + "t", + "u", + "l", + "o", + "c", + "s", + "d", + "p", + "m", + "ă", + "f", + "v", + "î", + "g", + "b", + "ș", + "ț", + "z", + "h", + "â", + "j", + ], + ), + ( + "Farsi", + [ + "ا", + "ی", + "ر", + "د", + "ن", + "ه", + "و", + "م", + "ت", + "ب", + "س", + "ل", + "ک", + "ش", + "ز", + "ف", + "گ", + "ع", + "خ", + "ق", + "ج", + "آ", + "پ", + "ح", + "ط", + "ص", + ], + ), + ( + "Arabic", + [ + "ا", + "ل", + "ي", + "م", + "و", + "ن", + "ر", + "ت", + "ب", + "ة", + "ع", + "د", + "س", + "ف", + "ه", + "ك", + "ق", + "أ", + "ح", + "ج", + "ش", + "ط", + "ص", + "ى", + "خ", + "إ", + ], + ), + ( + "Danish", + [ + "e", + "r", + "n", + "t", + "a", + "i", + "s", + "d", + "l", + "o", + "g", + "m", + "k", + "f", + "v", + "u", + "b", + "h", + "p", + "å", + "y", + "ø", + "æ", + "c", + "j", + "w", + ], + ), + ( + "Serbian", + [ + "а", + "и", + "о", + "е", + "н", + "р", + "с", + "у", + "т", + "к", + "ј", + "в", + "д", + "м", + "п", + "л", + "г", + "з", + "б", + "a", + "i", + "e", + "o", + "n", + "ц", + "ш", + ], + ), + ( + "Lithuanian", + [ + "i", + "a", + "s", + "o", + "r", + "e", + "t", + "n", + "u", + "k", + "m", + "l", + "p", + "v", + "d", + "j", + "g", + "ė", + "b", + "y", + "ų", + "š", + "ž", + "c", + "ą", + "į", + ], + ), + ( + "Slovene", + [ + "e", + "a", + "i", + "o", + "n", + "r", + "s", + "l", + "t", + "j", + "v", + "k", + "d", + "p", + "m", + "u", + "z", + "b", + "g", + "h", + "č", + "c", + "š", + "ž", + "f", + "y", + ], + ), + ( + "Slovak", + [ + "o", + "a", + "e", + "n", + "i", + "r", + "v", + "t", + "s", + "l", + "k", + "d", + "m", + "p", + "u", + "c", + "h", + "j", + "b", + "z", + "á", + "y", + "ý", + "í", + "č", + "é", + ], + ), + ( + "Hebrew", + [ + "י", + "ו", + "ה", + "ל", + "ר", + "ב", + "ת", + "מ", + "א", + "ש", + "נ", + "ע", + "ם", + "ד", + "ק", + "ח", + "פ", + "ס", + "כ", + "ג", + "ט", + "צ", + "ן", + "ז", + "ך", + ], + ), + ( + "Bulgarian", + [ + "а", + "и", + "о", + "е", + "н", + "т", + "р", + "с", + "в", + "л", + "к", + "д", + "п", + "м", + "з", + "г", + "я", + "ъ", + "у", + "б", + "ч", + "ц", + "й", + "ж", + "щ", + "х", + ], + ), + ( + "Croatian", + [ + "a", + "i", + "o", + "e", + "n", + "r", + "j", + "s", + "t", + "u", + "k", + "l", + "v", + "d", + "m", + "p", + "g", + "z", + "b", + "c", + "č", + "h", + "š", + "ž", + "ć", + "f", + ], + ), + ( + "Hindi", + [ + "क", + "र", + "स", + "न", + "त", + "म", + "ह", + "प", + "य", + "ल", + "व", + "ज", + "द", + "ग", + "ब", + "श", + "ट", + "अ", + "ए", + "थ", + "भ", + "ड", + "च", + "ध", + "ष", + "इ", + ], + ), + ( + "Estonian", + [ + "a", + "i", + "e", + "s", + "t", + "l", + "u", + "n", + "o", + "k", + "r", + "d", + "m", + "v", + "g", + "p", + "j", + "h", + "ä", + "b", + "õ", + "ü", + "f", + "c", + "ö", + "y", + ], + ), + ( + "Simple English", + [ + "e", + "a", + "t", + "i", + "o", + "n", + "s", + "r", + "h", + "l", + "d", + "c", + "m", + "u", + "f", + "p", + "g", + "w", + "b", + "y", + "v", + "k", + "j", + "x", + "z", + "q", + ], + ), + ( + "Thai", + [ + "า", + "น", + "ร", + "อ", + "ก", + "เ", + "ง", + "ม", + "ย", + "ล", + "ว", + "ด", + "ท", + "ส", + "ต", + "ะ", + "ป", + "บ", + "ค", + "ห", + "แ", + "จ", + "พ", + "ช", + "ข", + "ใ", + ], + ), + ( + "Greek", + [ + "α", + "τ", + "ο", + "ι", + "ε", + "ν", + "ρ", + "σ", + "κ", + "η", + "π", + "ς", + "υ", + "μ", + "λ", + "ί", + "ό", + "ά", + "γ", + "έ", + "δ", + "ή", + "ω", + "χ", + "θ", + "ύ", + ], + ), + ( + "Tamil", + [ + "க", + "த", + "ப", + "ட", + "ர", + "ம", + "ல", + "ன", + "வ", + "ற", + "ய", + "ள", + "ச", + "ந", + "இ", + "ண", + "அ", + "ஆ", + "ழ", + "ங", + "எ", + "உ", + "ஒ", + "ஸ", + ], + ), + ( + "Classical Chinese", + [ + "之", + "年", + "為", + "也", + "以", + "一", + "人", + "其", + "者", + "國", + "有", + "二", + "十", + "於", + "曰", + "三", + "不", + "大", + "而", + "子", + "中", + "五", + "四", + ], + ), + ( + "Kazakh", + [ + "а", + "ы", + "е", + "н", + "т", + "р", + "л", + "і", + "д", + "с", + "м", + "қ", + "к", + "о", + "б", + "и", + "у", + "ғ", + "ж", + "ң", + "з", + "ш", + "й", + "п", + "г", + "ө", + ], + ), + ] +) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/assets/__pycache__/__init__.cpython-39.pyc b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/assets/__pycache__/__init__.cpython-39.pyc new file mode 100755 index 0000000000000000000000000000000000000000..4149c790efc38bd6e256e9839c04fd1b7ab661df GIT binary patch literal 7367 zcmbtZTXYmv7VQe=1>*aOqESaByc$Ij-(Uz2QAEI5Gc}J)r@Ktrbh zMR_I>f#wmE21K+IKt2ewW`58(A2c;TkXzbY00reB#S{dCG4g|iJ#>k&ZsxeFbB@bGGKqL^cVu5DMwyc0-MM@e1 zkx_fB*GnSTD614!nX<}ZRVb?x)@Wsofpx92#=^QzS=Yn5L0LD#x=C3#!@5OTx5Bzj zS+~QwLs@si8mFwgVBM{(@v!bu*1fQ*lyx7h`<3+ote+|CL0Atd>tR?ElvNFDqOvBz znyjoTu%;?22y2?M9)b0!vZlj&Oj(b^nxU*GV9iw4ldzsr*3+<_QP#7to>SKIux2T1 zHmnzvRRe2|vT9+?Rn|OM^Ody#){Dwo28>`28mg89=&q{e#)Uy(v75A*9XStr$=vgt( zig;Gov(lc`>{+jSR*Ppfc-C^ydfT(=J?l-+YVxeNJnIe5TH#s0x69@^ZgVJJJl3?tK`IoBnuq}e;9!2B!_>w}fP=Z9~3;`MdF?2$p@I<_zK?8)vCz4$Tm!X)rBrSwF*Gja--~mP78eHt#K}^T(@}(`I zIFe-qg^YIq0HA;t&Vplr2Y$lbpfd1aJ`mmb34wV?d{Xoi=RXY6AcXAL?UgS{CzFU7 zdcOIJ>L}F-svOm6sQy({tyC*{?K7&ARJ~M8qHjKD>kL$X8(YWOdY5VgJHMnlM%BY> z8>!Y(t>LvV*m}pScrm10>Li`&acK$c_p7p6e?r~5LAQ5leT2I0lx`o?dK-1?X5BuZ z^?t24YQ37e?KpL7q5sgZ%s<%kx$f_wUbUCHP2*Xm@wBej*ITvTLfxv{t?l;c#R)f+ zZb;+p$YO98gaKDT6A%V8L5hJZUQU}=R!MCJT*zg)Pj@xx4KiL;}H>$ikK#1vWTFF$3#pQ zF;m105s!;_Lc}v7o)YoAh-XDSDdIU1vqa1mQKLj!mcIUNcIBdkyWD9QvG#)uhK^>d zG|RBz2FL(ffFNci17kr8@BmbqFOy@5lf{>`&4Dbm_hVDH%jZVpdZjfxq5*_F0#5-0 z?8HQX0sa9C-UEQJ`vCz^0RfUu*vZA;Fcy3+78myDpGTckJk-oY1`0e0*#eK?R`|he zn7{)Rzz8U^)xqn1@3RELivS>C!B2t>gZ_AwTh|1EC~pQbeRq+~| z;9&q@JattvV=6#_r{Dnt6c}WkVD{oAv33AKF={Bo_!=ExfmE*W}jl1iVJ$gYrl28jLJ#9h`2AEw1 zj)#xnc=!#DH?#z44fnt!xYk4)^Q)LS%DZx5cu(h8_(?;QEUSNkOCiGVP0Wm-!8jiNkSbzMor$!PUBbmk9W@LyRZ zvI;woO_qw}oI@>z_$ z$XYP}DR0;Vb&;iH{xF8*S=!}K*k!ZbP<=G44pF~QbGh|OaD2P_Tj}_Xh+m2LrHDEa zzf*$G?sgsNutkJKL`3{r2|lFFZ7A6Jy>3)4Hi`&~ctb>!5*)kUeZ64k_t|B0{-ZL# zD#Qpo2w(zhB90sY{g51n(Ntr)kPRjg;0)XXf8hy8NIU^=f7NmU7hnZI_TrtzeSqD!jR$n`4m!?}nCEr_ z$hoiRs0Ry|`;I7A#S(8iaaI10I8gzhc@tm*RD=uwF)?reAixwel^+qXKp=RCZ!r=3 zHW5a%g5kzRAm9SpE)zJRCWQvm!@2MZ90FWGgP8%u;4(l!C7^)|!48?8=QltCxCzoH z^TIu6PrDCGM?yrE5?NNXLqGz<*5vaNgv>qw?OMxa0xr zTF@Q|0LFv+PpPYzsK1@LgFKie_Xy`%=)O=Kv>x@YT~XsELa7n^r6HLKFk%a8A*=|n z$pWy?aNk53{4#Vyyb(nNy~s0w?pq7G*`@QN@rc?6u(kUco*w-SO9nr~E#J@Zbn9oh z_4^r~j{OWzr+$X#8b8BRv7h-&KktOrEG_&DPr-hMr({3F62s5%yy9ngy7n_`^nLGY z&GU_);d#l=?AHA|wdQ%r&wQ!dYwe2KWGbQe-K!QS<5aj3o<(9I*^obo0J0hGg}32e zq!U5|r=rA{Od6IY?(7LyiUcMy+>c67QftL^OQX##F{i5dopZ!Og8&;M01H3@1||Yh z0K#*D3c#^w02T0|K0<2CtgKV;M!<|p2@JVgUG=V6))*?rKBr@rV_EO#_{G7`X`knK zmh^jAHu|}>^mR_hBDY7kb*yqaCOMX~eon_+pMm|H=9(@~{alB>U&l1ZveVD;i-+H% z=g+Ov<37^5U2A^v@O#?4(s{1qsMQlpKYtAB>(y+Xq3WSJL3JAHYZfP8x3ROA>Puc* zN!3clFLLKkamY!kBfPeeEtWCokF#}{ip9|REJv=VTFYxWwl>+N%R=A;R_A0^$1&Tj@7Fn)fCF|?J3m!S@NWgxfST_}%xrEtfk zmHLju@41T#oddlj>0n2PUA8c^BGe?G=O@XHPm7o=VycK~BCuIti+EL(UJ-#TVm;WQ_x9;gQ1p|WN_K+Dal0G z4MjrklxRF0jX3dCGFTst2UDTC!j(F6C6uVIYk7NmFx;pP3Qnpno>2csiA7g9Zcqi) zQTNuV(a}_0-PD%1y^3d=6OnYxc}}1uE381^+LDq{C05x#OR9ddeBdWP;eW?)@Bca1 RJs3Y8a%JG^-#?f9>)$=jEd>Ao literal 0 HcmV?d00001 diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/cd.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/cd.py new file mode 100755 index 00000000..8429a0eb --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/cd.py @@ -0,0 +1,340 @@ +import importlib +from codecs import IncrementalDecoder +from collections import Counter, OrderedDict +from functools import lru_cache +from typing import Dict, List, Optional, Tuple + +from .assets import FREQUENCIES +from .constant import KO_NAMES, LANGUAGE_SUPPORTED_COUNT, TOO_SMALL_SEQUENCE, ZH_NAMES +from .md import is_suspiciously_successive_range +from .models import CoherenceMatches +from .utils import ( + is_accentuated, + is_latin, + is_multi_byte_encoding, + is_unicode_range_secondary, + unicode_range, +) + + +def encoding_unicode_range(iana_name: str) -> List[str]: + """ + Return associated unicode ranges in a single byte code page. + """ + if is_multi_byte_encoding(iana_name): + raise IOError("Function not supported on multi-byte code page") + + decoder = importlib.import_module("encodings.{}".format(iana_name)).IncrementalDecoder # type: ignore + + p = decoder(errors="ignore") # type: IncrementalDecoder + seen_ranges = {} # type: Dict[str, int] + character_count = 0 # type: int + + for i in range(0x40, 0xFF): + chunk = p.decode(bytes([i])) # type: str + + if chunk: + character_range = unicode_range(chunk) # type: Optional[str] + + if character_range is None: + continue + + if is_unicode_range_secondary(character_range) is False: + if character_range not in seen_ranges: + seen_ranges[character_range] = 0 + seen_ranges[character_range] += 1 + character_count += 1 + + return sorted( + [ + character_range + for character_range in seen_ranges + if seen_ranges[character_range] / character_count >= 0.15 + ] + ) + + +def unicode_range_languages(primary_range: str) -> List[str]: + """ + Return inferred languages used with a unicode range. + """ + languages = [] # type: List[str] + + for language, characters in FREQUENCIES.items(): + for character in characters: + if unicode_range(character) == primary_range: + languages.append(language) + break + + return languages + + +@lru_cache() +def encoding_languages(iana_name: str) -> List[str]: + """ + Single-byte encoding language association. Some code page are heavily linked to particular language(s). + This function does the correspondence. + """ + unicode_ranges = encoding_unicode_range(iana_name) # type: List[str] + primary_range = None # type: Optional[str] + + for specified_range in unicode_ranges: + if "Latin" not in specified_range: + primary_range = specified_range + break + + if primary_range is None: + return ["Latin Based"] + + return unicode_range_languages(primary_range) + + +@lru_cache() +def mb_encoding_languages(iana_name: str) -> List[str]: + """ + Multi-byte encoding language association. Some code page are heavily linked to particular language(s). + This function does the correspondence. + """ + if ( + iana_name.startswith("shift_") + or iana_name.startswith("iso2022_jp") + or iana_name.startswith("euc_j") + or iana_name == "cp932" + ): + return ["Japanese"] + if iana_name.startswith("gb") or iana_name in ZH_NAMES: + return ["Chinese", "Classical Chinese"] + if iana_name.startswith("iso2022_kr") or iana_name in KO_NAMES: + return ["Korean"] + + return [] + + +@lru_cache(maxsize=LANGUAGE_SUPPORTED_COUNT) +def get_target_features(language: str) -> Tuple[bool, bool]: + """ + Determine main aspects from a supported language if it contains accents and if is pure Latin. + """ + target_have_accents = False # type: bool + target_pure_latin = True # type: bool + + for character in FREQUENCIES[language]: + if not target_have_accents and is_accentuated(character): + target_have_accents = True + if target_pure_latin and is_latin(character) is False: + target_pure_latin = False + + return target_have_accents, target_pure_latin + + +def alphabet_languages( + characters: List[str], ignore_non_latin: bool = False +) -> List[str]: + """ + Return associated languages associated to given characters. + """ + languages = [] # type: List[Tuple[str, float]] + + source_have_accents = any(is_accentuated(character) for character in characters) + + for language, language_characters in FREQUENCIES.items(): + + target_have_accents, target_pure_latin = get_target_features(language) + + if ignore_non_latin and target_pure_latin is False: + continue + + if target_have_accents is False and source_have_accents: + continue + + character_count = len(language_characters) # type: int + + character_match_count = len( + [c for c in language_characters if c in characters] + ) # type: int + + ratio = character_match_count / character_count # type: float + + if ratio >= 0.2: + languages.append((language, ratio)) + + languages = sorted(languages, key=lambda x: x[1], reverse=True) + + return [compatible_language[0] for compatible_language in languages] + + +def characters_popularity_compare( + language: str, ordered_characters: List[str] +) -> float: + """ + Determine if a ordered characters list (by occurrence from most appearance to rarest) match a particular language. + The result is a ratio between 0. (absolutely no correspondence) and 1. (near perfect fit). + Beware that is function is not strict on the match in order to ease the detection. (Meaning close match is 1.) + """ + if language not in FREQUENCIES: + raise ValueError("{} not available".format(language)) + + character_approved_count = 0 # type: int + + for character in ordered_characters: + if character not in FREQUENCIES[language]: + continue + + characters_before_source = FREQUENCIES[language][ + 0 : FREQUENCIES[language].index(character) + ] # type: List[str] + characters_after_source = FREQUENCIES[language][ + FREQUENCIES[language].index(character) : + ] # type: List[str] + + characters_before = ordered_characters[ + 0 : ordered_characters.index(character) + ] # type: List[str] + characters_after = ordered_characters[ + ordered_characters.index(character) : + ] # type: List[str] + + before_match_count = [ + e in characters_before for e in characters_before_source + ].count( + True + ) # type: int + after_match_count = [ + e in characters_after for e in characters_after_source + ].count( + True + ) # type: int + + if len(characters_before_source) == 0 and before_match_count <= 4: + character_approved_count += 1 + continue + + if len(characters_after_source) == 0 and after_match_count <= 4: + character_approved_count += 1 + continue + + if ( + before_match_count / len(characters_before_source) >= 0.4 + or after_match_count / len(characters_after_source) >= 0.4 + ): + character_approved_count += 1 + continue + + return character_approved_count / len(ordered_characters) + + +def alpha_unicode_split(decoded_sequence: str) -> List[str]: + """ + Given a decoded text sequence, return a list of str. Unicode range / alphabet separation. + Ex. a text containing English/Latin with a bit a Hebrew will return two items in the resulting list; + One containing the latin letters and the other hebrew. + """ + layers = OrderedDict() # type: Dict[str, str] + + for character in decoded_sequence: + if character.isalpha() is False: + continue + + character_range = unicode_range(character) # type: Optional[str] + + if character_range is None: + continue + + layer_target_range = None # type: Optional[str] + + for discovered_range in layers: + if ( + is_suspiciously_successive_range(discovered_range, character_range) + is False + ): + layer_target_range = discovered_range + break + + if layer_target_range is None: + layer_target_range = character_range + + if layer_target_range not in layers: + layers[layer_target_range] = character.lower() + continue + + layers[layer_target_range] += character.lower() + + return list(layers.values()) + + +def merge_coherence_ratios(results: List[CoherenceMatches]) -> CoherenceMatches: + """ + This function merge results previously given by the function coherence_ratio. + The return type is the same as coherence_ratio. + """ + per_language_ratios = OrderedDict() # type: Dict[str, List[float]] + for result in results: + for sub_result in result: + language, ratio = sub_result + if language not in per_language_ratios: + per_language_ratios[language] = [ratio] + continue + per_language_ratios[language].append(ratio) + + merge = [ + ( + language, + round( + sum(per_language_ratios[language]) / len(per_language_ratios[language]), + 4, + ), + ) + for language in per_language_ratios + ] + + return sorted(merge, key=lambda x: x[1], reverse=True) + + +@lru_cache(maxsize=2048) +def coherence_ratio( + decoded_sequence: str, threshold: float = 0.1, lg_inclusion: Optional[str] = None +) -> CoherenceMatches: + """ + Detect ANY language that can be identified in given sequence. The sequence will be analysed by layers. + A layer = Character extraction by alphabets/ranges. + """ + + results = [] # type: List[Tuple[str, float]] + ignore_non_latin = False # type: bool + + sufficient_match_count = 0 # type: int + + lg_inclusion_list = lg_inclusion.split(",") if lg_inclusion is not None else [] + if "Latin Based" in lg_inclusion_list: + ignore_non_latin = True + lg_inclusion_list.remove("Latin Based") + + for layer in alpha_unicode_split(decoded_sequence): + sequence_frequencies = Counter(layer) # type: Counter + most_common = sequence_frequencies.most_common() + + character_count = sum(o for c, o in most_common) # type: int + + if character_count <= TOO_SMALL_SEQUENCE: + continue + + popular_character_ordered = [c for c, o in most_common] # type: List[str] + + for language in lg_inclusion_list or alphabet_languages( + popular_character_ordered, ignore_non_latin + ): + ratio = characters_popularity_compare( + language, popular_character_ordered + ) # type: float + + if ratio < threshold: + continue + elif ratio >= 0.8: + sufficient_match_count += 1 + + results.append((language, round(ratio, 4))) + + if sufficient_match_count >= 3: + break + + return sorted(results, key=lambda x: x[1], reverse=True) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/cli/__init__.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/cli/__init__.py new file mode 100755 index 00000000..e69de29b diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/cli/normalizer.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/cli/normalizer.py new file mode 100755 index 00000000..5f912c92 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/cli/normalizer.py @@ -0,0 +1,290 @@ +import argparse +import sys +from json import dumps +from os.path import abspath +from platform import python_version +from typing import List + +from charset_normalizer import from_fp +from charset_normalizer.models import CliDetectionResult +from charset_normalizer.version import __version__ + + +def query_yes_no(question: str, default: str = "yes") -> bool: + """Ask a yes/no question via input() and return their answer. + + "question" is a string that is presented to the user. + "default" is the presumed answer if the user just hits . + It must be "yes" (the default), "no" or None (meaning + an answer is required of the user). + + The "answer" return value is True for "yes" or False for "no". + + Credit goes to (c) https://stackoverflow.com/questions/3041986/apt-command-line-interface-like-yes-no-input + """ + valid = {"yes": True, "y": True, "ye": True, "no": False, "n": False} + if default is None: + prompt = " [y/n] " + elif default == "yes": + prompt = " [Y/n] " + elif default == "no": + prompt = " [y/N] " + else: + raise ValueError("invalid default answer: '%s'" % default) + + while True: + sys.stdout.write(question + prompt) + choice = input().lower() + if default is not None and choice == "": + return valid[default] + elif choice in valid: + return valid[choice] + else: + sys.stdout.write("Please respond with 'yes' or 'no' " "(or 'y' or 'n').\n") + + +def cli_detect(argv: List[str] = None) -> int: + """ + CLI assistant using ARGV and ArgumentParser + :param argv: + :return: 0 if everything is fine, anything else equal trouble + """ + parser = argparse.ArgumentParser( + description="The Real First Universal Charset Detector. " + "Discover originating encoding used on text file. " + "Normalize text to unicode." + ) + + parser.add_argument( + "files", type=argparse.FileType("rb"), nargs="+", help="File(s) to be analysed" + ) + parser.add_argument( + "-v", + "--verbose", + action="store_true", + default=False, + dest="verbose", + help="Display complementary information about file if any. " + "Stdout will contain logs about the detection process.", + ) + parser.add_argument( + "-a", + "--with-alternative", + action="store_true", + default=False, + dest="alternatives", + help="Output complementary possibilities if any. Top-level JSON WILL be a list.", + ) + parser.add_argument( + "-n", + "--normalize", + action="store_true", + default=False, + dest="normalize", + help="Permit to normalize input file. If not set, program does not write anything.", + ) + parser.add_argument( + "-m", + "--minimal", + action="store_true", + default=False, + dest="minimal", + help="Only output the charset detected to STDOUT. Disabling JSON output.", + ) + parser.add_argument( + "-r", + "--replace", + action="store_true", + default=False, + dest="replace", + help="Replace file when trying to normalize it instead of creating a new one.", + ) + parser.add_argument( + "-f", + "--force", + action="store_true", + default=False, + dest="force", + help="Replace file without asking if you are sure, use this flag with caution.", + ) + parser.add_argument( + "-t", + "--threshold", + action="store", + default=0.1, + type=float, + dest="threshold", + help="Define a custom maximum amount of chaos allowed in decoded content. 0. <= chaos <= 1.", + ) + parser.add_argument( + "--version", + action="version", + version="Charset-Normalizer {} - Python {}".format( + __version__, python_version() + ), + help="Show version information and exit.", + ) + + args = parser.parse_args(argv) + + if args.replace is True and args.normalize is False: + print("Use --replace in addition of --normalize only.", file=sys.stderr) + return 1 + + if args.force is True and args.replace is False: + print("Use --force in addition of --replace only.", file=sys.stderr) + return 1 + + if args.threshold < 0.0 or args.threshold > 1.0: + print("--threshold VALUE should be between 0. AND 1.", file=sys.stderr) + return 1 + + x_ = [] + + for my_file in args.files: + + matches = from_fp(my_file, threshold=args.threshold, explain=args.verbose) + + best_guess = matches.best() + + if best_guess is None: + print( + 'Unable to identify originating encoding for "{}". {}'.format( + my_file.name, + "Maybe try increasing maximum amount of chaos." + if args.threshold < 1.0 + else "", + ), + file=sys.stderr, + ) + x_.append( + CliDetectionResult( + abspath(my_file.name), + None, + [], + [], + "Unknown", + [], + False, + 1.0, + 0.0, + None, + True, + ) + ) + else: + x_.append( + CliDetectionResult( + abspath(my_file.name), + best_guess.encoding, + best_guess.encoding_aliases, + [ + cp + for cp in best_guess.could_be_from_charset + if cp != best_guess.encoding + ], + best_guess.language, + best_guess.alphabets, + best_guess.bom, + best_guess.percent_chaos, + best_guess.percent_coherence, + None, + True, + ) + ) + + if len(matches) > 1 and args.alternatives: + for el in matches: + if el != best_guess: + x_.append( + CliDetectionResult( + abspath(my_file.name), + el.encoding, + el.encoding_aliases, + [ + cp + for cp in el.could_be_from_charset + if cp != el.encoding + ], + el.language, + el.alphabets, + el.bom, + el.percent_chaos, + el.percent_coherence, + None, + False, + ) + ) + + if args.normalize is True: + + if best_guess.encoding.startswith("utf") is True: + print( + '"{}" file does not need to be normalized, as it already came from unicode.'.format( + my_file.name + ), + file=sys.stderr, + ) + if my_file.closed is False: + my_file.close() + continue + + o_ = my_file.name.split(".") # type: List[str] + + if args.replace is False: + o_.insert(-1, best_guess.encoding) + if my_file.closed is False: + my_file.close() + elif ( + args.force is False + and query_yes_no( + 'Are you sure to normalize "{}" by replacing it ?'.format( + my_file.name + ), + "no", + ) + is False + ): + if my_file.closed is False: + my_file.close() + continue + + try: + x_[0].unicode_path = abspath("./{}".format(".".join(o_))) + + with open(x_[0].unicode_path, "w", encoding="utf-8") as fp: + fp.write(str(best_guess)) + except IOError as e: + print(str(e), file=sys.stderr) + if my_file.closed is False: + my_file.close() + return 2 + + if my_file.closed is False: + my_file.close() + + if args.minimal is False: + print( + dumps( + [el.__dict__ for el in x_] if len(x_) > 1 else x_[0].__dict__, + ensure_ascii=True, + indent=4, + ) + ) + else: + for my_file in args.files: + print( + ", ".join( + [ + el.encoding or "undefined" + for el in x_ + if el.path == abspath(my_file.name) + ] + ) + ) + + return 0 + + +if __name__ == "__main__": + cli_detect() diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/constant.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/constant.py new file mode 100755 index 00000000..c32f5cf2 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/constant.py @@ -0,0 +1,503 @@ +from codecs import BOM_UTF8, BOM_UTF16_BE, BOM_UTF16_LE, BOM_UTF32_BE, BOM_UTF32_LE +from collections import OrderedDict +from encodings.aliases import aliases +from re import IGNORECASE, compile as re_compile +from typing import Dict, List, Set, Union + +from .assets import FREQUENCIES + +# Contain for each eligible encoding a list of/item bytes SIG/BOM +ENCODING_MARKS = OrderedDict( + [ + ("utf_8", BOM_UTF8), + ( + "utf_7", + [ + b"\x2b\x2f\x76\x38", + b"\x2b\x2f\x76\x39", + b"\x2b\x2f\x76\x2b", + b"\x2b\x2f\x76\x2f", + b"\x2b\x2f\x76\x38\x2d", + ], + ), + ("gb18030", b"\x84\x31\x95\x33"), + ("utf_32", [BOM_UTF32_BE, BOM_UTF32_LE]), + ("utf_16", [BOM_UTF16_BE, BOM_UTF16_LE]), + ] +) # type: Dict[str, Union[bytes, List[bytes]]] + +TOO_SMALL_SEQUENCE = 32 # type: int +TOO_BIG_SEQUENCE = int(10e6) # type: int + +UTF8_MAXIMAL_ALLOCATION = 1112064 # type: int + +UNICODE_RANGES_COMBINED = { + "Control character": range(31 + 1), + "Basic Latin": range(32, 127 + 1), + "Latin-1 Supplement": range(128, 255 + 1), + "Latin Extended-A": range(256, 383 + 1), + "Latin Extended-B": range(384, 591 + 1), + "IPA Extensions": range(592, 687 + 1), + "Spacing Modifier Letters": range(688, 767 + 1), + "Combining Diacritical Marks": range(768, 879 + 1), + "Greek and Coptic": range(880, 1023 + 1), + "Cyrillic": range(1024, 1279 + 1), + "Cyrillic Supplement": range(1280, 1327 + 1), + "Armenian": range(1328, 1423 + 1), + "Hebrew": range(1424, 1535 + 1), + "Arabic": range(1536, 1791 + 1), + "Syriac": range(1792, 1871 + 1), + "Arabic Supplement": range(1872, 1919 + 1), + "Thaana": range(1920, 1983 + 1), + "NKo": range(1984, 2047 + 1), + "Samaritan": range(2048, 2111 + 1), + "Mandaic": range(2112, 2143 + 1), + "Syriac Supplement": range(2144, 2159 + 1), + "Arabic Extended-A": range(2208, 2303 + 1), + "Devanagari": range(2304, 2431 + 1), + "Bengali": range(2432, 2559 + 1), + "Gurmukhi": range(2560, 2687 + 1), + "Gujarati": range(2688, 2815 + 1), + "Oriya": range(2816, 2943 + 1), + "Tamil": range(2944, 3071 + 1), + "Telugu": range(3072, 3199 + 1), + "Kannada": range(3200, 3327 + 1), + "Malayalam": range(3328, 3455 + 1), + "Sinhala": range(3456, 3583 + 1), + "Thai": range(3584, 3711 + 1), + "Lao": range(3712, 3839 + 1), + "Tibetan": range(3840, 4095 + 1), + "Myanmar": range(4096, 4255 + 1), + "Georgian": range(4256, 4351 + 1), + "Hangul Jamo": range(4352, 4607 + 1), + "Ethiopic": range(4608, 4991 + 1), + "Ethiopic Supplement": range(4992, 5023 + 1), + "Cherokee": range(5024, 5119 + 1), + "Unified Canadian Aboriginal Syllabics": range(5120, 5759 + 1), + "Ogham": range(5760, 5791 + 1), + "Runic": range(5792, 5887 + 1), + "Tagalog": range(5888, 5919 + 1), + "Hanunoo": range(5920, 5951 + 1), + "Buhid": range(5952, 5983 + 1), + "Tagbanwa": range(5984, 6015 + 1), + "Khmer": range(6016, 6143 + 1), + "Mongolian": range(6144, 6319 + 1), + "Unified Canadian Aboriginal Syllabics Extended": range(6320, 6399 + 1), + "Limbu": range(6400, 6479 + 1), + "Tai Le": range(6480, 6527 + 1), + "New Tai Lue": range(6528, 6623 + 1), + "Khmer Symbols": range(6624, 6655 + 1), + "Buginese": range(6656, 6687 + 1), + "Tai Tham": range(6688, 6831 + 1), + "Combining Diacritical Marks Extended": range(6832, 6911 + 1), + "Balinese": range(6912, 7039 + 1), + "Sundanese": range(7040, 7103 + 1), + "Batak": range(7104, 7167 + 1), + "Lepcha": range(7168, 7247 + 1), + "Ol Chiki": range(7248, 7295 + 1), + "Cyrillic Extended C": range(7296, 7311 + 1), + "Sundanese Supplement": range(7360, 7375 + 1), + "Vedic Extensions": range(7376, 7423 + 1), + "Phonetic Extensions": range(7424, 7551 + 1), + "Phonetic Extensions Supplement": range(7552, 7615 + 1), + "Combining Diacritical Marks Supplement": range(7616, 7679 + 1), + "Latin Extended Additional": range(7680, 7935 + 1), + "Greek Extended": range(7936, 8191 + 1), + "General Punctuation": range(8192, 8303 + 1), + "Superscripts and Subscripts": range(8304, 8351 + 1), + "Currency Symbols": range(8352, 8399 + 1), + "Combining Diacritical Marks for Symbols": range(8400, 8447 + 1), + "Letterlike Symbols": range(8448, 8527 + 1), + "Number Forms": range(8528, 8591 + 1), + "Arrows": range(8592, 8703 + 1), + "Mathematical Operators": range(8704, 8959 + 1), + "Miscellaneous Technical": range(8960, 9215 + 1), + "Control Pictures": range(9216, 9279 + 1), + "Optical Character Recognition": range(9280, 9311 + 1), + "Enclosed Alphanumerics": range(9312, 9471 + 1), + "Box Drawing": range(9472, 9599 + 1), + "Block Elements": range(9600, 9631 + 1), + "Geometric Shapes": range(9632, 9727 + 1), + "Miscellaneous Symbols": range(9728, 9983 + 1), + "Dingbats": range(9984, 10175 + 1), + "Miscellaneous Mathematical Symbols-A": range(10176, 10223 + 1), + "Supplemental Arrows-A": range(10224, 10239 + 1), + "Braille Patterns": range(10240, 10495 + 1), + "Supplemental Arrows-B": range(10496, 10623 + 1), + "Miscellaneous Mathematical Symbols-B": range(10624, 10751 + 1), + "Supplemental Mathematical Operators": range(10752, 11007 + 1), + "Miscellaneous Symbols and Arrows": range(11008, 11263 + 1), + "Glagolitic": range(11264, 11359 + 1), + "Latin Extended-C": range(11360, 11391 + 1), + "Coptic": range(11392, 11519 + 1), + "Georgian Supplement": range(11520, 11567 + 1), + "Tifinagh": range(11568, 11647 + 1), + "Ethiopic Extended": range(11648, 11743 + 1), + "Cyrillic Extended-A": range(11744, 11775 + 1), + "Supplemental Punctuation": range(11776, 11903 + 1), + "CJK Radicals Supplement": range(11904, 12031 + 1), + "Kangxi Radicals": range(12032, 12255 + 1), + "Ideographic Description Characters": range(12272, 12287 + 1), + "CJK Symbols and Punctuation": range(12288, 12351 + 1), + "Hiragana": range(12352, 12447 + 1), + "Katakana": range(12448, 12543 + 1), + "Bopomofo": range(12544, 12591 + 1), + "Hangul Compatibility Jamo": range(12592, 12687 + 1), + "Kanbun": range(12688, 12703 + 1), + "Bopomofo Extended": range(12704, 12735 + 1), + "CJK Strokes": range(12736, 12783 + 1), + "Katakana Phonetic Extensions": range(12784, 12799 + 1), + "Enclosed CJK Letters and Months": range(12800, 13055 + 1), + "CJK Compatibility": range(13056, 13311 + 1), + "CJK Unified Ideographs Extension A": range(13312, 19903 + 1), + "Yijing Hexagram Symbols": range(19904, 19967 + 1), + "CJK Unified Ideographs": range(19968, 40959 + 1), + "Yi Syllables": range(40960, 42127 + 1), + "Yi Radicals": range(42128, 42191 + 1), + "Lisu": range(42192, 42239 + 1), + "Vai": range(42240, 42559 + 1), + "Cyrillic Extended-B": range(42560, 42655 + 1), + "Bamum": range(42656, 42751 + 1), + "Modifier Tone Letters": range(42752, 42783 + 1), + "Latin Extended-D": range(42784, 43007 + 1), + "Syloti Nagri": range(43008, 43055 + 1), + "Common Indic Number Forms": range(43056, 43071 + 1), + "Phags-pa": range(43072, 43135 + 1), + "Saurashtra": range(43136, 43231 + 1), + "Devanagari Extended": range(43232, 43263 + 1), + "Kayah Li": range(43264, 43311 + 1), + "Rejang": range(43312, 43359 + 1), + "Hangul Jamo Extended-A": range(43360, 43391 + 1), + "Javanese": range(43392, 43487 + 1), + "Myanmar Extended-B": range(43488, 43519 + 1), + "Cham": range(43520, 43615 + 1), + "Myanmar Extended-A": range(43616, 43647 + 1), + "Tai Viet": range(43648, 43743 + 1), + "Meetei Mayek Extensions": range(43744, 43775 + 1), + "Ethiopic Extended-A": range(43776, 43823 + 1), + "Latin Extended-E": range(43824, 43887 + 1), + "Cherokee Supplement": range(43888, 43967 + 1), + "Meetei Mayek": range(43968, 44031 + 1), + "Hangul Syllables": range(44032, 55215 + 1), + "Hangul Jamo Extended-B": range(55216, 55295 + 1), + "High Surrogates": range(55296, 56191 + 1), + "High Private Use Surrogates": range(56192, 56319 + 1), + "Low Surrogates": range(56320, 57343 + 1), + "Private Use Area": range(57344, 63743 + 1), + "CJK Compatibility Ideographs": range(63744, 64255 + 1), + "Alphabetic Presentation Forms": range(64256, 64335 + 1), + "Arabic Presentation Forms-A": range(64336, 65023 + 1), + "Variation Selectors": range(65024, 65039 + 1), + "Vertical Forms": range(65040, 65055 + 1), + "Combining Half Marks": range(65056, 65071 + 1), + "CJK Compatibility Forms": range(65072, 65103 + 1), + "Small Form Variants": range(65104, 65135 + 1), + "Arabic Presentation Forms-B": range(65136, 65279 + 1), + "Halfwidth and Fullwidth Forms": range(65280, 65519 + 1), + "Specials": range(65520, 65535 + 1), + "Linear B Syllabary": range(65536, 65663 + 1), + "Linear B Ideograms": range(65664, 65791 + 1), + "Aegean Numbers": range(65792, 65855 + 1), + "Ancient Greek Numbers": range(65856, 65935 + 1), + "Ancient Symbols": range(65936, 65999 + 1), + "Phaistos Disc": range(66000, 66047 + 1), + "Lycian": range(66176, 66207 + 1), + "Carian": range(66208, 66271 + 1), + "Coptic Epact Numbers": range(66272, 66303 + 1), + "Old Italic": range(66304, 66351 + 1), + "Gothic": range(66352, 66383 + 1), + "Old Permic": range(66384, 66431 + 1), + "Ugaritic": range(66432, 66463 + 1), + "Old Persian": range(66464, 66527 + 1), + "Deseret": range(66560, 66639 + 1), + "Shavian": range(66640, 66687 + 1), + "Osmanya": range(66688, 66735 + 1), + "Osage": range(66736, 66815 + 1), + "Elbasan": range(66816, 66863 + 1), + "Caucasian Albanian": range(66864, 66927 + 1), + "Linear A": range(67072, 67455 + 1), + "Cypriot Syllabary": range(67584, 67647 + 1), + "Imperial Aramaic": range(67648, 67679 + 1), + "Palmyrene": range(67680, 67711 + 1), + "Nabataean": range(67712, 67759 + 1), + "Hatran": range(67808, 67839 + 1), + "Phoenician": range(67840, 67871 + 1), + "Lydian": range(67872, 67903 + 1), + "Meroitic Hieroglyphs": range(67968, 67999 + 1), + "Meroitic Cursive": range(68000, 68095 + 1), + "Kharoshthi": range(68096, 68191 + 1), + "Old South Arabian": range(68192, 68223 + 1), + "Old North Arabian": range(68224, 68255 + 1), + "Manichaean": range(68288, 68351 + 1), + "Avestan": range(68352, 68415 + 1), + "Inscriptional Parthian": range(68416, 68447 + 1), + "Inscriptional Pahlavi": range(68448, 68479 + 1), + "Psalter Pahlavi": range(68480, 68527 + 1), + "Old Turkic": range(68608, 68687 + 1), + "Old Hungarian": range(68736, 68863 + 1), + "Rumi Numeral Symbols": range(69216, 69247 + 1), + "Brahmi": range(69632, 69759 + 1), + "Kaithi": range(69760, 69839 + 1), + "Sora Sompeng": range(69840, 69887 + 1), + "Chakma": range(69888, 69967 + 1), + "Mahajani": range(69968, 70015 + 1), + "Sharada": range(70016, 70111 + 1), + "Sinhala Archaic Numbers": range(70112, 70143 + 1), + "Khojki": range(70144, 70223 + 1), + "Multani": range(70272, 70319 + 1), + "Khudawadi": range(70320, 70399 + 1), + "Grantha": range(70400, 70527 + 1), + "Newa": range(70656, 70783 + 1), + "Tirhuta": range(70784, 70879 + 1), + "Siddham": range(71040, 71167 + 1), + "Modi": range(71168, 71263 + 1), + "Mongolian Supplement": range(71264, 71295 + 1), + "Takri": range(71296, 71375 + 1), + "Ahom": range(71424, 71487 + 1), + "Warang Citi": range(71840, 71935 + 1), + "Zanabazar Square": range(72192, 72271 + 1), + "Soyombo": range(72272, 72367 + 1), + "Pau Cin Hau": range(72384, 72447 + 1), + "Bhaiksuki": range(72704, 72815 + 1), + "Marchen": range(72816, 72895 + 1), + "Masaram Gondi": range(72960, 73055 + 1), + "Cuneiform": range(73728, 74751 + 1), + "Cuneiform Numbers and Punctuation": range(74752, 74879 + 1), + "Early Dynastic Cuneiform": range(74880, 75087 + 1), + "Egyptian Hieroglyphs": range(77824, 78895 + 1), + "Anatolian Hieroglyphs": range(82944, 83583 + 1), + "Bamum Supplement": range(92160, 92735 + 1), + "Mro": range(92736, 92783 + 1), + "Bassa Vah": range(92880, 92927 + 1), + "Pahawh Hmong": range(92928, 93071 + 1), + "Miao": range(93952, 94111 + 1), + "Ideographic Symbols and Punctuation": range(94176, 94207 + 1), + "Tangut": range(94208, 100351 + 1), + "Tangut Components": range(100352, 101119 + 1), + "Kana Supplement": range(110592, 110847 + 1), + "Kana Extended-A": range(110848, 110895 + 1), + "Nushu": range(110960, 111359 + 1), + "Duployan": range(113664, 113823 + 1), + "Shorthand Format Controls": range(113824, 113839 + 1), + "Byzantine Musical Symbols": range(118784, 119039 + 1), + "Musical Symbols": range(119040, 119295 + 1), + "Ancient Greek Musical Notation": range(119296, 119375 + 1), + "Tai Xuan Jing Symbols": range(119552, 119647 + 1), + "Counting Rod Numerals": range(119648, 119679 + 1), + "Mathematical Alphanumeric Symbols": range(119808, 120831 + 1), + "Sutton SignWriting": range(120832, 121519 + 1), + "Glagolitic Supplement": range(122880, 122927 + 1), + "Mende Kikakui": range(124928, 125151 + 1), + "Adlam": range(125184, 125279 + 1), + "Arabic Mathematical Alphabetic Symbols": range(126464, 126719 + 1), + "Mahjong Tiles": range(126976, 127023 + 1), + "Domino Tiles": range(127024, 127135 + 1), + "Playing Cards": range(127136, 127231 + 1), + "Enclosed Alphanumeric Supplement": range(127232, 127487 + 1), + "Enclosed Ideographic Supplement": range(127488, 127743 + 1), + "Miscellaneous Symbols and Pictographs": range(127744, 128511 + 1), + "Emoticons range(Emoji)": range(128512, 128591 + 1), + "Ornamental Dingbats": range(128592, 128639 + 1), + "Transport and Map Symbols": range(128640, 128767 + 1), + "Alchemical Symbols": range(128768, 128895 + 1), + "Geometric Shapes Extended": range(128896, 129023 + 1), + "Supplemental Arrows-C": range(129024, 129279 + 1), + "Supplemental Symbols and Pictographs": range(129280, 129535 + 1), + "CJK Unified Ideographs Extension B": range(131072, 173791 + 1), + "CJK Unified Ideographs Extension C": range(173824, 177983 + 1), + "CJK Unified Ideographs Extension D": range(177984, 178207 + 1), + "CJK Unified Ideographs Extension E": range(178208, 183983 + 1), + "CJK Unified Ideographs Extension F": range(183984, 191471 + 1), + "CJK Compatibility Ideographs Supplement": range(194560, 195103 + 1), + "Tags": range(917504, 917631 + 1), + "Variation Selectors Supplement": range(917760, 917999 + 1), +} # type: Dict[str, range] + + +UNICODE_SECONDARY_RANGE_KEYWORD = [ + "Supplement", + "Extended", + "Extensions", + "Modifier", + "Marks", + "Punctuation", + "Symbols", + "Forms", + "Operators", + "Miscellaneous", + "Drawing", + "Block", + "Shapes", + "Supplemental", + "Tags", +] # type: List[str] + +RE_POSSIBLE_ENCODING_INDICATION = re_compile( + r"(?:(?:encoding)|(?:charset)|(?:coding))(?:[\:= ]{1,10})(?:[\"\']?)([a-zA-Z0-9\-_]+)(?:[\"\']?)", + IGNORECASE, +) + +IANA_SUPPORTED = sorted( + filter( + lambda x: x.endswith("_codec") is False + and x not in {"rot_13", "tactis", "mbcs"}, + list(set(aliases.values())), + ) +) # type: List[str] + +IANA_SUPPORTED_COUNT = len(IANA_SUPPORTED) # type: int + +# pre-computed code page that are similar using the function cp_similarity. +IANA_SUPPORTED_SIMILAR = { + "cp037": ["cp1026", "cp1140", "cp273", "cp500"], + "cp1026": ["cp037", "cp1140", "cp273", "cp500"], + "cp1125": ["cp866"], + "cp1140": ["cp037", "cp1026", "cp273", "cp500"], + "cp1250": ["iso8859_2"], + "cp1251": ["kz1048", "ptcp154"], + "cp1252": ["iso8859_15", "iso8859_9", "latin_1"], + "cp1253": ["iso8859_7"], + "cp1254": ["iso8859_15", "iso8859_9", "latin_1"], + "cp1257": ["iso8859_13"], + "cp273": ["cp037", "cp1026", "cp1140", "cp500"], + "cp437": ["cp850", "cp858", "cp860", "cp861", "cp862", "cp863", "cp865"], + "cp500": ["cp037", "cp1026", "cp1140", "cp273"], + "cp850": ["cp437", "cp857", "cp858", "cp865"], + "cp857": ["cp850", "cp858", "cp865"], + "cp858": ["cp437", "cp850", "cp857", "cp865"], + "cp860": ["cp437", "cp861", "cp862", "cp863", "cp865"], + "cp861": ["cp437", "cp860", "cp862", "cp863", "cp865"], + "cp862": ["cp437", "cp860", "cp861", "cp863", "cp865"], + "cp863": ["cp437", "cp860", "cp861", "cp862", "cp865"], + "cp865": ["cp437", "cp850", "cp857", "cp858", "cp860", "cp861", "cp862", "cp863"], + "cp866": ["cp1125"], + "iso8859_10": ["iso8859_14", "iso8859_15", "iso8859_4", "iso8859_9", "latin_1"], + "iso8859_11": ["tis_620"], + "iso8859_13": ["cp1257"], + "iso8859_14": [ + "iso8859_10", + "iso8859_15", + "iso8859_16", + "iso8859_3", + "iso8859_9", + "latin_1", + ], + "iso8859_15": [ + "cp1252", + "cp1254", + "iso8859_10", + "iso8859_14", + "iso8859_16", + "iso8859_3", + "iso8859_9", + "latin_1", + ], + "iso8859_16": [ + "iso8859_14", + "iso8859_15", + "iso8859_2", + "iso8859_3", + "iso8859_9", + "latin_1", + ], + "iso8859_2": ["cp1250", "iso8859_16", "iso8859_4"], + "iso8859_3": ["iso8859_14", "iso8859_15", "iso8859_16", "iso8859_9", "latin_1"], + "iso8859_4": ["iso8859_10", "iso8859_2", "iso8859_9", "latin_1"], + "iso8859_7": ["cp1253"], + "iso8859_9": [ + "cp1252", + "cp1254", + "cp1258", + "iso8859_10", + "iso8859_14", + "iso8859_15", + "iso8859_16", + "iso8859_3", + "iso8859_4", + "latin_1", + ], + "kz1048": ["cp1251", "ptcp154"], + "latin_1": [ + "cp1252", + "cp1254", + "cp1258", + "iso8859_10", + "iso8859_14", + "iso8859_15", + "iso8859_16", + "iso8859_3", + "iso8859_4", + "iso8859_9", + ], + "mac_iceland": ["mac_roman", "mac_turkish"], + "mac_roman": ["mac_iceland", "mac_turkish"], + "mac_turkish": ["mac_iceland", "mac_roman"], + "ptcp154": ["cp1251", "kz1048"], + "tis_620": ["iso8859_11"], +} # type: Dict[str, List[str]] + + +CHARDET_CORRESPONDENCE = { + "iso2022_kr": "ISO-2022-KR", + "iso2022_jp": "ISO-2022-JP", + "euc_kr": "EUC-KR", + "tis_620": "TIS-620", + "utf_32": "UTF-32", + "euc_jp": "EUC-JP", + "koi8_r": "KOI8-R", + "iso8859_1": "ISO-8859-1", + "iso8859_2": "ISO-8859-2", + "iso8859_5": "ISO-8859-5", + "iso8859_6": "ISO-8859-6", + "iso8859_7": "ISO-8859-7", + "iso8859_8": "ISO-8859-8", + "utf_16": "UTF-16", + "cp855": "IBM855", + "mac_cyrillic": "MacCyrillic", + "gb2312": "GB2312", + "gb18030": "GB18030", + "cp932": "CP932", + "cp866": "IBM866", + "utf_8": "utf-8", + "utf_8_sig": "UTF-8-SIG", + "shift_jis": "SHIFT_JIS", + "big5": "Big5", + "cp1250": "windows-1250", + "cp1251": "windows-1251", + "cp1252": "Windows-1252", + "cp1253": "windows-1253", + "cp1255": "windows-1255", + "cp1256": "windows-1256", + "cp1254": "Windows-1254", + "cp949": "CP949", +} # type: Dict[str, str] + + +COMMON_SAFE_ASCII_CHARACTERS = { + "<", + ">", + "=", + ":", + "/", + "&", + ";", + "{", + "}", + "[", + "]", + ",", + "|", + '"', + "-", +} # type: Set[str] + + +KO_NAMES = {"johab", "cp949", "euc_kr"} # type: Set[str] +ZH_NAMES = {"big5", "cp950", "big5hkscs", "hz"} # type: Set[str] + +NOT_PRINTABLE_PATTERN = re_compile(r"[0-9\W\n\r\t]+") + +LANGUAGE_SUPPORTED_COUNT = len(FREQUENCIES) # type: int + +# Logging LEVEL bellow DEBUG +TRACE = 5 # type: int diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/legacy.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/legacy.py new file mode 100755 index 00000000..cdebe2b8 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/legacy.py @@ -0,0 +1,95 @@ +import warnings +from typing import Dict, Optional, Union + +from .api import from_bytes, from_fp, from_path, normalize +from .constant import CHARDET_CORRESPONDENCE +from .models import CharsetMatch, CharsetMatches + + +def detect(byte_str: bytes) -> Dict[str, Optional[Union[str, float]]]: + """ + chardet legacy method + Detect the encoding of the given byte string. It should be mostly backward-compatible. + Encoding name will match Chardet own writing whenever possible. (Not on encoding name unsupported by it) + This function is deprecated and should be used to migrate your project easily, consult the documentation for + further information. Not planned for removal. + + :param byte_str: The byte sequence to examine. + """ + if not isinstance(byte_str, (bytearray, bytes)): + raise TypeError( # pragma: nocover + "Expected object of type bytes or bytearray, got: " + "{0}".format(type(byte_str)) + ) + + if isinstance(byte_str, bytearray): + byte_str = bytes(byte_str) + + r = from_bytes(byte_str).best() + + encoding = r.encoding if r is not None else None + language = r.language if r is not None and r.language != "Unknown" else "" + confidence = 1.0 - r.chaos if r is not None else None + + # Note: CharsetNormalizer does not return 'UTF-8-SIG' as the sig get stripped in the detection/normalization process + # but chardet does return 'utf-8-sig' and it is a valid codec name. + if r is not None and encoding == "utf_8" and r.bom: + encoding += "_sig" + + return { + "encoding": encoding + if encoding not in CHARDET_CORRESPONDENCE + else CHARDET_CORRESPONDENCE[encoding], + "language": language, + "confidence": confidence, + } + + +class CharsetNormalizerMatch(CharsetMatch): + pass + + +class CharsetNormalizerMatches(CharsetMatches): + @staticmethod + def from_fp(*args, **kwargs): # type: ignore + warnings.warn( # pragma: nocover + "staticmethod from_fp, from_bytes, from_path and normalize are deprecated " + "and scheduled to be removed in 3.0", + DeprecationWarning, + ) + return from_fp(*args, **kwargs) # pragma: nocover + + @staticmethod + def from_bytes(*args, **kwargs): # type: ignore + warnings.warn( # pragma: nocover + "staticmethod from_fp, from_bytes, from_path and normalize are deprecated " + "and scheduled to be removed in 3.0", + DeprecationWarning, + ) + return from_bytes(*args, **kwargs) # pragma: nocover + + @staticmethod + def from_path(*args, **kwargs): # type: ignore + warnings.warn( # pragma: nocover + "staticmethod from_fp, from_bytes, from_path and normalize are deprecated " + "and scheduled to be removed in 3.0", + DeprecationWarning, + ) + return from_path(*args, **kwargs) # pragma: nocover + + @staticmethod + def normalize(*args, **kwargs): # type: ignore + warnings.warn( # pragma: nocover + "staticmethod from_fp, from_bytes, from_path and normalize are deprecated " + "and scheduled to be removed in 3.0", + DeprecationWarning, + ) + return normalize(*args, **kwargs) # pragma: nocover + + +class CharsetDetector(CharsetNormalizerMatches): + pass + + +class CharsetDoctor(CharsetNormalizerMatches): + pass diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/md.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/md.py new file mode 100755 index 00000000..f3d6505c --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/md.py @@ -0,0 +1,559 @@ +from functools import lru_cache +from typing import List, Optional + +from .constant import COMMON_SAFE_ASCII_CHARACTERS, UNICODE_SECONDARY_RANGE_KEYWORD +from .utils import ( + is_accentuated, + is_ascii, + is_case_variable, + is_cjk, + is_emoticon, + is_hangul, + is_hiragana, + is_katakana, + is_latin, + is_punctuation, + is_separator, + is_symbol, + is_thai, + remove_accent, + unicode_range, +) + + +class MessDetectorPlugin: + """ + Base abstract class used for mess detection plugins. + All detectors MUST extend and implement given methods. + """ + + def eligible(self, character: str) -> bool: + """ + Determine if given character should be fed in. + """ + raise NotImplementedError # pragma: nocover + + def feed(self, character: str) -> None: + """ + The main routine to be executed upon character. + Insert the logic in witch the text would be considered chaotic. + """ + raise NotImplementedError # pragma: nocover + + def reset(self) -> None: # pragma: no cover + """ + Permit to reset the plugin to the initial state. + """ + raise NotImplementedError + + @property + def ratio(self) -> float: + """ + Compute the chaos ratio based on what your feed() has seen. + Must NOT be lower than 0.; No restriction gt 0. + """ + raise NotImplementedError # pragma: nocover + + +class TooManySymbolOrPunctuationPlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._punctuation_count = 0 # type: int + self._symbol_count = 0 # type: int + self._character_count = 0 # type: int + + self._last_printable_char = None # type: Optional[str] + self._frenzy_symbol_in_word = False # type: bool + + def eligible(self, character: str) -> bool: + return character.isprintable() + + def feed(self, character: str) -> None: + self._character_count += 1 + + if ( + character != self._last_printable_char + and character not in COMMON_SAFE_ASCII_CHARACTERS + ): + if is_punctuation(character): + self._punctuation_count += 1 + elif ( + character.isdigit() is False + and is_symbol(character) + and is_emoticon(character) is False + ): + self._symbol_count += 2 + + self._last_printable_char = character + + def reset(self) -> None: # pragma: no cover + self._punctuation_count = 0 + self._character_count = 0 + self._symbol_count = 0 + + @property + def ratio(self) -> float: + if self._character_count == 0: + return 0.0 + + ratio_of_punctuation = ( + self._punctuation_count + self._symbol_count + ) / self._character_count # type: float + + return ratio_of_punctuation if ratio_of_punctuation >= 0.3 else 0.0 + + +class TooManyAccentuatedPlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._character_count = 0 # type: int + self._accentuated_count = 0 # type: int + + def eligible(self, character: str) -> bool: + return character.isalpha() + + def feed(self, character: str) -> None: + self._character_count += 1 + + if is_accentuated(character): + self._accentuated_count += 1 + + def reset(self) -> None: # pragma: no cover + self._character_count = 0 + self._accentuated_count = 0 + + @property + def ratio(self) -> float: + if self._character_count == 0: + return 0.0 + ratio_of_accentuation = ( + self._accentuated_count / self._character_count + ) # type: float + return ratio_of_accentuation if ratio_of_accentuation >= 0.35 else 0.0 + + +class UnprintablePlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._unprintable_count = 0 # type: int + self._character_count = 0 # type: int + + def eligible(self, character: str) -> bool: + return True + + def feed(self, character: str) -> None: + if ( + character.isspace() is False # includes \n \t \r \v + and character.isprintable() is False + and character != "\x1A" # Why? Its the ASCII substitute character. + ): + self._unprintable_count += 1 + self._character_count += 1 + + def reset(self) -> None: # pragma: no cover + self._unprintable_count = 0 + + @property + def ratio(self) -> float: + if self._character_count == 0: + return 0.0 + + return (self._unprintable_count * 8) / self._character_count + + +class SuspiciousDuplicateAccentPlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._successive_count = 0 # type: int + self._character_count = 0 # type: int + + self._last_latin_character = None # type: Optional[str] + + def eligible(self, character: str) -> bool: + return character.isalpha() and is_latin(character) + + def feed(self, character: str) -> None: + self._character_count += 1 + if ( + self._last_latin_character is not None + and is_accentuated(character) + and is_accentuated(self._last_latin_character) + ): + if character.isupper() and self._last_latin_character.isupper(): + self._successive_count += 1 + # Worse if its the same char duplicated with different accent. + if remove_accent(character) == remove_accent(self._last_latin_character): + self._successive_count += 1 + self._last_latin_character = character + + def reset(self) -> None: # pragma: no cover + self._successive_count = 0 + self._character_count = 0 + self._last_latin_character = None + + @property + def ratio(self) -> float: + if self._character_count == 0: + return 0.0 + + return (self._successive_count * 2) / self._character_count + + +class SuspiciousRange(MessDetectorPlugin): + def __init__(self) -> None: + self._suspicious_successive_range_count = 0 # type: int + self._character_count = 0 # type: int + self._last_printable_seen = None # type: Optional[str] + + def eligible(self, character: str) -> bool: + return character.isprintable() + + def feed(self, character: str) -> None: + self._character_count += 1 + + if ( + character.isspace() + or is_punctuation(character) + or character in COMMON_SAFE_ASCII_CHARACTERS + ): + self._last_printable_seen = None + return + + if self._last_printable_seen is None: + self._last_printable_seen = character + return + + unicode_range_a = unicode_range( + self._last_printable_seen + ) # type: Optional[str] + unicode_range_b = unicode_range(character) # type: Optional[str] + + if is_suspiciously_successive_range(unicode_range_a, unicode_range_b): + self._suspicious_successive_range_count += 1 + + self._last_printable_seen = character + + def reset(self) -> None: # pragma: no cover + self._character_count = 0 + self._suspicious_successive_range_count = 0 + self._last_printable_seen = None + + @property + def ratio(self) -> float: + if self._character_count == 0: + return 0.0 + + ratio_of_suspicious_range_usage = ( + self._suspicious_successive_range_count * 2 + ) / self._character_count # type: float + + if ratio_of_suspicious_range_usage < 0.1: + return 0.0 + + return ratio_of_suspicious_range_usage + + +class SuperWeirdWordPlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._word_count = 0 # type: int + self._bad_word_count = 0 # type: int + self._foreign_long_count = 0 # type: int + + self._is_current_word_bad = False # type: bool + self._foreign_long_watch = False # type: bool + + self._character_count = 0 # type: int + self._bad_character_count = 0 # type: int + + self._buffer = "" # type: str + self._buffer_accent_count = 0 # type: int + + def eligible(self, character: str) -> bool: + return True + + def feed(self, character: str) -> None: + if character.isalpha(): + self._buffer = "".join([self._buffer, character]) + if is_accentuated(character): + self._buffer_accent_count += 1 + if ( + self._foreign_long_watch is False + and (is_latin(character) is False or is_accentuated(character)) + and is_cjk(character) is False + and is_hangul(character) is False + and is_katakana(character) is False + and is_hiragana(character) is False + and is_thai(character) is False + ): + self._foreign_long_watch = True + return + if not self._buffer: + return + if ( + character.isspace() or is_punctuation(character) or is_separator(character) + ) and self._buffer: + self._word_count += 1 + buffer_length = len(self._buffer) # type: int + + self._character_count += buffer_length + + if buffer_length >= 4: + if self._buffer_accent_count / buffer_length > 0.34: + self._is_current_word_bad = True + # Word/Buffer ending with a upper case accentuated letter are so rare, + # that we will consider them all as suspicious. Same weight as foreign_long suspicious. + if is_accentuated(self._buffer[-1]) and self._buffer[-1].isupper(): + self._foreign_long_count += 1 + self._is_current_word_bad = True + if buffer_length >= 24 and self._foreign_long_watch: + self._foreign_long_count += 1 + self._is_current_word_bad = True + + if self._is_current_word_bad: + self._bad_word_count += 1 + self._bad_character_count += len(self._buffer) + self._is_current_word_bad = False + + self._foreign_long_watch = False + self._buffer = "" + self._buffer_accent_count = 0 + elif ( + character not in {"<", ">", "-", "=", "~", "|", "_"} + and character.isdigit() is False + and is_symbol(character) + ): + self._is_current_word_bad = True + self._buffer += character + + def reset(self) -> None: # pragma: no cover + self._buffer = "" + self._is_current_word_bad = False + self._foreign_long_watch = False + self._bad_word_count = 0 + self._word_count = 0 + self._character_count = 0 + self._bad_character_count = 0 + self._foreign_long_count = 0 + + @property + def ratio(self) -> float: + if self._word_count <= 10 and self._foreign_long_count == 0: + return 0.0 + + return self._bad_character_count / self._character_count + + +class CjkInvalidStopPlugin(MessDetectorPlugin): + """ + GB(Chinese) based encoding often render the stop incorrectly when the content does not fit and + can be easily detected. Searching for the overuse of '丅' and '丄'. + """ + + def __init__(self) -> None: + self._wrong_stop_count = 0 # type: int + self._cjk_character_count = 0 # type: int + + def eligible(self, character: str) -> bool: + return True + + def feed(self, character: str) -> None: + if character in {"丅", "丄"}: + self._wrong_stop_count += 1 + return + if is_cjk(character): + self._cjk_character_count += 1 + + def reset(self) -> None: # pragma: no cover + self._wrong_stop_count = 0 + self._cjk_character_count = 0 + + @property + def ratio(self) -> float: + if self._cjk_character_count < 16: + return 0.0 + return self._wrong_stop_count / self._cjk_character_count + + +class ArchaicUpperLowerPlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._buf = False # type: bool + + self._character_count_since_last_sep = 0 # type: int + + self._successive_upper_lower_count = 0 # type: int + self._successive_upper_lower_count_final = 0 # type: int + + self._character_count = 0 # type: int + + self._last_alpha_seen = None # type: Optional[str] + self._current_ascii_only = True # type: bool + + def eligible(self, character: str) -> bool: + return True + + def feed(self, character: str) -> None: + is_concerned = character.isalpha() and is_case_variable(character) + chunk_sep = is_concerned is False + + if chunk_sep and self._character_count_since_last_sep > 0: + if ( + self._character_count_since_last_sep <= 64 + and character.isdigit() is False + and self._current_ascii_only is False + ): + self._successive_upper_lower_count_final += ( + self._successive_upper_lower_count + ) + + self._successive_upper_lower_count = 0 + self._character_count_since_last_sep = 0 + self._last_alpha_seen = None + self._buf = False + self._character_count += 1 + self._current_ascii_only = True + + return + + if self._current_ascii_only is True and is_ascii(character) is False: + self._current_ascii_only = False + + if self._last_alpha_seen is not None: + if (character.isupper() and self._last_alpha_seen.islower()) or ( + character.islower() and self._last_alpha_seen.isupper() + ): + if self._buf is True: + self._successive_upper_lower_count += 2 + self._buf = False + else: + self._buf = True + else: + self._buf = False + + self._character_count += 1 + self._character_count_since_last_sep += 1 + self._last_alpha_seen = character + + def reset(self) -> None: # pragma: no cover + self._character_count = 0 + self._character_count_since_last_sep = 0 + self._successive_upper_lower_count = 0 + self._successive_upper_lower_count_final = 0 + self._last_alpha_seen = None + self._buf = False + self._current_ascii_only = True + + @property + def ratio(self) -> float: + if self._character_count == 0: + return 0.0 + + return self._successive_upper_lower_count_final / self._character_count + + +def is_suspiciously_successive_range( + unicode_range_a: Optional[str], unicode_range_b: Optional[str] +) -> bool: + """ + Determine if two Unicode range seen next to each other can be considered as suspicious. + """ + if unicode_range_a is None or unicode_range_b is None: + return True + + if unicode_range_a == unicode_range_b: + return False + + if "Latin" in unicode_range_a and "Latin" in unicode_range_b: + return False + + if "Emoticons" in unicode_range_a or "Emoticons" in unicode_range_b: + return False + + # Latin characters can be accompanied with a combining diacritical mark + # eg. Vietnamese. + if ("Latin" in unicode_range_a or "Latin" in unicode_range_b) and ( + "Combining" in unicode_range_a or "Combining" in unicode_range_b + ): + return False + + keywords_range_a, keywords_range_b = unicode_range_a.split( + " " + ), unicode_range_b.split(" ") + + for el in keywords_range_a: + if el in UNICODE_SECONDARY_RANGE_KEYWORD: + continue + if el in keywords_range_b: + return False + + # Japanese Exception + range_a_jp_chars, range_b_jp_chars = ( + unicode_range_a + in ( + "Hiragana", + "Katakana", + ), + unicode_range_b in ("Hiragana", "Katakana"), + ) + if (range_a_jp_chars or range_b_jp_chars) and ( + "CJK" in unicode_range_a or "CJK" in unicode_range_b + ): + return False + if range_a_jp_chars and range_b_jp_chars: + return False + + if "Hangul" in unicode_range_a or "Hangul" in unicode_range_b: + if "CJK" in unicode_range_a or "CJK" in unicode_range_b: + return False + if unicode_range_a == "Basic Latin" or unicode_range_b == "Basic Latin": + return False + + # Chinese/Japanese use dedicated range for punctuation and/or separators. + if ("CJK" in unicode_range_a or "CJK" in unicode_range_b) or ( + unicode_range_a in ["Katakana", "Hiragana"] + and unicode_range_b in ["Katakana", "Hiragana"] + ): + if "Punctuation" in unicode_range_a or "Punctuation" in unicode_range_b: + return False + if "Forms" in unicode_range_a or "Forms" in unicode_range_b: + return False + + return True + + +@lru_cache(maxsize=2048) +def mess_ratio( + decoded_sequence: str, maximum_threshold: float = 0.2, debug: bool = False +) -> float: + """ + Compute a mess ratio given a decoded bytes sequence. The maximum threshold does stop the computation earlier. + """ + + detectors = [ + md_class() for md_class in MessDetectorPlugin.__subclasses__() + ] # type: List[MessDetectorPlugin] + + length = len(decoded_sequence) + 1 # type: int + + mean_mess_ratio = 0.0 # type: float + + if length < 512: + intermediary_mean_mess_ratio_calc = 32 # type: int + elif length <= 1024: + intermediary_mean_mess_ratio_calc = 64 + else: + intermediary_mean_mess_ratio_calc = 128 + + for character, index in zip(decoded_sequence + "\n", range(length)): + for detector in detectors: + if detector.eligible(character): + detector.feed(character) + + if ( + index > 0 and index % intermediary_mean_mess_ratio_calc == 0 + ) or index == length - 1: + mean_mess_ratio = sum(dt.ratio for dt in detectors) + + if mean_mess_ratio >= maximum_threshold: + break + + if debug: + for dt in detectors: # pragma: nocover + print(dt.__class__, dt.ratio) + + return round(mean_mess_ratio, 3) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/models.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/models.py new file mode 100755 index 00000000..c38da31f --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/models.py @@ -0,0 +1,392 @@ +import warnings +from collections import Counter +from encodings.aliases import aliases +from hashlib import sha256 +from json import dumps +from re import sub +from typing import Any, Dict, Iterator, List, Optional, Tuple, Union + +from .constant import NOT_PRINTABLE_PATTERN, TOO_BIG_SEQUENCE +from .md import mess_ratio +from .utils import iana_name, is_multi_byte_encoding, unicode_range + + +class CharsetMatch: + def __init__( + self, + payload: bytes, + guessed_encoding: str, + mean_mess_ratio: float, + has_sig_or_bom: bool, + languages: "CoherenceMatches", + decoded_payload: Optional[str] = None, + ): + self._payload = payload # type: bytes + + self._encoding = guessed_encoding # type: str + self._mean_mess_ratio = mean_mess_ratio # type: float + self._languages = languages # type: CoherenceMatches + self._has_sig_or_bom = has_sig_or_bom # type: bool + self._unicode_ranges = None # type: Optional[List[str]] + + self._leaves = [] # type: List[CharsetMatch] + self._mean_coherence_ratio = 0.0 # type: float + + self._output_payload = None # type: Optional[bytes] + self._output_encoding = None # type: Optional[str] + + self._string = decoded_payload # type: Optional[str] + + def __eq__(self, other: object) -> bool: + if not isinstance(other, CharsetMatch): + raise TypeError( + "__eq__ cannot be invoked on {} and {}.".format( + str(other.__class__), str(self.__class__) + ) + ) + return self.encoding == other.encoding and self.fingerprint == other.fingerprint + + def __lt__(self, other: object) -> bool: + """ + Implemented to make sorted available upon CharsetMatches items. + """ + if not isinstance(other, CharsetMatch): + raise ValueError + + chaos_difference = abs(self.chaos - other.chaos) # type: float + coherence_difference = abs(self.coherence - other.coherence) # type: float + + # Bellow 1% difference --> Use Coherence + if chaos_difference < 0.01 and coherence_difference > 0.02: + # When having a tough decision, use the result that decoded as many multi-byte as possible. + if chaos_difference == 0.0 and self.coherence == other.coherence: + return self.multi_byte_usage > other.multi_byte_usage + return self.coherence > other.coherence + + return self.chaos < other.chaos + + @property + def multi_byte_usage(self) -> float: + return 1.0 - len(str(self)) / len(self.raw) + + @property + def chaos_secondary_pass(self) -> float: + """ + Check once again chaos in decoded text, except this time, with full content. + Use with caution, this can be very slow. + Notice: Will be removed in 3.0 + """ + warnings.warn( + "chaos_secondary_pass is deprecated and will be removed in 3.0", + DeprecationWarning, + ) + return mess_ratio(str(self), 1.0) + + @property + def coherence_non_latin(self) -> float: + """ + Coherence ratio on the first non-latin language detected if ANY. + Notice: Will be removed in 3.0 + """ + warnings.warn( + "coherence_non_latin is deprecated and will be removed in 3.0", + DeprecationWarning, + ) + return 0.0 + + @property + def w_counter(self) -> Counter: + """ + Word counter instance on decoded text. + Notice: Will be removed in 3.0 + """ + warnings.warn( + "w_counter is deprecated and will be removed in 3.0", DeprecationWarning + ) + + string_printable_only = sub(NOT_PRINTABLE_PATTERN, " ", str(self).lower()) + + return Counter(string_printable_only.split()) + + def __str__(self) -> str: + # Lazy Str Loading + if self._string is None: + self._string = str(self._payload, self._encoding, "strict") + return self._string + + def __repr__(self) -> str: + return "".format(self.encoding, self.fingerprint) + + def add_submatch(self, other: "CharsetMatch") -> None: + if not isinstance(other, CharsetMatch) or other == self: + raise ValueError( + "Unable to add instance <{}> as a submatch of a CharsetMatch".format( + other.__class__ + ) + ) + + other._string = None # Unload RAM usage; dirty trick. + self._leaves.append(other) + + @property + def encoding(self) -> str: + return self._encoding + + @property + def encoding_aliases(self) -> List[str]: + """ + Encoding name are known by many name, using this could help when searching for IBM855 when it's listed as CP855. + """ + also_known_as = [] # type: List[str] + for u, p in aliases.items(): + if self.encoding == u: + also_known_as.append(p) + elif self.encoding == p: + also_known_as.append(u) + return also_known_as + + @property + def bom(self) -> bool: + return self._has_sig_or_bom + + @property + def byte_order_mark(self) -> bool: + return self._has_sig_or_bom + + @property + def languages(self) -> List[str]: + """ + Return the complete list of possible languages found in decoded sequence. + Usually not really useful. Returned list may be empty even if 'language' property return something != 'Unknown'. + """ + return [e[0] for e in self._languages] + + @property + def language(self) -> str: + """ + Most probable language found in decoded sequence. If none were detected or inferred, the property will return + "Unknown". + """ + if not self._languages: + # Trying to infer the language based on the given encoding + # Its either English or we should not pronounce ourselves in certain cases. + if "ascii" in self.could_be_from_charset: + return "English" + + # doing it there to avoid circular import + from charset_normalizer.cd import encoding_languages, mb_encoding_languages + + languages = ( + mb_encoding_languages(self.encoding) + if is_multi_byte_encoding(self.encoding) + else encoding_languages(self.encoding) + ) + + if len(languages) == 0 or "Latin Based" in languages: + return "Unknown" + + return languages[0] + + return self._languages[0][0] + + @property + def chaos(self) -> float: + return self._mean_mess_ratio + + @property + def coherence(self) -> float: + if not self._languages: + return 0.0 + return self._languages[0][1] + + @property + def percent_chaos(self) -> float: + return round(self.chaos * 100, ndigits=3) + + @property + def percent_coherence(self) -> float: + return round(self.coherence * 100, ndigits=3) + + @property + def raw(self) -> bytes: + """ + Original untouched bytes. + """ + return self._payload + + @property + def submatch(self) -> List["CharsetMatch"]: + return self._leaves + + @property + def has_submatch(self) -> bool: + return len(self._leaves) > 0 + + @property + def alphabets(self) -> List[str]: + if self._unicode_ranges is not None: + return self._unicode_ranges + # list detected ranges + detected_ranges = [ + unicode_range(char) for char in str(self) + ] # type: List[Optional[str]] + # filter and sort + self._unicode_ranges = sorted(list({r for r in detected_ranges if r})) + return self._unicode_ranges + + @property + def could_be_from_charset(self) -> List[str]: + """ + The complete list of encoding that output the exact SAME str result and therefore could be the originating + encoding. + This list does include the encoding available in property 'encoding'. + """ + return [self._encoding] + [m.encoding for m in self._leaves] + + def first(self) -> "CharsetMatch": + """ + Kept for BC reasons. Will be removed in 3.0. + """ + return self + + def best(self) -> "CharsetMatch": + """ + Kept for BC reasons. Will be removed in 3.0. + """ + return self + + def output(self, encoding: str = "utf_8") -> bytes: + """ + Method to get re-encoded bytes payload using given target encoding. Default to UTF-8. + Any errors will be simply ignored by the encoder NOT replaced. + """ + if self._output_encoding is None or self._output_encoding != encoding: + self._output_encoding = encoding + self._output_payload = str(self).encode(encoding, "replace") + + return self._output_payload # type: ignore + + @property + def fingerprint(self) -> str: + """ + Retrieve the unique SHA256 computed using the transformed (re-encoded) payload. Not the original one. + """ + return sha256(self.output()).hexdigest() + + +class CharsetMatches: + """ + Container with every CharsetMatch items ordered by default from most probable to the less one. + Act like a list(iterable) but does not implements all related methods. + """ + + def __init__(self, results: List[CharsetMatch] = None): + self._results = sorted(results) if results else [] # type: List[CharsetMatch] + + def __iter__(self) -> Iterator[CharsetMatch]: + yield from self._results + + def __getitem__(self, item: Union[int, str]) -> CharsetMatch: + """ + Retrieve a single item either by its position or encoding name (alias may be used here). + Raise KeyError upon invalid index or encoding not present in results. + """ + if isinstance(item, int): + return self._results[item] + if isinstance(item, str): + item = iana_name(item, False) + for result in self._results: + if item in result.could_be_from_charset: + return result + raise KeyError + + def __len__(self) -> int: + return len(self._results) + + def __bool__(self) -> bool: + return len(self._results) > 0 + + def append(self, item: CharsetMatch) -> None: + """ + Insert a single match. Will be inserted accordingly to preserve sort. + Can be inserted as a submatch. + """ + if not isinstance(item, CharsetMatch): + raise ValueError( + "Cannot append instance '{}' to CharsetMatches".format( + str(item.__class__) + ) + ) + # We should disable the submatch factoring when the input file is too heavy (conserve RAM usage) + if len(item.raw) <= TOO_BIG_SEQUENCE: + for match in self._results: + if match.fingerprint == item.fingerprint and match.chaos == item.chaos: + match.add_submatch(item) + return + self._results.append(item) + self._results = sorted(self._results) + + def best(self) -> Optional["CharsetMatch"]: + """ + Simply return the first match. Strict equivalent to matches[0]. + """ + if not self._results: + return None + return self._results[0] + + def first(self) -> Optional["CharsetMatch"]: + """ + Redundant method, call the method best(). Kept for BC reasons. + """ + return self.best() + + +CoherenceMatch = Tuple[str, float] +CoherenceMatches = List[CoherenceMatch] + + +class CliDetectionResult: + def __init__( + self, + path: str, + encoding: Optional[str], + encoding_aliases: List[str], + alternative_encodings: List[str], + language: str, + alphabets: List[str], + has_sig_or_bom: bool, + chaos: float, + coherence: float, + unicode_path: Optional[str], + is_preferred: bool, + ): + self.path = path # type: str + self.unicode_path = unicode_path # type: Optional[str] + self.encoding = encoding # type: Optional[str] + self.encoding_aliases = encoding_aliases # type: List[str] + self.alternative_encodings = alternative_encodings # type: List[str] + self.language = language # type: str + self.alphabets = alphabets # type: List[str] + self.has_sig_or_bom = has_sig_or_bom # type: bool + self.chaos = chaos # type: float + self.coherence = coherence # type: float + self.is_preferred = is_preferred # type: bool + + @property + def __dict__(self) -> Dict[str, Any]: # type: ignore + return { + "path": self.path, + "encoding": self.encoding, + "encoding_aliases": self.encoding_aliases, + "alternative_encodings": self.alternative_encodings, + "language": self.language, + "alphabets": self.alphabets, + "has_sig_or_bom": self.has_sig_or_bom, + "chaos": self.chaos, + "coherence": self.coherence, + "unicode_path": self.unicode_path, + "is_preferred": self.is_preferred, + } + + def to_json(self) -> str: + return dumps(self.__dict__, ensure_ascii=True, indent=4) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/py.typed b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/py.typed new file mode 100755 index 00000000..e69de29b diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/utils.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/utils.py new file mode 100755 index 00000000..dcb14dfe --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/utils.py @@ -0,0 +1,342 @@ +try: + import unicodedata2 as unicodedata +except ImportError: + import unicodedata # type: ignore[no-redef] + +import importlib +import logging +from codecs import IncrementalDecoder +from encodings.aliases import aliases +from functools import lru_cache +from re import findall +from typing import List, Optional, Set, Tuple, Union + +from _multibytecodec import MultibyteIncrementalDecoder # type: ignore + +from .constant import ( + ENCODING_MARKS, + IANA_SUPPORTED_SIMILAR, + RE_POSSIBLE_ENCODING_INDICATION, + UNICODE_RANGES_COMBINED, + UNICODE_SECONDARY_RANGE_KEYWORD, + UTF8_MAXIMAL_ALLOCATION, +) + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_accentuated(character: str) -> bool: + try: + description = unicodedata.name(character) # type: str + except ValueError: + return False + return ( + "WITH GRAVE" in description + or "WITH ACUTE" in description + or "WITH CEDILLA" in description + or "WITH DIAERESIS" in description + or "WITH CIRCUMFLEX" in description + or "WITH TILDE" in description + ) + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def remove_accent(character: str) -> str: + decomposed = unicodedata.decomposition(character) # type: str + if not decomposed: + return character + + codes = decomposed.split(" ") # type: List[str] + + return chr(int(codes[0], 16)) + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def unicode_range(character: str) -> Optional[str]: + """ + Retrieve the Unicode range official name from a single character. + """ + character_ord = ord(character) # type: int + + for range_name, ord_range in UNICODE_RANGES_COMBINED.items(): + if character_ord in ord_range: + return range_name + + return None + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_latin(character: str) -> bool: + try: + description = unicodedata.name(character) # type: str + except ValueError: + return False + return "LATIN" in description + + +def is_ascii(character: str) -> bool: + try: + character.encode("ascii") + except UnicodeEncodeError: + return False + return True + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_punctuation(character: str) -> bool: + character_category = unicodedata.category(character) # type: str + + if "P" in character_category: + return True + + character_range = unicode_range(character) # type: Optional[str] + + if character_range is None: + return False + + return "Punctuation" in character_range + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_symbol(character: str) -> bool: + character_category = unicodedata.category(character) # type: str + + if "S" in character_category or "N" in character_category: + return True + + character_range = unicode_range(character) # type: Optional[str] + + if character_range is None: + return False + + return "Forms" in character_range + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_emoticon(character: str) -> bool: + character_range = unicode_range(character) # type: Optional[str] + + if character_range is None: + return False + + return "Emoticons" in character_range + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_separator(character: str) -> bool: + if character.isspace() or character in {"|", "+", ",", ";", "<", ">"}: + return True + + character_category = unicodedata.category(character) # type: str + + return "Z" in character_category + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_case_variable(character: str) -> bool: + return character.islower() != character.isupper() + + +def is_private_use_only(character: str) -> bool: + character_category = unicodedata.category(character) # type: str + + return character_category == "Co" + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_cjk(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: + return False + + return "CJK" in character_name + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_hiragana(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: + return False + + return "HIRAGANA" in character_name + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_katakana(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: + return False + + return "KATAKANA" in character_name + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_hangul(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: + return False + + return "HANGUL" in character_name + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_thai(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: + return False + + return "THAI" in character_name + + +@lru_cache(maxsize=len(UNICODE_RANGES_COMBINED)) +def is_unicode_range_secondary(range_name: str) -> bool: + return any(keyword in range_name for keyword in UNICODE_SECONDARY_RANGE_KEYWORD) + + +def any_specified_encoding(sequence: bytes, search_zone: int = 4096) -> Optional[str]: + """ + Extract using ASCII-only decoder any specified encoding in the first n-bytes. + """ + if not isinstance(sequence, bytes): + raise TypeError + + seq_len = len(sequence) # type: int + + results = findall( + RE_POSSIBLE_ENCODING_INDICATION, + sequence[: min(seq_len, search_zone)].decode("ascii", errors="ignore"), + ) # type: List[str] + + if len(results) == 0: + return None + + for specified_encoding in results: + specified_encoding = specified_encoding.lower().replace("-", "_") + + for encoding_alias, encoding_iana in aliases.items(): + if encoding_alias == specified_encoding: + return encoding_iana + if encoding_iana == specified_encoding: + return encoding_iana + + return None + + +@lru_cache(maxsize=128) +def is_multi_byte_encoding(name: str) -> bool: + """ + Verify is a specific encoding is a multi byte one based on it IANA name + """ + return name in { + "utf_8", + "utf_8_sig", + "utf_16", + "utf_16_be", + "utf_16_le", + "utf_32", + "utf_32_le", + "utf_32_be", + "utf_7", + } or issubclass( + importlib.import_module("encodings.{}".format(name)).IncrementalDecoder, # type: ignore + MultibyteIncrementalDecoder, + ) + + +def identify_sig_or_bom(sequence: bytes) -> Tuple[Optional[str], bytes]: + """ + Identify and extract SIG/BOM in given sequence. + """ + + for iana_encoding in ENCODING_MARKS: + marks = ENCODING_MARKS[iana_encoding] # type: Union[bytes, List[bytes]] + + if isinstance(marks, bytes): + marks = [marks] + + for mark in marks: + if sequence.startswith(mark): + return iana_encoding, mark + + return None, b"" + + +def should_strip_sig_or_bom(iana_encoding: str) -> bool: + return iana_encoding not in {"utf_16", "utf_32"} + + +def iana_name(cp_name: str, strict: bool = True) -> str: + cp_name = cp_name.lower().replace("-", "_") + + for encoding_alias, encoding_iana in aliases.items(): + if cp_name in [encoding_alias, encoding_iana]: + return encoding_iana + + if strict: + raise ValueError("Unable to retrieve IANA for '{}'".format(cp_name)) + + return cp_name + + +def range_scan(decoded_sequence: str) -> List[str]: + ranges = set() # type: Set[str] + + for character in decoded_sequence: + character_range = unicode_range(character) # type: Optional[str] + + if character_range is None: + continue + + ranges.add(character_range) + + return list(ranges) + + +def cp_similarity(iana_name_a: str, iana_name_b: str) -> float: + + if is_multi_byte_encoding(iana_name_a) or is_multi_byte_encoding(iana_name_b): + return 0.0 + + decoder_a = importlib.import_module("encodings.{}".format(iana_name_a)).IncrementalDecoder # type: ignore + decoder_b = importlib.import_module("encodings.{}".format(iana_name_b)).IncrementalDecoder # type: ignore + + id_a = decoder_a(errors="ignore") # type: IncrementalDecoder + id_b = decoder_b(errors="ignore") # type: IncrementalDecoder + + character_match_count = 0 # type: int + + for i in range(255): + to_be_decoded = bytes([i]) # type: bytes + if id_a.decode(to_be_decoded) == id_b.decode(to_be_decoded): + character_match_count += 1 + + return character_match_count / 254 + + +def is_cp_similar(iana_name_a: str, iana_name_b: str) -> bool: + """ + Determine if two code page are at least 80% similar. IANA_SUPPORTED_SIMILAR dict was generated using + the function cp_similarity. + """ + return ( + iana_name_a in IANA_SUPPORTED_SIMILAR + and iana_name_b in IANA_SUPPORTED_SIMILAR[iana_name_a] + ) + + +def set_logging_handler( + name: str = "charset_normalizer", + level: int = logging.INFO, + format_string: str = "%(asctime)s | %(levelname)s | %(message)s", +) -> None: + + logger = logging.getLogger(name) + logger.setLevel(level) + + handler = logging.StreamHandler() + handler.setFormatter(logging.Formatter(format_string)) + logger.addHandler(handler) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/version.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/version.py new file mode 100755 index 00000000..77cfff25 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/charset_normalizer/version.py @@ -0,0 +1,6 @@ +""" +Expose version +""" + +__version__ = "2.0.12" +VERSION = __version__.split(".") diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib-3.3.0.dist-info/INSTALLER b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib-3.3.0.dist-info/INSTALLER new file mode 100755 index 00000000..a1b589e3 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib-3.3.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib-3.3.0.dist-info/LICENSE b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib-3.3.0.dist-info/LICENSE new file mode 100755 index 00000000..d13065d5 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib-3.3.0.dist-info/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2021 Splunk Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib-3.3.0.dist-info/METADATA b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib-3.3.0.dist-info/METADATA new file mode 100755 index 00000000..096ecdbc --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib-3.3.0.dist-info/METADATA @@ -0,0 +1,28 @@ +Metadata-Version: 2.1 +Name: cloudconnectlib +Version: 3.3.0 +Summary: APP Cloud Connect +License: Apache-2.0 +Author: Addon Factory template +Author-email: addonfactory@splunk.com +Requires-Python: >=3.7,<3.13 +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: Apache Software License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Requires-Dist: PySocks (>=1.7.1,<2.0.0) +Requires-Dist: decorator (==5.1.1) +Requires-Dist: jinja2 (>=2.10.1,<4.0.0) +Requires-Dist: jsonpath-ng (>=1.5.2,<2.0.0) +Requires-Dist: jsonschema (>=4.4.0,<5.0.0) +Requires-Dist: munch (>=2.3.2,<3.0.0) +Requires-Dist: requests (>=2.27.1,<3.0.0) +Requires-Dist: solnlib (>=6.0.1,<7.0.0) +Requires-Dist: splunktalib (==3.0.5) +Requires-Dist: splunktaucclib (>=6.5.3,<9.0.0) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib-3.3.0.dist-info/RECORD b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib-3.3.0.dist-info/RECORD new file mode 100755 index 00000000..d414a0b8 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib-3.3.0.dist-info/RECORD @@ -0,0 +1,47 @@ +cloudconnectlib-3.3.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +cloudconnectlib-3.3.0.dist-info/LICENSE,sha256=Xvvd894DEl8lUHPEeFU-Ya18RW7Hc2IlPTZS_bE3Hgs,11341 +cloudconnectlib-3.3.0.dist-info/METADATA,sha256=JJeqM96pBcflFshaH5LvfchyEJIILzc97KhnjckOdSI,1107 +cloudconnectlib-3.3.0.dist-info/RECORD,, +cloudconnectlib-3.3.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +cloudconnectlib-3.3.0.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88 +cloudconnectlib/__init__.py,sha256=OmnTl-agqeNw4ZnbK9ZqQkTu9azflefFMSk_hpkzXrU,632 +cloudconnectlib/client.py,sha256=ANhZbAcDIr07bPxnbEmiPYxHmnk_9_x-ifSlv4zKpAw,3128 +cloudconnectlib/common/__init__.py,sha256=rxI-uxSKeWik2u12--0H8dFKpyL0nK64bLOH7pwzl_M,579 +cloudconnectlib/common/lib_util.py,sha256=mjf2dwJnDTpP-3QbIABoj2GQKtj3-6TzYXPZcH_aCuY,1673 +cloudconnectlib/common/log.py,sha256=nFbWsZdhFlhMLoXAxZWkABk4AFdevb-zASV3gQZ43B8,1792 +cloudconnectlib/common/util.py,sha256=FLWREHSgCjLM0nJsJ0QOEj61ejY4pa6sx-_9KnpHCoI,1946 +cloudconnectlib/configuration/__init__.py,sha256=omNLeyLD7ykxCoVbtGaE7IS2JPFFqEbI7N6m0Ix0AcY,621 +cloudconnectlib/configuration/loader.py,sha256=UVzqVjB9zGcMC7s7IXNJQPYIEfeRG87HMgM9Pzq-4aA,10609 +cloudconnectlib/configuration/schema_1_0_0.json,sha256=WKWbZJAyWu-rt-OLwvNoMo_UqBi3iwxHbIcRy0aSRy0,11645 +cloudconnectlib/core/__init__.py,sha256=NEKyhdMTqOWx9QE5K0AF6LHmHaQsKVfMZd6-miwnTwQ,669 +cloudconnectlib/core/checkpoint.py,sha256=cYA6nFbxCQgXk89P0EfCEF43Lb1peY5BdnY6FobXUjI,1820 +cloudconnectlib/core/defaults.py,sha256=Q2VpWpPlHIAVE5CmmXZTv3J6TcNGndLzrN55EaxIxSI,1321 +cloudconnectlib/core/engine.py,sha256=vMqBXey78ry0TGduzDFnV13Vpfbp98K3WUS1pTugMTQ,10928 +cloudconnectlib/core/engine_v2.py,sha256=9uRklcZenuj72AHTW2A8YQcU0fhOLK3r1hVDnJh1KJA,5221 +cloudconnectlib/core/exceptions.py,sha256=R_rjUIPWVejh-sJ6n42uMuYbSDkz6CNAjMnEw96ZMCM,1318 +cloudconnectlib/core/ext.py,sha256=mB-zPWbfcTnXBiOkIz57NfLeXeKEt3S7SE7eF4zA8m8,12281 +cloudconnectlib/core/http.py,sha256=wFASTYm5zXUAA0qDVLttcZcxt5Ps4SYaXL-7lQRuCQs,10996 +cloudconnectlib/core/job.py,sha256=Y-wmOLK6U5TgH0B9sG0YkPrCKT_cBLArMWCdOZEEh70,4877 +cloudconnectlib/core/models.py,sha256=4H5chnvFY7uFRW7IId3ol2YUkXZEOfhn3iSqML72n6c,10006 +cloudconnectlib/core/pipemgr.py,sha256=JqZGOkNe4EBeALruGRb7zMBznED1fHJiI6Ip6YY8Te8,933 +cloudconnectlib/core/plugin.py,sha256=pR59EjDA6N-ykBdlr1KrPXt3vLSuSTi8c3_I5hEghR0,3596 +cloudconnectlib/core/task.py,sha256=C4PbxchWWfLn4wQ8w9N2DbEwdVqeK81PLQRgZm-ZsZY,21000 +cloudconnectlib/core/template.py,sha256=iT9dpMNT7pNQUFPEPT6UUi5VR_YgB2wXu45cNS-IAlA,1157 +cloudconnectlib/splunktacollectorlib/__init__.py,sha256=rxI-uxSKeWik2u12--0H8dFKpyL0nK64bLOH7pwzl_M,579 +cloudconnectlib/splunktacollectorlib/cloud_connect_mod_input.py,sha256=DitMkKpkPbXeC4Ex8xwR8WI2i3fbGzpyF5HhXkhOcOk,2919 +cloudconnectlib/splunktacollectorlib/common/__init__.py,sha256=cG37onGSdPzs3xTeTezI5YrV2qft4jKhJ5KXRLJ1nD4,1628 +cloudconnectlib/splunktacollectorlib/common/log.py,sha256=5NPueTb6o3HB8tpa0uMb5ymrS659V0Ny6_UhQsR8QEg,1923 +cloudconnectlib/splunktacollectorlib/common/rwlock.py,sha256=1iYi88bpNzKO-uYlstjV2QFOwch3qpb9f1I0Z_o0f2A,2069 +cloudconnectlib/splunktacollectorlib/common/schema_meta.py,sha256=xq5FCDvsb_XnwUYrUHEVf3f6MsiSnfqGkn_zJEF53Xs,807 +cloudconnectlib/splunktacollectorlib/config.py,sha256=Ae1hSJZ6p7Rd-iONIUbrRW9mVxX88QbyMX8X99fWyyQ,14534 +cloudconnectlib/splunktacollectorlib/data_collection/__init__.py,sha256=W6J_wdRAlDoi2nUFA4RHLwCLQhM7jwhOcdOWaPoST3g,601 +cloudconnectlib/splunktacollectorlib/data_collection/ta_checkpoint_manager.py,sha256=xf0aVM3ZVvrmT_sSVvimaQUKKGtJjAw0NVybe0t_M-I,6328 +cloudconnectlib/splunktacollectorlib/data_collection/ta_config.py,sha256=FvTuVO54NNn8SKkYqtHFH2p0N_20gte_bBiq7zRK7l4,6884 +cloudconnectlib/splunktacollectorlib/data_collection/ta_consts.py,sha256=Bk_TuyhYTrXzyIe3j4aKZDt1lPB-5or5_Je7Fg7aASw,1901 +cloudconnectlib/splunktacollectorlib/data_collection/ta_data_client.py,sha256=QzjS-4gGv2fkU5khlvJzI2UnNhJuOVR-_hlNPcqtYeg,2880 +cloudconnectlib/splunktacollectorlib/data_collection/ta_data_collector.py,sha256=9JhdjRxOunkxJIQ3U5I2bb4fCkTnAz3xedvrJdiBCzc,5705 +cloudconnectlib/splunktacollectorlib/data_collection/ta_data_loader.py,sha256=9stFBmsDHYwhhWT71O40hGH0y9Fox39qWJctogvDdxQ,5507 +cloudconnectlib/splunktacollectorlib/data_collection/ta_helper.py,sha256=tl4dTcSk-wuIWDkcGqe_LJbTM3ISI9P0bE4nATM-pCA,5518 +cloudconnectlib/splunktacollectorlib/data_collection/ta_mod_input.py,sha256=iFzVH8-CS6r2xy8k7q8eRcnpzMK2QVAxFrI5jHr1vno,8359 +cloudconnectlib/splunktacollectorlib/splunk_ta_import_declare.py,sha256=AHxSKSnC6SYqjBlEZoz8hOp931s1mGCFPj70MFzKLUw,1136 +cloudconnectlib/splunktacollectorlib/ta_cloud_connect_client.py,sha256=T-P3dgg0XKMTnOmu321LIcMnMBs7lu9sUcrVCqIN9JU,1759 diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib-3.3.0.dist-info/REQUESTED b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib-3.3.0.dist-info/REQUESTED new file mode 100755 index 00000000..e69de29b diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib-3.3.0.dist-info/WHEEL b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib-3.3.0.dist-info/WHEEL new file mode 100755 index 00000000..258a6ff3 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib-3.3.0.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: poetry-core 1.6.1 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/__init__.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/__init__.py new file mode 100755 index 00000000..6f562d1c --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/__init__.py @@ -0,0 +1,20 @@ +# +# Copyright 2025 Splunk Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +""" +Cloud Connect library +""" + +__version__ = "3.3.0" diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/client.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/client.py new file mode 100755 index 00000000..3c2596b0 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/client.py @@ -0,0 +1,91 @@ +# +# Copyright 2025 Splunk Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +import copy +import os.path +import traceback + +from .common.log import get_cc_logger +from .common.util import load_json_file +from .configuration import get_loader_by_version +from .core import CloudConnectEngine +from .core.exceptions import ConfigException + +_logger = get_cc_logger() + + +class CloudConnectClient: + """The client of cloud connect used to start a cloud connect engine instance.""" + + def __init__(self, context, config_file, checkpoint_mgr): + """ + Constructs a `CloudConnectClient` with `context` which contains variables + to render template in the configuration parsed from file `config_file`. + :param context: context to render template. + :param config_file: file path for load user passed interface. + """ + self._context = context + self._config_file = config_file + self._engine = None + self._config = None + self._checkpoint_mgr = checkpoint_mgr + + def _load_config(self): + """Load a JSON based configuration definition from file. + :return: A `dict` contains user defined JSON interface. + """ + try: + conf = load_json_file(self._config_file) + except: + raise ConfigException( + "Unable to load configuration file %s: %s" + % (self._config_file, traceback.format_exc()) + ) + + version = conf.get("meta", {"apiVersion", None}).get("apiVersion", None) + if not version: + raise ConfigException( + f"Config meta or api version not present in {self._config_file}" + ) + + config_loader, schema_file = get_loader_by_version(version) + schema_path = os.path.join( + os.path.dirname(__file__), "configuration", schema_file + ) + + return config_loader.load(conf, schema_path, self._context) + + def start(self): + """ + Initialize a new `CloudConnectEngine` instance and start it. + """ + try: + if self._config is None: + self._config = self._load_config() + + self._engine = CloudConnectEngine() + self._engine.start( + context=copy.deepcopy(self._context), + config=self._config, + checkpoint_mgr=self._checkpoint_mgr, + ) + except Exception as ex: + _logger.exception("Error while starting client") + raise ex + + def stop(self): + """Stop the current cloud connect engine.""" + if self._engine: + self._engine.stop() diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/common/__init__.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/common/__init__.py new file mode 100755 index 00000000..cb8e7bbd --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/common/__init__.py @@ -0,0 +1,15 @@ +# +# Copyright 2025 Splunk Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/common/lib_util.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/common/lib_util.py new file mode 100755 index 00000000..95d3c113 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/common/lib_util.py @@ -0,0 +1,58 @@ +# +# Copyright 2025 Splunk Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +import os +import os.path as op +import platform +import sys + +import __main__ + + +def get_main_file(): + """Return the running mod input file""" + return __main__.__file__ + + +def get_app_root_dir(): + """Return the root dir of app""" + return op.dirname(op.dirname(op.abspath(get_main_file()))) + + +def get_mod_input_script_name(): + """Return the name of running mod input""" + script_name = os.path.basename(get_main_file()) + if script_name.lower().endswith(".py"): + script_name = script_name[:-3] + return script_name + + +def register_module(new_path): + """register_module(new_path): adds a directory to sys.path. + Do nothing if it does not exist or if it's already in sys.path. + """ + if not os.path.exists(new_path): + return + + new_path = os.path.abspath(new_path) + if platform.system() == "Windows": + new_path = new_path.lower() + for x in sys.path: + x = os.path.abspath(x) + if platform.system() == "Windows": + x = x.lower() + if new_path in (x, x + os.sep): + return + sys.path.insert(0, new_path) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/common/log.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/common/log.py new file mode 100755 index 00000000..729a774d --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/common/log.py @@ -0,0 +1,57 @@ +# +# Copyright 2025 Splunk Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +import logging + +from solnlib.pattern import Singleton + +from ..splunktacollectorlib.common import log as stulog +from ..splunktacollectorlib.data_collection import ta_helper as th +from .lib_util import get_mod_input_script_name + + +class CloudClientLogAdapter(logging.LoggerAdapter, metaclass=Singleton): + def __init__(self, logger=None, extra=None, prefix=""): + super().__init__(logger, extra) + self.cc_prefix = prefix if prefix else "" + + def process(self, msg, kwargs): + msg = f"{self.cc_prefix} {msg}" + return super().process(msg, kwargs) + + def set_level(self, val): + self.logger.setLevel(val) + + +_adapter = CloudClientLogAdapter(stulog.logger) + + +def set_cc_logger(logger, logger_prefix=""): + global _adapter + _adapter.logger = logger + _adapter.cc_prefix = logger_prefix or "" + + +def get_cc_logger(): + return _adapter + + +def reset_cc_logger(stanza_name, logging_level, logger_prefix=""): + script_name = get_mod_input_script_name() + logger_name = script_name + "_" + th.format_name_for_file(stanza_name) + stulog.reset_logger(logger_name) + stulog.set_log_level(logging_level) + set_cc_logger(stulog.logger, logger_prefix) + return get_cc_logger() diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/common/util.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/common/util.py new file mode 100755 index 00000000..d91660d2 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/common/util.py @@ -0,0 +1,79 @@ +# +# Copyright 2025 Splunk Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +import json + +from solnlib import utils +from solnlib.modular_input.event import XMLEvent + + +def is_valid_bool(val): + """Check whether a string can be convert to bool. + :param val: value as string. + :return: `True` if value can be convert to bool else `False`. + """ + return utils.is_true(val) or utils.is_false(val) + + +def is_true(val): + return utils.is_true(val) + + +def is_valid_port(port): + """Check whether a port is valid. + :param port: port to check. + :return: `True` if port is valid else `False`. + """ + try: + return 1 <= int(port) <= 65535 + except ValueError: + return False + + +def load_json_file(file_path): + """ + Load a dict from a JSON file. + :param file_path: JSON file path. + :return: A `dict` object. + """ + with open(file_path) as file_pointer: + return json.load(file_pointer) + + +def format_events( + raw_events, + time=None, + index=None, + host=None, + source=None, + sourcetype=None, + stanza=None, + unbroken=False, + done=False, +): + return XMLEvent.format_events( + XMLEvent( + data, + time=time, + index=index, + host=host, + source=source, + sourcetype=sourcetype, + stanza=stanza, + unbroken=unbroken, + done=done, + ) + for data in raw_events + ) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/configuration/__init__.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/configuration/__init__.py new file mode 100755 index 00000000..3ef80c02 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/configuration/__init__.py @@ -0,0 +1,16 @@ +# +# Copyright 2025 Splunk Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +from .loader import get_loader_by_version diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/configuration/loader.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/configuration/loader.py new file mode 100755 index 00000000..14c87651 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/configuration/loader.py @@ -0,0 +1,316 @@ +# +# Copyright 2025 Splunk Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +import logging +import re +import traceback +from abc import abstractmethod + +from jsonschema import ValidationError, validate +from munch import munchify + +from ..common.log import get_cc_logger +from ..common.util import is_true, is_valid_bool, is_valid_port, load_json_file +from ..core.exceptions import ConfigException +from ..core.ext import lookup_method +from ..core.models import ( + BasicAuthorization, + Checkpoint, + Condition, + DictToken, + IterationMode, + Processor, + RequestParams, + Task, +) + +_logger = get_cc_logger() + +_PROXY_TYPES = ["http", "socks4", "socks5", "http_no_tunnel"] +_AUTH_TYPES = {"basic_auth": BasicAuthorization} + +_LOGGING_LEVELS = { + "DEBUG": logging.DEBUG, + "INFO": logging.INFO, + "WARNING": logging.WARNING, + "ERROR": logging.ERROR, + "FATAL": logging.FATAL, + "CRITICAL": logging.CRITICAL, +} + +# FIXME Make this configurable +_DEFAULT_LOG_LEVEL = "INFO" + + +class CloudConnectConfigLoader: + """The Base cloud connect configuration loader""" + + @staticmethod + def _get_schema_from_file(schema_file): + """Load JSON based schema definition from schema file path. + :return: A `dict` contains schema. + """ + try: + return load_json_file(schema_file) + except: + raise ConfigException( + "Cannot load schema from file {}: {}".format( + schema_file, traceback.format_exc() + ) + ) + + @abstractmethod + def load(self, definition, schema_file, context): + pass + + +class CloudConnectConfigLoaderV1(CloudConnectConfigLoader): + @staticmethod + def _render_from_dict(source, ctx): + rendered = DictToken(source).render(ctx) + + return {k: v.strip() if isinstance(v, str) else v for k, v in rendered.items()} + + def _load_proxy(self, candidate, variables): + """ + Render and validate proxy setting with given variables. + :param candidate: raw proxy setting as `dict` + :param variables: variables to render template in proxy setting. + :return: A `dict` contains rendered proxy setting. + """ + if not candidate: + return {} + + proxy = self._render_from_dict(candidate, variables) + + enabled = proxy.get("enabled", "0") + if not is_valid_bool(enabled): + raise ValueError(f'Proxy "enabled" expect to be bool type: {enabled}') + + proxy["enabled"] = is_true(enabled) + + host, port = proxy.get("host"), proxy.get("port") + + if host or port: + if not host: + raise ValueError('Proxy "host" must not be empty') + + if not is_valid_port(port): + raise ValueError( + 'Proxy "port" expect to be in range [1,65535]: %s' % port + ) + + # proxy type default to 'http' + proxy_type = proxy.get("type") + proxy_type = proxy_type.lower() if proxy_type else "http" + if proxy_type not in _PROXY_TYPES: + raise ValueError( + 'Proxy "type" expect to be one of [{}]: {}'.format( + ",".join(_PROXY_TYPES), proxy_type + ) + ) + else: + proxy["type"] = proxy_type + + # proxy rdns default to '0' + proxy_rdns = proxy.get("rdns", "0") + if not is_valid_bool(proxy_rdns): + raise ValueError(f'Proxy "rdns" expect to be bool type: {proxy_rdns}') + else: + proxy["rdns"] = is_true(proxy_rdns) + + return proxy + + @staticmethod + def _get_log_level(level_name): + if level_name: + level_name = level_name.upper().strip() + + for k, v in _LOGGING_LEVELS.items(): + if k.startswith(level_name): + return v + + _logger.warning( + 'The log level "%s" is invalid, set it to default: "%s"', + level_name, + _DEFAULT_LOG_LEVEL, + ) + + return _LOGGING_LEVELS[_DEFAULT_LOG_LEVEL] + + def _load_logging(self, log_setting, variables): + logger = self._render_from_dict(log_setting, variables) + + logger["level"] = self._get_log_level(logger.get("level")) + + return logger + + def _load_global_setting(self, candidate, variables): + """ + Load and render global setting with variables. + :param candidate: Global setting as a `dict` + :param variables: variables from context to render setting + :return: A `Munch` object + """ + candidate = candidate or {} + proxy_setting = self._load_proxy(candidate.get("proxy"), variables) + log_setting = self._load_logging(candidate.get("logging"), variables) + + return munchify({"proxy": proxy_setting, "logging": log_setting}) + + @staticmethod + def _load_authorization(candidate): + if candidate is None: + return None + auth_type = candidate["type"].lower() + + if auth_type not in _AUTH_TYPES: + raise ValueError( + "Auth type expect to be one of [{}]: {}".format( + ",".join(list(_AUTH_TYPES.keys())), auth_type + ) + ) + return _AUTH_TYPES[auth_type](candidate["options"]) + + def _load_options(self, options): + return RequestParams( + auth=self._load_authorization(options.get("auth")), + url=options["url"], + method=options.get("method", "GET"), + header=options.get("headers", {}), + body=options.get("body", {}), + ) + + @staticmethod + def _validate_method(method): + if lookup_method(method) is None: + raise ValueError(f"Unimplemented method: {method}") + + def _parse_tasks(self, raw_tasks): + tasks = [] + for item in raw_tasks: + self._validate_method(item["method"]) + tasks.append(Task(item["input"], item["method"], item.get("output"))) + return tasks + + def _parse_conditions(self, raw_conditions): + conditions = [] + for item in raw_conditions: + self._validate_method(item["method"]) + conditions.append(Condition(item["input"], item["method"])) + return conditions + + @staticmethod + def _load_checkpoint(checkpoint): + if not checkpoint: + return None + return Checkpoint(checkpoint.get("namespace", []), checkpoint["content"]) + + def _load_iteration_mode(self, iteration_mode): + count = iteration_mode.get("iteration_count", "0") + try: + iteration_count = int(count) + except ValueError: + raise ValueError('"iteration_count" must be an integer: %s' % count) + + stop_conditions = self._parse_conditions(iteration_mode["stop_conditions"]) + + return IterationMode( + iteration_count=iteration_count, conditions=stop_conditions + ) + + def _load_processor(self, processor): + skip_conditions = self._parse_conditions(processor.get("skip_conditions", [])) + pipeline = self._parse_tasks(processor.get("pipeline", [])) + return Processor(skip_conditions=skip_conditions, pipeline=pipeline) + + def _load_request(self, request): + options = self._load_options(request["request"]) + + pre_process = self._load_processor(request.get("pre_process", {})) + post_process = self._load_processor(request["post_process"]) + checkpoint = self._load_checkpoint(request.get("checkpoint")) + iteration_mode = self._load_iteration_mode(request["iteration_mode"]) + + return munchify( + { + "request": options, + "pre_process": pre_process, + "post_process": post_process, + "checkpoint": checkpoint, + "iteration_mode": iteration_mode, + } + ) + + def load(self, definition, schema_file, context): + """Load cloud connect configuration from a `dict` and validate + it with schema and global settings will be rendered. + :param schema_file: Schema file location used to validate config. + :param definition: A dictionary contains raw configs. + :param context: variables to render template in global setting. + :return: A `Munch` object. + """ + try: + validate(definition, self._get_schema_from_file(schema_file)) + except ValidationError: + raise ConfigException( + "Failed to validate interface with schema: {}".format( + traceback.format_exc() + ) + ) + + try: + global_settings = self._load_global_setting( + definition.get("global_settings"), context + ) + + requests = [self._load_request(item) for item in definition["requests"]] + + return munchify( + { + "meta": munchify(definition["meta"]), + "tokens": definition["tokens"], + "global_settings": global_settings, + "requests": requests, + } + ) + except Exception as ex: + error = "Unable to load configuration: %s" % str(ex) + _logger.exception(error) + raise ConfigException(error) + + +_loader_and_schema_by_version = { + r"1\.0\.0": (CloudConnectConfigLoaderV1, "schema_1_0_0.json"), +} + + +def get_loader_by_version(version): + """Instantiate a configuration loader on basis of a given version. + A `ConfigException` will raised if the version is not supported. + :param version: Version to lookup config loader. + :return: A config loader. + """ + for support_version in _loader_and_schema_by_version: + if re.match(support_version, version): + loader_cls, schema = _loader_and_schema_by_version[support_version] + return loader_cls(), schema + + raise ConfigException( + "Unsupported schema version {}, current supported" + " versions should match these regex [{}]".format( + version, ",".join(_loader_and_schema_by_version) + ) + ) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/configuration/schema_1_0_0.json b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/configuration/schema_1_0_0.json new file mode 100755 index 00000000..100e7b65 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/configuration/schema_1_0_0.json @@ -0,0 +1,344 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "definitions": { + "Authentication": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "digest", + "basic_auth" + ] + }, + "options": { + "type": "object" + } + }, + "required": [ + "type" + ], + "additionalProperties": false + }, + "Checkpoint": { + "type": "object", + "properties": { + "namespace": { + "type": "array", + "items": { + "type": "string" + } + }, + "content": { + "type": "object" + } + }, + "required": [ + "content" + ], + "additionalProperties": false + }, + "GlobalSettings": { + "type": "object", + "properties": { + "proxy": { + "$ref": "#/definitions/Proxy" + }, + "logging": { + "type": "object", + "properties": { + "level": { + "type": "string" + } + } + } + }, + "additionalProperties": false + }, + "IterationMode": { + "type": "object", + "properties": { + "iteration_count": { + "oneOf": [ + { + "type": "string", + "pattern": "^[+-]?[1-9]\\d*|0$" + }, + { + "type": "integer" + } + ] + }, + "stop_conditions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "input": { + "type": "array", + "items": { + "type": "string" + } + }, + "method": { + "type": "string" + } + }, + "required": [ + "input", + "method" + ], + "additionalProperties": false + } + } + }, + "additionalProperties": false + }, + "Meta": { + "type": "object", + "properties": { + "apiVersion": { + "type": "string", + "pattern": "(?:\\d{1,3}\\.){2}[\\w\\-]{1,15}" + } + }, + "required": [ + "apiVersion" + ], + "additionalProperties": false + }, + "Proxy": { + "type": "object", + "properties": { + "enabled": { + "default": false, + "oneOf": [ + { + "type": "string" + }, + { + "type": "boolean" + }, + { + "type": "integer" + } + ] + }, + "host": { + "type": "string" + }, + "port": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "integer", + "minimum": 1, + "exclusiveMinimum": true, + "maximum": 65535, + "exclusiveMaximum": true + } + ] + }, + "username": { + "type": "string" + }, + "password": { + "type": "string" + }, + "rdns": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "host", + "port" + ], + "additionalProperties": false + }, + "Request": { + "type": "object", + "properties": { + "request": { + "type": "object", + "properties": { + "url": { + "type": "string" + }, + "method": { + "type": "string", + "enum": [ + "GET", + "POST" + ], + "default": "GET" + }, + "headers": { + "type": "object" + }, + "auth": { + "$ref": "#/definitions/Authentication" + }, + "body": { + "type": "object" + } + }, + "required": [ + "url" + ], + "additionalProperties": false + }, + "pre_process": { + "type": "object", + "properties": { + "skip_conditions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "input": { + "type": "array", + "items": { + "type": "string" + } + }, + "method": { + "type": "string" + } + }, + "required": [ + "input", + "method" + ], + "additionalProperties": false + } + }, + "pipeline": { + "type": "array", + "items": { + "type": "object", + "properties": { + "input": { + "type": "array", + "items": { + "type": "string" + } + }, + "method": { + "type": "string" + }, + "output": { + "type": "string" + } + }, + "required": [ + "input", + "method" + ], + "additionalProperties": false + } + } + }, + "additionalProperties": false + }, + "post_process": { + "type": "object", + "properties": { + "skip_conditions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "input": { + "type": "array", + "items": { + "type": "string" + } + }, + "method": { + "type": "string" + } + }, + "required": [ + "input", + "method" + ], + "additionalProperties": false + } + }, + "pipeline": { + "type": "array", + "items": { + "type": "object", + "properties": { + "input": { + "type": "array", + "items": { + "type": "string" + } + }, + "method": { + "type": "string" + }, + "output": { + "type": "string" + } + }, + "required": [ + "input", + "method" + ], + "additionalProperties": false + } + } + }, + "additionalProperties": false + }, + "iteration_mode": { + "$ref": "#/definitions/IterationMode" + }, + "checkpoint": { + "$ref": "#/definitions/Checkpoint" + } + }, + "required": [ + "request", + "post_process", + "iteration_mode" + ], + "additionalProperties": false + } + }, + "type": "object", + "properties": { + "meta": { + "$ref": "#/definitions/Meta" + }, + "tokens": { + "type": "array", + "items": { + "type": "string" + } + }, + "global_settings": { + "$ref": "#/definitions/GlobalSettings" + }, + "requests": { + "type": "array", + "items": { + "$ref": "#/definitions/Request" + }, + "minItems": 1 + } + }, + "required": [ + "meta", + "tokens", + "requests" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/__init__.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/__init__.py new file mode 100755 index 00000000..b9565b32 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/__init__.py @@ -0,0 +1,17 @@ +# +# Copyright 2025 Splunk Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +from .engine import CloudConnectEngine +from .exceptions import ConfigException, HTTPError diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/checkpoint.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/checkpoint.py new file mode 100755 index 00000000..5774bb1c --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/checkpoint.py @@ -0,0 +1,50 @@ +# +# Copyright 2025 Splunk Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +import cloudconnectlib.splunktacollectorlib.data_collection.ta_checkpoint_manager as tacm +from cloudconnectlib.common.log import get_cc_logger +from cloudconnectlib.core.models import DictToken, _Token + +logger = get_cc_logger() + + +class CheckpointManagerAdapter(tacm.TACheckPointMgr): + """Wrap TACheckPointMgr for custom usage""" + + def __init__(self, namespaces, content, meta_config, task_config): + super().__init__(meta_config, task_config) + if isinstance(namespaces, (list, tuple)): + self.namespaces = (_Token(t) for t in namespaces) + else: + self.namespaces = [_Token(namespaces)] + self.content = DictToken(content) + + def _namespaces_for(self, ctx): + return [item.render(ctx) for item in self.namespaces] + + def save(self, ctx): + """Save checkpoint""" + super().update_ckpt( + ckpt=self.content.render(ctx), namespaces=self._namespaces_for(ctx) + ) + + def load(self, ctx): + """Load checkpoint""" + namespaces = self._namespaces_for(ctx) + checkpoint = super().get_ckpt(namespaces) + if checkpoint is None: + logger.info("No existing checkpoint found") + checkpoint = {} + return checkpoint diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/defaults.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/defaults.py new file mode 100755 index 00000000..2151ac61 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/defaults.py @@ -0,0 +1,50 @@ +# +# Copyright 2025 Splunk Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +"""Default config for cloud connect""" + +timeout = 120 # request timeout is two minutes + +disable_ssl_cert_validation = False # default enable SSL validation + +success_statuses = (200, 201) # statuses be treated as success. + +# response status which need to retry. +retry_statuses = (429, 500, 501, 502, 503, 504, 505, 506, 507, 509, 510, 511) + +# response status which need print a warning log. +warning_statuses = ( + 203, + 204, + 205, + 206, + 207, + 208, + 226, + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, +) +retries = 3 # Default maximum retry times. + +max_iteration_count = 100 # maximum iteration loop count + +charset = "utf-8" # Default response charset if not found in response header diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/engine.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/engine.py new file mode 100755 index 00000000..9f2f6cf7 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/engine.py @@ -0,0 +1,341 @@ +# +# Copyright 2025 Splunk Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +import threading + +from ..common.log import get_cc_logger +from . import defaults +from .exceptions import HTTPError, StopCCEIteration +from .http import HttpClient + +_logger = get_cc_logger() + + +class CloudConnectEngine: + """The cloud connect engine to process request instantiated + from user options.""" + + def __init__(self): + self._stopped = False + self._running_job = None + + @staticmethod + def _set_logging(log_setting): + _logger.set_level(log_setting.level) + + def start(self, context, config, checkpoint_mgr): + """Start current client instance to execute each request parsed + from config. + """ + if not config: + raise ValueError("Config must not be empty") + + context = context or {} + global_setting = config.global_settings + + CloudConnectEngine._set_logging(global_setting.logging) + + _logger.info("Start to execute requests jobs.") + processed = 0 + + for request in config.requests: + job = Job( + request=request, + context=context, + checkpoint_mgr=checkpoint_mgr, + proxy=global_setting.proxy, + ) + self._running_job = job + job.run() + + processed += 1 + _logger.info("%s job(s) process finished", processed) + + if self._stopped: + _logger.info("Engine has been stopped, stopping to execute jobs.") + break + + self._stopped = True + _logger.info("Engine executing finished") + + def stop(self): + """Stops engine and running job. Do nothing if engine already + been stopped.""" + if self._stopped: + _logger.info("Engine already stopped, do nothing.") + return + + _logger.info("Stopping engine") + + if self._running_job: + _logger.info("Attempting to stop the running job.") + self._running_job.terminate() + _logger.info("Stopping job finished.") + + self._stopped = True + + +class Job: + """Job class represents a single request to send HTTP request until + reached it's stop condition. + """ + + def __init__(self, request, context, checkpoint_mgr, proxy=None): + """ + Constructs a `Job` with properties request, context and a + optional proxy setting. + :param request: A `Request` instance which contains request settings. + :param context: A values set contains initial values for template + variables. + :param proxy: A optional `Proxy` object contains proxy related + settings. + """ + self._request = request + self._context = context + self._checkpoint_mgr = checkpoint_mgr + self._client = HttpClient(proxy) + self._stopped = True + self._should_stop = False + + self._request_iterated_count = 0 + self._iteration_mode = self._request.iteration_mode + self._max_iteration_count = self._get_max_iteration_count() + + self._running_thread = None + self._terminated = threading.Event() + + def _get_max_iteration_count(self): + mode_max_count = self._iteration_mode.iteration_count + default_max_count = defaults.max_iteration_count + return ( + min(default_max_count, mode_max_count) + if mode_max_count > 0 + else default_max_count + ) + + def terminate(self, block=True, timeout=30): + """Terminate this job, the current thread will blocked util + the job is terminate finished if block is True""" + if self.is_stopped(): + _logger.info("Job already been stopped.") + return + + if self._running_thread == threading.current_thread(): + _logger.warning("Job cannot terminate itself.") + return + + _logger.info("Stopping job") + self._should_stop = True + + if not block: + return + if not self._terminated.wait(timeout): + _logger.warning("Terminating job timeout.") + + def _set_context(self, key, value): + self._context[key] = value + + def _execute_tasks(self, tasks): + if not tasks: + return + for task in tasks: + if self._check_should_stop(): + return + self._context.update(task.execute(self._context)) + + def _on_pre_process(self): + """ + Execute tasks in pre process one by one if condition satisfied. + """ + pre_processor = self._request.pre_process + + if pre_processor.should_skipped(self._context): + _logger.info("Skip pre process condition satisfied, do nothing") + return + + tasks = pre_processor.pipeline + _logger.debug("Got %s tasks need be executed before process", len(tasks)) + self._execute_tasks(tasks) + + def _on_post_process(self): + """ + Execute tasks in post process one by one if condition satisfied. + """ + post_processor = self._request.post_process + + if post_processor.should_skipped(self._context): + _logger.info("Skip post process condition satisfied, " "do nothing") + return + + tasks = post_processor.pipeline + _logger.debug("Got %s tasks need to be executed after process", len(tasks)) + self._execute_tasks(tasks) + + def _update_checkpoint(self): + """Updates checkpoint based on checkpoint namespace and content.""" + checkpoint = self._request.checkpoint + if not checkpoint: + _logger.info("Checkpoint not specified, do not update it.") + return + + self._checkpoint_mgr.update_ckpt( + checkpoint.normalize_content(self._context), + namespaces=checkpoint.normalize_namespace(self._context), + ) + + def _get_checkpoint(self): + checkpoint = self._request.checkpoint + if not checkpoint: + _logger.info("Checkpoint not specified, do not read it.") + return + + namespaces = checkpoint.normalize_namespace(self._context) + checkpoint = self._checkpoint_mgr.get_ckpt(namespaces) + if checkpoint: + self._context.update(checkpoint) + + def _is_stoppable(self): + """Check if repeat mode conditions satisfied.""" + if self._request_iterated_count >= self._max_iteration_count: + _logger.info( + "Job iteration count is %s, current request count is %s," + " stop condition satisfied.", + self._max_iteration_count, + self._request_iterated_count, + ) + return True + + if self._iteration_mode.passed(self._context): + _logger.info("Job stop condition satisfied.") + return True + + return False + + def is_stopped(self): + """Return if this job is stopped.""" + return self._stopped + + def run(self): + """Start job and exit util meet stop condition.""" + _logger.info("Start to process job") + + self._stopped = False + try: + self._running_thread = threading.current_thread() + self._run() + except Exception: + _logger.exception("Error encountered while running job.") + raise + finally: + self._terminated.set() + self._stopped = True + + _logger.info("Job processing finished") + + def _check_should_stop(self): + if self._should_stop: + _logger.info("Job should been stopped.") + return self._should_stop + + def _run(self): + request = self._request.request + authorizer = request.auth + self._get_checkpoint() + + while 1: + if self._check_should_stop(): + return + + try: + self._on_pre_process() + except StopCCEIteration: + _logger.info( + "Stop iteration command in pre process is received, exit job now." + ) + return + + r = request.render(self._context) + + if authorizer: + authorizer(r.headers, self._context) + + if self._check_should_stop(): + return + + response, need_terminate = self._send_request(r) + + if need_terminate: + _logger.info("This job need to be terminated.") + break + + self._request_iterated_count += 1 + self._set_context("__response__", response) + if self._check_should_stop(): + return + + try: + self._on_post_process() + except StopCCEIteration: + _logger.info( + "Stop iteration command in post process is received, exit job now." + ) + return + + if self._check_should_stop(): + return + self._update_checkpoint() + + if self._is_stoppable(): + _logger.info("Stop condition reached, exit job now") + break + + def _send_request(self, request): + """Do send request with a simple error handling strategy. Refer to + https://confluence.splunk.com/display/PROD/CC+1.0+-+Detail+Design""" + try: + response = self._client.send(request) + except HTTPError as error: + _logger.exception( + "HTTPError reason=%s when sending request to " "url=%s method=%s", + error.reason, + request.url, + request.method, + ) + return None, True + + status = response.status_code + + if status in defaults.success_statuses: + if not (response.body or "").strip(): + _logger.info( + "The response body of request which url=%s and" + " method=%s is empty, status=%s.", + request.url, + request.method, + status, + ) + return None, True + return response, False + + error_log = ( + "The response status=%s for request which url=%s and" " method=%s." + ) % (status, request.url, request.method) + + if status in defaults.warning_statuses: + _logger.warning(error_log) + else: + _logger.error(error_log) + + return None, True diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/engine_v2.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/engine_v2.py new file mode 100755 index 00000000..54797fcb --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/engine_v2.py @@ -0,0 +1,140 @@ +# +# Copyright 2025 Splunk Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +import concurrent.futures as cf +import threading +from collections import Iterable +from os import path as op + +from ..common.log import get_cc_logger +from .plugin import init_pipeline_plugins + +logger = get_cc_logger() + + +class CloudConnectEngine: + def __init__(self, max_workers=4, plugin_dir=""): + """ + Initialize CloudConnectEngine object + :param max_workers: maximum number of Threads to execute the given calls + :param plugin_dir: Absolute path of directory containing cce_plugin_*.py + """ + self._executor = cf.ThreadPoolExecutor(max_workers) + self._pending_job_results = set() + self._shutdown = False + self._pending_jobs = [] + self._counter = 0 + self._lock = threading.RLock() + plugin_dir = plugin_dir or op.join(op.dirname(op.dirname(__file__)), "plugin") + init_pipeline_plugins(plugin_dir) + + def start(self, jobs=None): + """ + Engine starts to run jobs + :param jobs: A list contains at least one job + :return: + """ + try: + if not jobs: + logger.warning("CloudConnectEngine just exits with no jobs to run") + return + for job in jobs: + self._add_job(job) + while not self._shutdown: + logger.info("CloudConnectEngine starts to run...") + if not self._pending_job_results: + logger.info("CloudConnectEngine has no more jobs to run") + break + # check the intermediate results to find the done jobs and not + # done jobs + done_and_not_done_jobs = cf.wait( + self._pending_job_results, return_when=cf.FIRST_COMPLETED + ) + self._pending_job_results = done_and_not_done_jobs.not_done + done_job_results = done_and_not_done_jobs.done + for future in done_job_results: + # get the result of each done jobs and add new jobs to the + # engine if the result spawns more jobs + result = future.result() + if result: + if isinstance(result, Iterable): + for temp in result: + self._add_job(temp) + else: + self._add_job(result) + except Exception: + logger.exception("CloudConnectEngine encountered exception") + finally: + self._teardown() + + def _add_job(self, job): + """ + add job to engine for scheduling later + :param job: job should have a 'run' method + :return:True when the jobs is added successfully and False when the + engine has shut down + """ + if self._shutdown: + return False + self._pending_jobs.append(job) + result = self._executor.submit(self._invoke_job, job) + self._pending_job_results.add(result) + self._counter += 1 + logger.debug("%s job(s) have been added to the engine now", self._counter) + return True + + def _invoke_job(self, job): + """ + Wrap the run method of jobs + :param job: job should have a 'run' method + :return: + """ + try: + # just return when the engine has shut down + if self._shutdown: + return None + invoke_result = job.run() + return invoke_result + except Exception: + logger.exception("job %s is invoked with exception", job) + return None + finally: + # remove the job from pending_jobs when it's done + with self._lock: + self._pending_jobs.remove(job) + + def shutdown(self): + """ + set the shutdown flag to True + often called by another thread which needs to shut down + CloudConnectEngine when e.g. receives a exit signal from external system + :return: + """ + self._shutdown = True + logger.info("CloudConnectEngine receives shutdown signal") + + def _teardown(self): + """ + internal method which will call stop method of each running jobs + firstly and then wait for the thread pool to shutdown in a blocked way + :return: + """ + logger.info("CloudConnectEngine is going to tear down...") + self._shutdown = True + with self._lock: + for job in self._pending_jobs: + job.stop() + self._executor.shutdown(wait=True) + logger.info("CloudConnectEngine successfully tears down") diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/exceptions.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/exceptions.py new file mode 100755 index 00000000..188e75eb --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/exceptions.py @@ -0,0 +1,59 @@ +# +# Copyright 2025 Splunk Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +"""APP Cloud Connect errors""" + + +class CCEError(Exception): + pass + + +class ConfigException(CCEError): + """Config exception""" + + pass + + +class FuncException(CCEError): + """Ext function call exception""" + + pass + + +class HTTPError(CCEError): + """HTTPError raised when HTTP request returned a error.""" + + def __init__(self, reason=None): + """ + Initialize HTTPError with `response` object and `status`. + """ + self.reason = reason + super().__init__(reason) + + +class StopCCEIteration(CCEError): + """Exception to exit from the engine iteration.""" + + pass + + +class CCESplitError(CCEError): + """Exception to exit the job in Split Task""" + + pass + + +class QuitJobError(CCEError): + pass diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/ext.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/ext.py new file mode 100755 index 00000000..504ba74d --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/ext.py @@ -0,0 +1,397 @@ +# +# Copyright 2025 Splunk Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +import calendar +import json +import re +import traceback +from collections import Iterable +from datetime import datetime + +from jsonpath_ng import parse + +from ..common import log, util +from .exceptions import FuncException, QuitJobError, StopCCEIteration +from .pipemgr import PipeManager + +_logger = log.get_cc_logger() + + +def regex_search(pattern, source, flags=0): + """Search substring in source through regex""" + if not isinstance(source, str): + _logger.warning("Cannot apply regex search on non-string: %s", type(source)) + return {} + try: + matches = re.search(pattern=pattern, string=source, flags=flags) + except Exception: + _logger.warning( + "Unable to search pattern=%s and flags=%s in string, error=%s", + pattern, + flags, + traceback.format_exc(), + ) + return {} + else: + return matches.groupdict() if matches else {} + + +def regex_match(pattern, source, flags=0): + """ + Determine whether a string is match a regex pattern. + + :param pattern: regex pattern + :param source: candidate to match regex + :param flags: flags for regex match + :return: `True` if candidate match pattern else `False` + """ + try: + return re.match(pattern, source, flags) is not None + except Exception: + _logger.warning( + "Unable to match source with pattern=%s, cause=%s", + pattern, + traceback.format_exc(), + ) + return False + + +def json_path(source, json_path_expr): + """Extract value from string with JSONPATH expression. + :param json_path_expr: JSONPATH expression + :param source: string to extract value + :return: A `list` contains all values extracted + """ + if not source: + _logger.debug("source to apply JSONPATH is empty, return empty.") + return "" + + if isinstance(source, str): + _logger.debug( + "source expected is a JSON, not %s. Attempt to" " convert it to JSON", + type(source), + ) + try: + source = json.loads(source) + except Exception as ex: + _logger.warning( + "Unable to load JSON from source: %s. " + 'Attempt to apply JSONPATH "%s" on source directly.', + ex, + json_path_expr, + ) + + try: + expression = parse(json_path_expr) + results = [match.value for match in expression.find(source)] + + _logger.debug( + 'Got %s elements extracted with JSONPATH expression "%s"', + len(results), + json_path_expr, + ) + + if not results: + return "" + + return results[0] or "" if len(results) == 1 else results + except Exception as ex: + _logger.warning( + 'Unable to apply JSONPATH expression "%s" on source,' + " message=%s cause=%s", + json_path_expr, + ex, + traceback.format_exc(), + ) + return "" + + +def splunk_xml( + candidates, time=None, index=None, host=None, source=None, sourcetype=None +): + """Wrap a event with splunk xml format. + :param candidates: data used to wrap as event + :param time: timestamp which must be empty or a valid float + :param index: index name for event + :param host: host for event + :param source: source for event + :param sourcetype: sourcetype for event + :return: A wrapped event with splunk xml format. + """ + if not isinstance(candidates, (list, tuple)): + candidates = [candidates] + + time = time or None + if time: + try: + time = float(time) + except ValueError: + _logger.warning( + '"time" %s is expected to be a float, set "time" to None', time + ) + time = None + xml_events = util.format_events( + candidates, + time=time, + index=index, + host=host, + source=source, + sourcetype=sourcetype, + ) + _logger.info("[%s] events are formated as splunk stream xml", len(candidates)) + return xml_events + + +def std_output(candidates): + """Output a string to stdout. + :param candidates: List of string to output to stdout or a single string. + """ + if isinstance(candidates, str): + candidates = [candidates] + + all_str = True + for candidate in candidates: + if all_str and not isinstance(candidate, str): + all_str = False + _logger.debug( + 'The type of data needs to print is "%s" rather than str', + type(candidate), + ) + try: + candidate = json.dumps(candidate) + except: + _logger.exception( + 'The type of data needs to print is "%s"' " rather than str", + type(candidate), + ) + + if not PipeManager().write_events(candidate): + raise FuncException( + "Fail to output data to stdout. The event" + " writer is stopped or encountered exception" + ) + + _logger.debug("Writing events to stdout finished.") + return True + + +def _parse_json(source, json_path_expr=None): + if not source: + _logger.debug("Unable to parse JSON from empty source, return empty.") + return {} + + if json_path_expr: + _logger.debug( + "Try to extract JSON from source with JSONPATH expression: %s, ", + json_path_expr, + ) + source = json_path(source, json_path_expr) + + elif isinstance(source, str): + source = json.loads(source) + + return source + + +def json_empty(source, json_path_expr=None): + """Check whether a JSON is empty, return True only if the JSON to + check is a valid JSON and is empty. + :param json_path_expr: A optional JSONPATH expression + :param source: source to extract JSON + :return: `True` if the result JSON is empty + """ + try: + data = _parse_json(source, json_path_expr) + + if isinstance(data, (list, tuple)): + return all(len(ele) == 0 for ele in data) + return len(data) == 0 + except Exception as ex: + _logger.warning( + "Unable to determine whether source is json_empty, treat it as " + "not json_empty: %s", + ex, + ) + return False + + +def json_not_empty(source, json_path_expr=None): + """Check if a JSON object is not empty, return True only if the + source is a valid JSON object and the value leading by + json_path_expr is empty. + :param json_path_expr: A optional JSONPATH expression + :param source: source to extract JSON + :return: `True` if the result JSON is not empty + """ + try: + data = _parse_json(source, json_path_expr) + + if isinstance(data, (list, tuple)): + return any(len(ele) > 0 for ele in data) + return len(data) > 0 + except Exception as ex: + _logger.warning( + "Unable to determine whether source is json_not_empty, " + "treat it as not json_not_empty: %s", + ex, + ) + return False + + +def set_var(value): + """Set a variable which name should be specified in `output` with value""" + return value + + +def _fix_microsecond_format(fmt, micros): + """ + implement %Nf so that user can control the digital number of microsecond. + If number of % is even, don't do replacement. + If N is not in [1-6], don't do replacement. + If time length m is less than N, convert it to 6 digitals and return N + digitals. + """ + micros = str(micros).zfill(6) + + def do_replacement(x, micros): + if int(x.group(1)) in range(1, 7) and len(x.group()) % 2: + return x.group().replace( + "%" + x.group(1) + "f", micros[: min(int(x.group(1)), len(micros))] + ) + return x.group() + + return re.sub(r"%+([1-6])f", lambda x: do_replacement(x, micros), fmt) + + +def _fix_timestamp_format(fmt, timestamp): + """Replace '%s' in time format with timestamp if the number + of '%' before 's' is odd.""" + return re.sub( + r"%+s", + ( + lambda x: x.group() + if len(x.group()) % 2 + else x.group().replace("%s", timestamp) + ), + fmt, + ) + + +def time_str2str(date_string, from_format, to_format): + """Convert a date string with given format to another format. Return + the original date string if it's type is not string or failed to parse or + convert it with format.""" + if not isinstance(date_string, str): + _logger.warning( + '"date_string" must be a string type, found %s,' + " return the original date_string directly.", + type(date_string), + ) + return date_string + + try: + dt = datetime.strptime(date_string, from_format) + # Need to pre process '%s' in to_format here because '%s' is not + # available on all platforms. Even on supported platforms, the + # result may be different because it depends on implementation on each + # platform. Replace it with UTC timestamp here directly. + if to_format: + timestamp = calendar.timegm(dt.timetuple()) + to_format = _fix_timestamp_format(to_format, str(timestamp)) + to_format = _fix_microsecond_format(to_format, str(dt.microsecond)) + return dt.strftime(to_format) + except Exception: + _logger.warning( + 'Unable to convert date_string "%s" from format "%s" to "%s",' + " return the original date_string, cause=%s", + date_string, + from_format, + to_format, + traceback.format_exc(), + ) + return date_string + + +def is_true(value): + """Determine whether value is True""" + return str(value).strip().lower() == "true" + + +def exit_if_true(value): + """Raise a StopCCEIteration exception if value is True""" + if is_true(value): + raise StopCCEIteration + + +def exit_job_if_true(value): + """Raise a QuitJob exception if value is True""" + if is_true(value): + raise QuitJobError + + +def assert_true(value, message=None): + """Assert value is True""" + if not is_true(value): + raise AssertionError(message or f'"{value}" is not true') + + +def split_by(source, target, separator=None): + """Split the source to multiple values by the separator""" + try: + if not source: + return [] + elif isinstance(source, str) and separator: + values = source.split(separator) + return [{target: value.strip()} for value in values] + elif isinstance(source, str): + return [{target: source}] + elif isinstance(source, Iterable): + return [{target: value} for value in source] + else: + return [{target: source}] + except Exception as ex: + _logger.warning( + "split_by method encountered exception " "source=%s message=%s cause=%s", + source, + ex, + traceback.format_exc(), + ) + return [] + + +_extension_functions = { + "assert_true": assert_true, + "exit_if_true": exit_if_true, + "exit_job_if_true": exit_job_if_true, + "is_true": is_true, + "regex_match": regex_match, + "regex_search": regex_search, + "set_var": set_var, + "splunk_xml": splunk_xml, + "std_output": std_output, + "json_path": json_path, + "json_empty": json_empty, + "json_not_empty": json_not_empty, + "time_str2str": time_str2str, + "split_by": split_by, +} + + +def lookup_method(name): + """Find a predefined function with given function name. + :param name: function name. + :return: A function with given name. + """ + return _extension_functions.get(name) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/http.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/http.py new file mode 100755 index 00000000..695520dc --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/http.py @@ -0,0 +1,315 @@ +# +# Copyright 2025 Splunk Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +import time +import traceback +import requests + +import munch +from requests import PreparedRequest, Session, utils +from solnlib.utils import is_true + +from cloudconnectlib.common import util +from cloudconnectlib.common.log import get_cc_logger +from cloudconnectlib.core import defaults +from cloudconnectlib.core.exceptions import HTTPError + +_logger = get_cc_logger() + + +class HTTPResponse: + """ + HTTPResponse class wraps response of HTTP request for later use. + """ + + def __init__(self, response, content): + """Construct a HTTPResponse from response and content returned + with requests.Session() request""" + self._status_code = response.status_code + self._header = response + self._body = self._decode_content(response.headers, content) + + @staticmethod + def _decode_content(response, content): + if not content: + return "" + + charset = utils.get_encoding_from_headers(response) + + if charset is None: + charset = defaults.charset + _logger.info( + "Unable to find charset in response headers," ' set it to default "%s"', + charset, + ) + + _logger.info("Decoding response content with charset=%s", charset) + + try: + return content.decode(charset, errors="replace") + except Exception as ex: + _logger.warning( + "Failure decoding response content with charset=%s," + " decode it with utf-8: %s", + charset, + ex, + ) + + return content.decode("utf-8", errors="replace") + + @property + def header(self): + return self._header + + @property + def body(self): + """ + Return response body as a `string`. + :return: A `string` + """ + return self._body + + @property + def status_code(self): + """ + Return response status code. + :return: A `integer` + """ + return self._status_code + + +def _make_prepare_url_func(): + """Expose prepare_url in `PreparedRequest`""" + pr = PreparedRequest() + + def prepare_url(url, params=None): + """Prepare the given HTTP URL with ability provided in requests lib. + For some illegal characters in URL or parameters like space(' ') will + be escaped to make sure we can request the correct URL.""" + pr.prepare_url(url, params=params) + return pr.url + + return prepare_url + + +def get_proxy_info(proxy_config: dict) -> dict: + """ + @proxy_config: dict like object of the format - + { + "proxy_url": my-proxy.server.com, + "proxy_port": 0000, + "proxy_username": username, + "proxy_password": password, + "proxy_type": http or sock5, + "proxy_rdns": 0 or 1, + } + """ + proxy_info = {} + + if not proxy_config or not is_true(proxy_config.get("proxy_enabled")): + _logger.info("Proxy is not enabled") + return {} + + proxy_type = proxy_config.get("proxy_type", "").lower() + if proxy_type not in ("http", "socks5"): + proxy_type = "http" + _logger.info('Proxy type not found, set to "HTTP"') + + if is_true(proxy_config.get("proxy_rdns")) and proxy_type == "socks5": + proxy_type = "socks5h" + + url = proxy_config.get("proxy_url") + port = proxy_config.get("proxy_port") + + if url or port: + if not url: + raise ValueError('Proxy "url" must not be empty') + if not util.is_valid_port(port): + raise ValueError('Proxy "port" must be in range [1,65535]: %s' % port) + + proxy_info["http"] = f"{proxy_type}://{url}:{int(port)}" + user = proxy_config.get("proxy_username") + password = proxy_config.get("proxy_password") + + if all((user, password)): + proxy_info["http"] = f"{proxy_type}://{user}:{password}@{url}:{int(port)}" + else: + _logger.info("Proxy has no credentials found") + + proxy_info["https"] = proxy_info["http"] + return proxy_info + + +def standardize_proxy_config(proxy_config): + """ + This function is used to standardize the proxy information structure to + get it evaluated through `get_proxy_info` function + """ + + if not isinstance(proxy_config, dict): + raise ValueError( + "Received unexpected format of proxy configuration. " + "Expected format: object, Actual format: {}".format(type(proxy_config)) + ) + + standard_proxy_config = { + "proxy_enabled": proxy_config.get("enabled", proxy_config.get("proxy_enabled")), + "proxy_username": proxy_config.get( + "username", proxy_config.get("proxy_username") + ), + "proxy_password": proxy_config.get( + "password", proxy_config.get("proxy_password") + ), + "proxy_url": proxy_config.get("host", proxy_config.get("proxy_url")), + "proxy_type": proxy_config.get("type", proxy_config.get("proxy_type")), + "proxy_port": proxy_config.get("port", proxy_config.get("proxy_port")), + "proxy_rdns": proxy_config.get("rdns", proxy_config.get("proxy_rdns")), + } + + return standard_proxy_config + + +class HttpClient: + def __init__(self, proxy_info=None, verify=True): + """ + Constructs a `HTTPRequest` with a optional proxy setting. + :param proxy_info: a dictionary of proxy details. It could directly match the input signature + of `requests` library, otherwise will be standardized and converted to match the input signature. + :param verify: same as the `verify` parameter of requests.request() method + """ + self._connection = None + self.requests_verify = verify + + if proxy_info: + if isinstance(proxy_info, munch.Munch): + proxy_info = dict(proxy_info) + + if all((len(proxy_info) == 2, "http" in proxy_info, "https" in proxy_info)): + # when `proxy_info` already matches the input signature of `requests` library's proxy dict + self._proxy_info = proxy_info + else: + # Updating the proxy_info object to make it compatible for getting evaluated + # through `get_proxy_info` function + proxy_info = standardize_proxy_config(proxy_info) + self._proxy_info = get_proxy_info(proxy_info) + else: + self._proxy_info = proxy_info + self._url_preparer = PreparedRequest() + + def _send_internal(self, uri, method, headers=None, body=None): + """Do send request to target URL, validate SSL cert by default and return the response.""" + return self._connection.request( + url=uri, + data=body, + method=method, + headers=headers, + timeout=defaults.timeout, + verify=self.requests_verify, + ) + + def _retry_send_request_if_needed(self, uri, method="GET", headers=None, body=None): + """Invokes request and auto retry with an exponential backoff + if the response status is configured in defaults.retry_statuses.""" + retries = max(defaults.retries, 0) + _logger.info("Invoking request to [%s] using [%s] method", uri, method) + for i in range(retries + 1): + try: + resp = self._send_internal( + uri=uri, body=body, method=method, headers=headers + ) + content = resp.content + response = resp + except requests.exceptions.SSLError as err: + _logger.error( + "[SSL: CERTIFICATE_VERIFY_FAILED] certificate verification failed. " + "The certificate of the https server [%s] is not trusted, " + "You may need to check the certificate and " + "refer to the documentation and add it to the trust list. %s", + uri, + traceback.format_exc(), + ) + raise HTTPError(f"HTTP Error {err}") from err + except Exception as err: + _logger.exception( + "Could not send request url=%s method=%s", uri, method + ) + raise HTTPError(f"HTTP Error {err}") from err + + status = resp.status_code + + if self._is_need_retry(status, i, retries): + delay = 2**i + _logger.warning( + "The response status=%s of request which url=%s and" + " method=%s. Retry after %s seconds.", + status, + uri, + method, + delay, + ) + time.sleep(delay) + continue + + return HTTPResponse(response, content) + + def _prepare_url(self, url, params=None): + self._url_preparer.prepare_url(url, params) + return self._url_preparer.url + + def _initialize_connection(self): + if self._proxy_info: + _logger.info("Proxy is enabled for http connection.") + else: + _logger.info("Proxy is not enabled for http connection.") + self._connection = self._build_http_connection(self._proxy_info) + + def send(self, request): + if not request: + raise ValueError("The request is none") + if request.body and not isinstance(request.body, str): + raise TypeError(f"Invalid request body type: {request.body}") + + if self._connection is None: + self._initialize_connection() + + try: + url = self._prepare_url(request.url) + except Exception: + _logger.warning( + "Failed to encode url=%s: %s", request.url, traceback.format_exc() + ) + url = request.url + + return self._retry_send_request_if_needed( + url, request.method, request.headers, request.body + ) + + @staticmethod + def _build_http_connection( + proxy_info=None, + disable_ssl_cert_validation=defaults.disable_ssl_cert_validation, + ): + """ + Creates a `request.Session()` object, sets the verify + and proxy_info parameter and returns this object + """ + s = Session() + s.verify = not disable_ssl_cert_validation + s.proxies = proxy_info or {} + return s + + @staticmethod + def _is_need_retry(status, retried, maximum_retries): + return retried < maximum_retries and status in defaults.retry_statuses diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/job.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/job.py new file mode 100755 index 00000000..aa7405eb --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/job.py @@ -0,0 +1,160 @@ +# +# Copyright 2025 Splunk Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +import threading + +from ..common import log +from .exceptions import QuitJobError +from .task import BaseTask + +logger = log.get_cc_logger() + + +class CCEJob: + """ + One CCEJob is composed of a list of tasks. The task could be HTTP + task or Split task(currently supported task types). + Job is an executing unit of CCE engine. + All tasks in one job will be run sequentially but different jobs + could be run concurrently. + So if there is no dependency among tasks, then suggest to create + different Job for them to improve performance. + """ + + def __init__(self, context, tasks=None): + self._context = context + self._rest_tasks = [] + + self._stop_signal_received = False + self._stopped = threading.Event() + + if tasks: + self._rest_tasks.extend(tasks) + self._running_task = None + self._proxy_info = None + + def set_proxy(self, proxy_setting): + """ + Setup the proxy setting. + + :param proxy_setting: Proxy setting should include the following fields + "proxy_enabled": , + "proxy_url":, + "proxy_port": , + "proxy_username": , + "proxy_password": , + "proxy_rdns": , + "proxy_type": , + :type proxy_setting: ``dict`` + """ + self._proxy_info = proxy_setting + logger.debug( + "CCEJob proxy info: proxy_enabled='%s', proxy_url='%s', " + "proxy_port='%s', proxy_rdns='%s', proxy_type='%s', " + "proxy_username='%s'", + proxy_setting.get("proxy_enabled"), + proxy_setting.get("proxy_url"), + proxy_setting.get("proxy_port"), + proxy_setting.get("proxy_rdns"), + proxy_setting.get("proxy_type"), + proxy_setting.get("proxy_username"), + ) + + def add_task(self, task): + """ + Add a task instance into a job. + + :param task: TBD + :type task: TBD + """ + if not isinstance(task, BaseTask): + raise ValueError(f"Unsupported task type: {type(task)}") + if callable(getattr(task, "set_proxy", None)) and self._proxy_info: + task.set_proxy(self._proxy_info) + self._rest_tasks.append(task) + + def _check_if_stop_needed(self): + if self._stop_signal_received: + logger.info("Stop job signal received, stopping job.") + self._stopped.set() + return True + return False + + def run(self): + """ + Run current job, which executes tasks in it sequentially. + """ + logger.debug("Start to run job") + + if not self._rest_tasks: + logger.info("No task found in job") + return + + if self._check_if_stop_needed(): + return + + self._running_task = self._rest_tasks[0] + self._rest_tasks = self._rest_tasks[1:] + + try: + contexts = list(self._running_task.perform(self._context) or ()) + except QuitJobError: + logger.info("Quit job signal received, exiting job") + return + + if self._check_if_stop_needed(): + return + + if not self._rest_tasks: + logger.info("No more task need to perform, exiting job") + return + + count = 0 + + for ctx in contexts: + count += 1 + yield CCEJob(context=ctx, tasks=self._rest_tasks) + + if self._check_if_stop_needed(): + break + + logger.debug("Generated %s job in total", count) + logger.debug("Job execution finished successfully.") + self._stopped.set() + + def stop(self, block=False, timeout=30): + """ + Stop current job. + """ + if self._stopped.is_set(): + logger.info("Job is not running, cannot stop it.") + return + self._stop_signal_received = True + + if self._running_task: + self._running_task.stop(block, timeout) + if not block: + return + + if not self._stopped.wait(timeout): + logger.info("Waiting for stop job timeout") + + def __str__(self): + if self._running_task: + return f"Job(running task={self._running_task})" + return "Job(no running task)" + + def __repr__(self): + return self.__str__() diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/models.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/models.py new file mode 100755 index 00000000..c33b89b3 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/models.py @@ -0,0 +1,338 @@ +# +# Copyright 2025 Splunk Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +import base64 +import json +import sys +import traceback + +from ..common.log import get_cc_logger +from .ext import lookup_method +from .template import compile_template + +_logger = get_cc_logger() + + +class _Token: + """Token class wraps a template expression""" + + def __init__(self, source): + """Constructs _Token from source. A rendered template + will be created if source is string type because Jinja + template must be a string.""" + self._source = source + self._value_for = compile_template(source) if isinstance(source, str) else None + + def render(self, variables): + """Render value with variables if source is a string. + Otherwise return source directly.""" + if self._value_for is None: + return self._source + try: + return self._value_for(variables) + except Exception as ex: + _logger.warning( + 'Unable to render template "%s". Please make sure template is' + " a valid Jinja2 template and token is exist in variables. " + "message=%s cause=%s", + self._source, + ex, + traceback.format_exc(), + ) + return self._source + + +class DictToken: + """DictToken wraps a dict which value is template expression""" + + def __init__(self, template_expr): + self._tokens = {k: _Token(v) for k, v in (template_expr or {}).items()} + + def render(self, variables): + return {k: v.render(variables) for k, v in self._tokens.items()} + + +class BaseAuth: + """A base class for all authorization classes""" + + def __call__(self, headers, context): + raise NotImplementedError("Auth must be callable.") + + +class BasicAuthorization(BaseAuth): + """BasicAuthorization class implements basic auth""" + + def __init__(self, options): + if not options: + raise ValueError("Options for basic auth unexpected to be empty") + + username = options.get("username") + if not username: + raise ValueError("Username is mandatory for basic auth") + password = options.get("password") + if not password: + raise ValueError("Password is mandatory for basic auth") + + self._username = _Token(username) + self._password = _Token(password) + + def to_native_string(self, string, encoding="ascii"): + """ + According to rfc7230: + Historically, HTTP has allowed field content with text in the + ISO-8859-1 charset [ISO-8859-1], supporting other charsets only + through use of [RFC2047] encoding. In practice, most HTTP header + field values use only a subset of the US-ASCII charset [USASCII]. + Newly defined header fields SHOULD limit their field values to + US-ASCII octets. A recipient SHOULD treat other octets in field + content (obs-text) as opaque data. + """ + is_py2 = sys.version_info[0] == 2 + if isinstance(string, str): + out = string + else: + if is_py2: + out = string.encode(encoding) + else: + out = string.decode(encoding) + + return out + + def __call__(self, headers, context): + username = self._username.render(context) + password = self._password.render(context) + headers["Authorization"] = ( + "Basic %s" + % self.to_native_string( + base64.b64encode((username + ":" + password).encode("latin1")) + ).strip() + ) + + +class RequestParams: + def __init__(self, url, method, header=None, auth=None, body=None): + self._header = DictToken(header) + self._url = _Token(url) + self._method = method.upper() + self._auth = auth + self._body = DictToken(body) + + @property + def header(self): + return self._header + + @property + def url(self): + return self._url + + @property + def method(self): + return self._method + + @property + def auth(self): + return self._auth + + @property + def body(self): + return self._body + + def render(self, ctx): + return Request( + url=self._url.render(ctx), + method=self._method, + headers=self.normalize_headers(ctx), + body=self.body.render(ctx), + ) + + def normalize_url(self, context): + """Normalize url""" + return self._url.render(context) + + def normalize_headers(self, context): + """Normalize headers which must be a dict which keys and values are + string.""" + header = self.header.render(context) + return {k: str(v) for k, v in header.items()} + + def normalize_body(self, context): + """Normalize body""" + return self.body.render(context) + + +class Request: + def __init__(self, method, url, headers, body): + self.method = method + self.url = url + self.headers = headers + if not body: + body = None + elif not isinstance(body, str): + body = json.dumps(body) + self.body = body + + +class _Function: + def __init__(self, inputs, function): + self._inputs = tuple(_Token(expr) for expr in inputs or []) + self._function = function + + @property + def inputs(self): + return self._inputs + + def inputs_values(self, context): + """ + Get rendered input values. + """ + for arg in self._inputs: + yield arg.render(context) + + @property + def function(self): + return self._function + + +class Task(_Function): + """Task class wraps a task in processor pipeline""" + + def __init__(self, inputs, function, output=None): + super().__init__(inputs, function) + self._output = output + + @property + def output(self): + return self._output + + def execute(self, context): + """Execute task with arguments which rendered from context""" + args = [arg for arg in self.inputs_values(context)] + caller = lookup_method(self.function) + output = self._output + + _logger.info( + "Executing task method: [%s], input size: [%s], output: [%s]", + self.function, + len(args), + output, + ) + + if output is None: + caller(*args) + return {} + + return {output: caller(*args)} + + +class Condition(_Function): + """A condition return the value calculated from input and function""" + + def calculate(self, context): + """Calculate condition with input arguments rendered from context + and method which expected return a bool result. + :param context: context contains key value pairs + :return A bool value returned from the corresponding method + """ + args = [arg for arg in self.inputs_values(context)] + callable_method = lookup_method(self.function) + + _logger.debug( + "Calculating condition with method: [%s], input size: [%s]", + self.function, + len(args), + ) + + result = callable_method(*args) + + _logger.debug("Calculated result: %s", result) + + return result + + +class _Conditional: + """A base class for all conditional action""" + + def __init__(self, conditions): + self._conditions = conditions or [] + + @property + def conditions(self): + return self._conditions + + def passed(self, context): + """Determine if any condition is satisfied. + :param context: variables to render template + :return: `True` if all passed else `False` + """ + return any(condition.calculate(context) for condition in self._conditions) + + +class Processor(_Conditional): + """Processor class contains a conditional data process pipeline""" + + def __init__(self, skip_conditions, pipeline): + super().__init__(skip_conditions) + self._pipeline = pipeline or [] + + @property + def pipeline(self): + return self._pipeline + + def should_skipped(self, context): + """Determine processor if should skip process""" + return self.passed(context) + + +class IterationMode(_Conditional): + def __init__(self, iteration_count, conditions): + super().__init__(conditions) + self._iteration_count = iteration_count + + @property + def iteration_count(self): + return self._iteration_count + + @property + def conditions(self): + return self._conditions + + +class Checkpoint: + """A checkpoint includes a namespace to determine the checkpoint location + and a content defined the format of content stored in checkpoint.""" + + def __init__(self, namespace, content): + """Constructs checkpoint with given namespace and content template.""" + if not content: + raise ValueError("Checkpoint content must not be empty") + + self._namespace = tuple(_Token(expr) for expr in namespace or ()) + self._content = DictToken(content) + + @property + def namespace(self): + return self._namespace + + def normalize_namespace(self, ctx): + """Normalize namespace with context used to render template.""" + return [token.render(ctx) for token in self._namespace] + + @property + def content(self): + return self._content + + def normalize_content(self, ctx): + """Normalize checkpoint with context used to render template.""" + return self._content.render(ctx) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/pipemgr.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/pipemgr.py new file mode 100755 index 00000000..63586289 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/pipemgr.py @@ -0,0 +1,27 @@ +# +# Copyright 2025 Splunk Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +from solnlib.pattern import Singleton + + +class PipeManager(metaclass=Singleton): + def __init__(self, event_writer=None): + self._event_writer = event_writer + + def write_events(self, events): + if not self._event_writer: + print(events, flush=True) + return True + return self._event_writer.write_events(events) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/plugin.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/plugin.py new file mode 100755 index 00000000..b3d313b2 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/plugin.py @@ -0,0 +1,119 @@ +# +# Copyright 2025 Splunk Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +import importlib +import sys +import traceback +from os import path as op +from os import walk + +from ..common import log +from .ext import _extension_functions + +logger = log.get_cc_logger() + + +def cce_pipeline_plugin(func): + """ + Decorator for pipeline plugin functions. + + This docorator helps to register user defined pipeline function into CCE + engine so that it could be looked up when executing jobs. + + :param func: User defined function object + :type func: ``function`` + + Usage:: + >>> @cce_pipeline_plugin + >>> def my_function(arg): + >>> do_work() + """ + if not callable(func): + logger.debug( + "Function %s is not callable, don't add it as a pipeline function", + func.__name__, + ) + else: + if func.__name__ in list(_extension_functions.keys()): + logger.warning( + "Pipeline function %s already exists, please rename it!", + func.__name__, + ) + else: + _extension_functions[func.__name__] = func + logger.debug("Added function %s to pipeline plugin system", func.__name__) + + def pipeline_func(*args, **kwargs): + return func(*args, **kwargs) + + return pipeline_func + + +def import_plugin_file(file_name): + """ + Import a module. + 1. If the module with the same name already in sys.modules, then log a + warning and exit without reloading it. + 2. If failed to import the file, then log a warning and exit + """ + if file_name.endswith(".py"): + module_name = file_name[:-3] + else: + logger.warning( + "Plugin file %s is with unsupported extension, the supported are py", + file_name, + ) + return + + if module_name in list(sys.modules.keys()): + logger.debug( + "Module %s already exists and it won't be reload, " + "please rename your plugin module if it is required.", + module_name, + ) + return + + try: + importlib.import_module(module_name) + except Exception: + logger.warning(f"Failed to load module {module_name}, {traceback.format_exc()}") + return + + logger.info("Module %s is imported", module_name) + return + + +def init_pipeline_plugins(plugin_dir): + """ + Initialize the pipeline plugins which triggers the auto registering of user + defined pipeline functions. + 1. Add the plugin_dir into sys.path. + 2. Import the file under plugin_dir that starts with "cce_plugin_" and ends + with ".py" + """ + if not op.isdir(plugin_dir): + logger.warning( + "%s is not a directory! Pipeline plugin files won't be loaded.", plugin_dir + ) + return + + if plugin_dir not in sys.path: + sys.path.append(plugin_dir) + + for file_name in next(walk(plugin_dir))[2]: + if file_name == "__init__.py" or not file_name.startswith("cce_plugin_"): + continue + if file_name.endswith(".py"): + import_plugin_file(file_name) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/task.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/task.py new file mode 100755 index 00000000..cd4e0009 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/task.py @@ -0,0 +1,600 @@ +# +# Copyright 2025 Splunk Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +import copy +import threading +from abc import abstractmethod + +from cloudconnectlib.common.log import get_cc_logger +from cloudconnectlib.core import defaults +from cloudconnectlib.core.checkpoint import CheckpointManagerAdapter +from cloudconnectlib.core.exceptions import ( + CCESplitError, + HTTPError, + QuitJobError, + StopCCEIteration, +) +from cloudconnectlib.core.ext import lookup_method +from cloudconnectlib.core.http import HttpClient, get_proxy_info +from cloudconnectlib.core.models import BasicAuthorization, DictToken, Request, _Token + +logger = get_cc_logger() + +_RESPONSE_KEY = "__response__" +_AUTH_TYPES = {"basic_auth": BasicAuthorization} + + +class ProcessHandler: + def __init__(self, method, arguments, output): + self.method = method + self.arguments = [_Token(arg) for arg in arguments or ()] + self.output = output + + def execute(self, context): + args = [arg.render(context) for arg in self.arguments] + logger.debug("%s arguments found for method %s", len(args), self.method) + callable_method = lookup_method(self.method) + result = callable_method(*args) + + data = {} + if self.output: + data[self.output] = result + + return data + + +class Condition: + def __init__(self, method, arguments): + self.method = method + self.arguments = [_Token(arg) for arg in arguments or ()] + + def is_meet(self, context): + args = [arg.render(context) for arg in self.arguments] + callable_method = lookup_method(self.method) + logger.debug("%s arguments found for method %s", len(args), self.method) + return callable_method(*args) + + +class ConditionGroup: + def __init__(self): + self._conditions = [] + + def add(self, condition): + self._conditions.append(condition) + + def is_meet(self, context): + return any(cdn.is_meet(context) for cdn in self._conditions) + + +class ProxyTemplate: + def __init__(self, proxy_setting): + self._proxy = DictToken(proxy_setting or {}) + + def render(self, context): + rendered = self._proxy.render(context) + return get_proxy_info(rendered) + + +class RequestTemplate: + def __init__(self, request): + if not request: + raise ValueError("The request is none") + url = request.get("url") + if not url: + raise ValueError("The request doesn't contain a url or it's empty") + self.url = _Token(url) + self.nextpage_url = _Token(request.get("nextpage_url", url)) + self.headers = DictToken(request.get("headers", {})) + + # Request body could be string or dict + body = request.get("body") + if isinstance(body, dict): + self.body = DictToken(body) + elif isinstance(body, str): + self.body = _Token(body) + else: + if body: + logger.warning("Invalid request body: %s", body) + self.body = None + + method = request.get("method", "GET") + if not method or method.upper() not in ("GET", "POST"): + raise ValueError(f"Unsupported value for request method: {method}") + self.method = _Token(method) + + self.count = 0 + + def reset(self): + self.count = 0 + + def render(self, context): + if self.count == 0 or not self.nextpage_url: + url = self.url.render(context) + else: + url = self.nextpage_url.render(context) + + self.count += 1 + return Request( + url=url, + method=self.method.render(context), + headers=self.headers.render(context), + body=self.body.render(context) if self.body else None, + ) + + +class BaseTask: + def __init__(self, name): + self._name = name + self._pre_process_handler = [] + self._post_process_handler = [] + self._skip_pre_conditions = ConditionGroup() + self._skip_post_conditions = ConditionGroup() + + def add_preprocess_handler(self, method, input, output=None): + """ + Add a preprocess handler. All handlers will be maintained and + executed sequentially. + :param method: The method name. + :type method: ``string`` + :param input: The input of the method. + :type input: ``list`` + :param output: The output variable name. + :type output: ``string`` + """ + handler = ProcessHandler(method, input, output) + self._pre_process_handler.append(handler) + + def add_preprocess_handler_batch(self, handlers): + """ + Add multiple preprocess handlers. All handlers will be maintained and + executed sequentially. + :param handlers: preprocess handler list + :type handlers: tuple + """ + for method, args, output in handlers: + self.add_preprocess_handler(method, args, output) + + def add_preprocess_skip_condition(self, method, input): + """ + Add a preprocess skip condition. The skip_conditions for preprocess + defines a group of conditions and the relation of them is OR which + means if any one of them returns True then the whole skip_conditions + returns True. If it returns True, then the preprocess pipeline will + be skipped. + :param method: The method name. + :type method: ``string`` + :param input: The input of the method. + :type input: ``list`` + """ + self._skip_pre_conditions.add(Condition(method, input)) + + def add_postprocess_handler(self, method, input, output=None): + """ + Add a postprocess handler. All handlers will be maintained and + executed sequentially. + :param method: The method name. + :type method: ``string`` + :param input: The input of the method. + :type input: ``list`` + :param output: The output variable name. + :type output: ``string`` + """ + handler = ProcessHandler(method, input, output) + self._post_process_handler.append(handler) + + def add_postprocess_handler_batch(self, handlers): + """ + Add multiple postprocess handlers. All handlers will be maintained and + executed sequentially. + :param handlers: postprocess handler list + :type handlers: tuple + """ + for method, args, output in handlers: + self.add_postprocess_handler(method, args, output) + + def add_postprocess_skip_condition(self, method, input): + """ + Add a preprocess skip condition. The skip_conditions for postprocess + defines a group of conditions and the relation of them is OR which means + if any one of them returns True then the whole skip_conditions returns + True. If it returns True, then the postprocess pipeline will be skipped. + + :param method: The method name. + :type method: ``string`` + :param input: The input of the method. + :type input: ``list`` + """ + self._skip_post_conditions.add(Condition(method, input)) + + @staticmethod + def _execute_handlers(skip_conditions, handlers, context, phase): + if skip_conditions.is_meet(context): + logger.debug("%s process skip conditions are met", phase.capitalize()) + return + if not handlers: + logger.debug("No handler found in %s process", phase) + return + + for handler in handlers: + data = handler.execute(context) + if data: + # FIXME + context.update(data) + if context.get("is_token_refreshed"): + # In case of OAuth flow after refreshing access token retrying again with the query to collect records + logger.info( + "The access token is refreshed hence skipping the rest post process handler tasks. Retrying again." + ) + return + logger.debug("Execute handlers finished successfully.") + + def _pre_process(self, context): + self._execute_handlers( + self._skip_pre_conditions, self._pre_process_handler, context, "pre" + ) + + def _post_process(self, context): + self._execute_handlers( + self._skip_post_conditions, self._post_process_handler, context, "post" + ) + + @abstractmethod + def perform(self, context): + pass + + def stop(self, block=False, timeout=30): + pass + + def __str__(self): + return self._name + + def __repr__(self): + return self.__str__() + + +class CCESplitTask(BaseTask): + OUTPUT_KEY = "__cce_split_result__" + + def __init__(self, name): + super().__init__(name) + self._process_handler = None + self._source = None + + def configure_split(self, method, source, output, separator=None): + arguments = [source, output, separator] + self._source = source + self._process_handler = ProcessHandler( + method, arguments, CCESplitTask.OUTPUT_KEY + ) + + def perform(self, context): + logger.debug("Task=%s start to run", self) + try: + self._pre_process(context) + except StopCCEIteration: + logger.info("Task=%s exits in pre_process stage", self) + yield context + return + + if not self._process_handler: + logger.info("Task=%s has no split method", self) + raise CCESplitError + + try: + invoke_results = self._process_handler.execute(context) + except Exception: + logger.exception("Task=%s encountered exception", self) + raise CCESplitError + if not invoke_results or not invoke_results.get(CCESplitTask.OUTPUT_KEY): + raise CCESplitError + for invoke_result in invoke_results[CCESplitTask.OUTPUT_KEY]: + new_context = copy.deepcopy(context) + new_context.update(invoke_result) + yield new_context + + logger.debug("Task=%s finished", self) + + +class CCEHTTPRequestTask(BaseTask): + """ + CCEHTTPTask represents a HTTP request's properties and its methods. + It can configure all properties covered by request JSON schema, + like url, method, auth, pre-process, post-process, skip conditions etc. + All properties could contain jinja2 template which will be render + from context when executing. + """ + + def __init__(self, request, name, meta_config=None, task_config=None, **kwargs): + """ + :param verify: Absolute path to server certificate, otherwise uses + requests' default certificate to verify server's TLS certificate. + Explicitly set it to False to not verify TLS certificate. + :type verify: ``string or bool`` + :param custom_func: Custom error code handling for HTTP codes: + the function should accept `request`, `response` and `logger` parameters + To let the library handle the status code, return a non-list object + To handle status code using custom logic, return (response, bool). + Bool decides whether to break or continue the code flow + :type custom_func: ``function`` + """ + super().__init__(name) + self._request = RequestTemplate(request) + self._stop_conditions = ConditionGroup() + self._proxy_info = None + self._max_iteration_count = defaults.max_iteration_count + + self._checkpointer = None + self._task_config = task_config + self._meta_config = meta_config + + self._http_client = None + self._authorizer = None + self._stopped = threading.Event() + self._stop_signal_received = False + if kwargs.get("custom_func"): + self.custom_handle_status_code = kwargs["custom_func"] + self.requests_verify = kwargs.get("verify", True) + + def stop(self, block=False, timeout=30): + """ + Stop current task. + """ + if self._stopped.is_set(): + logger.info("Task=%s is not running, cannot stop it.", self) + return + self._stop_signal_received = True + + if not block: + return + + if not self._stopped.wait(timeout): + logger.info("Waiting for stop task %s timeout", self) + + def _check_if_stop_needed(self): + if self._stop_signal_received: + logger.info("Stop task signal received, stopping task %s.", self) + self._stopped.set() + return True + return False + + def set_proxy(self, proxy_setting): + """ + Setup the proxy setting. + + :param proxy_setting: Proxy setting should include the following fields + "proxy_enabled": , + "proxy_url":, + "proxy_port": , + "proxy_username": , + "proxy_password": , + "proxy_rdns": , + "proxy_type": , + :type proxy_setting: ``dict`` + """ + self._proxy_info = ProxyTemplate(proxy_setting) + + def set_auth(self, auth_type, settings): + """ + Set the authentication of HTTP request. + :param auth_type: Authentication type. + :type auth_type: ``string`` + :param settings: The detail setting of authentication. It + could contain jinja2 + template. For example: + {"username": xxx, "password": xxx} + :type settings: ``dict`` + """ + if not auth_type: + raise ValueError(f"Invalid auth type={auth_type}") + authorizer_cls = _AUTH_TYPES.get(auth_type.lower()) + if not authorizer_cls: + raise ValueError(f"Unsupported auth type={auth_type}") + self._authorizer = authorizer_cls(settings) + + def set_iteration_count(self, count): + """ + Set the maximum loop count for the request. The request will ignore + this field if it's less or equal to 0 and will not stopped until + the stop conditions satisfied. Otherwise if the request count + reaches the iteration_count, the request will stop. + :param count: Iteration count. + :type count: ``integer`` + """ + try: + self._max_iteration_count = int(count) + except ValueError: + self._max_iteration_count = defaults.max_iteration_count + logger.warning( + "Invalid iteration count: %s, using default max iteration count: %s", + count, + self._max_iteration_count, + ) + + def add_stop_condition(self, method, input): + """ + Add a stop condition. The stop_conditions is a group of conditions + which defines when the request loop should be stopped and the + relation of them is OR which means if any one of them returns + True, then the whole skip_conditions returns True. If it + returns True, then stop looping the request. + :param method: The method name. + :type method: ``string`` + :param input: The input of the method. + :type input: ``list`` + """ + self._stop_conditions.add(Condition(method, input)) + + def configure_checkpoint(self, name, content): + """ + :param name: The checkpoint name. + :type name: ``string`` + :param content: The checkpoint content. + :type content: ``dict`` + """ + if not name or not name.strip(): + raise ValueError(f'Invalid checkpoint name: "{name}"') + if not content: + raise ValueError(f"Invalid checkpoint content: {content}") + self._checkpointer = CheckpointManagerAdapter( + namespaces=name, + content=content, + meta_config=self._meta_config, + task_config=self._task_config, + ) + + def _should_exit(self, done_count, context): + if 0 < self._max_iteration_count <= done_count: + logger.info("Iteration count reached %s", self._max_iteration_count) + return True + + if self._stop_conditions.is_meet(context): + logger.info("Stop conditions are met") + return True + return False + + def _send_request(self, request): + try: + response = self._http_client.send(request) + except HTTPError as error: + logger.exception( + "Error occurred in request url=%s method=%s reason=%s", + request.url, + request.method, + error.reason, + ) + return None, True + + status = response.status_code + + if status in defaults.success_statuses: + if not (response.body or "").strip(): + logger.info( + "The response body of request which url=%s and" + " method=%s is empty, status=%s.", + request.url, + request.method, + status, + ) + return None, True + return response, False + + if "custom_handle_status_code" in dir(self): + returned_items = self.custom_handle_status_code(request, response, logger) + if isinstance(returned_items, (list, tuple)): + return returned_items[0], returned_items[1] + + error_log = ( + "The response status=%s for request which url=%s and" + " method=%s and message=%s " + ) % (status, request.url, request.method, response.body) + + if status in defaults.warning_statuses: + logger.warning(error_log) + else: + logger.error(error_log) + + return response, True + + def _persist_checkpoint(self, context): + if not self._checkpointer: + logger.debug("Checkpoint is not configured. Skip persisting checkpoint.") + return + try: + self._checkpointer.save(context) + except Exception: + logger.exception("Error while persisting checkpoint") + else: + logger.debug("Checkpoint has been updated successfully.") + + def _load_checkpoint(self, ctx): + if not self._checkpointer: + logger.debug("Checkpoint is not configured. Skip loading checkpoint.") + return {} + return self._checkpointer.load(ctx=ctx) + + def _prepare_http_client(self, ctx): + proxy = self._proxy_info.render(ctx) if self._proxy_info else None + self._http_client = HttpClient(proxy, self.requests_verify) + + def _flush_checkpoint(self): + if self._checkpointer: + # Flush checkpoint cache to disk + self._checkpointer.close() + + def perform(self, context): + logger.info("Starting to perform task=%s", self) + + self._prepare_http_client(context) + done_count = 0 + + context.update(self._load_checkpoint(context)) + update_source = False if context.get("source") else True + self._request.reset() + + while True: + try: + self._pre_process(context) + except StopCCEIteration: + logger.info("Task=%s exits in pre_process stage", self) + break + except QuitJobError: + self._flush_checkpoint() + raise + + if self._check_if_stop_needed(): + break + + r = self._request.render(context) + if self._authorizer: + self._authorizer(r.headers, context) + + response, need_exit = self._send_request(r) + context[_RESPONSE_KEY] = response + + if need_exit: + logger.info( + "Task=%s need been terminated due to request response", self + ) + break + if self._check_if_stop_needed(): + break + + if update_source: + context["source"] = r.url.split("?")[0] + + try: + self._post_process(context) + except StopCCEIteration: + logger.info("Task=%s exits in post_process stage", self) + break + except QuitJobError: + self._flush_checkpoint() + raise + + self._persist_checkpoint(context) + + if self._check_if_stop_needed(): + break + + done_count += 1 + if self._should_exit(done_count, context): + break + if update_source and context.get("source"): + del context["source"] + yield context + + self._stopped.set() + self._flush_checkpoint() + logger.info("Perform task=%s finished", self) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/template.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/template.py new file mode 100755 index 00000000..c4880016 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/core/template.py @@ -0,0 +1,36 @@ +# +# Copyright 2025 Splunk Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +import re + +from jinja2 import Template + +# This pattern matches the template with only one token inside like "{{ +# token1}}", "{{ token2 }" +PATTERN = re.compile(r"^\{\{\s*(\w+)\s*\}\}$") + + +def compile_template(template): + _origin_template = template + _template = Template(template) + + def translate_internal(context): + match = re.match(PATTERN, _origin_template) + if match: + context_var = context.get(match.groups()[0]) + return context_var if context_var else "" + return _template.render(context) + + return translate_internal diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/__init__.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/__init__.py new file mode 100755 index 00000000..cb8e7bbd --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/__init__.py @@ -0,0 +1,15 @@ +# +# Copyright 2025 Splunk Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/cloud_connect_mod_input.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/cloud_connect_mod_input.py new file mode 100755 index 00000000..d54b5de7 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/cloud_connect_mod_input.py @@ -0,0 +1,85 @@ +# +# Copyright 2025 Splunk Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +import configparser +import os.path as op + +from ..common.lib_util import get_app_root_dir, get_main_file, get_mod_input_script_name +from .data_collection import ta_mod_input as ta_input +from .ta_cloud_connect_client import TACloudConnectClient as CollectorCls + + +def _load_options_from_inputs_spec(app_root, stanza_name): + input_spec_file = "inputs.conf.spec" + file_path = op.join(app_root, "README", input_spec_file) + + if not op.isfile(file_path): + raise RuntimeError("README/%s doesn't exist" % input_spec_file) + + parser = configparser.RawConfigParser(allow_no_value=True) + parser.read(file_path) + options = list(parser.defaults().keys()) + stanza_prefix = "%s://" % stanza_name + + stanza_exist = False + for section in parser.sections(): + if section == stanza_name or section.startswith(stanza_prefix): + options.extend(parser.options(section)) + stanza_exist = True + if not stanza_exist: + raise RuntimeError("Stanza %s doesn't exist" % stanza_name) + return set(options) + + +def _find_ucc_global_config_json(app_root, ucc_config_filename): + """Find UCC config file from all possible directories""" + candidates = [ + "local", + "default", + "bin", + op.join("appserver", "static", "js", "build"), + ] + + for candidate in candidates: + file_path = op.join(app_root, candidate, ucc_config_filename) + if op.isfile(file_path): + return file_path + raise RuntimeError( + "Unable to load {} from [{}]".format(ucc_config_filename, ",".join(candidates)) + ) + + +def _get_cloud_connect_config_json(script_name): + config_file_name = ".".join([script_name, "cc.json"]) + return op.join(op.dirname(get_main_file()), config_file_name) + + +def run(single_instance=False): + script_name = get_mod_input_script_name() + + cce_config_file = _get_cloud_connect_config_json(script_name) + + app_root = get_app_root_dir() + ucc_config_path = _find_ucc_global_config_json(app_root, "globalConfig.json") + + schema_params = _load_options_from_inputs_spec(app_root, script_name) + ta_input.main( + CollectorCls, + schema_file_path=ucc_config_path, + log_suffix=script_name, + cc_json_file=cce_config_file, + schema_para_list=schema_params, + single_instance=single_instance, + ) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/common/__init__.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/common/__init__.py new file mode 100755 index 00000000..0abce142 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/common/__init__.py @@ -0,0 +1,66 @@ +# +# Copyright 2025 Splunk Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +import hashlib +import json + + +def load_schema_file(schema_file): + """ + Load schema file. + """ + + with open(schema_file) as f: + ret = json.load(f) + + common = ret.get("_common_", dict()) + if common: + for k, v in list(ret.items()): + if k == "_common_" or not isinstance(v, dict): + continue + # merge common into other values + for _k, _v in list(common.items()): + if _k not in v: + v[_k] = _v + ret[k] = v + + return ret + + +def md5_of_dict(data): + """ + MD5 of dict data. + """ + + md5 = hashlib.sha256() + if isinstance(data, dict): + for key in sorted(data.keys()): + md5.update(repr(key)) + md5.update(md5_of_dict(data[key])) + elif isinstance(data, list): + for item in sorted(data): + md5.update(md5_of_dict(item)) + else: + md5.update(repr(data)) + + return md5.hexdigest() + + +class UCCException(Exception): + """ + Dispatch engine exception. + """ + + pass diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/common/log.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/common/log.py new file mode 100755 index 00000000..e5a45908 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/common/log.py @@ -0,0 +1,67 @@ +# +# Copyright 2025 Splunk Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +import logging + +from solnlib import log + + +def set_log_level(log_level): + """ + Set log level. + """ + + if isinstance(log_level, str): + if log_level.upper() == "DEBUG": + log.Logs().set_level(logging.DEBUG) + elif log_level.upper() == "INFO": + log.Logs().set_level(logging.INFO) + elif log_level.upper() == "WARN": + log.Logs().set_level(logging.WARN) + elif log_level.upper() == "ERROR": + log.Logs().set_level(logging.ERROR) + elif log_level.upper() == "WARNING": + log.Logs().set_level(logging.WARNING) + elif log_level.upper() == "CRITICAL": + log.Logs().set_level(logging.CRITICAL) + else: + log.Logs().set_level(logging.INFO) + elif isinstance(log_level, int): + if log_level in [ + logging.DEBUG, + logging.INFO, + logging.ERROR, + logging.WARN, + logging.WARNING, + logging.CRITICAL, + ]: + log.Logs().set_level(log_level) + else: + log.Logs().set_level(logging.INFO) + else: + log.Logs().set_level(logging.INFO) + + +# Global logger +logger = log.Logs().get_logger("cloud_connect_engine") + + +def reset_logger(name): + """ + Reset logger. + """ + + global logger + logger = log.Logs().get_logger(name) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/common/rwlock.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/common/rwlock.py new file mode 100755 index 00000000..18c6edd8 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/common/rwlock.py @@ -0,0 +1,85 @@ +# +# Copyright 2025 Splunk Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +""" +This module provides Read-Write lock. +""" + +import threading + + +class _ReadLocker: + def __init__(self, lock): + self.lock = lock + + def __enter__(self): + self.lock.acquire_read() + + def __exit__(self, exc_type, exc_val, exc_tb): + self.lock.release_read() + return False + + +class _WriteLocker: + def __init__(self, lock): + self.lock = lock + + def __enter__(self): + self.lock.acquire_write() + + def __exit__(self, exc_type, exc_val, exc_tb): + self.lock.release_write() + return False + + +class RWLock: + """Simple Read-Write lock. + + Allow multiple read but only one writing concurrently. + """ + + def __init__(self): + self._condition = threading.Condition(threading.Lock()) + self._readers = 0 + + def acquire_read(self): + self._condition.acquire() + self._readers += 1 + self._condition.release() + + def release_read(self): + self._condition.acquire() + try: + self._readers -= 1 + if not self._readers: + self._condition.notifyAll() + finally: + self._condition.release() + + def acquire_write(self): + self._condition.acquire() + while self._readers > 0: + self._condition.wait() + + def release_write(self): + self._condition.release() + + @property + def reader_lock(self): + return _ReadLocker(self) + + @property + def writer_lock(self): + return _WriteLocker(self) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/common/schema_meta.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/common/schema_meta.py new file mode 100755 index 00000000..0b40aa0d --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/common/schema_meta.py @@ -0,0 +1,21 @@ +# +# Copyright 2025 Splunk Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +FIELD_PRODUCT = "_product" +FIELD_REST_NAMESPACE = "_rest_namespace" +FIELD_REST_PREFIX = "_rest_prefix" +FIELD_PROTOCOL_VERSION = "_protocol_version" +FIELD_VERSION = "_version" +FIELD_ENCRYPTION_FORMATTER = "_encryption_formatter" diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/config.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/config.py new file mode 100755 index 00000000..61a672d0 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/config.py @@ -0,0 +1,427 @@ +# +# Copyright 2025 Splunk Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +"""UCC Config Module +This is for load/save configuration in UCC server or TA. +The load/save action is based on specified schema. +""" +import json +import logging +import time +import traceback +from urllib.parse import quote + +from solnlib import utils +from splunktalib.rest import code_to_msg, splunkd_request + +from .common import UCCException +from .common import log as stulog + +LOGGING_STOPPED = False + + +def stop_logging(): + """ + Stop Config Logging. This is for not showing REST request error + while splunkd shutting down. + :return: + """ + global LOGGING_STOPPED + LOGGING_STOPPED = True + + +def log(msg, msgx="", level=logging.INFO, need_tb=False): + """ + Logging in UCC Config Module. + :param msg: message content + :param msgx: detail info. + :param level: logging level + :param need_tb: if need logging traceback + :return: + """ + global LOGGING_STOPPED + if LOGGING_STOPPED: + return + + msgx = " - " + msgx if msgx else "" + content = f"UCC Config Module: {msg}{msgx}" + if need_tb: + stack = "".join(traceback.format_stack()) + content = f"{content}\r\n{stack}" + stulog.logger.log(level, content, exc_info=1) + + +class ConfigException(UCCException): + """Exception for UCC Config Exception""" + + pass + + +class Config: + """UCC Config Module""" + + # Placeholder stands for any field + FIELD_PLACEHOLDER = "*" + + # Head of non-processing endpoint + NON_PROC_ENDPOINT = "#" + + # Some meta fields in UCC Config schema + META_FIELDS = ( + "_product", + "_rest_namespace", + "_rest_prefix", + "_protocol_version", + "_version", + "_encryption_formatter", + ) + + # Default Values for Meta fields + META_FIELDS_DEFAULT = { + "_encryption_formatter": "", + } + + def __init__(self, splunkd_uri, session_key, schema, user="nobody", app="-"): + """ + :param splunkd_uri: the root uri of Splunk server, + like https://127.0.0.1:8089 + :param session_key: session key for Splunk server + :param schema: + :param user: owner of the resources requested + :param app: namespace of the resources requested + :return: + """ + self.splunkd_uri = splunkd_uri.strip("/") + self.session_key = session_key + self.user, self.app = user, app + self._parse_schema(schema) + self._check_protocol_version() + + def load(self): + """Load Configurations in UCC according to the schema + It will raise exception if failing to load any endpoint, + because it make no sense with not complete configuration info. + """ + log('"load" method in', level=logging.DEBUG) + + ret = { + meta_field: getattr(self, meta_field) for meta_field in Config.META_FIELDS + } + + for ep_id, ep in self._endpoints.items(): + data = {"output_mode": "json", "--cred--": "1"} + + retries = 4 + waiting_time = [1, 2, 2] + for retry in range(retries): + response = splunkd_request( + splunkd_uri=self.make_uri(ep_id), + session_key=self.session_key, + data=data, + retry=3, + ) + cont = response.text + if response is None or response.status_code != 200: + msg = 'Fail to load endpoint "{ep_id}" - {err}' "".format( + ep_id=ep_id, err=code_to_msg(response) + ) + log(msg, level=logging.ERROR, need_tb=True) + raise ConfigException(msg) + + try: + ret[ep_id] = self._parse_content(ep_id, cont) + except ConfigException as exc: + log(exc, level=logging.WARNING, need_tb=True) + if retry < retries - 1: + time.sleep(waiting_time[retry]) + else: + break + else: + log(exc, level=logging.ERROR, need_tb=True) + raise exc + + log('"load" method out', level=logging.DEBUG) + return ret + + def update_items( + self, endpoint_id, item_names, field_names, data, raise_if_failed=False + ): + """Update items in specified endpoint with given fields in data + :param endpoint_id: endpoint id in schema, the key name in schema + :param item_names: a list of item name + :param field_names: a list of updated fields + :param data: a dict of content for items, for example: + { + "item_name_1": { + "field_name_1": "value_1", + "field_name_2": "value_2", + }, + "item_name_2": { + "field_name_1": "value_1x", + "field_name_2": "value_2x", + } + } + :raise_if_failed: raise an exception if updating failed. + :return: a list of endpoint ids, which are failed to be updated. + If raise_if_failed is True, it will exist with an exception + on any updating failed. + """ + log( + '"update_items" method in', + msgx="endpoint_id=%s, item_names=%s, field_names=%s" + % (endpoint_id, item_names, field_names), + level=logging.DEBUG, + ) + + assert ( + endpoint_id in self._endpoints + ), "Unexpected endpoint id in given schema - {ep_id}" "".format( + ep_id=endpoint_id + ) + + item_names_failed = [] + for item_name in item_names: + item_data = data.get(item_name, {}) + item_data = { + field_name: self.dump_value( + endpoint_id, item_name, field_name, item_data[field_name] + ) + for field_name in field_names + if field_name in item_data + } + if not item_data: + continue + item_uri = self.make_uri(endpoint_id, item_name=item_name) + + response = splunkd_request( + splunkd_uri=item_uri, + session_key=self.session_key, + data=item_data, + method="POST", + retry=3, + ) + if response is None or response.status_code not in (200, 201): + msg = ( + 'Fail to update item "{item}" in endpoint "{ep_id}"' + " - {err}".format( + ep_id=endpoint_id, + item=item_name, + err=code_to_msg(response), + ) + ) + log(msg, level=logging.ERROR) + if raise_if_failed: + raise ConfigException(msg) + item_names_failed.append(item_name) + + log('"update_items" method out', level=logging.DEBUG) + return item_names_failed + + def make_uri(self, endpoint_id, item_name=None): + """Make uri for REST endpoint in TA according to given schema + :param endpoint_id: endpoint id in schema + :param item_name: item name for given endpoint. None for listing all + :return: + """ + endpoint = self._endpoints[endpoint_id]["endpoint"] + ep_full = ( + endpoint[1:].strip("/") + if endpoint.startswith(Config.NON_PROC_ENDPOINT) + else "{admin_match}/{protocol_version}/{endpoint}" + "".format( + admin_match=self._rest_namespace, + protocol_version=self._protocol_version, + endpoint=(self._rest_prefix + self._endpoints[endpoint_id]["endpoint"]), + ) + ) + ep_uri = ( + None + if endpoint_id not in self._endpoints + else "{splunkd_uri}/servicesNS/{user}/{app}/{endpoint_full}" + "".format( + splunkd_uri=self.splunkd_uri, + user=self.user, + app=self.app, + endpoint_full=ep_full, + ) + ) + + url = ( + ep_uri + if item_name is None + else "{ep_uri}/{item_name}".format( + ep_uri=ep_uri, item_name=quote(item_name) + ) + ) + if item_name is None: + url += "?count=-1" + log('"make_uri" method', msgx="url=%s" % url, level=logging.DEBUG) + return url + + def _parse_content(self, endpoint_id, content): + """Parse content returned from REST + :param content: a JSON string returned from REST. + """ + try: + content = json.loads(content)["entry"] + ret = {ent["name"]: ent["content"] for ent in content} + except Exception as exc: + msg = "Fail to parse content from endpoint_id=%s" " - %s" % ( + endpoint_id, + exc, + ) + log(msg, level=logging.ERROR, need_tb=True) + raise ConfigException(msg) + + ret = { + name: { + key: self.load_value(endpoint_id, name, key, val) + for key, val in ent.items() + if not key.startswith("eai:") + } + for name, ent in ret.items() + } + return ret + + def _parse_schema(self, ucc_config_schema): + try: + ucc_config_schema = json.loads(ucc_config_schema) + except ValueError: + msg = "Invalid JSON content of schema" + log(msg, level=logging.ERROR, need_tb=True) + raise ConfigException(msg) + except Exception as exc: + log(exc, level=logging.ERROR, need_tb=True) + raise ConfigException(exc) + + ucc_config_schema.update( + { + key: val + for key, val in Config.META_FIELDS_DEFAULT.items() + if key not in ucc_config_schema + } + ) + for field in Config.META_FIELDS: + assert field in ucc_config_schema and isinstance( + ucc_config_schema[field], str + ), ('Missing or invalid field "%s" in given schema' % field) + setattr(self, field, ucc_config_schema[field]) + + self._endpoints = {} + for key, val in ucc_config_schema.items(): + if key.startswith("_"): + continue + + assert isinstance(val, dict), ( + 'The schema of endpoint "%s" should be dict' % key + ) + assert "endpoint" in val, 'The endpoint "%s" has no endpoint entry' % key + + self._endpoints[key] = val + + def _check_protocol_version(self): + """ + Check if the protocol version in given schema is supported. + :return: + """ + if not self._protocol_version: + return + if not self._protocol_version.startswith("1."): + raise ConfigException( + 'Unsupported protocol version "%s" ' + "in given schema" % self._protocol_version + ) + + def load_value(self, endpoint_id, item_name, fname, fval): + field_type = self._get_field_type(endpoint_id, item_name, fname) + if field_type == "": + return fval + + try: + field_type = field_type.lower() + if field_type == "bool": + return True if utils.is_true(fval) else False + elif field_type == "int": + return int(fval) + elif field_type == "json": + return json.loads(fval) + except Exception as exc: + msg = ( + 'Fail to load value of "{type_name}" - ' + "endpoint={endpoint}, item={item}, field={field}" + "".format( + type_name=field_type, + endpoint=endpoint_id, + item=item_name, + field=fname, + ) + ) + log(msg, msgx=str(exc), level=logging.WARNING, need_tb=True) + raise ConfigException(msg) + + def dump_value(self, endpoint_id, item_name, fname, fval): + field_type = self._get_field_type(endpoint_id, item_name, fname) + if field_type == "": + return fval + + try: + field_type = field_type.lower() + if field_type == "bool": + return str(fval).lower() + elif field_type == "json": + return json.dumps(fval) + else: + return fval + except Exception as exc: + msg = ( + 'Fail to dump value of "{type_name}" - ' + "endpoint={endpoint}, item={item}, field={field}" + "".format( + type_name=field_type, + endpoint=endpoint_id, + item=item_name, + field=fname, + ) + ) + log(msg, msgx=str(exc), level=logging.ERROR, need_tb=True) + raise ConfigException(msg) + + def _get_field_type(self, endpoint_id, item_name, fname): + field_types = self._endpoints[endpoint_id].get("field_types", {}) + if item_name in field_types: + fields = field_types[item_name] + elif Config.FIELD_PLACEHOLDER in field_types: + fields = field_types[Config.FIELD_PLACEHOLDER] + else: + fields = {} + + field_type = fields.get(fname, "") + if field_type not in ("", "bool", "int", "json"): + msg = ( + 'Unsupported type "{type_name}" for value in schema - ' + "endpoint={endpoint}, item={item}, field={field}" + "".format( + type_name=field_type, + endpoint=endpoint_id, + item=item_name, + field=fname, + ) + ) + log(msg, level=logging.ERROR, need_tb=True) + raise ConfigException(msg) + return field_type + + def get_endpoints(self): + return self._endpoints diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/data_collection/__init__.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/data_collection/__init__.py new file mode 100755 index 00000000..6a2c312e --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/data_collection/__init__.py @@ -0,0 +1,16 @@ +# +# Copyright 2025 Splunk Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +__version__ = "1.0.2" diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/data_collection/ta_checkpoint_manager.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/data_collection/ta_checkpoint_manager.py new file mode 100755 index 00000000..ed275b63 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/data_collection/ta_checkpoint_manager.py @@ -0,0 +1,174 @@ +# +# Copyright 2025 Splunk Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +import json +import re + +from solnlib.utils import is_true +from splunktalib import state_store as ss + +from ..common import log as stulog +from . import ta_consts as c +from . import ta_helper as th + + +class TACheckPointMgr: + SEPARATOR = "_" * 3 + + # FIXME We'd better move all default values together + _DEFAULT_MAX_CACHE_SECONDS = 5 + _MAXIMUM_MAX_CACHE_SECONDS = 3600 + + def __init__(self, meta_config, task_config): + self._task_config = task_config + self._store = self._create_state_store( + meta_config, + task_config.get(c.checkpoint_storage_type), + task_config[c.appname], + ) + + def _create_state_store(self, meta_config, storage_type, app_name): + stulog.logger.debug("Got checkpoint storage type=%s", storage_type) + + if storage_type == c.checkpoint_kv_storage: + collection_name = self._get_collection_name() + stulog.logger.debug( + "Creating KV state store, collection name=%s", collection_name + ) + return ss.get_state_store( + meta_config, + appname=app_name, + collection_name=collection_name, + use_kv_store=True, + ) + + use_cache_file = self._use_cache_file() + max_cache_seconds = self._get_max_cache_seconds() if use_cache_file else None + + stulog.logger.debug( + "Creating file state store, use_cache_file=%s, max_cache_seconds=%s", + use_cache_file, + max_cache_seconds, + ) + + return ss.get_state_store( + meta_config, app_name, use_cached_store=use_cache_file + ) + + def _get_collection_name(self): + collection = self._task_config.get(c.collection_name) + collection = collection.strip() if collection else "" + + if not collection: + input_name = self._task_config[c.mod_input_name] + stulog.logger.info( + 'Collection name="%s" is empty, set it to "%s"', collection, input_name + ) + collection = input_name + return re.sub(r"[^\w]+", "_", collection) + + def _use_cache_file(self): + # TODO Move the default value outside code + use_cache_file = is_true(self._task_config.get(c.use_cache_file, True)) + if use_cache_file: + stulog.logger.info( + "Stanza=%s using cached file store to create checkpoint", + self._task_config[c.stanza_name], + ) + return use_cache_file + + def _get_max_cache_seconds(self): + default = self._DEFAULT_MAX_CACHE_SECONDS + seconds = self._task_config.get(c.max_cache_seconds, default) + try: + seconds = int(seconds) + except ValueError: + stulog.logger.warning( + "The max_cache_seconds '%s' is not a valid integer," + " so set this variable to default value %s", + seconds, + default, + ) + seconds = default + else: + maximum = self._MAXIMUM_MAX_CACHE_SECONDS + if not (1 <= seconds <= maximum): + # for seconds>3600 set it to 3600. for seconds <=0 set it to default. + adjusted = max(min(seconds, maximum), default) + stulog.logger.warning( + "The max_cache_seconds (%s) is expected in range[1,%s]," + " set it to %s", + seconds, + maximum, + adjusted, + ) + seconds = adjusted + return seconds + + def get_ckpt_key(self, namespaces=None): + return self._key_formatter(namespaces) + + def get_ckpt(self, namespaces=None, show_namespaces=False): + key, namespaces = self.get_ckpt_key(namespaces) + raw_checkpoint = self._store.get_state(key) + stulog.logger.debug( + "Get checkpoint key='%s' value='%s'", key, json.dumps(raw_checkpoint) + ) + if not show_namespaces and raw_checkpoint: + return raw_checkpoint.get("data") + return raw_checkpoint + + def delete_if_exists(self, namespaces=None): + """Return true if exist and deleted else False""" + key, _ = self._key_formatter(namespaces) + try: + self._store.delete_state(key) + return True + except Exception: + return False + + def update_ckpt(self, ckpt, namespaces=None): + if not ckpt: + stulog.logger.warning("Checkpoint expect to be not empty.") + return + key, namespaces = self.get_ckpt_key(namespaces) + value = {"namespaces": namespaces, "data": ckpt} + stulog.logger.info( + "Update checkpoint key='%s' value='%s'", key, json.dumps(value) + ) + self._store.update_state(key, value) + + def remove_ckpt(self, namespaces=None): + key, namespaces = self.get_ckpt_key(namespaces) + self._store.delete_state(key) + + def _key_formatter(self, namespaces=None): + if not namespaces: + stanza = self._task_config[c.stanza_name] + stulog.logger.info( + f"Namespaces is empty, using stanza name {stanza} instead." + ) + namespaces = [stanza] + key_str = TACheckPointMgr.SEPARATOR.join(namespaces) + hashed_file = th.format_name_for_file(key_str) + stulog.logger.info("raw_file='%s' hashed_file='%s'", key_str, hashed_file) + return hashed_file, namespaces + + def close(self, key=None): + try: + self._store.close(key) + stulog.logger.info("Closed state store successfully. key=%s", key) + except Exception: + stulog.logger.exception("Error closing state store. key=%s", key) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/data_collection/ta_config.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/data_collection/ta_config.py new file mode 100755 index 00000000..6741cade --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/data_collection/ta_config.py @@ -0,0 +1,192 @@ +# +# Copyright 2025 Splunk Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +import os.path as op +import socket + +from solnlib import server_info +from splunktalib import modinput as modinput +from splunktalib.common import util + +from ..common import log as stulog +from . import ta_consts as c +from . import ta_helper as th + + +# methods can be overrided by subclass : process_task_configs +class TaConfig: + _current_hostname = socket.gethostname() + _appname = util.get_appname_from_path(op.abspath(__file__)) + + def __init__( + self, + meta_config, + client_schema, + log_suffix=None, + stanza_name=None, + input_type=None, + single_instance=True, + ): + self._meta_config = meta_config + self._stanza_name = stanza_name + self._input_type = input_type + self._log_suffix = log_suffix + self._single_instance = single_instance + self._task_configs = [] + self._client_schema = client_schema + self._server_info = server_info.ServerInfo.from_server_uri( + meta_config[c.server_uri], meta_config[c.session_key] + ) + self._all_conf_contents = {} + self._get_division_settings = {} + self.set_logging() + self._load_task_configs() + + def is_shc_member(self): + return self._server_info.is_shc_member() + + def is_search_head(self): + return self._server_info.is_search_head() + + def is_single_instance(self): + return self._single_instance + + def get_meta_config(self): + return self._meta_config + + def get_task_configs(self): + return self._task_configs + + def get_all_conf_contents(self): + if self._all_conf_contents: + return ( + self._all_conf_contents.get(c.inputs), + self._all_conf_contents.get(c.all_configs), + self._all_conf_contents.get(c.global_settings), + ) + + inputs, configs, global_settings = th.get_all_conf_contents( + self._meta_config[c.server_uri], + self._meta_config[c.session_key], + self._client_schema, + self._input_type, + ) + self._all_conf_contents[c.inputs] = inputs + self._all_conf_contents[c.all_configs] = configs + self._all_conf_contents[c.global_settings] = global_settings + return inputs, configs, global_settings + + def set_logging(self): + # The default logger name is "cloud_connect_engine" + if self._stanza_name and self._log_suffix: + logger_name = ( + self._log_suffix + "_" + th.format_name_for_file(self._stanza_name) + ) + stulog.reset_logger(logger_name) + inputs, configs, global_settings = self.get_all_conf_contents() + log_level = "INFO" + for item in global_settings.get("settings"): + if item.get(c.name) == "logging" and item.get("loglevel"): + log_level = item["loglevel"] + break + stulog.set_log_level(log_level) + stulog.logger.info(f"Set log_level={log_level}") + stulog.logger.info(f"Start {self._stanza_name} task") + + def get_input_type(self): + return self._input_type + + def _get_checkpoint_storage_type(self, config): + cs_type = config.get(c.checkpoint_storage_type) + stulog.logger.debug("Checkpoint storage type=%s", cs_type) + + cs_type = cs_type.strip() if cs_type else c.checkpoint_auto + + # Allow user configure 'auto' and 'file' only. + if cs_type not in (c.checkpoint_auto, c.checkpoint_file): + stulog.logger.warning( + "Checkpoint storage type='%s' is invalid, change it to '%s'", + cs_type, + c.checkpoint_auto, + ) + cs_type = c.checkpoint_auto + + if cs_type == c.checkpoint_auto and self.is_search_head(): + stulog.logger.info( + "Checkpoint storage type is '%s' and instance is " + "search head, set checkpoint storage type to '%s'.", + c.checkpoint_auto, + c.checkpoint_kv_storage, + ) + cs_type = c.checkpoint_kv_storage + return cs_type + + def _load_task_configs(self): + inputs, configs, global_settings = self.get_all_conf_contents() + if self._input_type: + inputs = inputs.get(self._input_type) + if not self._single_instance: + inputs = [input for input in inputs if input[c.name] == self._stanza_name] + all_task_configs = [] + for input in inputs: + task_config = {} + task_config.update(input) + task_config[c.configs] = configs + task_config[c.settings] = { + item[c.name]: item for item in global_settings["settings"] + } + if self.is_single_instance(): + collection_interval = "collection_interval" + task_config[c.interval] = task_config.get(collection_interval) + task_config[c.interval] = int(task_config[c.interval]) + if task_config[c.interval] <= 0: + raise ValueError( + "The interval value {} is invalid." + " It should be a positive integer".format(task_config[c.interval]) + ) + + task_config[c.checkpoint_storage_type] = self._get_checkpoint_storage_type( + task_config + ) + + task_config[c.appname] = TaConfig._appname + task_config[c.mod_input_name] = self._input_type + task_config[c.stanza_name] = task_config[c.name] + + all_task_configs.append(task_config) + self._task_configs = all_task_configs + + # Override this method if some transforms or validations needs to be done + # before task_configs is exposed + def process_task_configs(self, task_configs): + pass + + +def create_ta_config( + settings, config_cls=TaConfig, log_suffix=None, single_instance=True +): + meta_config, configs = modinput.get_modinput_configs_from_stdin() + stanza_name = None + input_type = None + if configs and "://" in configs[0].get("name", ""): + input_type, stanza_name = configs[0].get("name").split("://", 1) + return config_cls( + meta_config, + settings, + log_suffix, + stanza_name, + input_type, + single_instance=single_instance, + ) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/data_collection/ta_consts.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/data_collection/ta_consts.py new file mode 100755 index 00000000..eb5f66aa --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/data_collection/ta_consts.py @@ -0,0 +1,69 @@ +# +# Copyright 2025 Splunk Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +server_uri = "server_uri" +session_key = "session_key" +version = "version" +appname = "appname" +event_writer = "event_writer" +index = "index" +default_index = "default" +source = "source" +sourcetype = "sourcetype" +data_loader = "data_loader" + +meta_configs = "meta_configs" +disabled = "disabled" +resource = "resource" +events = "events" +scope = "scope" +checkpoint_dir = "checkpoint_dir" + +ckpt_dict = "ckpt_dict" +inputs = "inputs" +input_name = "input_name" +input_data = "input_data" +interval = "interval" +data = "data" +batch_size = "batch_size" +time_fmt = "%Y-%m-%dT%H:%M:%S" +utc_time_fmt = "%Y-%m-%dT%H:%M:%S.%fZ" + +# system setting keys +checkpoint_storage_type = "builtin_system_checkpoint_storage_type" + +# Possible values for checkpoint storage type +checkpoint_auto = "auto" +checkpoint_kv_storage = "kv_store" +checkpoint_file = "file" + +# For cache file +use_cache_file = "builtin_system_use_cache_file" +max_cache_seconds = "builtin_system_max_cache_seconds" +# For kv store +collection_name = "builtin_system_kvstore_collection_name" + +settings = "__settings__" +configs = "__configs__" + +name = "name" +config = "config" +division = "division" +stanza_name = "stanza_name" +divide_key = "_divide_key" +divide_endpoint = "_divide_endpoint" +mod_input_name = "mod_input_name" +global_settings = "global_settings" +all_configs = "all_configs" diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/data_collection/ta_data_client.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/data_collection/ta_data_client.py new file mode 100755 index 00000000..9b3f4f3b --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/data_collection/ta_data_client.py @@ -0,0 +1,100 @@ +#!/usr/bin/python +# +# Copyright 2025 Splunk Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +from . import ta_checkpoint_manager as cp +from . import ta_data_collector as tdc + + +def build_event( + host=None, + source=None, + sourcetype=None, + time=None, + index=None, + raw_data="", + is_unbroken=False, + is_done=False, +): + if is_unbroken is False and is_done is True: + raise Exception("is_unbroken=False is_done=True is invalid") + return tdc.event_tuple._make( + [host, source, sourcetype, time, index, raw_data, is_unbroken, is_done] + ) + + +class TaDataClient: + def __init__( + self, meta_config, task_config, checkpoint_mgr=None, event_writer=None + ): + self._meta_config = meta_config + self._task_config = task_config + self._checkpoint_mgr = checkpoint_mgr + self._event_writer = event_writer + self._stop = False + + def is_stopped(self): + return self._stop + + def stop(self): + self._stop = True + + def get(self): + raise StopIteration + + +def create_data_collector( + dataloader, tconfig, meta_configs, task_config, data_client_cls, checkpoint_cls=None +): + checkpoint_manager_cls = checkpoint_cls or cp.TACheckPointMgr + return tdc.TADataCollector( + tconfig, + meta_configs, + task_config, + checkpoint_manager_cls, + data_client_cls, + dataloader, + ) + + +def client_adatper(job_func): + class TaDataClientAdapter(TaDataClient): + def __init__(self, all_conf_contents, meta_config, task_config, chp_mgr): + super().__init__(meta_config, task_config, chp_mgr) + self._execute_times = 0 + self._gen = job_func(self._task_config, chp_mgr) + + def stop(self): + """ + overwrite to handle stop control command + """ + + # normaly base class just set self._stop as True + super().stop() + + def get(self): + """ + overwrite to get events + """ + self._execute_times += 1 + if self.is_stopped(): + # send stop signal + self._gen.send(self.is_stopped()) + raise StopIteration + if self._execute_times == 1: + return next(self._gen) + return self._gen.send(self.is_stopped()) + + return TaDataClientAdapter diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/data_collection/ta_data_collector.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/data_collection/ta_data_collector.py new file mode 100755 index 00000000..29cbcbb7 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/data_collection/ta_data_collector.py @@ -0,0 +1,191 @@ +#!/usr/bin/python +# +# Copyright 2025 Splunk Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +import threading +import time +from collections import namedtuple + +from splunktalib.common import util as scu + +from ..common import log as stulog +from . import ta_consts as c + +evt_fmt = ( + "{0}" + "" + "" + "" + "{4}" + "" +) + +unbroken_evt_fmt = ( + "" + '' + "{0}" + "" + "" + "" + "{4}" + "" + "{6}" + "" + "" +) + +event_tuple = namedtuple( + "Event", + [ + "host", + "source", + "sourcetype", + "time", + "index", + "raw_data", + "is_unbroken", + "is_done", + ], +) + + +class TADataCollector: + def __init__( + self, + tconfig, + meta_config, + task_config, + checkpoint_manager_cls, + data_client_cls, + data_loader, + ): + self._lock = threading.Lock() + self._ta_config = tconfig + self._meta_config = meta_config + self._task_config = task_config + self._stopped = False + self._p = self._get_logger_prefix() + self._checkpoint_manager = checkpoint_manager_cls(meta_config, task_config) + self.data_client_cls = data_client_cls + self._data_loader = data_loader + self._client = None + + def get_meta_configs(self): + return self._meta_config + + def get_task_config(self): + return self._task_config + + def get_interval(self): + return self._task_config[c.interval] + + def _get_logger_prefix(self): + pairs = [f'{c.stanza_name}="{self._task_config[c.stanza_name]}"'] + return "[{}]".format(" ".join(pairs)) + + def stop(self): + self._stopped = True + if self._client: + self._client.stop() + + def __call__(self): + self.index_data() + + def _build_event(self, events): + if not events: + return None + if not isinstance(events, list): + events = [events] + evts = [] + for event in events: + assert event.raw_data, "the raw data of events is empty" + if event.is_unbroken: + evt = unbroken_evt_fmt.format( + event.host or "", + event.source or "", + event.sourcetype or "", + event.time or "", + event.index or "", + scu.escape_cdata(event.raw_data), + "" if event.is_done else "", + ) + else: + evt = evt_fmt.format( + event.host or "", + event.source or "", + event.sourcetype or "", + event.time or "", + event.index or "", + scu.escape_cdata(event.raw_data), + ) + evts.append(evt) + return evts + + def _create_data_client(self): + return self.data_client_cls( + self._meta_config, + self._task_config, + self._checkpoint_manager, + self._data_loader.get_event_writer(), + ) + + def index_data(self): + if self._lock.locked(): + stulog.logger.debug( + "Last round of stanza={} is not done yet".format( + self._task_config[c.stanza_name] + ) + ) + return + with self._lock: + try: + self._do_safe_index() + self._checkpoint_manager.close() + except Exception: + stulog.logger.exception(f"{self._p} Failed to index data") + stulog.logger.info(f"{self._p} End of indexing data") + if not self._ta_config.is_single_instance(): + self._data_loader.tear_down() + + def _write_events(self, events): + evts = self._build_event(events) + if evts: + if not self._data_loader.write_events(evts): + stulog.logger.info( + "{} the event queue is closed and the " + "received data will be discarded".format(self._p) + ) + return False + return True + + def _do_safe_index(self): + self._client = self._create_data_client() + while not self._stopped: + try: + events = self._client.get() + if not events: + continue + else: + if not self._write_events(events): + break + except StopIteration: + stulog.logger.info(f"{self._p} Finished this round") + return + except Exception: + stulog.logger.exception(f"{self._p} Failed to get msg") + break + # in case encounter exception or fail to write events + if not self._stopped: + self.stop() diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/data_collection/ta_data_loader.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/data_collection/ta_data_loader.py new file mode 100755 index 00000000..1917f791 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/data_collection/ta_data_loader.py @@ -0,0 +1,180 @@ +# +# Copyright 2025 Splunk Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +""" +Data Loader main entry point +""" +import configparser +import os.path as op +import queue + +from solnlib import log +from solnlib import timer_queue as tq +from splunktalib.concurrent import concurrent_executor as ce +from splunktalib.schedule import job as sjob + +# Global logger +logger = log.Logs().get_logger("util") + + +class TADataLoader: + """ + Data Loader boots all underlying facilities to handle data collection + """ + + def __init__(self, job_scheduler, event_writer): + """ + @configs: a list like object containing a list of dict + like object. Each element shall implement dict.get/[] like interfaces + to get the value for a key. + @job_scheduler: schedulering the jobs. shall implement get_ready_jobs + @event_writer: write_events + """ + + self._settings = self._read_default_settings() + self._settings["daemonize_thread"] = False + self._event_writer = event_writer + self._wakeup_queue = queue.Queue() + self._scheduler = job_scheduler + self._timer_queue = tq.TimerQueue() + self._executor = ce.ConcurrentExecutor(self._settings) + self._started = False + + def run(self, jobs): + if self._started: + return + self._started = True + + self._event_writer.start() + self._executor.start() + self._timer_queue.start() + self._scheduler.start() + logger.info("TADataLoader started.") + + def _enqueue_io_job(job): + job_props = job.get_props() + real_job = job_props["real_job"] + self.run_io_jobs((real_job,)) + + for job in jobs: + j = sjob.Job(_enqueue_io_job, {"real_job": job}, job.get_interval()) + self._scheduler.add_jobs((j,)) + + self._wait_for_tear_down() + + for job in jobs: + job.stop() + + self._scheduler.tear_down() + self._timer_queue.stop() + self._executor.tear_down() + self._event_writer.tear_down() + logger.info("DataLoader stopped.") + + def _wait_for_tear_down(self): + wakeup_q = self._wakeup_queue + while 1: + try: + go_exit = wakeup_q.get(timeout=1) + except queue.Empty: + pass + else: + if go_exit: + logger.info("DataLoader got stop signal") + self._stopped = True + break + + def tear_down(self): + self._wakeup_queue.put(True) + logger.info("DataLoader is going to stop.") + + def stopped(self): + return self._stopped + + def run_io_jobs(self, jobs, block=True): + self._executor.enqueue_io_funcs(jobs, block) + + def run_compute_job(self, func, args=(), kwargs={}): + self._executor.run_compute_func_sync(func, args, kwargs) + + def run_compute_job_async(self, func, args=(), kwargs={}, callback=None): + """ + @return: AsyncResult + """ + + return self._executor.run_compute_func_async(func, args, kwargs, callback) + + def add_timer(self, callback, when, interval): + return self._timer_queue.add_timer(callback, when, interval) + + def remove_timer(self, timer): + self._timer_queue.remove_timer(timer) + + def write_events(self, events): + return self._event_writer.write_events(events) + + def get_event_writer(self): + return self._event_writer + + @staticmethod + def _read_default_settings(): + cur_dir = op.dirname(op.abspath(__file__)) + setting_file = op.join(cur_dir, "../../../", "splunktalib", "setting.conf") + parser = configparser.ConfigParser() + parser.read(setting_file) + settings = {} + keys = ("process_size", "thread_min_size", "thread_max_size", "task_queue_size") + for option in keys: + try: + settings[option] = parser.get("global", option) + except configparser.NoOptionError: + settings[option] = -1 + + try: + settings[option] = int(settings[option]) + except ValueError: + settings[option] = -1 + logger.debug("settings: %s", settings) + return settings + + +class GlobalDataLoader: + """Singleton, inited when started""" + + __instance = None + + @staticmethod + def get_data_loader(scheduler, writer): + if GlobalDataLoader.__instance is None: + GlobalDataLoader.__instance = TADataLoader(scheduler, writer) + return GlobalDataLoader.__instance + + @staticmethod + def reset(): + GlobalDataLoader.__instance = None + + +def create_data_loader(): + """ + create a data loader with default event_writer, job_scheudler + """ + + from splunktalib import event_writer as ew + from splunktalib.schedule import scheduler as sched + + writer = ew.EventWriter() + scheduler = sched.Scheduler() + loader = GlobalDataLoader.get_data_loader(scheduler, writer) + return loader diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/data_collection/ta_helper.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/data_collection/ta_helper.py new file mode 100755 index 00000000..6aa188e1 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/data_collection/ta_helper.py @@ -0,0 +1,176 @@ +# +# Copyright 2025 Splunk Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +import hashlib +import json +import os.path as op +import re +from calendar import timegm +from datetime import datetime +from functools import lru_cache + +from splunktalib.common import util +from splunktaucclib.global_config import GlobalConfig, GlobalConfigSchema + +from ...splunktacollectorlib import config as sc +from . import ta_consts as c + + +def utc2timestamp(human_time): + regex1 = r"\d{4}-\d{2}-\d{2}.\d{2}:\d{2}:\d{2}" + match = re.search(regex1, human_time) + if match: + formated = match.group() + else: + return None + + strped_time = datetime.strptime(formated, c.time_fmt) + timestamp = timegm(strped_time.utctimetuple()) + + regex2 = r"\d{4}-\d{2}-\d{2}.\d{2}:\d{2}:\d{2}(\.\d+)" + match = re.search(regex2, human_time) + if match: + timestamp += float(match.group(1)) + else: + timestamp += float("0.000000") + return timestamp + + +def get_md5(data): + """ + function name is not change, actually use sha1 instead + :param data: + :return: + """ + assert data is not None, "The input cannot be None" + if isinstance(data, str): + return hashlib.sha256(data.encode("utf-8")).hexdigest() + elif isinstance(data, (list, tuple, dict)): + return hashlib.sha256(json.dumps(data).encode("utf-8")).hexdigest() + + +def get_all_conf_contents(server_uri, sessionkey, settings, input_type=None): + schema = GlobalConfigSchema(settings) + global_config = GlobalConfig(server_uri, sessionkey, schema) + inputs = global_config.inputs.load(input_type=input_type) + configs = global_config.configs.load() + settings = global_config.settings.load() + return inputs, configs, settings + + +@lru_cache(maxsize=64) +def format_name_for_file(name): + return hashlib.sha256(name.encode("utf-8")).hexdigest() + + +class ConfigSchemaHandler: + _app_name = util.get_appname_from_path(op.abspath(__file__)) + # Division schema keys. + TYPE = "type" + + TYPE_SINGLE = "single" + TYPE_MULTI = "multi" + REFER = "refer" + SEPARATOR = "separator" + + def __init__(self, meta_configs, client_schema): + self._config = sc.Config( + splunkd_uri=meta_configs[c.server_uri], + session_key=meta_configs[c.session_key], + schema=json.dumps(client_schema[c.config]), + user="nobody", + app=ConfigSchemaHandler._app_name, + ) + self._client_schema = client_schema + self._all_conf_contents = {} + self._load_conf_contents() + self._division_settings = self._divide_settings() + + def get_endpoints(self): + return self._config.get_endpoints() + + def get_all_conf_contents(self): + return self._all_conf_contents + + def get_single_conf_contents(self, endpoint): + return self._all_conf_contents.get(endpoint) + + def get_division_settings(self): + return self._division_settings + + def _divide_settings(self): + division_schema = self._client_schema[c.division] + division_settings = dict() + for division_endpoint, division_contents in division_schema.items(): + division_settings[division_endpoint] = self._process_division( + division_endpoint, division_contents + ) + return division_settings + + def _load_conf_contents(self): + self._all_conf_contents = self._config.load() + + def _process_division(self, division_endpoint, division_contents): + division_metrics = [] + assert isinstance(division_contents, dict) + for division_key, division_value in division_contents.items(): + try: + assert ( + self.TYPE in division_value + and division_value[self.TYPE] in [self.TYPE_SINGLE, self.TYPE_MULTI] + and self.SEPARATOR in division_value + if division_value[self.TYPE] == self.TYPE_MULTI + else True + ) + except Exception: + raise Exception("Invalid division schema") + division_metrics.append( + DivisionRule( + division_endpoint, + division_key, + division_value[self.TYPE], + division_value.get( + self.SEPARATOR, + ), + division_value.get( + self.REFER, + ), + ) + ) + return division_metrics + + +class DivisionRule: + def __init__(self, endpoint, metric, type, separator, refer): + self._endpoint = endpoint + self._metric = metric + self._type = type + self._separator = separator + self._refer = refer + + def endpoint(self): + return self._endpoint + + def metric(self): + return self._metric + + def type(self): + return self._type + + def separator(self): + return self._separator + + def refer(self): + return self._refer diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/data_collection/ta_mod_input.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/data_collection/ta_mod_input.py new file mode 100755 index 00000000..3afb7bdb --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/data_collection/ta_mod_input.py @@ -0,0 +1,310 @@ +#!/usr/bin/python +# +# Copyright 2025 Splunk Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +""" +This is the main entry point for My TA +""" +import os.path as op +import platform +import sys +import time + +from solnlib import file_monitor as fm +from solnlib import orphan_process_monitor as opm +from solnlib import utils +from splunktalib import modinput +from splunktalib.common import util as sc_util + +from ...common.lib_util import get_app_root_dir, get_mod_input_script_name +from ..common import load_schema_file as ld +from ..common import log as stulog +from . import ta_checkpoint_manager as cpmgr +from . import ta_config as tc +from . import ta_data_client as tdc +from . import ta_data_loader as dl + +utils.remove_http_proxy_env_vars() + +__CHECKPOINT_DIR_MAX_LEN__ = 180 + + +def do_scheme( + mod_input_name, + schema_para_list=None, + single_instance=True, +): + """ + Feed splunkd the TA's scheme + + """ + builtin_names = { + "name", + "index", + "sourcetype", + "host", + "source", + "disabled", + "interval", + } + + param_string_list = [] + if schema_para_list is None: + schema_para_list = () + + for param in schema_para_list: + if param in builtin_names: + continue + + param_string_list.append( + """ + + {param} + 0 + 0 + + """.format( + param=param + ) + ) + + description = ( + "Go to the add-on's configuration UI and configure" + " modular inputs under the Inputs menu." + ) + + print( + """ + + {data_input_title} + {description} + true + xml + {single_instance} + + + + {data_input_title} Data Input Name + + {param_str} + + + + """.format( + single_instance=(str(single_instance)).lower(), + data_input_title=mod_input_name, + param_str="".join(param_string_list), + description=description, + ) + ) + + +def _setup_signal_handler(data_loader, ta_short_name): + """ + Setup signal handlers + :data_loader: data_loader.DataLoader instance + """ + + def _handle_exit(signum, frame): + stulog.logger.info(f"{ta_short_name} receives exit signal") + if data_loader is not None: + data_loader.tear_down() + + utils.handle_teardown_signals(_handle_exit) + + +def _handle_file_changes(data_loader): + """ + :reload conf files and exit + """ + + def _handle_refresh(changed_files): + stulog.logger.info(f"Detect {changed_files} changed, reboot itself") + data_loader.tear_down() + + return _handle_refresh + + +def _get_conf_files(settings): + rest_root = settings.get("meta").get("restRoot") + file_list = [rest_root + "_settings.conf"] + if settings.get("pages") and settings.get("pages").get("configuration"): + configs = settings.get("pages").get("configuration") + tabs = configs.get("tabs") if configs.get("tabs") else [] + for tab in tabs: + if tab.get("table"): + file_list.append(rest_root + "_" + tab.get("name") + ".conf") + ta_dir = get_app_root_dir() + return [op.join(ta_dir, "local", f) for f in file_list] + + +def run( + collector_cls, + settings, + checkpoint_cls=None, + config_cls=None, + log_suffix=None, + single_instance=True, + cc_json_file=None, +): + """ + Main loop. Run this TA forever + """ + ta_short_name = settings["meta"]["name"].lower() + + # This is for stdout flush + sc_util.disable_stdout_buffer() + + # http://bugs.python.org/issue7980 + time.strptime("2016-01-01", "%Y-%m-%d") + + loader = dl.create_data_loader() + + # handle signal + _setup_signal_handler(loader, ta_short_name) + + # monitor files to reboot + try: + monitor = fm.FileMonitor( + _handle_file_changes(loader), _get_conf_files(settings) + ) + loader.add_timer(monitor.check_changes, time.time(), 10) + except Exception: + stulog.logger.exception("Fail to add files for monitoring") + + # add orphan process handling, which will check each 1 second + orphan_checker = opm.OrphanProcessChecker(loader.tear_down) + loader.add_timer(orphan_checker.check_orphan, time.time(), 1) + + tconfig = tc.create_ta_config( + settings, config_cls or tc.TaConfig, log_suffix, single_instance=single_instance + ) + task_configs = tconfig.get_task_configs() + + if not task_configs: + stulog.logger.debug("No task and exiting...") + return + meta_config = tconfig.get_meta_config() + meta_config["cc_json_file"] = cc_json_file + + if tconfig.is_shc_member(): + # Don't support SHC env + stulog.logger.error( + "This host is in search head cluster environment , " "will exit." + ) + return + + # In this case, use file for checkpoint + if _is_checkpoint_dir_length_exceed_limit(tconfig, meta_config["checkpoint_dir"]): + stulog.logger.error( + "The length of the checkpoint directory path: '{}' " + "is too long. The max length we support is {}", + meta_config["checkpoint_dir"], + __CHECKPOINT_DIR_MAX_LEN__, + ) + return + + jobs = [ + tdc.create_data_collector( + loader, + tconfig, + meta_config, + task_config, + collector_cls, + checkpoint_cls=checkpoint_cls or cpmgr.TACheckPointMgr, + ) + for task_config in task_configs + ] + + loader.run(jobs) + + +def _is_checkpoint_dir_length_exceed_limit(config, checkpoint_dir): + return ( + platform.system() == "Windows" + and not config.is_search_head() + and len(checkpoint_dir) >= __CHECKPOINT_DIR_MAX_LEN__ + ) + + +def validate_config(): + """ + Validate inputs.conf + """ + + _, configs = modinput.get_modinput_configs_from_stdin() + return 0 + + +def usage(): + """ + Print usage of this binary + """ + + hlp = "%s --scheme|--validate-arguments|-h" + print(hlp % sys.argv[0], file=sys.stderr) + sys.exit(1) + + +def main( + collector_cls, + schema_file_path, + log_suffix="modinput", + checkpoint_cls=None, + config_cls=None, + cc_json_file=None, + schema_para_list=None, + single_instance=True, +): + """ + Main entry point + """ + assert collector_cls, "ucc modinput collector is None." + assert schema_file_path, "ucc modinput schema file is None" + + settings = ld(schema_file_path) + + mod_input_name = get_mod_input_script_name() + + args = sys.argv + if len(args) > 1: + if args[1] == "--scheme": + do_scheme( + mod_input_name=mod_input_name, + schema_para_list=schema_para_list, + single_instance=single_instance, + ) + elif args[1] == "--validate-arguments": + sys.exit(validate_config()) + elif args[1] in ("-h", "--h", "--help"): + usage() + else: + usage() + else: + try: + run( + collector_cls, + settings, + checkpoint_cls=checkpoint_cls, + config_cls=config_cls, + log_suffix=log_suffix, + single_instance=single_instance, + cc_json_file=cc_json_file, + ) + except Exception: + stulog.logger.exception(f"{mod_input_name} task encounter exception") + stulog.logger.info(f"End {mod_input_name} task") + sys.exit(0) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/splunk_ta_import_declare.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/splunk_ta_import_declare.py new file mode 100755 index 00000000..fc05ad78 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/splunk_ta_import_declare.py @@ -0,0 +1,30 @@ +# +# Copyright 2025 Splunk Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +""" +This module is used to filter and reload PATH. +""" + +import os +import re +import sys + +ta_name = os.path.basename(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +ta_lib_name = re.sub(r"[^\w]+", "_", ta_name.lower()) +assert ta_name or ta_name == "package", "TA name is None or package" +pattern = re.compile(r"[\\/]etc[\\/]apps[\\/][^\\/]+[\\/]bin[\\/]?$") +new_paths = [path for path in sys.path if not pattern.search(path) or ta_name in path] +new_paths.insert(0, os.path.sep.join([os.path.dirname(__file__), ta_lib_name])) +sys.path = new_paths diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/ta_cloud_connect_client.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/ta_cloud_connect_client.py new file mode 100755 index 00000000..ec74839a --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/cloudconnectlib/splunktacollectorlib/ta_cloud_connect_client.py @@ -0,0 +1,48 @@ +# +# Copyright 2025 Splunk Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +from ..common.log import set_cc_logger +from ..splunktacollectorlib.common import log as stulog +from ..splunktacollectorlib.data_collection import ta_consts as c +from .data_collection.ta_data_client import TaDataClient + + +class TACloudConnectClient(TaDataClient): + def __init__( + self, meta_config, task_config, checkpoint_mgr=None, event_writer=None + ): + super().__init__(meta_config, task_config, checkpoint_mgr, event_writer) + self._set_log() + self._cc_config_file = self._meta_config["cc_json_file"] + from ..client import CloudConnectClient as Client + from ..core.pipemgr import PipeManager + + self._pipe_mgr = PipeManager(event_writer=event_writer) + self._client = Client(self._task_config, self._cc_config_file, checkpoint_mgr) + + def _set_log(self): + pairs = [f'{c.stanza_name}="{self._task_config[c.stanza_name]}"'] + set_cc_logger(stulog.logger, logger_prefix="[{}]".format(" ".join(pairs))) + + def is_stopped(self): + return self._stop + + def stop(self): + self._stop = True + self._client.stop() + + def get(self): + self._client.start() + raise StopIteration diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/decorator-5.1.1.dist-info/INSTALLER b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/decorator-5.1.1.dist-info/INSTALLER new file mode 100755 index 00000000..a1b589e3 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/decorator-5.1.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/decorator-5.1.1.dist-info/METADATA b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/decorator-5.1.1.dist-info/METADATA new file mode 100755 index 00000000..df407f80 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/decorator-5.1.1.dist-info/METADATA @@ -0,0 +1,127 @@ +Metadata-Version: 2.1 +Name: decorator +Version: 5.1.1 +Summary: Decorators for Humans +Home-page: https://github.com/micheles/decorator +Author: Michele Simionato +Author-email: michele.simionato@gmail.com +License: new BSD License +Keywords: decorators generic utility +Platform: All +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Natural Language :: English +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Topic :: Software Development :: Libraries +Classifier: Topic :: Utilities +Requires-Python: >=3.5 + +Decorators for Humans +===================== + +The goal of the decorator module is to make it easy to define +signature-preserving function decorators and decorator factories. +It also includes an implementation of multiple dispatch and other niceties +(please check the docs). It is released under a two-clauses +BSD license, i.e. basically you can do whatever you want with it but I am not +responsible. + +Installation +------------- + +If you are lazy, just perform + + ``$ pip install decorator`` + +which will install just the module on your system. + +If you prefer to install the full distribution from source, including +the documentation, clone the `GitHub repo`_ or download the tarball_, unpack it and run + + ``$ pip install .`` + +in the main directory, possibly as superuser. + +.. _tarball: https://pypi.org/project/decorator/#files +.. _GitHub repo: https://github.com/micheles/decorator + +Testing +-------- + +If you have the source code installation you can run the tests with + + `$ python src/tests/test.py -v` + +or (if you have setuptools installed) + + `$ python setup.py test` + +Notice that you may run into trouble if in your system there +is an older version of the decorator module; in such a case remove the +old version. It is safe even to copy the module `decorator.py` over +an existing one, since we kept backward-compatibility for a long time. + +Repository +--------------- + +The project is hosted on GitHub. You can look at the source here: + + https://github.com/micheles/decorator + +Documentation +--------------- + +The documentation has been moved to https://github.com/micheles/decorator/blob/master/docs/documentation.md + +From there you can get a PDF version by simply using the print +functionality of your browser. + +Here is the documentation for previous versions of the module: + +https://github.com/micheles/decorator/blob/4.3.2/docs/tests.documentation.rst +https://github.com/micheles/decorator/blob/4.2.1/docs/tests.documentation.rst +https://github.com/micheles/decorator/blob/4.1.2/docs/tests.documentation.rst +https://github.com/micheles/decorator/blob/4.0.0/documentation.rst +https://github.com/micheles/decorator/blob/3.4.2/documentation.rst + +For the impatient +----------------- + +Here is an example of how to define a family of decorators tracing slow +operations: + +.. code-block:: python + + from decorator import decorator + + @decorator + def warn_slow(func, timelimit=60, *args, **kw): + t0 = time.time() + result = func(*args, **kw) + dt = time.time() - t0 + if dt > timelimit: + logging.warn('%s took %d seconds', func.__name__, dt) + else: + logging.info('%s took %d seconds', func.__name__, dt) + return result + + @warn_slow # warn if it takes more than 1 minute + def preprocess_input_files(inputdir, tempdir): + ... + + @warn_slow(timelimit=600) # warn if it takes more than 10 minutes + def run_calculation(tempdir, outdir): + ... + +Enjoy! + + diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/decorator-5.1.1.dist-info/RECORD b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/decorator-5.1.1.dist-info/RECORD new file mode 100755 index 00000000..2115358c --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/decorator-5.1.1.dist-info/RECORD @@ -0,0 +1,8 @@ +decorator-5.1.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +decorator-5.1.1.dist-info/LICENSE.txt,sha256=_RFmDKvwUyCCxFcGhi-vwpSQfsf44heBgkCkmZgGeC4,1309 +decorator-5.1.1.dist-info/METADATA,sha256=XAr2zbYpRxCkcPbsmg1oaiS5ea7mhTq-j-wb0XjuVho,3955 +decorator-5.1.1.dist-info/RECORD,, +decorator-5.1.1.dist-info/WHEEL,sha256=ewwEueio1C2XeHTvT17n8dZUJgOvyCWCt0WVNLClP9o,92 +decorator-5.1.1.dist-info/pbr.json,sha256=AL84oUUWQHwkd8OCPhLRo2NJjU5MDdmXMqRHv-posqs,47 +decorator-5.1.1.dist-info/top_level.txt,sha256=Kn6eQjo83ctWxXVyBMOYt0_YpjRjBznKYVuNyuC_DSI,10 +decorator.py,sha256=el5cAEgoTEpRQN65tOxGhElue-CccMv0xol-J2MwOc0,16752 diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/decorator-5.1.1.dist-info/WHEEL b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/decorator-5.1.1.dist-info/WHEEL new file mode 100755 index 00000000..5bad85fd --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/decorator-5.1.1.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.37.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/decorator-5.1.1.dist-info/pbr.json b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/decorator-5.1.1.dist-info/pbr.json new file mode 100755 index 00000000..cd045997 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/decorator-5.1.1.dist-info/pbr.json @@ -0,0 +1 @@ +{"is_release": false, "git_version": "8608a46"} \ No newline at end of file diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/decorator.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/decorator.py new file mode 100755 index 00000000..2479b6f7 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/decorator.py @@ -0,0 +1,451 @@ +# ######################### LICENSE ############################ # + +# Copyright (c) 2005-2021, Michele Simionato +# All rights reserved. + +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: + +# Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# Redistributions in bytecode form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. + +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR +# TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +# DAMAGE. + +""" +Decorator module, see +https://github.com/micheles/decorator/blob/master/docs/documentation.md +for the documentation. +""" +import re +import sys +import inspect +import operator +import itertools +from contextlib import _GeneratorContextManager +from inspect import getfullargspec, iscoroutinefunction, isgeneratorfunction + +__version__ = '5.1.1' + +DEF = re.compile(r'\s*def\s*([_\w][_\w\d]*)\s*\(') +POS = inspect.Parameter.POSITIONAL_OR_KEYWORD +EMPTY = inspect.Parameter.empty + + +# this is not used anymore in the core, but kept for backward compatibility +class FunctionMaker(object): + """ + An object with the ability to create functions with a given signature. + It has attributes name, doc, module, signature, defaults, dict and + methods update and make. + """ + + # Atomic get-and-increment provided by the GIL + _compile_count = itertools.count() + + # make pylint happy + args = varargs = varkw = defaults = kwonlyargs = kwonlydefaults = () + + def __init__(self, func=None, name=None, signature=None, + defaults=None, doc=None, module=None, funcdict=None): + self.shortsignature = signature + if func: + # func can be a class or a callable, but not an instance method + self.name = func.__name__ + if self.name == '': # small hack for lambda functions + self.name = '_lambda_' + self.doc = func.__doc__ + self.module = func.__module__ + if inspect.isroutine(func): + argspec = getfullargspec(func) + self.annotations = getattr(func, '__annotations__', {}) + for a in ('args', 'varargs', 'varkw', 'defaults', 'kwonlyargs', + 'kwonlydefaults'): + setattr(self, a, getattr(argspec, a)) + for i, arg in enumerate(self.args): + setattr(self, 'arg%d' % i, arg) + allargs = list(self.args) + allshortargs = list(self.args) + if self.varargs: + allargs.append('*' + self.varargs) + allshortargs.append('*' + self.varargs) + elif self.kwonlyargs: + allargs.append('*') # single star syntax + for a in self.kwonlyargs: + allargs.append('%s=None' % a) + allshortargs.append('%s=%s' % (a, a)) + if self.varkw: + allargs.append('**' + self.varkw) + allshortargs.append('**' + self.varkw) + self.signature = ', '.join(allargs) + self.shortsignature = ', '.join(allshortargs) + self.dict = func.__dict__.copy() + # func=None happens when decorating a caller + if name: + self.name = name + if signature is not None: + self.signature = signature + if defaults: + self.defaults = defaults + if doc: + self.doc = doc + if module: + self.module = module + if funcdict: + self.dict = funcdict + # check existence required attributes + assert hasattr(self, 'name') + if not hasattr(self, 'signature'): + raise TypeError('You are decorating a non function: %s' % func) + + def update(self, func, **kw): + """ + Update the signature of func with the data in self + """ + func.__name__ = self.name + func.__doc__ = getattr(self, 'doc', None) + func.__dict__ = getattr(self, 'dict', {}) + func.__defaults__ = self.defaults + func.__kwdefaults__ = self.kwonlydefaults or None + func.__annotations__ = getattr(self, 'annotations', None) + try: + frame = sys._getframe(3) + except AttributeError: # for IronPython and similar implementations + callermodule = '?' + else: + callermodule = frame.f_globals.get('__name__', '?') + func.__module__ = getattr(self, 'module', callermodule) + func.__dict__.update(kw) + + def make(self, src_templ, evaldict=None, addsource=False, **attrs): + """ + Make a new function from a given template and update the signature + """ + src = src_templ % vars(self) # expand name and signature + evaldict = evaldict or {} + mo = DEF.search(src) + if mo is None: + raise SyntaxError('not a valid function template\n%s' % src) + name = mo.group(1) # extract the function name + names = set([name] + [arg.strip(' *') for arg in + self.shortsignature.split(',')]) + for n in names: + if n in ('_func_', '_call_'): + raise NameError('%s is overridden in\n%s' % (n, src)) + + if not src.endswith('\n'): # add a newline for old Pythons + src += '\n' + + # Ensure each generated function has a unique filename for profilers + # (such as cProfile) that depend on the tuple of (, + # , ) being unique. + filename = '' % next(self._compile_count) + try: + code = compile(src, filename, 'single') + exec(code, evaldict) + except Exception: + print('Error in generated code:', file=sys.stderr) + print(src, file=sys.stderr) + raise + func = evaldict[name] + if addsource: + attrs['__source__'] = src + self.update(func, **attrs) + return func + + @classmethod + def create(cls, obj, body, evaldict, defaults=None, + doc=None, module=None, addsource=True, **attrs): + """ + Create a function from the strings name, signature and body. + evaldict is the evaluation dictionary. If addsource is true an + attribute __source__ is added to the result. The attributes attrs + are added, if any. + """ + if isinstance(obj, str): # "name(signature)" + name, rest = obj.strip().split('(', 1) + signature = rest[:-1] # strip a right parens + func = None + else: # a function + name = None + signature = None + func = obj + self = cls(func, name, signature, defaults, doc, module) + ibody = '\n'.join(' ' + line for line in body.splitlines()) + caller = evaldict.get('_call_') # when called from `decorate` + if caller and iscoroutinefunction(caller): + body = ('async def %(name)s(%(signature)s):\n' + ibody).replace( + 'return', 'return await') + else: + body = 'def %(name)s(%(signature)s):\n' + ibody + return self.make(body, evaldict, addsource, **attrs) + + +def fix(args, kwargs, sig): + """ + Fix args and kwargs to be consistent with the signature + """ + ba = sig.bind(*args, **kwargs) + ba.apply_defaults() # needed for test_dan_schult + return ba.args, ba.kwargs + + +def decorate(func, caller, extras=(), kwsyntax=False): + """ + Decorates a function/generator/coroutine using a caller. + If kwsyntax is True calling the decorated functions with keyword + syntax will pass the named arguments inside the ``kw`` dictionary, + even if such argument are positional, similarly to what functools.wraps + does. By default kwsyntax is False and the the arguments are untouched. + """ + sig = inspect.signature(func) + if iscoroutinefunction(caller): + async def fun(*args, **kw): + if not kwsyntax: + args, kw = fix(args, kw, sig) + return await caller(func, *(extras + args), **kw) + elif isgeneratorfunction(caller): + def fun(*args, **kw): + if not kwsyntax: + args, kw = fix(args, kw, sig) + for res in caller(func, *(extras + args), **kw): + yield res + else: + def fun(*args, **kw): + if not kwsyntax: + args, kw = fix(args, kw, sig) + return caller(func, *(extras + args), **kw) + fun.__name__ = func.__name__ + fun.__doc__ = func.__doc__ + fun.__wrapped__ = func + fun.__signature__ = sig + fun.__qualname__ = func.__qualname__ + # builtin functions like defaultdict.__setitem__ lack many attributes + try: + fun.__defaults__ = func.__defaults__ + except AttributeError: + pass + try: + fun.__kwdefaults__ = func.__kwdefaults__ + except AttributeError: + pass + try: + fun.__annotations__ = func.__annotations__ + except AttributeError: + pass + try: + fun.__module__ = func.__module__ + except AttributeError: + pass + try: + fun.__dict__.update(func.__dict__) + except AttributeError: + pass + return fun + + +def decoratorx(caller): + """ + A version of "decorator" implemented via "exec" and not via the + Signature object. Use this if you are want to preserve the `.__code__` + object properties (https://github.com/micheles/decorator/issues/129). + """ + def dec(func): + return FunctionMaker.create( + func, + "return _call_(_func_, %(shortsignature)s)", + dict(_call_=caller, _func_=func), + __wrapped__=func, __qualname__=func.__qualname__) + return dec + + +def decorator(caller, _func=None, kwsyntax=False): + """ + decorator(caller) converts a caller function into a decorator + """ + if _func is not None: # return a decorated function + # this is obsolete behavior; you should use decorate instead + return decorate(_func, caller, (), kwsyntax) + # else return a decorator function + sig = inspect.signature(caller) + dec_params = [p for p in sig.parameters.values() if p.kind is POS] + + def dec(func=None, *args, **kw): + na = len(args) + 1 + extras = args + tuple(kw.get(p.name, p.default) + for p in dec_params[na:] + if p.default is not EMPTY) + if func is None: + return lambda func: decorate(func, caller, extras, kwsyntax) + else: + return decorate(func, caller, extras, kwsyntax) + dec.__signature__ = sig.replace(parameters=dec_params) + dec.__name__ = caller.__name__ + dec.__doc__ = caller.__doc__ + dec.__wrapped__ = caller + dec.__qualname__ = caller.__qualname__ + dec.__kwdefaults__ = getattr(caller, '__kwdefaults__', None) + dec.__dict__.update(caller.__dict__) + return dec + + +# ####################### contextmanager ####################### # + + +class ContextManager(_GeneratorContextManager): + def __init__(self, g, *a, **k): + _GeneratorContextManager.__init__(self, g, a, k) + + def __call__(self, func): + def caller(f, *a, **k): + with self.__class__(self.func, *self.args, **self.kwds): + return f(*a, **k) + return decorate(func, caller) + + +_contextmanager = decorator(ContextManager) + + +def contextmanager(func): + # Enable Pylint config: contextmanager-decorators=decorator.contextmanager + return _contextmanager(func) + + +# ############################ dispatch_on ############################ # + +def append(a, vancestors): + """ + Append ``a`` to the list of the virtual ancestors, unless it is already + included. + """ + add = True + for j, va in enumerate(vancestors): + if issubclass(va, a): + add = False + break + if issubclass(a, va): + vancestors[j] = a + add = False + if add: + vancestors.append(a) + + +# inspired from simplegeneric by P.J. Eby and functools.singledispatch +def dispatch_on(*dispatch_args): + """ + Factory of decorators turning a function into a generic function + dispatching on the given arguments. + """ + assert dispatch_args, 'No dispatch args passed' + dispatch_str = '(%s,)' % ', '.join(dispatch_args) + + def check(arguments, wrong=operator.ne, msg=''): + """Make sure one passes the expected number of arguments""" + if wrong(len(arguments), len(dispatch_args)): + raise TypeError('Expected %d arguments, got %d%s' % + (len(dispatch_args), len(arguments), msg)) + + def gen_func_dec(func): + """Decorator turning a function into a generic function""" + + # first check the dispatch arguments + argset = set(getfullargspec(func).args) + if not set(dispatch_args) <= argset: + raise NameError('Unknown dispatch arguments %s' % dispatch_str) + + typemap = {} + + def vancestors(*types): + """ + Get a list of sets of virtual ancestors for the given types + """ + check(types) + ras = [[] for _ in range(len(dispatch_args))] + for types_ in typemap: + for t, type_, ra in zip(types, types_, ras): + if issubclass(t, type_) and type_ not in t.mro(): + append(type_, ra) + return [set(ra) for ra in ras] + + def ancestors(*types): + """ + Get a list of virtual MROs, one for each type + """ + check(types) + lists = [] + for t, vas in zip(types, vancestors(*types)): + n_vas = len(vas) + if n_vas > 1: + raise RuntimeError( + 'Ambiguous dispatch for %s: %s' % (t, vas)) + elif n_vas == 1: + va, = vas + mro = type('t', (t, va), {}).mro()[1:] + else: + mro = t.mro() + lists.append(mro[:-1]) # discard t and object + return lists + + def register(*types): + """ + Decorator to register an implementation for the given types + """ + check(types) + + def dec(f): + check(getfullargspec(f).args, operator.lt, ' in ' + f.__name__) + typemap[types] = f + return f + return dec + + def dispatch_info(*types): + """ + An utility to introspect the dispatch algorithm + """ + check(types) + lst = [] + for anc in itertools.product(*ancestors(*types)): + lst.append(tuple(a.__name__ for a in anc)) + return lst + + def _dispatch(dispatch_args, *args, **kw): + types = tuple(type(arg) for arg in dispatch_args) + try: # fast path + f = typemap[types] + except KeyError: + pass + else: + return f(*args, **kw) + combinations = itertools.product(*ancestors(*types)) + next(combinations) # the first one has been already tried + for types_ in combinations: + f = typemap.get(types_) + if f is not None: + return f(*args, **kw) + + # else call the default implementation + return func(*args, **kw) + + return FunctionMaker.create( + func, 'return _f_(%s, %%(shortsignature)s)' % dispatch_str, + dict(_f_=_dispatch), register=register, default=func, + typemap=typemap, vancestors=vancestors, ancestors=ancestors, + dispatch_info=dispatch_info, __wrapped__=func) + + gen_func_dec.__name__ = 'dispatch_on' + dispatch_str + return gen_func_dec diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml-0.7.1.dist-info/INSTALLER b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml-0.7.1.dist-info/INSTALLER new file mode 100755 index 00000000..a1b589e3 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml-0.7.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml-0.7.1.dist-info/LICENSE b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml-0.7.1.dist-info/LICENSE new file mode 100755 index 00000000..311690c6 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml-0.7.1.dist-info/LICENSE @@ -0,0 +1,49 @@ +PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 +-------------------------------------------- + +1. This LICENSE AGREEMENT is between the Python Software Foundation +("PSF"), and the Individual or Organization ("Licensee") accessing and +otherwise using this software ("Python") in source or binary form and +its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, PSF +hereby grants Licensee a nonexclusive, royalty-free, world-wide +license to reproduce, analyze, test, perform and/or display publicly, +prepare derivative works, distribute, and otherwise use Python +alone or in any derivative version, provided, however, that PSF's +License Agreement and PSF's notice of copyright, i.e., "Copyright (c) +2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Python Software Foundation; +All Rights Reserved" are retained in Python alone or in any derivative +version prepared by Licensee. + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python. + +4. PSF is making Python available to Licensee on an "AS IS" +basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. Nothing in this License Agreement shall be deemed to create any +relationship of agency, partnership, or joint venture between PSF and +Licensee. This License Agreement does not grant permission to use PSF +trademarks or trade name in a trademark sense to endorse or promote +products or services of Licensee, or any third party. + +8. By copying, installing or otherwise using Python, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. + diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml-0.7.1.dist-info/METADATA b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml-0.7.1.dist-info/METADATA new file mode 100755 index 00000000..f916e891 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml-0.7.1.dist-info/METADATA @@ -0,0 +1,978 @@ +Metadata-Version: 2.1 +Name: defusedxml +Version: 0.7.1 +Summary: XML bomb protection for Python stdlib modules +Home-page: https://github.com/tiran/defusedxml +Author: Christian Heimes +Author-email: christian@python.org +Maintainer: Christian Heimes +Maintainer-email: christian@python.org +License: PSFL +Download-URL: https://pypi.python.org/pypi/defusedxml +Keywords: xml bomb DoS +Platform: all +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: Python Software Foundation License +Classifier: Natural Language :: English +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Topic :: Text Processing :: Markup :: XML +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.* + +=================================================== +defusedxml -- defusing XML bombs and other exploits +=================================================== + +.. image:: https://img.shields.io/pypi/v/defusedxml.svg + :target: https://pypi.org/project/defusedxml/ + :alt: Latest Version + +.. image:: https://img.shields.io/pypi/pyversions/defusedxml.svg + :target: https://pypi.org/project/defusedxml/ + :alt: Supported Python versions + +.. image:: https://travis-ci.org/tiran/defusedxml.svg?branch=master + :target: https://travis-ci.org/tiran/defusedxml + :alt: Travis CI + +.. image:: https://codecov.io/github/tiran/defusedxml/coverage.svg?branch=master + :target: https://codecov.io/github/tiran/defusedxml?branch=master + :alt: codecov + +.. image:: https://img.shields.io/pypi/dm/defusedxml.svg + :target: https://pypistats.org/packages/defusedxml + :alt: PyPI downloads + +.. image:: https://img.shields.io/badge/code%20style-black-000000.svg + :target: https://github.com/psf/black + :alt: Code style: black + +.. + + "It's just XML, what could probably go wrong?" + +Christian Heimes + +Synopsis +======== + +The results of an attack on a vulnerable XML library can be fairly dramatic. +With just a few hundred **Bytes** of XML data an attacker can occupy several +**Gigabytes** of memory within **seconds**. An attacker can also keep +CPUs busy for a long time with a small to medium size request. Under some +circumstances it is even possible to access local files on your +server, to circumvent a firewall, or to abuse services to rebound attacks to +third parties. + +The attacks use and abuse less common features of XML and its parsers. The +majority of developers are unacquainted with features such as processing +instructions and entity expansions that XML inherited from SGML. At best +they know about ```` from experience with HTML but they are not +aware that a document type definition (DTD) can generate an HTTP request +or load a file from the file system. + +None of the issues is new. They have been known for a long time. Billion +laughs was first reported in 2003. Nevertheless some XML libraries and +applications are still vulnerable and even heavy users of XML are +surprised by these features. It's hard to say whom to blame for the +situation. It's too short sighted to shift all blame on XML parsers and +XML libraries for using insecure default settings. After all they +properly implement XML specifications. Application developers must not rely +that a library is always configured for security and potential harmful data +by default. + + +.. contents:: Table of Contents + :depth: 2 + + +Attack vectors +============== + +billion laughs / exponential entity expansion +--------------------------------------------- + +The `Billion Laughs`_ attack -- also known as exponential entity expansion -- +uses multiple levels of nested entities. The original example uses 9 levels +of 10 expansions in each level to expand the string ``lol`` to a string of +3 * 10 :sup:`9` bytes, hence the name "billion laughs". The resulting string +occupies 3 GB (2.79 GiB) of memory; intermediate strings require additional +memory. Because most parsers don't cache the intermediate step for every +expansion it is repeated over and over again. It increases the CPU load even +more. + +An XML document of just a few hundred bytes can disrupt all services on a +machine within seconds. + +Example XML:: + + + + + + ]> + &d; + + +quadratic blowup entity expansion +--------------------------------- + +A quadratic blowup attack is similar to a `Billion Laughs`_ attack; it abuses +entity expansion, too. Instead of nested entities it repeats one large entity +with a couple of thousand chars over and over again. The attack isn't as +efficient as the exponential case but it avoids triggering countermeasures of +parsers against heavily nested entities. Some parsers limit the depth and +breadth of a single entity but not the total amount of expanded text +throughout an entire XML document. + +A medium-sized XML document with a couple of hundred kilobytes can require a +couple of hundred MB to several GB of memory. When the attack is combined +with some level of nested expansion an attacker is able to achieve a higher +ratio of success. + +:: + + + ]> + &a;&a;&a;... repeat + + +external entity expansion (remote) +---------------------------------- + +Entity declarations can contain more than just text for replacement. They can +also point to external resources by public identifiers or system identifiers. +System identifiers are standard URIs. When the URI is a URL (e.g. a +``http://`` locator) some parsers download the resource from the remote +location and embed them into the XML document verbatim. + +Simple example of a parsed external entity:: + + + ]> + + +The case of parsed external entities works only for valid XML content. The +XML standard also supports unparsed external entities with a +``NData declaration``. + +External entity expansion opens the door to plenty of exploits. An attacker +can abuse a vulnerable XML library and application to rebound and forward +network requests with the IP address of the server. It highly depends +on the parser and the application what kind of exploit is possible. For +example: + +* An attacker can circumvent firewalls and gain access to restricted + resources as all the requests are made from an internal and trustworthy + IP address, not from the outside. +* An attacker can abuse a service to attack, spy on or DoS your servers but + also third party services. The attack is disguised with the IP address of + the server and the attacker is able to utilize the high bandwidth of a big + machine. +* An attacker can exhaust additional resources on the machine, e.g. with + requests to a service that doesn't respond or responds with very large + files. +* An attacker may gain knowledge, when, how often and from which IP address + an XML document is accessed. +* An attacker could send mail from inside your network if the URL handler + supports ``smtp://`` URIs. + + +external entity expansion (local file) +-------------------------------------- + +External entities with references to local files are a sub-case of external +entity expansion. It's listed as an extra attack because it deserves extra +attention. Some XML libraries such as lxml disable network access by default +but still allow entity expansion with local file access by default. Local +files are either referenced with a ``file://`` URL or by a file path (either +relative or absolute). + +An attacker may be able to access and download all files that can be read by +the application process. This may include critical configuration files, too. + +:: + + + ]> + + + +DTD retrieval +------------- + +This case is similar to external entity expansion, too. Some XML libraries +like Python's xml.dom.pulldom retrieve document type definitions from remote +or local locations. Several attack scenarios from the external entity case +apply to this issue as well. + +:: + + + + + + text + + + +Python XML Libraries +==================== + +.. csv-table:: vulnerabilities and features + :header: "kind", "sax", "etree", "minidom", "pulldom", "xmlrpc", "lxml", "genshi" + :widths: 24, 7, 8, 8, 7, 8, 8, 8 + :stub-columns: 0 + + "billion laughs", "**True**", "**True**", "**True**", "**True**", "**True**", "False (1)", "False (5)" + "quadratic blowup", "**True**", "**True**", "**True**", "**True**", "**True**", "**True**", "False (5)" + "external entity expansion (remote)", "**True**", "False (3)", "False (4)", "**True**", "false", "False (1)", "False (5)" + "external entity expansion (local file)", "**True**", "False (3)", "False (4)", "**True**", "false", "**True**", "False (5)" + "DTD retrieval", "**True**", "False", "False", "**True**", "false", "False (1)", "False" + "gzip bomb", "False", "False", "False", "False", "**True**", "**partly** (2)", "False" + "xpath support (7)", "False", "False", "False", "False", "False", "**True**", "False" + "xsl(t) support (7)", "False", "False", "False", "False", "False", "**True**", "False" + "xinclude support (7)", "False", "**True** (6)", "False", "False", "False", "**True** (6)", "**True**" + "C library", "expat", "expat", "expat", "expat", "expat", "libxml2", "expat" + +1. Lxml is protected against billion laughs attacks and doesn't do network + lookups by default. +2. libxml2 and lxml are not directly vulnerable to gzip decompression bombs + but they don't protect you against them either. +3. xml.etree doesn't expand entities and raises a ParserError when an entity + occurs. +4. minidom doesn't expand entities and simply returns the unexpanded entity + verbatim. +5. genshi.input of genshi 0.6 doesn't support entity expansion and raises a + ParserError when an entity occurs. +6. Library has (limited) XInclude support but requires an additional step to + process inclusion. +7. These are features but they may introduce exploitable holes, see + `Other things to consider`_ + + +Settings in standard library +---------------------------- + + +xml.sax.handler Features +........................ + +feature_external_ges (http://xml.org/sax/features/external-general-entities) + disables external entity expansion + +feature_external_pes (http://xml.org/sax/features/external-parameter-entities) + the option is ignored and doesn't modify any functionality + +DOM xml.dom.xmlbuilder.Options +.............................. + +external_parameter_entities + ignored + +external_general_entities + ignored + +external_dtd_subset + ignored + +entities + unsure + + +defusedxml +========== + +The `defusedxml package`_ (`defusedxml on PyPI`_) +contains several Python-only workarounds and fixes +for denial of service and other vulnerabilities in Python's XML libraries. +In order to benefit from the protection you just have to import and use the +listed functions / classes from the right defusedxml module instead of the +original module. Merely `defusedxml.xmlrpc`_ is implemented as monkey patch. + +Instead of:: + + >>> from xml.etree.ElementTree import parse + >>> et = parse(xmlfile) + +alter code to:: + + >>> from defusedxml.ElementTree import parse + >>> et = parse(xmlfile) + +Additionally the package has an **untested** function to monkey patch +all stdlib modules with ``defusedxml.defuse_stdlib()``. + +All functions and parser classes accept three additional keyword arguments. +They return either the same objects as the original functions or compatible +subclasses. + +forbid_dtd (default: False) + disallow XML with a ```` processing instruction and raise a + *DTDForbidden* exception when a DTD processing instruction is found. + +forbid_entities (default: True) + disallow XML with ```` declarations inside the DTD and raise an + *EntitiesForbidden* exception when an entity is declared. + +forbid_external (default: True) + disallow any access to remote or local resources in external entities + or DTD and raising an *ExternalReferenceForbidden* exception when a DTD + or entity references an external resource. + + +defusedxml (package) +-------------------- + +DefusedXmlException, DTDForbidden, EntitiesForbidden, +ExternalReferenceForbidden, NotSupportedError + +defuse_stdlib() (*experimental*) + + +defusedxml.cElementTree +----------------------- + +**NOTE** ``defusedxml.cElementTree`` is deprecated and will be removed in a +future release. Import from ``defusedxml.ElementTree`` instead. + +parse(), iterparse(), fromstring(), XMLParser + + +defusedxml.ElementTree +----------------------- + +parse(), iterparse(), fromstring(), XMLParser + + +defusedxml.expatreader +---------------------- + +create_parser(), DefusedExpatParser + + +defusedxml.sax +-------------- + +parse(), parseString(), make_parser() + + +defusedxml.expatbuilder +----------------------- + +parse(), parseString(), DefusedExpatBuilder, DefusedExpatBuilderNS + + +defusedxml.minidom +------------------ + +parse(), parseString() + + +defusedxml.pulldom +------------------ + +parse(), parseString() + + +defusedxml.xmlrpc +----------------- + +The fix is implemented as monkey patch for the stdlib's xmlrpc package (3.x) +or xmlrpclib module (2.x). The function `monkey_patch()` enables the fixes, +`unmonkey_patch()` removes the patch and puts the code in its former state. + +The monkey patch protects against XML related attacks as well as +decompression bombs and excessively large requests or responses. The default +setting is 30 MB for requests, responses and gzip decompression. You can +modify the default by changing the module variable `MAX_DATA`. A value of +`-1` disables the limit. + + +defusedxml.lxml +--------------- + +**DEPRECATED** The module is deprecated and will be removed in a future +release. + +The module acts as an *example* how you could protect code that uses +lxml.etree. It implements a custom Element class that filters out +Entity instances, a custom parser factory and a thread local storage for +parser instances. It also has a check_docinfo() function which inspects +a tree for internal or external DTDs and entity declarations. In order to +check for entities lxml > 3.0 is required. + +parse(), fromstring() +RestrictedElement, GlobalParserTLS, getDefaultParser(), check_docinfo() + + +defusedexpat +============ + +The `defusedexpat package`_ (`defusedexpat on PyPI`_) +comes with binary extensions and a +`modified expat`_ library instead of the standard `expat parser`_. It's +basically a stand-alone version of the patches for Python's standard +library C extensions. + +Modifications in expat +---------------------- + +new definitions:: + + XML_BOMB_PROTECTION + XML_DEFAULT_MAX_ENTITY_INDIRECTIONS + XML_DEFAULT_MAX_ENTITY_EXPANSIONS + XML_DEFAULT_RESET_DTD + +new XML_FeatureEnum members:: + + XML_FEATURE_MAX_ENTITY_INDIRECTIONS + XML_FEATURE_MAX_ENTITY_EXPANSIONS + XML_FEATURE_IGNORE_DTD + +new XML_Error members:: + + XML_ERROR_ENTITY_INDIRECTIONS + XML_ERROR_ENTITY_EXPANSION + +new API functions:: + + int XML_GetFeature(XML_Parser parser, + enum XML_FeatureEnum feature, + long *value); + int XML_SetFeature(XML_Parser parser, + enum XML_FeatureEnum feature, + long value); + int XML_GetFeatureDefault(enum XML_FeatureEnum feature, + long *value); + int XML_SetFeatureDefault(enum XML_FeatureEnum feature, + long value); + +XML_FEATURE_MAX_ENTITY_INDIRECTIONS + Limit the amount of indirections that are allowed to occur during the + expansion of a nested entity. A counter starts when an entity reference + is encountered. It resets after the entity is fully expanded. The limit + protects the parser against exponential entity expansion attacks (aka + billion laughs attack). When the limit is exceeded the parser stops and + fails with `XML_ERROR_ENTITY_INDIRECTIONS`. + A value of 0 disables the protection. + + Supported range + 0 .. UINT_MAX + Default + 40 + +XML_FEATURE_MAX_ENTITY_EXPANSIONS + Limit the total length of all entity expansions throughout the entire + document. The lengths of all entities are accumulated in a parser variable. + The setting protects against quadratic blowup attacks (lots of expansions + of a large entity declaration). When the sum of all entities exceeds + the limit, the parser stops and fails with `XML_ERROR_ENTITY_EXPANSION`. + A value of 0 disables the protection. + + Supported range + 0 .. UINT_MAX + Default + 8 MiB + +XML_FEATURE_RESET_DTD + Reset all DTD information after the block has been parsed. When + the flag is set (default: false) all DTD information after the + endDoctypeDeclHandler has been called. The flag can be set inside the + endDoctypeDeclHandler. Without DTD information any entity reference in + the document body leads to `XML_ERROR_UNDEFINED_ENTITY`. + + Supported range + 0, 1 + Default + 0 + + +How to avoid XML vulnerabilities +================================ + +Best practices +-------------- + +* Don't allow DTDs +* Don't expand entities +* Don't resolve externals +* Limit parse depth +* Limit total input size +* Limit parse time +* Favor a SAX or iterparse-like parser for potential large data +* Validate and properly quote arguments to XSL transformations and + XPath queries +* Don't use XPath expression from untrusted sources +* Don't apply XSL transformations that come untrusted sources + +(based on Brad Hill's `Attacking XML Security`_) + + +Other things to consider +======================== + +XML, XML parsers and processing libraries have more features and possible +issue that could lead to DoS vulnerabilities or security exploits in +applications. I have compiled an incomplete list of theoretical issues that +need further research and more attention. The list is deliberately pessimistic +and a bit paranoid, too. It contains things that might go wrong under daffy +circumstances. + + +attribute blowup / hash collision attack +---------------------------------------- + +XML parsers may use an algorithm with quadratic runtime O(n :sup:`2`) to +handle attributes and namespaces. If it uses hash tables (dictionaries) to +store attributes and namespaces the implementation may be vulnerable to +hash collision attacks, thus reducing the performance to O(n :sup:`2`) again. +In either case an attacker is able to forge a denial of service attack with +an XML document that contains thousands upon thousands of attributes in +a single node. + +I haven't researched yet if expat, pyexpat or libxml2 are vulnerable. + + +decompression bomb +------------------ + +The issue of decompression bombs (aka `ZIP bomb`_) apply to all XML libraries +that can parse compressed XML stream like gzipped HTTP streams or LZMA-ed +files. For an attacker it can reduce the amount of transmitted data by three +magnitudes or more. Gzip is able to compress 1 GiB zeros to roughly 1 MB, +lzma is even better:: + + $ dd if=/dev/zero bs=1M count=1024 | gzip > zeros.gz + $ dd if=/dev/zero bs=1M count=1024 | lzma -z > zeros.xy + $ ls -sh zeros.* + 1020K zeros.gz + 148K zeros.xy + +None of Python's standard XML libraries decompress streams except for +``xmlrpclib``. The module is vulnerable +to decompression bombs. + +lxml can load and process compressed data through libxml2 transparently. +libxml2 can handle even very large blobs of compressed data efficiently +without using too much memory. But it doesn't protect applications from +decompression bombs. A carefully written SAX or iterparse-like approach can +be safe. + + +Processing Instruction +---------------------- + +`PI`_'s like:: + + + +may impose more threats for XML processing. It depends if and how a +processor handles processing instructions. The issue of URL retrieval with +network or local file access apply to processing instructions, too. + + +Other DTD features +------------------ + +`DTD`_ has more features like ````. I haven't researched how +these features may be a security threat. + + +XPath +----- + +XPath statements may introduce DoS vulnerabilities. Code should never execute +queries from untrusted sources. An attacker may also be able to create an XML +document that makes certain XPath queries costly or resource hungry. + + +XPath injection attacks +----------------------- + +XPath injeciton attacks pretty much work like SQL injection attacks. +Arguments to XPath queries must be quoted and validated properly, especially +when they are taken from the user. The page `Avoid the dangers of XPath injection`_ +list some ramifications of XPath injections. + +Python's standard library doesn't have XPath support. Lxml supports +parameterized XPath queries which does proper quoting. You just have to use +its xpath() method correctly:: + + # DON'T + >>> tree.xpath("/tag[@id='%s']" % value) + + # instead do + >>> tree.xpath("/tag[@id=$tagid]", tagid=name) + + +XInclude +-------- + +`XML Inclusion`_ is another way to load and include external files:: + + + + + +This feature should be disabled when XML files from an untrusted source are +processed. Some Python XML libraries and libxml2 support XInclude but don't +have an option to sandbox inclusion and limit it to allowed directories. + + +XMLSchema location +------------------ + +A validating XML parser may download schema files from the information in a +``xsi:schemaLocation`` attribute. + +:: + + + + + +XSL Transformation +------------------ + +You should keep in mind that XSLT is a Turing complete language. Never +process XSLT code from unknown or untrusted source! XSLT processors may +allow you to interact with external resources in ways you can't even imagine. +Some processors even support extensions that allow read/write access to file +system, access to JRE objects or scripting with Jython. + +Example from `Attacking XML Security`_ for Xalan-J:: + + + + + + + + + + + +Related CVEs +============ + +CVE-2013-1664 + Unrestricted entity expansion induces DoS vulnerabilities in Python XML + libraries (XML bomb) + +CVE-2013-1665 + External entity expansion in Python XML libraries inflicts potential + security flaws and DoS vulnerabilities + + +Other languages / frameworks +============================= + +Several other programming languages and frameworks are vulnerable as well. A +couple of them are affected by the fact that libxml2 up to 2.9.0 has no +protection against quadratic blowup attacks. Most of them have potential +dangerous default settings for entity expansion and external entities, too. + +Perl +---- + +Perl's XML::Simple is vulnerable to quadratic entity expansion and external +entity expansion (both local and remote). + + +Ruby +---- + +Ruby's REXML document parser is vulnerable to entity expansion attacks +(both quadratic and exponential) but it doesn't do external entity +expansion by default. In order to counteract entity expansion you have to +disable the feature:: + + REXML::Document.entity_expansion_limit = 0 + +libxml-ruby and hpricot don't expand entities in their default configuration. + + +PHP +--- + +PHP's SimpleXML API is vulnerable to quadratic entity expansion and loads +entities from local and remote resources. The option ``LIBXML_NONET`` disables +network access but still allows local file access. ``LIBXML_NOENT`` seems to +have no effect on entity expansion in PHP 5.4.6. + + +C# / .NET / Mono +---------------- + +Information in `XML DoS and Defenses (MSDN)`_ suggest that .NET is +vulnerable with its default settings. The article contains code snippets +how to create a secure XML reader:: + + XmlReaderSettings settings = new XmlReaderSettings(); + settings.ProhibitDtd = false; + settings.MaxCharactersFromEntities = 1024; + settings.XmlResolver = null; + XmlReader reader = XmlReader.Create(stream, settings); + + +Java +---- + +Untested. The documentation of Xerces and its `Xerces SecurityMananger`_ +sounds like Xerces is also vulnerable to billion laugh attacks with its +default settings. It also does entity resolving when an +``org.xml.sax.EntityResolver`` is configured. I'm not yet sure about the +default setting here. + +Java specialists suggest to have a custom builder factory:: + + DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); + builderFactory.setXIncludeAware(False); + builderFactory.setExpandEntityReferences(False); + builderFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, True); + # either + builderFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", True); + # or if you need DTDs + builderFactory.setFeature("http://xml.org/sax/features/external-general-entities", False); + builderFactory.setFeature("http://xml.org/sax/features/external-parameter-entities", False); + builderFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", False); + builderFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", False); + + +TODO +==== + +* DOM: Use xml.dom.xmlbuilder options for entity handling +* SAX: take feature_external_ges and feature_external_pes (?) into account +* test experimental monkey patching of stdlib modules +* improve documentation + + +License +======= + +Copyright (c) 2013-2017 by Christian Heimes + +Licensed to PSF under a Contributor Agreement. + +See https://www.python.org/psf/license for licensing details. + + +Acknowledgements +================ + +Brett Cannon (Python Core developer) + review and code cleanup + +Antoine Pitrou (Python Core developer) + code review + +Aaron Patterson, Ben Murphy and Michael Koziarski (Ruby community) + Many thanks to Aaron, Ben and Michael from the Ruby community for their + report and assistance. + +Thierry Carrez (OpenStack) + Many thanks to Thierry for his report to the Python Security Response + Team on behalf of the OpenStack security team. + +Carl Meyer (Django) + Many thanks to Carl for his report to PSRT on behalf of the Django security + team. + +Daniel Veillard (libxml2) + Many thanks to Daniel for his insight and assistance with libxml2. + +semantics GmbH (https://www.semantics.de/) + Many thanks to my employer semantics for letting me work on the issue + during working hours as part of semantics's open source initiative. + + +References +========== + +* `XML DoS and Defenses (MSDN)`_ +* `Billion Laughs`_ on Wikipedia +* `ZIP bomb`_ on Wikipedia +* `Configure SAX parsers for secure processing`_ +* `Testing for XML Injection`_ + +.. _defusedxml package: https://github.com/tiran/defusedxml +.. _defusedxml on PyPI: https://pypi.python.org/pypi/defusedxml +.. _defusedexpat package: https://github.com/tiran/defusedexpat +.. _defusedexpat on PyPI: https://pypi.python.org/pypi/defusedexpat +.. _modified expat: https://github.com/tiran/expat +.. _expat parser: http://expat.sourceforge.net/ +.. _Attacking XML Security: https://www.isecpartners.com/media/12976/iSEC-HILL-Attacking-XML-Security-bh07.pdf +.. _Billion Laughs: https://en.wikipedia.org/wiki/Billion_laughs +.. _XML DoS and Defenses (MSDN): https://msdn.microsoft.com/en-us/magazine/ee335713.aspx +.. _ZIP bomb: https://en.wikipedia.org/wiki/Zip_bomb +.. _DTD: https://en.wikipedia.org/wiki/Document_Type_Definition +.. _PI: https://en.wikipedia.org/wiki/Processing_Instruction +.. _Avoid the dangers of XPath injection: http://www.ibm.com/developerworks/xml/library/x-xpathinjection/index.html +.. _Configure SAX parsers for secure processing: http://www.ibm.com/developerworks/xml/library/x-tipcfsx/index.html +.. _Testing for XML Injection: https://www.owasp.org/index.php/Testing_for_XML_Injection_(OWASP-DV-008) +.. _Xerces SecurityMananger: https://xerces.apache.org/xerces2-j/javadocs/xerces2/org/apache/xerces/util/SecurityManager.html +.. _XML Inclusion: https://www.w3.org/TR/xinclude/#include_element + +Changelog +========= + +defusedxml 0.7.1 +--------------------- + +*Release date: 08-Mar-2021* + +- Fix regression ``defusedxml.ElementTree.ParseError`` (#63) + The ``ParseError`` exception is now the same class object as + ``xml.etree.ElementTree.ParseError`` again. + + +defusedxml 0.7.0 +---------------- + +*Release date: 4-Mar-2021* + +- No changes + + +defusedxml 0.7.0rc2 +------------------- + +*Release date: 12-Jan-2021* + +- Re-add and deprecate ``defusedxml.cElementTree`` +- Use GitHub Actions instead of TravisCI +- Restore ``ElementTree`` attribute of ``xml.etree`` module after patching + +defusedxml 0.7.0rc1 +------------------- + +*Release date: 04-May-2020* + +- Add support for Python 3.9 +- ``defusedxml.cElementTree`` is not available with Python 3.9. +- Python 2 is deprecate. Support for Python 2 will be removed in 0.8.0. + + +defusedxml 0.6.0 +---------------- + +*Release date: 17-Apr-2019* + +- Increase test coverage. +- Add badges to README. + + +defusedxml 0.6.0rc1 +------------------- + +*Release date: 14-Apr-2019* + +- Test on Python 3.7 stable and 3.8-dev +- Drop support for Python 3.4 +- No longer pass *html* argument to XMLParse. It has been deprecated and + ignored for a long time. The DefusedXMLParser still takes a html argument. + A deprecation warning is issued when the argument is False and a TypeError + when it's True. +- defusedxml now fails early when pyexpat stdlib module is not available or + broken. +- defusedxml.ElementTree.__all__ now lists ParseError as public attribute. +- The defusedxml.ElementTree and defusedxml.cElementTree modules had a typo + and used XMLParse instead of XMLParser as an alias for DefusedXMLParser. + Both the old and fixed name are now available. + + +defusedxml 0.5.0 +---------------- + +*Release date: 07-Feb-2017* + +- No changes + + +defusedxml 0.5.0.rc1 +-------------------- + +*Release date: 28-Jan-2017* + +- Add compatibility with Python 3.6 +- Drop support for Python 2.6, 3.1, 3.2, 3.3 +- Fix lxml tests (XMLSyntaxError: Detected an entity reference loop) + + +defusedxml 0.4.1 +---------------- + +*Release date: 28-Mar-2013* + +- Add more demo exploits, e.g. python_external.py and Xalan XSLT demos. +- Improved documentation. + + +defusedxml 0.4 +-------------- + +*Release date: 25-Feb-2013* + +- As per http://seclists.org/oss-sec/2013/q1/340 please REJECT + CVE-2013-0278, CVE-2013-0279 and CVE-2013-0280 and use CVE-2013-1664, + CVE-2013-1665 for OpenStack/etc. +- Add missing parser_list argument to sax.make_parser(). The argument is + ignored, though. (thanks to Florian Apolloner) +- Add demo exploit for external entity attack on Python's SAX parser, XML-RPC + and WebDAV. + + +defusedxml 0.3 +-------------- + +*Release date: 19-Feb-2013* + +- Improve documentation + + +defusedxml 0.2 +-------------- + +*Release date: 15-Feb-2013* + +- Rename ExternalEntitiesForbidden to ExternalReferenceForbidden +- Rename defusedxml.lxml.check_dtd() to check_docinfo() +- Unify argument names in callbacks +- Add arguments and formatted representation to exceptions +- Add forbid_external argument to all functions and classes +- More tests +- LOTS of documentation +- Add example code for other languages (Ruby, Perl, PHP) and parsers (Genshi) +- Add protection against XML and gzip attacks to xmlrpclib + +defusedxml 0.1 +-------------- + +*Release date: 08-Feb-2013* + +- Initial and internal release for PSRT review + + diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml-0.7.1.dist-info/RECORD b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml-0.7.1.dist-info/RECORD new file mode 100755 index 00000000..0a2fa9c6 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml-0.7.1.dist-info/RECORD @@ -0,0 +1,17 @@ +defusedxml-0.7.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +defusedxml-0.7.1.dist-info/LICENSE,sha256=uAzp2oxCofkQeWJ_u-K_JyEK4Qig_-Xwd9WwjgdsJMg,2409 +defusedxml-0.7.1.dist-info/METADATA,sha256=Np0872SHDa-En7pxHLjQWn7-PI2asPdjrcNAef43i7E,32518 +defusedxml-0.7.1.dist-info/RECORD,, +defusedxml-0.7.1.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110 +defusedxml-0.7.1.dist-info/top_level.txt,sha256=QGHa90F50pVKhWSFlERI0jtSKtqDiGyfeZX7dQNZAAw,11 +defusedxml/ElementTree.py,sha256=GLSqpCz58oXGPGyzf_HylsPS9_dcGVP5SN4dK7yvyPw,4640 +defusedxml/__init__.py,sha256=RczeaVJG64p2Fgy1jlCzbuRdchEPnEaCBrxgk8JJ_pM,1444 +defusedxml/cElementTree.py,sha256=PpaKMh3rU29sY8amAK4fzHQKl8gcAYD0h1LCoW62Rtk,1449 +defusedxml/common.py,sha256=3d26jNW4fNXzgjWhvUfs83Afiz5EVxFDupQbugkSMZc,4036 +defusedxml/expatbuilder.py,sha256=b4Q05vsBMJ5StkiTFf4my2rGGo1gZyEl_hC5MeFTOAA,3732 +defusedxml/expatreader.py,sha256=KOpSrwkSvj5SGOY9pTXOM26Dnz00rsJt33WueVvzpvc,2196 +defusedxml/lxml.py,sha256=HW-LFKdrfMRzHdi0Vcucq4-n8yz7v_OQwEQWFg1JQYA,4940 +defusedxml/minidom.py,sha256=3QcgygVwJqcWDQ3IZ2iol8zsH4cx3BRX70SPcd0bG2g,1884 +defusedxml/pulldom.py,sha256=DYj2D2lc7xoxZ38gfzujXmdznd8ovzDqGFXqyXbtxjk,1170 +defusedxml/sax.py,sha256=-SF08Msc2mWEYAMw62pJ5FMwWccOctFSnQwDLYLLlVE,1477 +defusedxml/xmlrpc.py,sha256=7rZQey3tqXcc1hrrM3RprOICU6fiFny9B9l4nmTioxA,5364 diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml-0.7.1.dist-info/WHEEL b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml-0.7.1.dist-info/WHEEL new file mode 100755 index 00000000..ef99c6cf --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml-0.7.1.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.34.2) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/ElementTree.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/ElementTree.py new file mode 100755 index 00000000..5ba765f1 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/ElementTree.py @@ -0,0 +1,154 @@ +# defusedxml +# +# Copyright (c) 2013 by Christian Heimes +# Licensed to PSF under a Contributor Agreement. +# See https://www.python.org/psf/license for licensing details. +"""Defused xml.etree.ElementTree facade +""" +from __future__ import print_function, absolute_import + +import sys +import warnings +from xml.etree.ElementTree import ParseError +from xml.etree.ElementTree import TreeBuilder as _TreeBuilder +from xml.etree.ElementTree import parse as _parse +from xml.etree.ElementTree import tostring + +from .common import PY3 + +if PY3: + import importlib +else: + from xml.etree.ElementTree import XMLParser as _XMLParser + from xml.etree.ElementTree import iterparse as _iterparse + + +from .common import ( + DTDForbidden, + EntitiesForbidden, + ExternalReferenceForbidden, + _generate_etree_functions, +) + +__origin__ = "xml.etree.ElementTree" + + +def _get_py3_cls(): + """Python 3.3 hides the pure Python code but defusedxml requires it. + + The code is based on test.support.import_fresh_module(). + """ + pymodname = "xml.etree.ElementTree" + cmodname = "_elementtree" + + pymod = sys.modules.pop(pymodname, None) + cmod = sys.modules.pop(cmodname, None) + + sys.modules[cmodname] = None + try: + pure_pymod = importlib.import_module(pymodname) + finally: + # restore module + sys.modules[pymodname] = pymod + if cmod is not None: + sys.modules[cmodname] = cmod + else: + sys.modules.pop(cmodname, None) + # restore attribute on original package + etree_pkg = sys.modules["xml.etree"] + if pymod is not None: + etree_pkg.ElementTree = pymod + elif hasattr(etree_pkg, "ElementTree"): + del etree_pkg.ElementTree + + _XMLParser = pure_pymod.XMLParser + _iterparse = pure_pymod.iterparse + # patch pure module to use ParseError from C extension + pure_pymod.ParseError = ParseError + + return _XMLParser, _iterparse + + +if PY3: + _XMLParser, _iterparse = _get_py3_cls() + + +_sentinel = object() + + +class DefusedXMLParser(_XMLParser): + def __init__( + self, + html=_sentinel, + target=None, + encoding=None, + forbid_dtd=False, + forbid_entities=True, + forbid_external=True, + ): + # Python 2.x old style class + _XMLParser.__init__(self, target=target, encoding=encoding) + if html is not _sentinel: + # the 'html' argument has been deprecated and ignored in all + # supported versions of Python. Python 3.8 finally removed it. + if html: + raise TypeError("'html=True' is no longer supported.") + else: + warnings.warn( + "'html' keyword argument is no longer supported. Pass " + "in arguments as keyword arguments.", + category=DeprecationWarning, + ) + + self.forbid_dtd = forbid_dtd + self.forbid_entities = forbid_entities + self.forbid_external = forbid_external + if PY3: + parser = self.parser + else: + parser = self._parser + if self.forbid_dtd: + parser.StartDoctypeDeclHandler = self.defused_start_doctype_decl + if self.forbid_entities: + parser.EntityDeclHandler = self.defused_entity_decl + parser.UnparsedEntityDeclHandler = self.defused_unparsed_entity_decl + if self.forbid_external: + parser.ExternalEntityRefHandler = self.defused_external_entity_ref_handler + + def defused_start_doctype_decl(self, name, sysid, pubid, has_internal_subset): + raise DTDForbidden(name, sysid, pubid) + + def defused_entity_decl( + self, name, is_parameter_entity, value, base, sysid, pubid, notation_name + ): + raise EntitiesForbidden(name, value, base, sysid, pubid, notation_name) + + def defused_unparsed_entity_decl(self, name, base, sysid, pubid, notation_name): + # expat 1.2 + raise EntitiesForbidden(name, None, base, sysid, pubid, notation_name) # pragma: no cover + + def defused_external_entity_ref_handler(self, context, base, sysid, pubid): + raise ExternalReferenceForbidden(context, base, sysid, pubid) + + +# aliases +# XMLParse is a typo, keep it for backwards compatibility +XMLTreeBuilder = XMLParse = XMLParser = DefusedXMLParser + +parse, iterparse, fromstring = _generate_etree_functions( + DefusedXMLParser, _TreeBuilder, _parse, _iterparse +) +XML = fromstring + + +__all__ = [ + "ParseError", + "XML", + "XMLParse", + "XMLParser", + "XMLTreeBuilder", + "fromstring", + "iterparse", + "parse", + "tostring", +] diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/__init__.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/__init__.py new file mode 100755 index 00000000..4b5a2300 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/__init__.py @@ -0,0 +1,67 @@ +# defusedxml +# +# Copyright (c) 2013 by Christian Heimes +# Licensed to PSF under a Contributor Agreement. +# See https://www.python.org/psf/license for licensing details. +"""Defuse XML bomb denial of service vulnerabilities +""" +from __future__ import print_function, absolute_import + +import warnings + +from .common import ( + DefusedXmlException, + DTDForbidden, + EntitiesForbidden, + ExternalReferenceForbidden, + NotSupportedError, + _apply_defusing, +) + + +def defuse_stdlib(): + """Monkey patch and defuse all stdlib packages + + :warning: The monkey patch is an EXPERIMETNAL feature. + """ + defused = {} + + with warnings.catch_warnings(): + from . import cElementTree + from . import ElementTree + from . import minidom + from . import pulldom + from . import sax + from . import expatbuilder + from . import expatreader + from . import xmlrpc + + xmlrpc.monkey_patch() + defused[xmlrpc] = None + + defused_mods = [ + cElementTree, + ElementTree, + minidom, + pulldom, + sax, + expatbuilder, + expatreader, + ] + + for defused_mod in defused_mods: + stdlib_mod = _apply_defusing(defused_mod) + defused[defused_mod] = stdlib_mod + + return defused + + +__version__ = "0.7.1" + +__all__ = [ + "DefusedXmlException", + "DTDForbidden", + "EntitiesForbidden", + "ExternalReferenceForbidden", + "NotSupportedError", +] diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/__pycache__/ElementTree.cpython-39.pyc b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/__pycache__/ElementTree.cpython-39.pyc new file mode 100755 index 0000000000000000000000000000000000000000..6f6c480b5c91b980a373bc074468a9371210215f GIT binary patch literal 3607 zcmb7G&5s;M74Prq>7AYZ^4B^}+{8|tA@U5cK@f1F5Oxg*FspdM(2CUbbk*$kx~F?w zU6Xi6y&SwgA%!F7gqv?1`BP9`kx=pvAQ6d=-|L>49q-ymbgN#ys(SV6)vNb@RnhXY zr{T-~*i8I&P5T=)7C#$}4^WDKgD@@7n9ht;9~yx%Gy_wowwYRiRn>N2qqb6K*a#Zc zm<`?ynicPW_kyL0Z-8$FE$}XDrpv>2(AG8H7FnfdC0NO>fb$@=8mv__mcXwE8`X>! zW?Tp^3@-*3hnIp&!^^>C^e+cjSevap)q+iE`U~GY(LOeUwP1r^J<);OUFY{}>$(Q)XiS@A=c)@ybonH_9eT}XENe{lk%==nrWAer} zAB+pm{Kvzz%cbDFyOZ)E&*UC>e-OnHn9U*do))J}taGa!!Q_~*NAQ)HXg@m&GuXIwaD|7cZTd119{`t=; z1ti@}Bp3AzOSQK5w(sVmpD@NVwYHPVL?*mA?Yg@27~)x!e#8e{@GR!1W1HbV&$x(S zX|>7u7K*PgzHsL;?RfUNU?`}5j8YgdnCZtFGmdqs9qOMOrN+!JjALWkLinI%GLzb+ zen*@1rTMv4YG3Hb)&s4qYUa;{~ucaT5HAXGp&Cot>4m0>#%X`fV#&G*(|NFSvqB7U?6my z$A!`At(UE5)lie0|*!$K`@Jk zJaFR~XIGtpMIC`h&Is$CW*v8iXV-E4rg2IBlOxk_qFq zxQUgEAAo4KrCUZ@ZyTO&=q=OJUA<*c%f;{M&Ogre7>@23jv-#f?C0`^)Hx_0pcEg1 za4paQxdt}@g@9d#3>Y}fV)j!Vfa|aZpw1=$MeQ(;Eun6(7F$N`G97W(R;yFUnmh5{ z-MzR0?X!>4l~BG)*FS)%5)p}qgwsC*!k4-u6&_>e2oX?Qs zB@#Alls2e~px45t^u$M{cDQuh$k0A)9XCK5VgR~aHo`V)SCpVDXsx1NL%oi=DSi*S zfz}14VGH&>K&c}m0sku(K$SB9;pE1x1366J+Y@7c%SSF`xu53QJ{SHp4>;>i9#lfN z{D=JL(_AngO2&lNFPq@+Mg?*$n+q0xRGgb#bP1AUz~g={jye~`CcLKH5b>1AFjUR3 zz#2)$Q`Ou%8rA5o+)pEs!SX^`#HsadJ`x;Sa5X%rhm<#{AUkA|sg)^DstCGIJEp)b znzXD_A-+(JaLQbr#&B4`XEJ1YEMY^)c$})s_o;8Y?%GDrPos>bT&RuNq-wRJTDrb9 zjuz#v&E&>ewHylkrpU7K8Iz+xnt_i~(KgJ~;YydbBKlPOy7UO;a1U$2o+nD?bN@0L#`sD3%7S5b}{^(;$^Vvr{ zK|p2mB`}rECX(2u8|%cWEf?Rz&@){uqw2Vo?c)33gN>x1Xu~dG@AM#*{YjLLxw7a| z67NDx5J0NsESFV`hqUXnTk1jN2&LYVIl1}LEiJ@ZOei_~h(EU%R>2qT=efOzA40g} zobE)thmKQY#rxDeg9Ig6FjIWh`51us>~7; zl!A^?kfQ_{vEaeV#3~J6!@w_43W_(^G;m!`|9^UKx~6NpmLQop&oEkZ$=BTOP2MBV^VFMiTiRtP#R zY<*!-L2D>ying?ta^ieA%(DuQ1#Pc>{m`vYn{|~qLVzljsj@Bl95wFUY zh_VR@v*`sQ(JxlEN1SJ97TG|oCbX}F}lu*HPo>rSwQF+A*nqDa#bNS?Kro#~9?itXfe zWOedYCD)8V#Qtz8^x*w&>VxH0Qz>%(ly0b`qM&!W!?Q|1YibjPlBJZD?DuhA*Zdk2 za~>ux3bV_%Z2}~O@g)rP2LMAI(&&}-8vXR)kVl(CPCLs&-y-6;$VD$9zvAE_Qu8BZ z4gEVn$hZqD-Oe7k2i)t%O8CJ2&K>3h;6djNJOmzg{=g&PQ5Ot61|D~zh1&2{^4j=z zTHwd1wOYG%TDSFDzYQ*eE^4C_^!+!(&~~nftB$w`r-E$K^2o5ep-o3dY#s} zE}o~kAW+7ktU2eY(uA`$=!(ny0_qp1&>p?WrGPX&N>|TmTJD-N1s>An`8Ug_U!N{l zXOEwx8=C7z()nO2T}a@}>L&!*!kiBODBRLvW4xuCjO!1Yv% z)#C@MDr8P_`GARn!QIztv1VeSbNp6=?=*R}#`X25i`!t3l?4Vh(-_a|>wY@U<1xI6 ztBwGW=i0ILu{GK4c4&o;ZSC~G+!*Gp*p}~u&5d_7|7`wn=1KUAkn{}%2F$~e5x{J} z4=^TGfpH&Wc=+Z{U@Xl)B^?9z0eZivN=W#Bx)};EgzOWHuc%b;dw@&u4c8U?nRD#G dd&X&a47qJM{oL$JnVP%yfgRdu9Dd~5{{XYkUxEMt literal 0 HcmV?d00001 diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/__pycache__/common.cpython-39.pyc b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/__pycache__/common.cpython-39.pyc new file mode 100755 index 0000000000000000000000000000000000000000..4880287e30293f3b361f13d5f58dc6989a4eab15 GIT binary patch literal 4395 zcmb_gTW{RP73Pp!?nS%ON_NoN4P55Z+8f9c3b&2h+OA_;4%#?E5DP`RNI_7XS&Isn zT+eW2YqR?j1(09*+NVB9kNO||74zDs{Dq(o{mxK(lPtsmG6K)e86FPL<(qR36*d|* z3nTqkHU7_%W&M|!+2Mk@k4yaR3%nlpOeO&72Ai{zpthUWr z+u=5Mpp461C{xmx9*It03I0Vl*%&J^SbPvFF;yyJ*ke3sPMbf(r79q~HM9=cQ|p9n zwwQKQF7e|kk#tThNdn)8>sc>fSG}a4ezh+0Xg%!p)cV#(H&qtNkcaYSoJKJhaK-v| zoUZ3#FuoH^?}XWQ(A&SY&I^TKc9ZqUIC8DGuPZ?yMNbC7Tcj50XR*QCud!`yEVv2d z@l+aiMG)v(5Og!%PiS5bg6I7(IlWU30-i;9iU4TrnITnLBkZlBZ8M&!`y0IY~gg`&bsh)(Iya;>(92zk2xXzS7AOm4><9vb}WQ5N;PaFw6$10!%o zoW_I_KURKcEEbU}<3V$JIbG^~kle}{VrC!N#}>1Om>qEJgE6Wg)F!9RY;9Fk}~I>^jE|JZEnXKAhd} z2I+kF`q!iDt3DLZMK_4~-LKz~qg5XkBylw6TPLpe;LC29pEbueMrtSTC1+ru0Tf_A z2;L>ljQ^R-2A5}5fJsK=q%0R8CF?{QL>7sVQ{*o|bmP=#kw}uU-;DDJ-h~G#B3E!J z4}?%x_e_)`uycdLPUFYoZh0fkfh?h>;Jap)_Af*o0bo36POqj*{T}3pP&ageJ#Sb7 zEe}1=$`prH*~AX=8WH0qLYXe@g-Ks%cN^Ji3OU_Kvpl3DVGehzJcG+$(gr?}2}0#N z#2UZO!}9~ID~ih)o&-^V^y)dk`~*n7b8gcg0ay7mGJ(Kw29pL%x3E6N>3b=qYDwWD2=E|g`h9T zlJj|wQp0%Ae1brV=9?jKin?-vIy%q>b-Ij_okN8)5NeeQh`mRGK9MQ9UIVN@K|+~! z<}~jCRPSBvfs4^aN#-GKMw#|(9z3RI13B>a#XH}arokdD&ZNOntK~?_uQRq>gs=ys z!zAOqd+`f@7;5C}+qB&TYGp}l=b%Py$bAx|#4uY;O_Sy5<;^UA+VAx;nG3!lWhMvL zwswS{p_-ZGK)6Ao@KN6ip-oh<*JWjs6{f_LulMoNkLm3;NQFt_=gJhRKPgiKFhiiP zC{S0dJ|gy4>l-Rp&WPpiki}Mv06t>}E-U2FsgCTtlzT(_fE}=rlb5N>I;tF7kF0;( z_|hJ^qtehls&f07sVB&t&K{FH&!6NqRC0G%I&hfv{K=3&;B0F4fo4H#0o~cY(&eJl zQN~*8d@>n7i_@YDio4_u%pE0i?eJJ?cMlz>F2$&rO4rb`%3QsO^BrA=NSLGF^Yp@L zS4Le_dqL$qiMLJqr3VZ{H|jGtlqs#+$+mZAk`8%SF9m22ll{Q#iG%+M77fNNb{QGC z$!e^Q*$T69faGs+cdp-|$}>Lu>K+(gJG2hjq0@0pdsQ8|e8H^PSfP%;Ix6uxt#oYD z@mEJ4`EclUsF7$4_~S6jGr3O<*0e46Qz5wE{`S5vaw)_r>S9l%)W`bh$6oA+d`HNd zj}dJof||B1i22xKmIV%}0bkpEycL~IUj!q{C8li~qKEHW^6D$=6+5sHW@m^`nt!?@ z_6l9kkR2e{CpKWLJ;dl4!dHX7Xw3qibG>vrhZd%)PZv&8s)+)cVozm#842z6%!h{j z5bu|CCgmSMT8?gx+v-oB6yGA~n8~mQ{W#%5YA-0BoRm{^h_uz0WC$Hsi&YRh7Z?8i z=Xrx0!84K4xfFr%WH9;kS-X>DQJAQEYi5gx95Nm>pE&5(V21XbgW#TF$vDU^9E7uk zc*@^Fv@q6_f5cpSVh>(Xk`nVdbLAacy-RYn0B1m+HLf~Y>_Dh6uyV%0)i*G3vdtWr z2@w+`Db1WlpHcjcaW2vT(#tVJEAJk$V`|>X#Fnky4iKtKQIaWv$hxL>&BxOi-Lj`v z7KhQC!&*mXT{NsXf-fef%|))p1~=cpwCO%A7ck#yl{U?fgLx5&@{9s>WaURh{!HWn zk;g;`P)O2~fD}ST+~|AdLRG%NlZtvq%U!ACo2U5uer35?la$9>D@6xRT~2!$pOyvO zq*^my*V@67uI~w{sI83CPNtpD{(eiBcS1!OP?rl-DEw=IKF9UKUrZh~g-6%^Mt!Q8 zn@>a2rx(pE)izT-Od2z~6aknoIJ$DDNZR)Z3+B7WwJWS*FFK2?;xx<6#pZHzsp(c4 F{|9SD^z8ru literal 0 HcmV?d00001 diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/cElementTree.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/cElementTree.py new file mode 100755 index 00000000..84670c68 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/cElementTree.py @@ -0,0 +1,62 @@ +# defusedxml +# +# Copyright (c) 2013 by Christian Heimes +# Licensed to PSF under a Contributor Agreement. +# See https://www.python.org/psf/license for licensing details. +"""Defused xml.etree.cElementTree +""" +from __future__ import absolute_import + +import warnings + +from .common import _generate_etree_functions + +from xml.etree.cElementTree import TreeBuilder as _TreeBuilder +from xml.etree.cElementTree import parse as _parse +from xml.etree.cElementTree import tostring + +# iterparse from ElementTree! +from xml.etree.ElementTree import iterparse as _iterparse + +# This module is an alias for ElementTree just like xml.etree.cElementTree +from .ElementTree import ( + XML, + XMLParse, + XMLParser, + XMLTreeBuilder, + fromstring, + iterparse, + parse, + tostring, + DefusedXMLParser, + ParseError, +) + +__origin__ = "xml.etree.cElementTree" + + +warnings.warn( + "defusedxml.cElementTree is deprecated, import from defusedxml.ElementTree instead.", + category=DeprecationWarning, + stacklevel=2, +) + +# XMLParse is a typo, keep it for backwards compatibility +XMLTreeBuilder = XMLParse = XMLParser = DefusedXMLParser + +parse, iterparse, fromstring = _generate_etree_functions( + DefusedXMLParser, _TreeBuilder, _parse, _iterparse +) +XML = fromstring + +__all__ = [ + "ParseError", + "XML", + "XMLParse", + "XMLParser", + "XMLTreeBuilder", + "fromstring", + "iterparse", + "parse", + "tostring", +] diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/common.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/common.py new file mode 100755 index 00000000..5ceda1fb --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/common.py @@ -0,0 +1,129 @@ +# defusedxml +# +# Copyright (c) 2013 by Christian Heimes +# Licensed to PSF under a Contributor Agreement. +# See https://www.python.org/psf/license for licensing details. +"""Common constants, exceptions and helpe functions +""" +import sys +import xml.parsers.expat + +PY3 = sys.version_info[0] == 3 + +# Fail early when pyexpat is not installed correctly +if not hasattr(xml.parsers.expat, "ParserCreate"): + raise ImportError("pyexpat") # pragma: no cover + + +class DefusedXmlException(ValueError): + """Base exception""" + + def __repr__(self): + return str(self) + + +class DTDForbidden(DefusedXmlException): + """Document type definition is forbidden""" + + def __init__(self, name, sysid, pubid): + super(DTDForbidden, self).__init__() + self.name = name + self.sysid = sysid + self.pubid = pubid + + def __str__(self): + tpl = "DTDForbidden(name='{}', system_id={!r}, public_id={!r})" + return tpl.format(self.name, self.sysid, self.pubid) + + +class EntitiesForbidden(DefusedXmlException): + """Entity definition is forbidden""" + + def __init__(self, name, value, base, sysid, pubid, notation_name): + super(EntitiesForbidden, self).__init__() + self.name = name + self.value = value + self.base = base + self.sysid = sysid + self.pubid = pubid + self.notation_name = notation_name + + def __str__(self): + tpl = "EntitiesForbidden(name='{}', system_id={!r}, public_id={!r})" + return tpl.format(self.name, self.sysid, self.pubid) + + +class ExternalReferenceForbidden(DefusedXmlException): + """Resolving an external reference is forbidden""" + + def __init__(self, context, base, sysid, pubid): + super(ExternalReferenceForbidden, self).__init__() + self.context = context + self.base = base + self.sysid = sysid + self.pubid = pubid + + def __str__(self): + tpl = "ExternalReferenceForbidden(system_id='{}', public_id={})" + return tpl.format(self.sysid, self.pubid) + + +class NotSupportedError(DefusedXmlException): + """The operation is not supported""" + + +def _apply_defusing(defused_mod): + assert defused_mod is sys.modules[defused_mod.__name__] + stdlib_name = defused_mod.__origin__ + __import__(stdlib_name, {}, {}, ["*"]) + stdlib_mod = sys.modules[stdlib_name] + stdlib_names = set(dir(stdlib_mod)) + for name, obj in vars(defused_mod).items(): + if name.startswith("_") or name not in stdlib_names: + continue + setattr(stdlib_mod, name, obj) + return stdlib_mod + + +def _generate_etree_functions(DefusedXMLParser, _TreeBuilder, _parse, _iterparse): + """Factory for functions needed by etree, dependent on whether + cElementTree or ElementTree is used.""" + + def parse(source, parser=None, forbid_dtd=False, forbid_entities=True, forbid_external=True): + if parser is None: + parser = DefusedXMLParser( + target=_TreeBuilder(), + forbid_dtd=forbid_dtd, + forbid_entities=forbid_entities, + forbid_external=forbid_external, + ) + return _parse(source, parser) + + def iterparse( + source, + events=None, + parser=None, + forbid_dtd=False, + forbid_entities=True, + forbid_external=True, + ): + if parser is None: + parser = DefusedXMLParser( + target=_TreeBuilder(), + forbid_dtd=forbid_dtd, + forbid_entities=forbid_entities, + forbid_external=forbid_external, + ) + return _iterparse(source, events, parser) + + def fromstring(text, forbid_dtd=False, forbid_entities=True, forbid_external=True): + parser = DefusedXMLParser( + target=_TreeBuilder(), + forbid_dtd=forbid_dtd, + forbid_entities=forbid_entities, + forbid_external=forbid_external, + ) + parser.feed(text) + return parser.close() + + return parse, iterparse, fromstring diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/expatbuilder.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/expatbuilder.py new file mode 100755 index 00000000..7bfc57e4 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/expatbuilder.py @@ -0,0 +1,107 @@ +# defusedxml +# +# Copyright (c) 2013 by Christian Heimes +# Licensed to PSF under a Contributor Agreement. +# See https://www.python.org/psf/license for licensing details. +"""Defused xml.dom.expatbuilder +""" +from __future__ import print_function, absolute_import + +from xml.dom.expatbuilder import ExpatBuilder as _ExpatBuilder +from xml.dom.expatbuilder import Namespaces as _Namespaces + +from .common import DTDForbidden, EntitiesForbidden, ExternalReferenceForbidden + +__origin__ = "xml.dom.expatbuilder" + + +class DefusedExpatBuilder(_ExpatBuilder): + """Defused document builder""" + + def __init__( + self, options=None, forbid_dtd=False, forbid_entities=True, forbid_external=True + ): + _ExpatBuilder.__init__(self, options) + self.forbid_dtd = forbid_dtd + self.forbid_entities = forbid_entities + self.forbid_external = forbid_external + + def defused_start_doctype_decl(self, name, sysid, pubid, has_internal_subset): + raise DTDForbidden(name, sysid, pubid) + + def defused_entity_decl( + self, name, is_parameter_entity, value, base, sysid, pubid, notation_name + ): + raise EntitiesForbidden(name, value, base, sysid, pubid, notation_name) + + def defused_unparsed_entity_decl(self, name, base, sysid, pubid, notation_name): + # expat 1.2 + raise EntitiesForbidden(name, None, base, sysid, pubid, notation_name) # pragma: no cover + + def defused_external_entity_ref_handler(self, context, base, sysid, pubid): + raise ExternalReferenceForbidden(context, base, sysid, pubid) + + def install(self, parser): + _ExpatBuilder.install(self, parser) + + if self.forbid_dtd: + parser.StartDoctypeDeclHandler = self.defused_start_doctype_decl + if self.forbid_entities: + # if self._options.entities: + parser.EntityDeclHandler = self.defused_entity_decl + parser.UnparsedEntityDeclHandler = self.defused_unparsed_entity_decl + if self.forbid_external: + parser.ExternalEntityRefHandler = self.defused_external_entity_ref_handler + + +class DefusedExpatBuilderNS(_Namespaces, DefusedExpatBuilder): + """Defused document builder that supports namespaces.""" + + def install(self, parser): + DefusedExpatBuilder.install(self, parser) + if self._options.namespace_declarations: + parser.StartNamespaceDeclHandler = self.start_namespace_decl_handler + + def reset(self): + DefusedExpatBuilder.reset(self) + self._initNamespaces() + + +def parse(file, namespaces=True, forbid_dtd=False, forbid_entities=True, forbid_external=True): + """Parse a document, returning the resulting Document node. + + 'file' may be either a file name or an open file object. + """ + if namespaces: + build_builder = DefusedExpatBuilderNS + else: + build_builder = DefusedExpatBuilder + builder = build_builder( + forbid_dtd=forbid_dtd, forbid_entities=forbid_entities, forbid_external=forbid_external + ) + + if isinstance(file, str): + fp = open(file, "rb") + try: + result = builder.parseFile(fp) + finally: + fp.close() + else: + result = builder.parseFile(file) + return result + + +def parseString( + string, namespaces=True, forbid_dtd=False, forbid_entities=True, forbid_external=True +): + """Parse a document from a string, returning the resulting + Document node. + """ + if namespaces: + build_builder = DefusedExpatBuilderNS + else: + build_builder = DefusedExpatBuilder + builder = build_builder( + forbid_dtd=forbid_dtd, forbid_entities=forbid_entities, forbid_external=forbid_external + ) + return builder.parseString(string) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/expatreader.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/expatreader.py new file mode 100755 index 00000000..890e1d16 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/expatreader.py @@ -0,0 +1,61 @@ +# defusedxml +# +# Copyright (c) 2013 by Christian Heimes +# Licensed to PSF under a Contributor Agreement. +# See https://www.python.org/psf/license for licensing details. +"""Defused xml.sax.expatreader +""" +from __future__ import print_function, absolute_import + +from xml.sax.expatreader import ExpatParser as _ExpatParser + +from .common import DTDForbidden, EntitiesForbidden, ExternalReferenceForbidden + +__origin__ = "xml.sax.expatreader" + + +class DefusedExpatParser(_ExpatParser): + """Defused SAX driver for the pyexpat C module.""" + + def __init__( + self, + namespaceHandling=0, + bufsize=2 ** 16 - 20, + forbid_dtd=False, + forbid_entities=True, + forbid_external=True, + ): + _ExpatParser.__init__(self, namespaceHandling, bufsize) + self.forbid_dtd = forbid_dtd + self.forbid_entities = forbid_entities + self.forbid_external = forbid_external + + def defused_start_doctype_decl(self, name, sysid, pubid, has_internal_subset): + raise DTDForbidden(name, sysid, pubid) + + def defused_entity_decl( + self, name, is_parameter_entity, value, base, sysid, pubid, notation_name + ): + raise EntitiesForbidden(name, value, base, sysid, pubid, notation_name) + + def defused_unparsed_entity_decl(self, name, base, sysid, pubid, notation_name): + # expat 1.2 + raise EntitiesForbidden(name, None, base, sysid, pubid, notation_name) # pragma: no cover + + def defused_external_entity_ref_handler(self, context, base, sysid, pubid): + raise ExternalReferenceForbidden(context, base, sysid, pubid) + + def reset(self): + _ExpatParser.reset(self) + parser = self._parser + if self.forbid_dtd: + parser.StartDoctypeDeclHandler = self.defused_start_doctype_decl + if self.forbid_entities: + parser.EntityDeclHandler = self.defused_entity_decl + parser.UnparsedEntityDeclHandler = self.defused_unparsed_entity_decl + if self.forbid_external: + parser.ExternalEntityRefHandler = self.defused_external_entity_ref_handler + + +def create_parser(*args, **kwargs): + return DefusedExpatParser(*args, **kwargs) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/lxml.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/lxml.py new file mode 100755 index 00000000..99d5be93 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/lxml.py @@ -0,0 +1,153 @@ +# defusedxml +# +# Copyright (c) 2013 by Christian Heimes +# Licensed to PSF under a Contributor Agreement. +# See https://www.python.org/psf/license for licensing details. +"""DEPRECATED Example code for lxml.etree protection + +The code has NO protection against decompression bombs. +""" +from __future__ import print_function, absolute_import + +import threading +import warnings + +from lxml import etree as _etree + +from .common import DTDForbidden, EntitiesForbidden, NotSupportedError + +LXML3 = _etree.LXML_VERSION[0] >= 3 + +__origin__ = "lxml.etree" + +tostring = _etree.tostring + + +warnings.warn( + "defusedxml.lxml is no longer supported and will be removed in a future release.", + category=DeprecationWarning, + stacklevel=2, +) + + +class RestrictedElement(_etree.ElementBase): + """A restricted Element class that filters out instances of some classes""" + + __slots__ = () + # blacklist = (etree._Entity, etree._ProcessingInstruction, etree._Comment) + blacklist = _etree._Entity + + def _filter(self, iterator): + blacklist = self.blacklist + for child in iterator: + if isinstance(child, blacklist): + continue + yield child + + def __iter__(self): + iterator = super(RestrictedElement, self).__iter__() + return self._filter(iterator) + + def iterchildren(self, tag=None, reversed=False): + iterator = super(RestrictedElement, self).iterchildren(tag=tag, reversed=reversed) + return self._filter(iterator) + + def iter(self, tag=None, *tags): + iterator = super(RestrictedElement, self).iter(tag=tag, *tags) + return self._filter(iterator) + + def iterdescendants(self, tag=None, *tags): + iterator = super(RestrictedElement, self).iterdescendants(tag=tag, *tags) + return self._filter(iterator) + + def itersiblings(self, tag=None, preceding=False): + iterator = super(RestrictedElement, self).itersiblings(tag=tag, preceding=preceding) + return self._filter(iterator) + + def getchildren(self): + iterator = super(RestrictedElement, self).__iter__() + return list(self._filter(iterator)) + + def getiterator(self, tag=None): + iterator = super(RestrictedElement, self).getiterator(tag) + return self._filter(iterator) + + +class GlobalParserTLS(threading.local): + """Thread local context for custom parser instances""" + + parser_config = { + "resolve_entities": False, + # 'remove_comments': True, + # 'remove_pis': True, + } + + element_class = RestrictedElement + + def createDefaultParser(self): + parser = _etree.XMLParser(**self.parser_config) + element_class = self.element_class + if self.element_class is not None: + lookup = _etree.ElementDefaultClassLookup(element=element_class) + parser.set_element_class_lookup(lookup) + return parser + + def setDefaultParser(self, parser): + self._default_parser = parser + + def getDefaultParser(self): + parser = getattr(self, "_default_parser", None) + if parser is None: + parser = self.createDefaultParser() + self.setDefaultParser(parser) + return parser + + +_parser_tls = GlobalParserTLS() +getDefaultParser = _parser_tls.getDefaultParser + + +def check_docinfo(elementtree, forbid_dtd=False, forbid_entities=True): + """Check docinfo of an element tree for DTD and entity declarations + + The check for entity declarations needs lxml 3 or newer. lxml 2.x does + not support dtd.iterentities(). + """ + docinfo = elementtree.docinfo + if docinfo.doctype: + if forbid_dtd: + raise DTDForbidden(docinfo.doctype, docinfo.system_url, docinfo.public_id) + if forbid_entities and not LXML3: + # lxml < 3 has no iterentities() + raise NotSupportedError("Unable to check for entity declarations " "in lxml 2.x") + + if forbid_entities: + for dtd in docinfo.internalDTD, docinfo.externalDTD: + if dtd is None: + continue + for entity in dtd.iterentities(): + raise EntitiesForbidden(entity.name, entity.content, None, None, None, None) + + +def parse(source, parser=None, base_url=None, forbid_dtd=False, forbid_entities=True): + if parser is None: + parser = getDefaultParser() + elementtree = _etree.parse(source, parser, base_url=base_url) + check_docinfo(elementtree, forbid_dtd, forbid_entities) + return elementtree + + +def fromstring(text, parser=None, base_url=None, forbid_dtd=False, forbid_entities=True): + if parser is None: + parser = getDefaultParser() + rootelement = _etree.fromstring(text, parser, base_url=base_url) + elementtree = rootelement.getroottree() + check_docinfo(elementtree, forbid_dtd, forbid_entities) + return rootelement + + +XML = fromstring + + +def iterparse(*args, **kwargs): + raise NotSupportedError("defused lxml.etree.iterparse not available") diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/minidom.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/minidom.py new file mode 100755 index 00000000..78033b6c --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/minidom.py @@ -0,0 +1,63 @@ +# defusedxml +# +# Copyright (c) 2013 by Christian Heimes +# Licensed to PSF under a Contributor Agreement. +# See https://www.python.org/psf/license for licensing details. +"""Defused xml.dom.minidom +""" +from __future__ import print_function, absolute_import + +from xml.dom.minidom import _do_pulldom_parse +from . import expatbuilder as _expatbuilder +from . import pulldom as _pulldom + +__origin__ = "xml.dom.minidom" + + +def parse( + file, parser=None, bufsize=None, forbid_dtd=False, forbid_entities=True, forbid_external=True +): + """Parse a file into a DOM by filename or file object.""" + if parser is None and not bufsize: + return _expatbuilder.parse( + file, + forbid_dtd=forbid_dtd, + forbid_entities=forbid_entities, + forbid_external=forbid_external, + ) + else: + return _do_pulldom_parse( + _pulldom.parse, + (file,), + { + "parser": parser, + "bufsize": bufsize, + "forbid_dtd": forbid_dtd, + "forbid_entities": forbid_entities, + "forbid_external": forbid_external, + }, + ) + + +def parseString( + string, parser=None, forbid_dtd=False, forbid_entities=True, forbid_external=True +): + """Parse a file into a DOM from a string.""" + if parser is None: + return _expatbuilder.parseString( + string, + forbid_dtd=forbid_dtd, + forbid_entities=forbid_entities, + forbid_external=forbid_external, + ) + else: + return _do_pulldom_parse( + _pulldom.parseString, + (string,), + { + "parser": parser, + "forbid_dtd": forbid_dtd, + "forbid_entities": forbid_entities, + "forbid_external": forbid_external, + }, + ) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/pulldom.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/pulldom.py new file mode 100755 index 00000000..e3b10a46 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/pulldom.py @@ -0,0 +1,41 @@ +# defusedxml +# +# Copyright (c) 2013 by Christian Heimes +# Licensed to PSF under a Contributor Agreement. +# See https://www.python.org/psf/license for licensing details. +"""Defused xml.dom.pulldom +""" +from __future__ import print_function, absolute_import + +from xml.dom.pulldom import parse as _parse +from xml.dom.pulldom import parseString as _parseString +from .sax import make_parser + +__origin__ = "xml.dom.pulldom" + + +def parse( + stream_or_string, + parser=None, + bufsize=None, + forbid_dtd=False, + forbid_entities=True, + forbid_external=True, +): + if parser is None: + parser = make_parser() + parser.forbid_dtd = forbid_dtd + parser.forbid_entities = forbid_entities + parser.forbid_external = forbid_external + return _parse(stream_or_string, parser, bufsize) + + +def parseString( + string, parser=None, forbid_dtd=False, forbid_entities=True, forbid_external=True +): + if parser is None: + parser = make_parser() + parser.forbid_dtd = forbid_dtd + parser.forbid_entities = forbid_entities + parser.forbid_external = forbid_external + return _parseString(string, parser) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/sax.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/sax.py new file mode 100755 index 00000000..b2786f74 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/sax.py @@ -0,0 +1,60 @@ +# defusedxml +# +# Copyright (c) 2013 by Christian Heimes +# Licensed to PSF under a Contributor Agreement. +# See https://www.python.org/psf/license for licensing details. +"""Defused xml.sax +""" +from __future__ import print_function, absolute_import + +from xml.sax import InputSource as _InputSource +from xml.sax import ErrorHandler as _ErrorHandler + +from . import expatreader + +__origin__ = "xml.sax" + + +def parse( + source, + handler, + errorHandler=_ErrorHandler(), + forbid_dtd=False, + forbid_entities=True, + forbid_external=True, +): + parser = make_parser() + parser.setContentHandler(handler) + parser.setErrorHandler(errorHandler) + parser.forbid_dtd = forbid_dtd + parser.forbid_entities = forbid_entities + parser.forbid_external = forbid_external + parser.parse(source) + + +def parseString( + string, + handler, + errorHandler=_ErrorHandler(), + forbid_dtd=False, + forbid_entities=True, + forbid_external=True, +): + from io import BytesIO + + if errorHandler is None: + errorHandler = _ErrorHandler() + parser = make_parser() + parser.setContentHandler(handler) + parser.setErrorHandler(errorHandler) + parser.forbid_dtd = forbid_dtd + parser.forbid_entities = forbid_entities + parser.forbid_external = forbid_external + + inpsrc = _InputSource() + inpsrc.setByteStream(BytesIO(string)) + parser.parse(inpsrc) + + +def make_parser(parser_list=[]): + return expatreader.create_parser() diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/xmlrpc.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/xmlrpc.py new file mode 100755 index 00000000..fbc674da --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/defusedxml/xmlrpc.py @@ -0,0 +1,153 @@ +# defusedxml +# +# Copyright (c) 2013 by Christian Heimes +# Licensed to PSF under a Contributor Agreement. +# See https://www.python.org/psf/license for licensing details. +"""Defused xmlrpclib + +Also defuses gzip bomb +""" +from __future__ import print_function, absolute_import + +import io + +from .common import DTDForbidden, EntitiesForbidden, ExternalReferenceForbidden, PY3 + +if PY3: + __origin__ = "xmlrpc.client" + from xmlrpc.client import ExpatParser + from xmlrpc import client as xmlrpc_client + from xmlrpc import server as xmlrpc_server + from xmlrpc.client import gzip_decode as _orig_gzip_decode + from xmlrpc.client import GzipDecodedResponse as _OrigGzipDecodedResponse +else: + __origin__ = "xmlrpclib" + from xmlrpclib import ExpatParser + import xmlrpclib as xmlrpc_client + + xmlrpc_server = None + from xmlrpclib import gzip_decode as _orig_gzip_decode + from xmlrpclib import GzipDecodedResponse as _OrigGzipDecodedResponse + +try: + import gzip +except ImportError: # pragma: no cover + gzip = None + + +# Limit maximum request size to prevent resource exhaustion DoS +# Also used to limit maximum amount of gzip decoded data in order to prevent +# decompression bombs +# A value of -1 or smaller disables the limit +MAX_DATA = 30 * 1024 * 1024 # 30 MB + + +def defused_gzip_decode(data, limit=None): + """gzip encoded data -> unencoded data + + Decode data using the gzip content encoding as described in RFC 1952 + """ + if not gzip: # pragma: no cover + raise NotImplementedError + if limit is None: + limit = MAX_DATA + f = io.BytesIO(data) + gzf = gzip.GzipFile(mode="rb", fileobj=f) + try: + if limit < 0: # no limit + decoded = gzf.read() + else: + decoded = gzf.read(limit + 1) + except IOError: # pragma: no cover + raise ValueError("invalid data") + f.close() + gzf.close() + if limit >= 0 and len(decoded) > limit: + raise ValueError("max gzipped payload length exceeded") + return decoded + + +class DefusedGzipDecodedResponse(gzip.GzipFile if gzip else object): + """a file-like object to decode a response encoded with the gzip + method, as described in RFC 1952. + """ + + def __init__(self, response, limit=None): + # response doesn't support tell() and read(), required by + # GzipFile + if not gzip: # pragma: no cover + raise NotImplementedError + self.limit = limit = limit if limit is not None else MAX_DATA + if limit < 0: # no limit + data = response.read() + self.readlength = None + else: + data = response.read(limit + 1) + self.readlength = 0 + if limit >= 0 and len(data) > limit: + raise ValueError("max payload length exceeded") + self.stringio = io.BytesIO(data) + gzip.GzipFile.__init__(self, mode="rb", fileobj=self.stringio) + + def read(self, n): + if self.limit >= 0: + left = self.limit - self.readlength + n = min(n, left + 1) + data = gzip.GzipFile.read(self, n) + self.readlength += len(data) + if self.readlength > self.limit: + raise ValueError("max payload length exceeded") + return data + else: + return gzip.GzipFile.read(self, n) + + def close(self): + gzip.GzipFile.close(self) + self.stringio.close() + + +class DefusedExpatParser(ExpatParser): + def __init__(self, target, forbid_dtd=False, forbid_entities=True, forbid_external=True): + ExpatParser.__init__(self, target) + self.forbid_dtd = forbid_dtd + self.forbid_entities = forbid_entities + self.forbid_external = forbid_external + parser = self._parser + if self.forbid_dtd: + parser.StartDoctypeDeclHandler = self.defused_start_doctype_decl + if self.forbid_entities: + parser.EntityDeclHandler = self.defused_entity_decl + parser.UnparsedEntityDeclHandler = self.defused_unparsed_entity_decl + if self.forbid_external: + parser.ExternalEntityRefHandler = self.defused_external_entity_ref_handler + + def defused_start_doctype_decl(self, name, sysid, pubid, has_internal_subset): + raise DTDForbidden(name, sysid, pubid) + + def defused_entity_decl( + self, name, is_parameter_entity, value, base, sysid, pubid, notation_name + ): + raise EntitiesForbidden(name, value, base, sysid, pubid, notation_name) + + def defused_unparsed_entity_decl(self, name, base, sysid, pubid, notation_name): + # expat 1.2 + raise EntitiesForbidden(name, None, base, sysid, pubid, notation_name) # pragma: no cover + + def defused_external_entity_ref_handler(self, context, base, sysid, pubid): + raise ExternalReferenceForbidden(context, base, sysid, pubid) + + +def monkey_patch(): + xmlrpc_client.FastParser = DefusedExpatParser + xmlrpc_client.GzipDecodedResponse = DefusedGzipDecodedResponse + xmlrpc_client.gzip_decode = defused_gzip_decode + if xmlrpc_server: + xmlrpc_server.gzip_decode = defused_gzip_decode + + +def unmonkey_patch(): + xmlrpc_client.FastParser = None + xmlrpc_client.GzipDecodedResponse = _OrigGzipDecodedResponse + xmlrpc_client.gzip_decode = _orig_gzip_decode + if xmlrpc_server: + xmlrpc_server.gzip_decode = _orig_gzip_decode diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/deprecation-2.1.0.dist-info/INSTALLER b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/deprecation-2.1.0.dist-info/INSTALLER new file mode 100755 index 00000000..a1b589e3 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/deprecation-2.1.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/deprecation-2.1.0.dist-info/LICENSE b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/deprecation-2.1.0.dist-info/LICENSE new file mode 100755 index 00000000..8dada3ed --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/deprecation-2.1.0.dist-info/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/deprecation-2.1.0.dist-info/METADATA b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/deprecation-2.1.0.dist-info/METADATA new file mode 100755 index 00000000..1d44ff8c --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/deprecation-2.1.0.dist-info/METADATA @@ -0,0 +1,114 @@ +Metadata-Version: 2.1 +Name: deprecation +Version: 2.1.0 +Summary: A library to handle automated deprecations +Home-page: http://deprecation.readthedocs.io/ +Author: Brian Curtin +Author-email: brian@python.org +Maintainer: Brian Curtin +Maintainer-email: brian@python.org +License: Apache 2 +Project-URL: Documentation, http://deprecation.readthedocs.io/en/latest/ +Project-URL: Source, https://github.com/briancurtin/deprecation +Project-URL: Bug Tracker, https://github.com/briancurtin/deprecation/issues +Keywords: deprecation +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: License :: OSI Approved :: Apache Software License +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Requires-Dist: packaging + +deprecation +=========== + +.. image:: https://readthedocs.org/projects/deprecation/badge/?version=latest + :target: http://deprecation.readthedocs.io/en/latest/ + :alt: Documentation Status + +.. image:: https://travis-ci.org/briancurtin/deprecation.svg?branch=master + :target: https://travis-ci.org/briancurtin/deprecation + +.. image:: https://codecov.io/gh/briancurtin/deprecation/branch/master/graph/badge.svg + :target: https://codecov.io/gh/briancurtin/deprecation + +The ``deprecation`` library provides a ``deprecated`` decorator and a +``fail_if_not_removed`` decorator for your tests. Together, the two +enable the automation of several things: + +1. The docstring of a deprecated method gets the deprecation details + appended to the end of it. If you generate your API docs direct + from your source, you don't need to worry about writing your own + notification. You also don't need to worry about forgetting to + write it. It's done for you. +2. Rather than having code live on forever because you only deprecated + it but never actually moved on from it, you can have your tests + tell you when it's time to remove the code. The ``@deprecated`` + decorator can be told when it's time to entirely remove the code, + which causes ``@fail_if_not_removed`` to raise an ``AssertionError``, + causing either your unittest or py.test tests to fail. + +See http://deprecation.readthedocs.io/ for the full documentation. + +Installation +============ + + :: + + pip install deprecation + +Usage +===== + + :: + + import deprecation + + @deprecation.deprecated(deprecated_in="1.0", removed_in="2.0", + current_version=__version__, + details="Use the bar function instead") + def foo(): + """Do some stuff""" + return 1 + +...but doesn't Python ignore ``DeprecationWarning``? +==================================================== + +Yes, by default since 2.7—and for good reason [#]_ —and this works fine +with that. + +1. It often makes sense for you to run your tests with a ``-W`` flag or + the ``PYTHONWARNINGS`` environment variable so you catch warnings + in development and handle them appropriately. The warnings raised by + this library show up there, as they're subclasses of the built-in + ``DeprecationWarning``. See the `Command Line + `_ + and `Environment Variable + `_ + documentation for more details. +2. Even if you don't enable those things, the behavior of this library + remains the same. The docstrings will still be updated and the tests + will still fail when they need to. You'll get the benefits regardless + of what Python cares about ``DeprecationWarning``. + +---- + +.. [#] Exposing application users to ``DeprecationWarning``\s that are + emitted by lower-level code needlessly involves end-users in + "how things are done." It often leads to users raising issues + about warnings they're presented, which on one hand is done + rightfully so, as it's been presented to them as some sort of + issue to resolve. However, at the same time, the warning could + be well known and planned for. From either side, loud + ``DeprecationWarning``\s can be seen as noise that isn't + necessary outside of development. + + diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/deprecation-2.1.0.dist-info/RECORD b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/deprecation-2.1.0.dist-info/RECORD new file mode 100755 index 00000000..df4f33ea --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/deprecation-2.1.0.dist-info/RECORD @@ -0,0 +1,7 @@ +deprecation-2.1.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +deprecation-2.1.0.dist-info/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357 +deprecation-2.1.0.dist-info/METADATA,sha256=AmlhU86t_lQQh858jSMZMZpoYM6gfnnLSKKe5DgGU88,4604 +deprecation-2.1.0.dist-info/RECORD,, +deprecation-2.1.0.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110 +deprecation-2.1.0.dist-info/top_level.txt,sha256=ztDh9pLraFksBgQ6iXWE_OnukoBC6_jkPQ4Y6p7771o,12 +deprecation.py,sha256=Z8qPVC-janAf7Ppoc1wYTiTWvGSdSjErOV1jDhnHN0Y,12895 diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/deprecation-2.1.0.dist-info/WHEEL b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/deprecation-2.1.0.dist-info/WHEEL new file mode 100755 index 00000000..ef99c6cf --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/deprecation-2.1.0.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.34.2) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/deprecation.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/deprecation.py new file mode 100755 index 00000000..0217b589 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/deprecation.py @@ -0,0 +1,290 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +import collections +import functools +import textwrap +import warnings + +from packaging import version +from datetime import date + +__version__ = "2.1.0" + +# This is mostly here so automodule docs are ordered more ideally. +__all__ = ["deprecated", "message_location", "fail_if_not_removed", + "DeprecatedWarning", "UnsupportedWarning"] + +#: Location where the details are added to a deprecated docstring +#: +#: When set to ``"bottom"``, the details are appended to the end. +#: When set to ``"top"``, the details are inserted between the +#: summary line and docstring contents. +message_location = "bottom" + + +class DeprecatedWarning(DeprecationWarning): + """A warning class for deprecated methods + + This is a specialization of the built-in :class:`DeprecationWarning`, + adding parameters that allow us to get information into the __str__ + that ends up being sent through the :mod:`warnings` system. + The attributes aren't able to be retrieved after the warning gets + raised and passed through the system as only the class--not the + instance--and message are what gets preserved. + + :param function: The function being deprecated. + :param deprecated_in: The version that ``function`` is deprecated in + :param removed_in: The version or :class:`datetime.date` specifying + when ``function`` gets removed. + :param details: Optional details about the deprecation. Most often + this will include directions on what to use instead + of the now deprecated code. + """ + + def __init__(self, function, deprecated_in, removed_in, details=""): + # NOTE: The docstring only works for this class if it appears up + # near the class name, not here inside __init__. I think it has + # to do with being an exception class. + self.function = function + self.deprecated_in = deprecated_in + self.removed_in = removed_in + self.details = details + super(DeprecatedWarning, self).__init__(function, deprecated_in, + removed_in, details) + + def __str__(self): + # Use a defaultdict to give us the empty string + # when a part isn't included. + parts = collections.defaultdict(str) + parts["function"] = self.function + + if self.deprecated_in: + parts["deprecated"] = " as of %s" % self.deprecated_in + if self.removed_in: + parts["removed"] = " and will be removed {} {}".format("on" if isinstance(self.removed_in, date) else "in", + self.removed_in) + if any([self.deprecated_in, self.removed_in, self.details]): + parts["period"] = "." + if self.details: + parts["details"] = " %s" % self.details + + return ("%(function)s is deprecated%(deprecated)s%(removed)s" + "%(period)s%(details)s" % (parts)) + + +class UnsupportedWarning(DeprecatedWarning): + """A warning class for methods to be removed + + This is a subclass of :class:`~deprecation.DeprecatedWarning` and is used + to output a proper message about a function being unsupported. + Additionally, the :func:`~deprecation.fail_if_not_removed` decorator + will handle this warning and cause any tests to fail if the system + under test uses code that raises this warning. + """ + + def __str__(self): + parts = collections.defaultdict(str) + parts["function"] = self.function + parts["removed"] = self.removed_in + + if self.details: + parts["details"] = " %s" % self.details + + return ("%(function)s is unsupported as of %(removed)s." + "%(details)s" % (parts)) + + +def deprecated(deprecated_in=None, removed_in=None, current_version=None, + details=""): + """Decorate a function to signify its deprecation + + This function wraps a method that will soon be removed and does two things: + * The docstring of the method will be modified to include a notice + about deprecation, e.g., "Deprecated since 0.9.11. Use foo instead." + * Raises a :class:`~deprecation.DeprecatedWarning` + via the :mod:`warnings` module, which is a subclass of the built-in + :class:`DeprecationWarning`. Note that built-in + :class:`DeprecationWarning`s are ignored by default, so for users + to be informed of said warnings they will need to enable them--see + the :mod:`warnings` module documentation for more details. + + :param deprecated_in: The version at which the decorated method is + considered deprecated. This will usually be the + next version to be released when the decorator is + added. The default is **None**, which effectively + means immediate deprecation. If this is not + specified, then the `removed_in` and + `current_version` arguments are ignored. + :param removed_in: The version or :class:`datetime.date` when the decorated + method will be removed. The default is **None**, + specifying that the function is not currently planned + to be removed. + Note: This parameter cannot be set to a value if + `deprecated_in=None`. + :param current_version: The source of version information for the + currently running code. This will usually be + a `__version__` attribute on your library. + The default is `None`. + When `current_version=None` the automation to + determine if the wrapped function is actually + in a period of deprecation or time for removal + does not work, causing a + :class:`~deprecation.DeprecatedWarning` + to be raised in all cases. + :param details: Extra details to be added to the method docstring and + warning. For example, the details may point users to + a replacement method, such as "Use the foo_bar + method instead". By default there are no details. + """ + # You can't just jump to removal. It's weird, unfair, and also makes + # building up the docstring weird. + if deprecated_in is None and removed_in is not None: + raise TypeError("Cannot set removed_in to a value " + "without also setting deprecated_in") + + # Only warn when it's appropriate. There may be cases when it makes sense + # to add this decorator before a formal deprecation period begins. + # In CPython, PendingDeprecatedWarning gets used in that period, + # so perhaps mimick that at some point. + is_deprecated = False + is_unsupported = False + + # StrictVersion won't take a None or a "", so make whatever goes to it + # is at least *something*. Compare versions only if removed_in is not + # of type datetime.date + if isinstance(removed_in, date): + if date.today() >= removed_in: + is_unsupported = True + else: + is_deprecated = True + elif current_version: + current_version = version.parse(current_version) + + if (removed_in + and current_version >= version.parse(removed_in)): + is_unsupported = True + elif (deprecated_in + and current_version >= version.parse(deprecated_in)): + is_deprecated = True + else: + # If we can't actually calculate that we're in a period of + # deprecation...well, they used the decorator, so it's deprecated. + # This will cover the case of someone just using + # @deprecated("1.0") without the other advantages. + is_deprecated = True + + should_warn = any([is_deprecated, is_unsupported]) + + def _function_wrapper(function): + if should_warn: + # Everything *should* have a docstring, but just in case... + existing_docstring = function.__doc__ or "" + + # The various parts of this decorator being optional makes for + # a number of ways the deprecation notice could go. The following + # makes for a nicely constructed sentence with or without any + # of the parts. + + # If removed_in is a date, use "removed on" + # If removed_in is a version, use "removed in" + parts = { + "deprecated_in": + " %s" % deprecated_in if deprecated_in else "", + "removed_in": + "\n This will be removed {} {}.".format("on" if isinstance(removed_in, date) else "in", + removed_in) if removed_in else "", + "details": + " %s" % details if details else ""} + + deprecation_note = (".. deprecated::{deprecated_in}" + "{removed_in}{details}".format(**parts)) + + # default location for insertion of deprecation note + loc = 1 + + # split docstring at first occurrence of newline + string_list = existing_docstring.split("\n", 1) + + if len(string_list) > 1: + # With a multi-line docstring, when we modify + # existing_docstring to add our deprecation_note, + # if we're not careful we'll interfere with the + # indentation levels of the contents below the + # first line, or as PEP 257 calls it, the summary + # line. Since the summary line can start on the + # same line as the """, dedenting the whole thing + # won't help. Split the summary and contents up, + # dedent the contents independently, then join + # summary, dedent'ed contents, and our + # deprecation_note. + + # in-place dedent docstring content + string_list[1] = textwrap.dedent(string_list[1]) + + # we need another newline + string_list.insert(loc, "\n") + + # change the message_location if we add to end of docstring + # do this always if not "top" + if message_location != "top": + loc = 3 + + # insert deprecation note and dual newline + string_list.insert(loc, deprecation_note) + string_list.insert(loc, "\n\n") + + function.__doc__ = "".join(string_list) + + @functools.wraps(function) + def _inner(*args, **kwargs): + if should_warn: + if is_unsupported: + cls = UnsupportedWarning + else: + cls = DeprecatedWarning + + the_warning = cls(function.__name__, deprecated_in, + removed_in, details) + warnings.warn(the_warning, category=DeprecationWarning, + stacklevel=2) + + return function(*args, **kwargs) + return _inner + return _function_wrapper + + +def fail_if_not_removed(method): + """Decorate a test method to track removal of deprecated code + + This decorator catches :class:`~deprecation.UnsupportedWarning` + warnings that occur during testing and causes unittests to fail, + making it easier to keep track of when code should be removed. + + :raises: :class:`AssertionError` if an + :class:`~deprecation.UnsupportedWarning` + is raised while running the test method. + """ + # NOTE(briancurtin): Unless this is named test_inner, nose won't work + # properly. See Issue #32. + @functools.wraps(method) + def test_inner(*args, **kwargs): + with warnings.catch_warnings(record=True) as caught_warnings: + warnings.simplefilter("always") + rv = method(*args, **kwargs) + + for warning in caught_warnings: + if warning.category == UnsupportedWarning: + raise AssertionError( + ("%s uses a function that should be removed: %s" % + (method, str(warning.message)))) + return rv + return test_inner diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna-3.10.dist-info/INSTALLER b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna-3.10.dist-info/INSTALLER new file mode 100755 index 00000000..a1b589e3 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna-3.10.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna-3.10.dist-info/LICENSE.md b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna-3.10.dist-info/LICENSE.md new file mode 100755 index 00000000..19b6b452 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna-3.10.dist-info/LICENSE.md @@ -0,0 +1,31 @@ +BSD 3-Clause License + +Copyright (c) 2013-2024, Kim Davies and contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna-3.10.dist-info/METADATA b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna-3.10.dist-info/METADATA new file mode 100755 index 00000000..c42623e9 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna-3.10.dist-info/METADATA @@ -0,0 +1,250 @@ +Metadata-Version: 2.1 +Name: idna +Version: 3.10 +Summary: Internationalized Domain Names in Applications (IDNA) +Author-email: Kim Davies +Requires-Python: >=3.6 +Description-Content-Type: text/x-rst +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Intended Audience :: System Administrators +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Internet :: Name Service (DNS) +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Utilities +Requires-Dist: ruff >= 0.6.2 ; extra == "all" +Requires-Dist: mypy >= 1.11.2 ; extra == "all" +Requires-Dist: pytest >= 8.3.2 ; extra == "all" +Requires-Dist: flake8 >= 7.1.1 ; extra == "all" +Project-URL: Changelog, https://github.com/kjd/idna/blob/master/HISTORY.rst +Project-URL: Issue tracker, https://github.com/kjd/idna/issues +Project-URL: Source, https://github.com/kjd/idna +Provides-Extra: all + +Internationalized Domain Names in Applications (IDNA) +===================================================== + +Support for the Internationalized Domain Names in +Applications (IDNA) protocol as specified in `RFC 5891 +`_. This is the latest version of +the protocol and is sometimes referred to as “IDNA 2008”. + +This library also provides support for Unicode Technical +Standard 46, `Unicode IDNA Compatibility Processing +`_. + +This acts as a suitable replacement for the “encodings.idna” +module that comes with the Python standard library, but which +only supports the older superseded IDNA specification (`RFC 3490 +`_). + +Basic functions are simply executed: + +.. code-block:: pycon + + >>> import idna + >>> idna.encode('ドメイン.テスト') + b'xn--eckwd4c7c.xn--zckzah' + >>> print(idna.decode('xn--eckwd4c7c.xn--zckzah')) + ドメイン.テスト + + +Installation +------------ + +This package is available for installation from PyPI: + +.. code-block:: bash + + $ python3 -m pip install idna + + +Usage +----- + +For typical usage, the ``encode`` and ``decode`` functions will take a +domain name argument and perform a conversion to A-labels or U-labels +respectively. + +.. code-block:: pycon + + >>> import idna + >>> idna.encode('ドメイン.テスト') + b'xn--eckwd4c7c.xn--zckzah' + >>> print(idna.decode('xn--eckwd4c7c.xn--zckzah')) + ドメイン.テスト + +You may use the codec encoding and decoding methods using the +``idna.codec`` module: + +.. code-block:: pycon + + >>> import idna.codec + >>> print('домен.испытание'.encode('idna2008')) + b'xn--d1acufc.xn--80akhbyknj4f' + >>> print(b'xn--d1acufc.xn--80akhbyknj4f'.decode('idna2008')) + домен.испытание + +Conversions can be applied at a per-label basis using the ``ulabel`` or +``alabel`` functions if necessary: + +.. code-block:: pycon + + >>> idna.alabel('测试') + b'xn--0zwm56d' + +Compatibility Mapping (UTS #46) ++++++++++++++++++++++++++++++++ + +As described in `RFC 5895 `_, the +IDNA specification does not normalize input from different potential +ways a user may input a domain name. This functionality, known as +a “mapping”, is considered by the specification to be a local +user-interface issue distinct from IDNA conversion functionality. + +This library provides one such mapping that was developed by the +Unicode Consortium. Known as `Unicode IDNA Compatibility Processing +`_, it provides for both a regular +mapping for typical applications, as well as a transitional mapping to +help migrate from older IDNA 2003 applications. Strings are +preprocessed according to Section 4.4 “Preprocessing for IDNA2008” +prior to the IDNA operations. + +For example, “Königsgäßchen” is not a permissible label as *LATIN +CAPITAL LETTER K* is not allowed (nor are capital letters in general). +UTS 46 will convert this into lower case prior to applying the IDNA +conversion. + +.. code-block:: pycon + + >>> import idna + >>> idna.encode('Königsgäßchen') + ... + idna.core.InvalidCodepoint: Codepoint U+004B at position 1 of 'Königsgäßchen' not allowed + >>> idna.encode('Königsgäßchen', uts46=True) + b'xn--knigsgchen-b4a3dun' + >>> print(idna.decode('xn--knigsgchen-b4a3dun')) + königsgäßchen + +Transitional processing provides conversions to help transition from +the older 2003 standard to the current standard. For example, in the +original IDNA specification, the *LATIN SMALL LETTER SHARP S* (ß) was +converted into two *LATIN SMALL LETTER S* (ss), whereas in the current +IDNA specification this conversion is not performed. + +.. code-block:: pycon + + >>> idna.encode('Königsgäßchen', uts46=True, transitional=True) + 'xn--knigsgsschen-lcb0w' + +Implementers should use transitional processing with caution, only in +rare cases where conversion from legacy labels to current labels must be +performed (i.e. IDNA implementations that pre-date 2008). For typical +applications that just need to convert labels, transitional processing +is unlikely to be beneficial and could produce unexpected incompatible +results. + +``encodings.idna`` Compatibility +++++++++++++++++++++++++++++++++ + +Function calls from the Python built-in ``encodings.idna`` module are +mapped to their IDNA 2008 equivalents using the ``idna.compat`` module. +Simply substitute the ``import`` clause in your code to refer to the new +module name. + +Exceptions +---------- + +All errors raised during the conversion following the specification +should raise an exception derived from the ``idna.IDNAError`` base +class. + +More specific exceptions that may be generated as ``idna.IDNABidiError`` +when the error reflects an illegal combination of left-to-right and +right-to-left characters in a label; ``idna.InvalidCodepoint`` when +a specific codepoint is an illegal character in an IDN label (i.e. +INVALID); and ``idna.InvalidCodepointContext`` when the codepoint is +illegal based on its positional context (i.e. it is CONTEXTO or CONTEXTJ +but the contextual requirements are not satisfied.) + +Building and Diagnostics +------------------------ + +The IDNA and UTS 46 functionality relies upon pre-calculated lookup +tables for performance. These tables are derived from computing against +eligibility criteria in the respective standards. These tables are +computed using the command-line script ``tools/idna-data``. + +This tool will fetch relevant codepoint data from the Unicode repository +and perform the required calculations to identify eligibility. There are +three main modes: + +* ``idna-data make-libdata``. Generates ``idnadata.py`` and + ``uts46data.py``, the pre-calculated lookup tables used for IDNA and + UTS 46 conversions. Implementers who wish to track this library against + a different Unicode version may use this tool to manually generate a + different version of the ``idnadata.py`` and ``uts46data.py`` files. + +* ``idna-data make-table``. Generate a table of the IDNA disposition + (e.g. PVALID, CONTEXTJ, CONTEXTO) in the format found in Appendix + B.1 of RFC 5892 and the pre-computed tables published by `IANA + `_. + +* ``idna-data U+0061``. Prints debugging output on the various + properties associated with an individual Unicode codepoint (in this + case, U+0061), that are used to assess the IDNA and UTS 46 status of a + codepoint. This is helpful in debugging or analysis. + +The tool accepts a number of arguments, described using ``idna-data +-h``. Most notably, the ``--version`` argument allows the specification +of the version of Unicode to be used in computing the table data. For +example, ``idna-data --version 9.0.0 make-libdata`` will generate +library data against Unicode 9.0.0. + + +Additional Notes +---------------- + +* **Packages**. The latest tagged release version is published in the + `Python Package Index `_. + +* **Version support**. This library supports Python 3.6 and higher. + As this library serves as a low-level toolkit for a variety of + applications, many of which strive for broad compatibility with older + Python versions, there is no rush to remove older interpreter support. + Removing support for older versions should be well justified in that the + maintenance burden has become too high. + +* **Python 2**. Python 2 is supported by version 2.x of this library. + Use "idna<3" in your requirements file if you need this library for + a Python 2 application. Be advised that these versions are no longer + actively developed. + +* **Testing**. The library has a test suite based on each rule of the + IDNA specification, as well as tests that are provided as part of the + Unicode Technical Standard 46, `Unicode IDNA Compatibility Processing + `_. + +* **Emoji**. It is an occasional request to support emoji domains in + this library. Encoding of symbols like emoji is expressly prohibited by + the technical standard IDNA 2008 and emoji domains are broadly phased + out across the domain industry due to associated security risks. For + now, applications that need to support these non-compliant labels + may wish to consider trying the encode/decode operation in this library + first, and then falling back to using `encodings.idna`. See `the Github + project `_ for more discussion. + diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna-3.10.dist-info/RECORD b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna-3.10.dist-info/RECORD new file mode 100755 index 00000000..e5d08b7b --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna-3.10.dist-info/RECORD @@ -0,0 +1,14 @@ +idna-3.10.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +idna-3.10.dist-info/LICENSE.md,sha256=pZ8LDvNjWHQQmkRhykT_enDVBpboFHZ7-vch1Mmw2w8,1541 +idna-3.10.dist-info/METADATA,sha256=URR5ZyDfQ1PCEGhkYoojqfi2Ra0tau2--lhwG4XSfjI,10158 +idna-3.10.dist-info/RECORD,, +idna-3.10.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 +idna/__init__.py,sha256=MPqNDLZbXqGaNdXxAFhiqFPKEQXju2jNQhCey6-5eJM,868 +idna/codec.py,sha256=PEew3ItwzjW4hymbasnty2N2OXvNcgHB-JjrBuxHPYY,3422 +idna/compat.py,sha256=RzLy6QQCdl9784aFhb2EX9EKGCJjg0P3PilGdeXXcx8,316 +idna/core.py,sha256=YJYyAMnwiQEPjVC4-Fqu_p4CJ6yKKuDGmppBNQNQpFs,13239 +idna/idnadata.py,sha256=W30GcIGvtOWYwAjZj4ZjuouUutC6ffgNuyjJy7fZ-lo,78306 +idna/intranges.py,sha256=amUtkdhYcQG8Zr-CoMM_kVRacxkivC1WgxN1b63KKdU,1898 +idna/package_data.py,sha256=q59S3OXsc5VI8j6vSD0sGBMyk6zZ4vWFREE88yCJYKs,21 +idna/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +idna/uts46data.py,sha256=rt90K9J40gUSwppDPCrhjgi5AA6pWM65dEGRSf6rIhM,239289 diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna-3.10.dist-info/WHEEL b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna-3.10.dist-info/WHEEL new file mode 100755 index 00000000..3b5e64b5 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna-3.10.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: flit 3.9.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna/__init__.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna/__init__.py new file mode 100755 index 00000000..cfdc030a --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna/__init__.py @@ -0,0 +1,45 @@ +from .core import ( + IDNABidiError, + IDNAError, + InvalidCodepoint, + InvalidCodepointContext, + alabel, + check_bidi, + check_hyphen_ok, + check_initial_combiner, + check_label, + check_nfc, + decode, + encode, + ulabel, + uts46_remap, + valid_contextj, + valid_contexto, + valid_label_length, + valid_string_length, +) +from .intranges import intranges_contain +from .package_data import __version__ + +__all__ = [ + "__version__", + "IDNABidiError", + "IDNAError", + "InvalidCodepoint", + "InvalidCodepointContext", + "alabel", + "check_bidi", + "check_hyphen_ok", + "check_initial_combiner", + "check_label", + "check_nfc", + "decode", + "encode", + "intranges_contain", + "ulabel", + "uts46_remap", + "valid_contextj", + "valid_contexto", + "valid_label_length", + "valid_string_length", +] diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna/__pycache__/__init__.cpython-39.pyc b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna/__pycache__/__init__.cpython-39.pyc new file mode 100755 index 0000000000000000000000000000000000000000..95cf01ca57d6cf90fde71fe585d8c542c8040e1a GIT binary patch literal 848 zcmbu7&5qMB5XX~#q)n54cf0!vJuEqZ_Jk12!eK8fBsf_@mK&Sa)MH1EyP_|`190P& zeC5O|aKe-Dr9E)LQhu5FPck$1n2pDyC@lRcmAo58U(xw{b%OIeJhcnp5sy^_F^Qo= zI?yFu=#d`uNgooDz<>;3NQRJ-6h>qO8Ob0gIgH5|CS(FrGKCqL!JN!tK^8IQ>!>BH z$f~is>I~Lo9Y?!}_ddtuocG^Eo8(&@N^cf^eEah5`i123m9@tD6y4UG-RgU$B)>6S zR7Ps&&mSr`MmzD*`GhI970Qpwy(kZK8`Ak{Ywu6hUTA6#e%%UEODCD4rGc%~!uqV$ z+YD*z==Y^hxF|zup9tN)kL@Sf(bZ3`s1?8}KWSPF$(lw!Jn)TQwDIOos)XLTy;<-l`2Mail`HB>9rd9Qt}Iwp)y3QE%i5Hdab_>2E+rS*)kPR?;TZiDp?@OG mY-x3RTu822K|??~N*`4xKYR*?AC-89ceBPLeZ9)#yz>KF+2x-A literal 0 HcmV?d00001 diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna/__pycache__/core.cpython-39.pyc b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna/__pycache__/core.cpython-39.pyc new file mode 100755 index 0000000000000000000000000000000000000000..8862bc25a44a7320dd637fee6da1264249285357 GIT binary patch literal 9869 zcmbVSUu;}edcXhYkH_PQ?Kn;daDfCeA&vtHfenF8;>01@Fi>IwOrewOIoI}$$9Kl( z-bv!&j+BjAiMCscP|E{CTf16Sr4ReimqpucA6Kik4;AXuRUeR$s=BJQE73kQbV+~T zId{h6NkW&7bI(2h?svZPo$vpNGdP%4@bf>+ct1U?C|^*c_m@WF1fF0_Qxv8!wWgHi zTP>@it(7&rwVJ+Ul#L~`Y^n;=nNhQrQstDWo3->(rkp|DDrZ@$Jm9KpIhI~m%Y$bX zmSNd<6qa@Kt9p3|?E#iUJLe9eT|j$~<@m!FpxfTZifBKGHB|w9KYJW) z8{;E@Z~zb{*g^C>#HM5)dM7_N*dg`=;64m2fWQ05oW2vZ7Z9FghcSN-^^5iq_7vKC zduL)b!sRG?8Y7Rg)0hi<(fb`hKE|E}_B`h7W7Bt;vz>kS zW0Rd=Co!YQ)Qd{->;`d6si?*2ml~m0_nlg7zUrg0p<t){ zgG#mThmPlOWQf5G6xaQUiDnL!-#z%njhnyv`Fp?m+x54qXm9xu&=Yuq0t#0lJ_HY{ zWu0ljMvpV+PM1!e;k?dUPn~iC*LJU0U4fWASLe1Z*b=Is=Jy)qLH=SBClB!f#y;`Y!qVPOW5yh=HChLuG zGHBGA{^Fz?RwtcCBbb~yIT6&W97Ny~o?rEt>xaSQtmjXLPNg$a*&K1|vz5lm;YlLg zWVO!SgN+qV!bl4VTBTJ(6FuLWK7+LTQy%jqjh;QzCC{}5*SBXe!riJoNYG}viRKdF zYdhSv{d#BzPUr=5p36#{&Tez}vNlA0bU341kfok)jcnnZf7PjZY^u)OMjgD2(nq1LbA2ywnm@L#Q76(@=VmS5RkU^jzrM0gv}+qDH@>iO0P@90N(3S9194_i}x zc!vwFy#+s_tk|pV`L-MtU)o;yTcAG-WbG~JQxAkvt2SbbyJ3_2RT7=f4+>o&p_{@J z96}K)Yig)P%Bs4qw$(^w>Y~OEpjYqo1_wfeX{+i@jFPC8I00`z7_aS?+UR~g^K>`(LFFCcQE10sV@ex3d)vG9ZMx%1nye;N&yP^I06+7&%g zcPgu-PSjG-;1)(>z0MgoQ7fk;$RNRz??z`op4o~QROGya7!JhBDt`cVoQWDpe0tA= z>N*~A9<-rIS%cDFCrWFjINfOaD@0J}P)n#T_Y;*rhXDXekPhzyQ@*}8kIsZG> zW9k~#OxA0qUw!=TV~38s-lp}SHX_x~S2qh9Jl)n4RaD>T65`isOVHGk~I5+V~oCHhzO* zdWP@A3mhS^Jb-#Xsv{EBAmp^Z#PtN`CAf|fu9Ij_caY6g7u@P%r55r#nU~Zq?NJc% z_i&UP+ij^1LAB(CetC#$3ysLYer~_ed+5`m`!G01-{H` zYs>ja3ob=!aEVzLArSapVX2*93jrgIc^vaB-v-1CAl|^rmOl)**$&)wl~e@!Q%q^6 zd$9V8JFv3eSNRwq4O~_EXMmAgGa_AnkKRG7_BmEd`8l-mi#q=gf{OakRRv$3kJ9g} zffkwVv_BlBBXd!wUcf032FpLj%xzay^c_Us@D|u30>bkIUCblsKPKpCr2w^zFGj^a zK!@V?(ljS!87r+PI@+$sOnTu8sXW1k_S_-ajtTyZN z3K6nj*JP#YAgI%TAH0l0(F}E1&8lf_6n4_WW9Vctsb*=z7!~81rKNLuEt#QZF>ayE z>RB}}S~MHqX#5ml-eFO?9tGJ7@+hD_U`yAb4iLgMws(naR`v2;I0#w11HbcCK$OPmOo{}59X1v~~i z@H2PYla5ZIXo=rwKTP`p0!E=w$3qwc+70?m^jV8qa7e05s`FT15#$C<)=5hYk-( zFMv-Z?>e>wI8#(b#Bf&v4M_sYnU(tD2S73Ls|ujZI8o<3`tE(=(qOLPq~S%tY(Sxo z(l)+15jNjx@$BX07U{mAB5r2pd<-HA{SF&^OYQf-h35GG#yr7ZC7u7v$* za;^8(*M~VN7Cu-VJ#X zUl%Q@TT28fU2RmLIGb*))fZ#cE9ZK@>emx_sbeWMfuQZmp8-N}0tK8&Xg`tz1DbLa zf8<<}(*|uwx)aY>(mRIUG&HC|dQ;tnmZ9_400Rc|QM|aoE7MI&NUkI;)A>=D(bc4X zx0NgPNEeYAV_Kvd2pJX?en>_x#Cd34_6=3>5xEg3cQ}<9;I+%0z8!*lWuG`LI5~iu z!kiyP>K14pbz0#6k0=r(nDjmL8hPvTOSpo;PXHkc2>&Q~h5xcMn`DIz^vuo)o*Ii3 zNXXH)5gBX{-~HQij4uq9UxmyCSy3PAsTWo?9wUti?pls%UA8UK1qFnQ$A%Z_y&!gf zRKPyaHrNRE3=Q3#cZrRPc}K-Oi_(%8iQ|t7I*jx{yphcOSs%o0eGvaLS^3>Qi0^hN z3-@v3r#RA0IoPP7IWz4waq6*omb>nv_a#o<`%e_H^@2Og-D}=ga1LmO^2O@k#OW6x z5c7`j#Od!Lm9~glS%1Otz01&Fo=3&6srYXc(0M|XNEl?yX>M{Jf1P?~sGuPGn`-q>x-MisU7#i6IdXsFVRZV>urJ?OcX@mEBYrFzTTdW6h_y8VZThAw4 z4(+1NA&BAQh=0N9(3VPQhzOB1?ST-14B6ArqCPdzfOw~qc81>It6wA7pr9xl!2&@u z4@7#HyE4c~2Wz~sd|~-Qw-1&ZeV?}ugn8ocRW10daEMuJg%BJ@0U%33*A5fpb+P(u zihsyZ!jYAKQ5E_FR_S}senauKLrTwj8Cnm#`an1;*8{&F$BNl|!@$?u*}ylBL!O8t ziRNvY&2Vnw8NqX{fip`D3K__&En6>NI(gyT>2iANrP9oq*JsYR_Me9$McM|T3%L-T zY}%c1z}s!1##_fbLC~f@?650N6=^~{tlOkvCAhnR=q~)yt%<2_hVHjmyR~(CAME;E zAO6K1an=jqOoonMbz^gOC3J&0LobJOXC=0nOZW?$A)O0y7=)W6JVE{(HH9QWs1#{* zwsp5G6Hsm-bUPoW8GESMO9f>w_)aQ_?>XfXg~!}$1El;3Nu<24lthu{8c1S)IwLDjrgN=r+o>u378yoeFU^#(xMaoCy&* zFoj|bnh`X@Z07{l21qk9x)vh4{v(W-q!p2fG3BWNqL_100X|f>NRvWu?E*fzm0u)! z3m0D)MoV3{sWWPa6ls<<^1 zw|g*0ug+XNa+I$3s%`*#Fn>@OF(kG#%`iA}l&&cF6F7|xSaQTB<T2T8p70Aw>8cBTGOj|<;~t0u#{{eQY;Y8#RXD!gUk0_VUHW%4q=toG zcBGZ3c!a@6>uNJ?<;jGd5(_1@8CdZ&d5#bbV^wdHNSX6W+XB132@P#BN{pxcY-p_^ z9ZvNq#X}OKd5X&;*er+}GCL_sfHM<)A5i@{L_SD{r{H7mL3%qyqSb~4;C~%iYw$wX zVKbLM#Mg-Ak%ay*GWp-r2+Pt4e7H;`bTP4dWMWVMin%$l66xK+MDLyr7V6C!Zl!U_ zWjmegv<`oRtBKp^n!dQHwYh^PM;}sVj!h;nnR#$JRu2m9zLk?spwv`CLC@Su97Cbk zza;v933gBpwuVj%eFkSPG0g))7soozuxpJ^3-?L#v{1J<@NI13^4kk>QCp(NB{s9$acSR1C{}F0%|L(>J!~^_2D*l*? zN2%yLeKPZZN~ixMDvCw!@V!o-+`InM7j8mPou+@<%yiM1#;>STv7fI1VyuCEMXK3C zstFc^ljqEJD#&n%$RN&i|7(l5G3LKRBOZ!4g-h#(S99goed-tFC{S%16%;)n^$%4| z=`TUH*qE)?Ya)D?F3=-1vX_d-si4b35mLxlVE+)^6Iq! literal 0 HcmV?d00001 diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna/__pycache__/idnadata.cpython-39.pyc b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna/__pycache__/idnadata.cpython-39.pyc new file mode 100755 index 0000000000000000000000000000000000000000..28dedc66c071d8e850114df7f2b8e5ba6c5e09ba GIT binary patch literal 42088 zcmeI*4Oo?R{^#)nqN3tsq*SD+sHmu@h={01MMcHO$jnGl(L_lR@u{$=p=T;~%R^^XmOM=RSwy zEs??DFuQs4rUCtL@hweqkMs=*e8TwS|1NA62n2P(vaoi6Ku%yrASWazG^asMSWd&7 zMr93Wgyb|n`Pcu&GZ3EB#Q%%3|A*`E{Pp`a?vj7}dsF{NcRBYE{x3XwJKDV+{_gJS zKl}S1kNwa3KfCS!%H{Tm{`oEa@od?(|F!p9j&+ZtvAVIpet!$@+TV|Jm;C-V-J|-i zz0H3->OZ)PEjn|7Dm{^R=R{>S@2xlf*f zfA2F8u75_{BmC$0=YRK0c;x>l9wYbS&ceyR|GS@o-``{Z-5=@y{^R>U@!tJEyN_lk z-}nFF4E%n^+@A)T{ozj>?%HO5_}JtAoWSw?uDfIG&n)gwGeYi{cRl8f9{QJo> zaPkbCJOd}sz#q@RA3wJKzwAFgrjvd04E+0_frz!u%JOD}<}}Y~k<&7#Rat`>4RTta z73kjPqDFlO^zPd`p?hpz1AS(^P*gSda+R{i@)G4y%VK4{D@!mGXsJ3gz8`z$MRozB zIo9TSxsW!a@SxnBOxbu&!4_8#ji81_BMkZQP|%+{hoJ zr|QwCw+M7^>)mQYZ{1Ide;3C!^4xf*kFH7euW6JJ2t)?`5v~#KMh}e=H&QhYYt-@R zswRlZ{%ry=A^MF9wFk8LB8{BJHV$f3<@%#`Noe5eVa@CgzSpR7<8ar8y1Q0(P0B!x z=u>U9Pu4i!ADbsO3>0VkfYNMQXM z|B-LhsMhfA`gorP`u*`AL%l|g8^38B*YM6zNP-@a9=A6->!B9A$30CWQ;*xbw*?w& zHM%!E*l-d2o?9^cg4v5_9}FKqyKwd*)fbt1m|vv9 zR2T^vA}&u~kNe_5Rc=6UJ2wPEp#g+JLudqzAsm`OQ)mVe&>UJoOK1hHp$(h@k#H)s zg?11Hr@`rP21LV|&>lKK40MD}&>3Q(3v`8U5C`3%2lRw^=mot&=RA0G zJqt47Y?ub;z;rklX25xn1?R&|m<8D|8|J`V$boq~%@Hp&(Ctx=`36<~^JOj_db5IR0z)R3d zA1rfQLmS{@XKo~%3T>esM8RorIz&SZbOL>p)jK+Lfv(UE;-EY9fSwQ!y`VSrfduFa z{h&W2!T?BufshP?AO!|PDhz?4Fbsk)97e!MNP|%@8pc36jD>M99x`A8OoT}=8K%Hg zI14i2Y?ub;z;rklX25xn1?R&|m<5Yr3FO04D1c?K99F){5t5!S*@a5MZF*1=!k7PuAG!)>quZih0s12)2) zunF#h&2TqtfqURyxDU3%{jd!lfO2>c9)gEqJ3InA;8Cc6$6zNs4!ht9*bPrYB|HUB z!!u9?&%$%?JXFIA@FKhfd*Ef*3$MUFcoklQ*I_@r0dK-v@HV^y@4^9i4-Ufna0otv z!|*X2flr_oK8K_5C42>S@HKn`-@;GuGt|Rx(6X^;1+AeCoC1+>Dzt@m5Cx~f>2L-_ z!IVxbFkg>DcB-Ju8cgm~x$y`c{zKwszw{UH$sKoSguWEcb~Fc?x{ z2n>Z`5QO0{0!Bg_jDpcH2GU_HjDra<5hlT8m;zJbEXahjVH%tR)8Sm00p~#$oDVZ$ z7G%S0m;-Y`e~{L{?qEJ#01H5WsMf#kU=iq#qWaezEQTeJ4@;o{mO&vbhZV3AR>5kx z2rh;q(4PhM0R=9Fd*MFV3irb{cmT@bL3jurhV8HyUV(k^D!c}-!+v-J-h{WH2Hu8u z;9WQX@4-QM9}d9>@F9Ezhv8#50-r!FdblqhjU>DoCn!32j)T!%!3PH0p!9$$cLp+0L!2d zmct5I39Dc=Tm% z?u1Qn7i@;RVGG;?_riU!74C;^@Boy_{VHZ3ByWvTwgs0$X zcm}HAS$GbfhiZ5MUWAum5A20kU?02+ufglEAKrjB;Vr0vx8WUl7Y@LCa1h>yL+}B7 z2p_>=_!vHcTKE(`gU{h8d;wp=S5OCE!#D6P9E0!Rd-ws4!(ZV?_#2#nzr#=PGt|Q` z@GJZVfhHmZLLmiGVK|I{k&p(XU^I+@beI5BU@DvinQ%5tgL7aG%!SLK5}t+U;CZNq zSK$bJ0>46to{O3r3aKz0M!*;C(_jwFh0CD|UWGt}2!m7@3d0}> zqhSoB!#EfZ8889PhG{Sd=E7xA3D3Zbun%5^Bk&0Xnu`z^45=_2M!-nWXEXGMU=GZM z%V00O32#9SyaRn(h(s6wNiYzSVGyLi7|`eH^x+!D!Fb4k2`~{JfeLsGcEaPZ3!Z@8 z@FY~i9(Wn{!Yi;3UWL~ns--v$2EafV1WTa+mO&vbhZV3AR>5kx2rh;qSOb?pFo`gzx5qh-}y`c{zKtJdYi7)_? zU?2>F6c_?SVLF@(Ghr5F!%`@KWl#v0!xeBPTn~4^`KO4PFbmq~dF{EUKqT~o{xB8J zf&y3u74R554!ht9*bPrYB|HT$!ppE1UV(k^D!c}-!+v-J-h{W{185v2nnE*(facH= zVxS{*g3b^NU7#y;gE;68J)kGVLoetJeINn)LOgZ)04Bj?m;zJbEXahjVH%tR)8Sm00p~#$oDVZ$ z7G%S0m;-Ym2j;u6Wj%x;cnOh_rSeyA8dvD zVH?DpCOSeV=mv4n4+cRB42E{6izqk)ronVL7iPeDkOk+%Ovr{gFc0R#1+V~eVIeGn zJXi*WupCyvN>~M};Uc&gir`Y%4v)YNcoZt&G1v)@!!CFNcEgiU2~WY(@C;PJv+x`| z57qDjya+GB9(Wn{!Yi;3UWL~naE1thP-p;&kOTuE83sWLq{0YT1bJ{FEQTeJ4@;o{ zmO(LG2Akn-*aG*!R=6J?fO2>cK7*t11$+(P!ZG*`;-f_`=nZ`!0s2Be=nqLS5cb0x z@Fvv2+wcy&3kTpmI0)~a031gKf%vX55K^#@EbIX z5zV0mw1ghe6XKy4^oDGh4Rc^Fy zL+}B72p_>=_!y4BCr}HY!e{U~9EC67OZW=v;A{8>zJ+66#Z&MdT-r+!%_GGzJ#x!4!(wO;9EEb-@*6r1009H!jJGbI01i$pWtVxhhN}V_zn2dcWzIJ zhhA_SY=9;AihNiK1yBgfVFj#&Rj?W^f{URD*1$%%6OO@m5V}<~f@aVKxQ+fKNtW>FcLDL2)4rxcoZt&ao7b%J=mv4n9eO}d zh=*R#8~VU+@b}-uPw+GR5)z_!pHQ))fmjKvU^QF>Ax%XnG=PTC2qK_4w1Ae741*vA zhCvlP3(vvxPz^7@OYk!6g;(J&y2s9TV5DE<-3>rcsXbj=d1e!uKh=AtM0$M^VXbo-P6o`aVp)It7C^!vHhch4= z&V=^R0b-ydbb`(h3tgZqbb|+4h;sM^eudv4p{3{x{h&W2!T?BufshP?AO!|PDhz?4 zFbsk)97e!MNQ2QZ2GU_HjDzuz0TW;%OoGWU1*XDTkO}#)6bfJ&6vA>?0V`n@tcHu= zVkm+&a0y%r#c&y14u66YxB|Ar4tNwQ;4#<`t2hT$_ybOEc z6$oi1l3@^}z+gy)Autq%K@f(+2p9=zFbYOPJ}iSmxD<-vGI$g!;4#<92+5IR5Tw9hNQEIV6o$bF7zt@G8fLIh z&>3Q(3v`1x=ng%gC-jLD3D6h%L4Qbu0gwa(VGyLi;L}7Z426+U18>7S@GcyL_u(*v zoGwD40fa$AXatQR9GXB==nsi70Fq!JB*S1xg&{B$#=sPq3THtkoDI|9T$lmp!L@K5 zl*09J1KbE};U>5l{tWBjFK`R2hua__TJ(i}&>s?E03<;&41yFG45=^#hQZD7XIKY+ zfm`5KSP!?s2Dlx{;11XbcfuyP3pT^uum$dcd*MFV1`j|vJO~fL!>}E8z@zXO?1a8& zihj@^5@7%&K?u2pU5;G=Zkj3?iU8w1Ae-3R*)OI0Yi%RA>wBAPP={)8Pz=hBKi(bbuJ>2%Vra z#6lP73f&+Mx3GvVi5}+^igZ_{R10V?oLNW}36c`MtFa(CeFbKkM7y%<84MxFe zxZn-30CHg&6vA>?0V`n@tcHu=Vkm+&a0y%r#c&y14p+dHa1~q)*TA)K9c+UKpd22A z5pRl-kOqN+A_PLA0fa$AXatQR9GXB=Xa*6`99lq2Xa%jI4V(gza4NKgb`S-p!Rc@Y zM8lcT9y&k_bc9aO8DgOebcJpZ2i>6u^n`fm1-+pUBtT#22mK)t20#)FhEx~=Ltz*M zVK|I{k&p(XU^I+@bQlZcU_4~N1egeuU@}aBsc;r#!r3ql&VlK0F3f=QAPdfinJ^2o zVK&TxxsU_%U_M*`3m_L3!Xn6nsg45u1 zI0K^LOlS`sAO<=@C+G~Z&;`0eH;9Ao&;xoxJoJLz&<7HrFZ6@{kO%`H2?jzk41yFG z45=^#hQcri!f+S?BOwh&!Dtu*=`a??!FUJ>w9qdQIzlJt46)D!xg9vC2 zEubZ|g4WOmPJu``71}~Oh=SALbT|W|;Y?@`9UuleLMP}9vCsv&LN|zm?$85zLOk?> z-p~gUpfB`;{*VX*APELSG7N$g7!0W}1ct&e2*Pj}0V5#|M!{$p1L-gp#=&^VfC(@W zCc$Kw0#o5E$b_?D8k_^u;ar#j=Rp>n4>MsFWW#Kj19Kq<=D~cp02V+lEQCdn2N%L( zSOWR56bfJ&6vA>?0V`n@tcHu=Vkm+&a0y%r#c&y14u66YxB{+(tKe$52CjwcpcJl$ z8{kG*3pc^d@Ml;De}P-zR#*?W!3MY;%HR&z2zSCJxC=JJ-LM7jfqUUT*b4WV2VcWC@U4j3p>Jg4+us7c_5TXX6lIm=#mbTp?|{E4iyC+t(6_K2whUEm9dr)%6LnCvOADysn2Z&QZ4n#zCfB~q%y-&pPve3TI%ygfh^0@ zl{uEt$~;T`Cw`#NGDcZs*-2Sq8LKR{?5bR68K*3>?4jIZ8Luq2?5(V@Oi)%@_ET0{ zCMjzy2PqF(4pttu9HKmCIZS!Na-=f6p?4-nDO*|U+j0X@mSdGMmim_5K)mHdWuoO| zWvb;=WtwHCGQ)D3GShOpGRty?GRHDYnP)juS!kK9EV7)VEV0Z{mRinNuCrXAEVI;S z9|Bt}^OWV5im()3T2JuD&-+dzJdCvXaur83g;8fA>-4ax+|KP%HMZ&7AimML>A?^Ld`+^j6I+@dVCyjQu-@_ywe%W~yb z%ZHQ|mX9c_EFV+uw|rcAz*3)G3DjCvE00_1Qv-qI#@??@|2-ZETE3-Bw|rYU+45cG zbj$aY*_Q7s7g&C%%(pzOEV4YJEU~OrmRf$MTxWSyS!VgAa*Ji1vfT0;WrgK;%1X;0 zl{J<>DQhk3m35ZCDvw(R^r{8*mZ8e9aQg_OjIeB^jI<0_Mq4&j##%-w<1Je#6D?aQ zQ!U#l(<~#E8J2C8nU+z?EX&iCIhN7NJj?dVLdzIsk!2@kiDj&^)UvB`on@S|%(91a zi)FmB+_JZ_!ZJZwY1vO%ZJDCnXE{W9%yPK0-g2Ze++MdJT^VgTP8n;Np^Uejs7$on zu1vLjPFdU3JL_*Mqndg7wQ{@Vx5{0Xd~0|h!aIO(3lFy!@8G+{4O3UNQeU^V$9=7~NS!bE8f5TR_^3Kj2Wl3u< zbCji)^Ofr?7bwdt7b>?{@_Gs7mW!1Ymifv`%K~M!WubDPIO%W`G8zD05Er z&cjv8V#{lkF>Sp|pH`+>Rw?T(pI3(2YuCJ}Y-PDe8QrcRLLbMy+y0=fm$lIcvA`LP z^g%ev%b>E@GFusTns@1Pm*yyo zyLg$eTyI&TthT&f8QIl4;3j3N<^9SG%SV)3Egx0xvD~dZVEKabnB~jL=x*Mfy{?S6 zJfO_7tW_3Uey?0_`HS+He!xz(~lxyN$1vc~d7%IKcn{l2D*w|qkxw5(MYTOL!cw+uAXyQgKCGA!P^ zhvv#i%ht+N%kIhy%f8C3mWj$emMO{_%TdZ>mSdICz3fCO<1MEvGc9wJMV9%>^_B(7 zYReL3cyI3>u2V)@-lR;nyhWLAdAl;l@(yLbD-K@1T*|NJb-7-bF)pC^bnB`byR9`z$$~en& zl$n<2DYGqSDhn-hl*N|$%Jr5d%0NHw&aPKRTHd5gw!B}NZdsw+YPnlkWBG#enB~jL zsQz{ylyR2tDl;uVQWjd)DvK?TDc4&bS5{j#Z>~p{XlF;6Y^fKw3Zz?(RYnc)4w$5j zvz)G+Y?-4hvdmYmw=7m3wJcGFC3*L7t1{AZhjM{srE;I;)5_zPFDU~9y_>zFjI(@O znQHm2a=PVVWwzxp<$BBG$~~6-Tj(()dv`Wix!-bWrF3s%5|2HD$6XNR_?caK^YkA-PudZD9hKCF_s6FLCeF+RhA(wb+c6OW)aGG z%hQ$FmOYfkmPyJQ%Vgyt%M@j;RE?P{vwLRVG`Wqs*|(Qf6D`Dhn+y zRBpB8n`)~q`L5dimVBq|QOhfo;X}Q*#`nNRS*}-3w&a^#b1eDx)>W2#Lu;ue-@>}d zl5a+>uzX5+)bb@|)G+T&jBBNH7W8tXGC17JpUIJ423qT#%W`ZR9h>f5I#C%n*2{C0 zLCbTM*_Jbv3oNfu7F*t+j2q|O>=9+qa;I{STfNgx_AV_}R-WtS?OZy;%deEhmVZ}P zpXXiLR^OKz$ntW4vdA)%OV9T%y--8Gz#Q+=AC*;>9rSI7fgJDBcxAC=s|L6y?@bHjdpV9=>g6TMM9a67!DZg1KPx9& z#_L05vz(+%UhW;RN?C4syRz0Y&|bG)=^YTN3|r-8m@>k$kuuUU zTp4ZIR2gd-p^Ud|p-i-FrA)PKqfE1mRAyMVRc2a7DYGn3SLRqoEAuSdD+?`Sltq@E zlqHt2%2La&%5|1;$}-Cy$}N`h%5uxz$_mQ_Wu;|5Wwm9Za-U_Avc@u5dB`$FS!3O)?1EHhOPF_Z<;c~aoT^N-%v5Gr zPE%%DPFH4G&QRu9W-0S5XDSOVvz0}bbCe~PIm%MY`O0;c3zTJ+3zb_e^OWV5im()3T2JuD&--|i6P3gb5^Q4aYcTGe8MR>2!Xw}Fc+3|Xd`XVHs zAP&sYDCz5u3pCcbp(hRnHo37#W2+k%YHW9-K%?4?1| z^4!>{QRv1djUqQTYm~ULMWfV>do|X%u~nnYjcpoR+$h&5cjFStPjYK#0YoxmIrbe0@H5wUiyrYrn#sQ5iHx6p#xN%4$&y5c?3f(xYQRK!E zjS@FL)hKo2YmM!0e6O*~jpG{o-00d%|8(d%^4>daoJN@&y)`P_SfEkm#;qFl1N__E zr%{~bkB2ojx$!u+apM_{!*0B!5g6#-=5>u2H{R6JdthVyDacJ*)EK+iSsj!n?ZfJdhJ zqe`QAw2sw(#{~-X2NM-ALDnc4M4ItQ#2`@or4iNOWVeMyeZAHPYP3)W~pSnntD@(>1c(n4yv5 zMwUjN8#6Tu-N@D`a$}B0i5oc@rEbjESm(w9jWRbDYHV>MPovz8e2oe>F45TUMzKb{ z8<%T@=}QgX87aN|miNH?z5h<4*zjaWBIHR9d4K_k(PwHm2z+^mu2#yX7*H*V3$ zbYs0nmKz&1a@;7>$aCW}ja6=ZuTgb||4WGJraRErOT1rCtVXFDT{YIZ5vNh+Mh}fG zZp3SpyU|;t!i|0!m2M~kYYqsEP7jYDpvXwthm1U2g27@-k%rhC8E zh;U=HMx-0*8qscy(};B=LnGdei5iJ+Ox8$sW2#1)8<`pzZcNk2bYr?kmK!rPa@@$$ z$a7<+Mxh(o8bxl*(I{~vN2An@`5NooSfEkn#zKuPZsci{yRlfK!i{{5N;g((RJ(Dp z#!)xcXdH8+Sfk#J%QeFEH8p$p*NAZAN{vW2uF;5g<9dw*H`Zz-yK%Ednj5!hWVo?j zBg>5q8aZy1Y2>-FQKQg}O&UdRY}P1oV~a+q8~19gb7QMUnH$?Qwz#ofqtcC?8Z~b0 z(m3SCZjD+uDmCidcv|DQ8&w+hZak+E*1708aZy9&^X{moSsm3)Qw&m+hhEPQ>YQ>=#Li}`dX>?yM0h2*x4T^G>YA* z*Qj%&cX$1=-N@9a(pOl$J9t(jps%soy=kO&^T%%*#cmAb8Gicut9RH$Mt6VA&qa|`G&j0w6uZ$!W0M=_ zX;itPCu0YS-OqRVN+Zz6zw2)_w!85Yw{c_3IXX;VJ@y_!tBdpx#sdEbd9=|;bK_Kv z3^!slirna=QQ}4yjZ!yyXq36pK~K(GrPr7C-cG_LdZ2p2Xm1p1?9&TJdm|#iA20kL zMAJ)Ch+7ckr`DAk-hfhJ@-#Wd68=CyzDt#~T{OZhXvW z=3f)jK!-*6W4K0z8{;&>oBP*XtPyl$Be!YcUsJ77?8bhLn3n!E8^iSLY2}Y?8pUn= zQLmAGia+8S>fR##k)u)N#%7JIw*ECcG)mprt+CIIr!?x^7}!|%7Ukb&8skiVEYK)+ z<1(&k?_bl1r_sguqlre08%Y{*ZVb{m0bn?d!T+`Vf zKWglEqiqu%7VBS=qEYO|F0Se7UsI)V!i_MV@fYV`(^w6(5Q0b%$E9RVX(V5jj~jKOwp)v z<4VR5|C$#VL;dkLjpAYc7{ik%gZ@~dv3|Hep46y!<9Utnk^VJbXawE(Nu$b*0j+g! zY5rkBjRS6^YqT2WUsI?NbYmrlx$%NVV6=bOs~WLm{PDg-hb3!d zxG_TGgd10J*f{^NYcyiqxIrV%jg1lqrsDgKzFvC54XIc%zb%^r>Dv;1+8+qkjwR2??Wzvfwu!)|=2 zk$sMT&2XNWJKZ0nG+LeOj~N<4H=f|I8U8hU8Rz-qjCLA&%8>WZT)al18z~x9Zj9lu z^ZmmH^AzB0e|*W9>yO5#={??!rW&z1{xy*r32wC0$aEt~BioHZ8i(9S)2MS}hDLCn ze{Wkgis$>|fW}rgj%X~nz`y2GjZ!y;@oeP<{x#_u(YgNEpb>OqqekIE|C+yRRJqZF z=Q!v4*9_E%b7Q#1VK-)I1ef}Ut<~7$##W8=0{@!FHMY3X_)Oh(p?^(NjTkouYQ(!S zSmUT0Lp6@Mk*-ni#te<%a{u1uYZSYYt5N30jT&3sxS89m@NaXQMur>PG>YB$o1WZV ze6fF6>kfLJoo!=&U=?Ys!1?d}&=Y+W6zUKDy0N ze>G`s z8-L|6HwG@!Ve$T9X^dX}n4uALW0gj!8*4R=yHUJYk6@60oAFC@2YT&y@3CF2kvha5 zn;1j=aYUn7uMY1W_Nhjx22T{XOHS}}*@FJn??hZj9rahW<5^G?LwTc#h6aQ~#QuGy=`s&`)9up5l+s^>f&YJNTncW0M=-YE-!K zn?{uzFYsgAV*J~@s}bz%j|}}Rx2t3QF+(HRrDdRiPlOieNvweaJ>xXMkF*KsLy*uj zC<6t0N??Ge+y%Oac)zVJV)Q4lK!|?wqW8s_UApE_sFy4BX8j*g%8z>7*Ur0iq3*Q! zG%xuvNmXZf_foIVtk&r>tKAzMY&3b=@Qkr(2g65BnwU9idgi$QUXvzv4?Eaw)~prt z3YO(ASv+gj!N$wx7Ubp^E<4zK;ga0Nxr;BDRk%8T-m-(O=Pt>am#>QoXU)xXM zW%maPy7S24r}O(P$uI1)EI)7g;zfPt70&H5J3oI}pUmOCmMxiEFgs^`g`p-uX M(V6+@x48Ge0hYr_PXGV_ literal 0 HcmV?d00001 diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna/__pycache__/intranges.cpython-39.pyc b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna/__pycache__/intranges.cpython-39.pyc new file mode 100755 index 0000000000000000000000000000000000000000..d743777c6bc6113e74af20e6f5f4c4a7c32eb7cd GIT binary patch literal 1993 zcmZuyOK;pZ5GE-~Ua#%cc{H(610_iS!l}gkVD%bbQN{#EHIEca2PSc_gx}NSTgR4cUC&JX)_Cd%>ZB+9B~#@*TwO3PdEhUnzmUcMcR!C(*% z#P%NMtL;nJ99^H+%KA{(U#3>P635~Dx%SJY$tSr^3xB}-*C8k2@~INvuNUQH{WG6; z91r?OfC<@(SVkjU2M~l!DzXc)sSq=8yuoJpBX`eR5Lk|G`&4u>eX1<L~%Qk*gEm@;B>Q{1^N8jJ-g z>e8XDLrCqwM?3le&k=%YaEPNevZZlKwxO>>8x%^nQCd|HqFqX$NU&wnt%W{P92xBB z(L(2#AWwiMKFv|TNP#skP3}}n^U+dP8v~^80{lVDGI;*=T9 z87{)c_9_gd*P|TXWq4O8qgUt}jhMLvD{;_<9+WnK)0+@f8AF%j2j}>C-ebT9uCjZ; z6nu{o+<8}C~4^6!c{YFi<;rT|xc>tf^5KD&}-p7$W zAY;7Ef-Ung=nJ&^@aDst;CO#(@T}dg=;*fwJf%9r^K;OjBykPqaC{DxOUwmy_|NIF z;}LkD%xjon*GqcHX3Wud(C-a<&t?JiFWu*6%LQF8uRwnv(r0YOp_6$7Ap){b&7&rS zn_x@BwXeAho{|Q89BvHIzUX{U{UY>(`{4!JNe;&jU*CPGoHEl~Llca}4(7ch#&AJf zynahj!ou+-+YtkAz@2WoGw|d$c%tn`ap)mvqum^CaMvz$ze%CS&R|^({=LO>W(DV1 zn^EK&A!&oEv@J(NXrFwt=USTlyXF_q$O!)tF3t595Tc_Z>(j-c2NYbPoGk(&k(%aH z+-{+rOA=XTNn%z(ZXBqXU&Kg56Vm%921Zce6x=)v7_ z+zm%bGGzhkHj(q-k0Jac3SkrI;vk$I8ISfX9bLyozFh3msGlKTgmqFY#5=R2F#E`h zKpPLvG_9&Z_zK7v2ZwFubY+Q?&7`U%7s@**r2 Tuple[bytes, int]: + if errors != "strict": + raise IDNAError('Unsupported error handling "{}"'.format(errors)) + + if not data: + return b"", 0 + + return encode(data), len(data) + + def decode(self, data: bytes, errors: str = "strict") -> Tuple[str, int]: + if errors != "strict": + raise IDNAError('Unsupported error handling "{}"'.format(errors)) + + if not data: + return "", 0 + + return decode(data), len(data) + + +class IncrementalEncoder(codecs.BufferedIncrementalEncoder): + def _buffer_encode(self, data: str, errors: str, final: bool) -> Tuple[bytes, int]: + if errors != "strict": + raise IDNAError('Unsupported error handling "{}"'.format(errors)) + + if not data: + return b"", 0 + + labels = _unicode_dots_re.split(data) + trailing_dot = b"" + if labels: + if not labels[-1]: + trailing_dot = b"." + del labels[-1] + elif not final: + # Keep potentially unfinished label until the next call + del labels[-1] + if labels: + trailing_dot = b"." + + result = [] + size = 0 + for label in labels: + result.append(alabel(label)) + if size: + size += 1 + size += len(label) + + # Join with U+002E + result_bytes = b".".join(result) + trailing_dot + size += len(trailing_dot) + return result_bytes, size + + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + def _buffer_decode(self, data: Any, errors: str, final: bool) -> Tuple[str, int]: + if errors != "strict": + raise IDNAError('Unsupported error handling "{}"'.format(errors)) + + if not data: + return ("", 0) + + if not isinstance(data, str): + data = str(data, "ascii") + + labels = _unicode_dots_re.split(data) + trailing_dot = "" + if labels: + if not labels[-1]: + trailing_dot = "." + del labels[-1] + elif not final: + # Keep potentially unfinished label until the next call + del labels[-1] + if labels: + trailing_dot = "." + + result = [] + size = 0 + for label in labels: + result.append(ulabel(label)) + if size: + size += 1 + size += len(label) + + result_str = ".".join(result) + trailing_dot + size += len(trailing_dot) + return (result_str, size) + + +class StreamWriter(Codec, codecs.StreamWriter): + pass + + +class StreamReader(Codec, codecs.StreamReader): + pass + + +def search_function(name: str) -> Optional[codecs.CodecInfo]: + if name != "idna2008": + return None + return codecs.CodecInfo( + name=name, + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) + + +codecs.register(search_function) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna/compat.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna/compat.py new file mode 100755 index 00000000..1df9f2a7 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna/compat.py @@ -0,0 +1,15 @@ +from typing import Any, Union + +from .core import decode, encode + + +def ToASCII(label: str) -> bytes: + return encode(label) + + +def ToUnicode(label: Union[bytes, bytearray]) -> str: + return decode(label) + + +def nameprep(s: Any) -> None: + raise NotImplementedError("IDNA 2008 does not utilise nameprep protocol") diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna/core.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna/core.py new file mode 100755 index 00000000..9115f123 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna/core.py @@ -0,0 +1,437 @@ +import bisect +import re +import unicodedata +from typing import Optional, Union + +from . import idnadata +from .intranges import intranges_contain + +_virama_combining_class = 9 +_alabel_prefix = b"xn--" +_unicode_dots_re = re.compile("[\u002e\u3002\uff0e\uff61]") + + +class IDNAError(UnicodeError): + """Base exception for all IDNA-encoding related problems""" + + pass + + +class IDNABidiError(IDNAError): + """Exception when bidirectional requirements are not satisfied""" + + pass + + +class InvalidCodepoint(IDNAError): + """Exception when a disallowed or unallocated codepoint is used""" + + pass + + +class InvalidCodepointContext(IDNAError): + """Exception when the codepoint is not valid in the context it is used""" + + pass + + +def _combining_class(cp: int) -> int: + v = unicodedata.combining(chr(cp)) + if v == 0: + if not unicodedata.name(chr(cp)): + raise ValueError("Unknown character in unicodedata") + return v + + +def _is_script(cp: str, script: str) -> bool: + return intranges_contain(ord(cp), idnadata.scripts[script]) + + +def _punycode(s: str) -> bytes: + return s.encode("punycode") + + +def _unot(s: int) -> str: + return "U+{:04X}".format(s) + + +def valid_label_length(label: Union[bytes, str]) -> bool: + if len(label) > 63: + return False + return True + + +def valid_string_length(label: Union[bytes, str], trailing_dot: bool) -> bool: + if len(label) > (254 if trailing_dot else 253): + return False + return True + + +def check_bidi(label: str, check_ltr: bool = False) -> bool: + # Bidi rules should only be applied if string contains RTL characters + bidi_label = False + for idx, cp in enumerate(label, 1): + direction = unicodedata.bidirectional(cp) + if direction == "": + # String likely comes from a newer version of Unicode + raise IDNABidiError("Unknown directionality in label {} at position {}".format(repr(label), idx)) + if direction in ["R", "AL", "AN"]: + bidi_label = True + if not bidi_label and not check_ltr: + return True + + # Bidi rule 1 + direction = unicodedata.bidirectional(label[0]) + if direction in ["R", "AL"]: + rtl = True + elif direction == "L": + rtl = False + else: + raise IDNABidiError("First codepoint in label {} must be directionality L, R or AL".format(repr(label))) + + valid_ending = False + number_type: Optional[str] = None + for idx, cp in enumerate(label, 1): + direction = unicodedata.bidirectional(cp) + + if rtl: + # Bidi rule 2 + if direction not in [ + "R", + "AL", + "AN", + "EN", + "ES", + "CS", + "ET", + "ON", + "BN", + "NSM", + ]: + raise IDNABidiError("Invalid direction for codepoint at position {} in a right-to-left label".format(idx)) + # Bidi rule 3 + if direction in ["R", "AL", "EN", "AN"]: + valid_ending = True + elif direction != "NSM": + valid_ending = False + # Bidi rule 4 + if direction in ["AN", "EN"]: + if not number_type: + number_type = direction + else: + if number_type != direction: + raise IDNABidiError("Can not mix numeral types in a right-to-left label") + else: + # Bidi rule 5 + if direction not in ["L", "EN", "ES", "CS", "ET", "ON", "BN", "NSM"]: + raise IDNABidiError("Invalid direction for codepoint at position {} in a left-to-right label".format(idx)) + # Bidi rule 6 + if direction in ["L", "EN"]: + valid_ending = True + elif direction != "NSM": + valid_ending = False + + if not valid_ending: + raise IDNABidiError("Label ends with illegal codepoint directionality") + + return True + + +def check_initial_combiner(label: str) -> bool: + if unicodedata.category(label[0])[0] == "M": + raise IDNAError("Label begins with an illegal combining character") + return True + + +def check_hyphen_ok(label: str) -> bool: + if label[2:4] == "--": + raise IDNAError("Label has disallowed hyphens in 3rd and 4th position") + if label[0] == "-" or label[-1] == "-": + raise IDNAError("Label must not start or end with a hyphen") + return True + + +def check_nfc(label: str) -> None: + if unicodedata.normalize("NFC", label) != label: + raise IDNAError("Label must be in Normalization Form C") + + +def valid_contextj(label: str, pos: int) -> bool: + cp_value = ord(label[pos]) + + if cp_value == 0x200C: + if pos > 0: + if _combining_class(ord(label[pos - 1])) == _virama_combining_class: + return True + + ok = False + for i in range(pos - 1, -1, -1): + joining_type = idnadata.joining_types.get(ord(label[i])) + if joining_type == ord("T"): + continue + elif joining_type in [ord("L"), ord("D")]: + ok = True + break + else: + break + + if not ok: + return False + + ok = False + for i in range(pos + 1, len(label)): + joining_type = idnadata.joining_types.get(ord(label[i])) + if joining_type == ord("T"): + continue + elif joining_type in [ord("R"), ord("D")]: + ok = True + break + else: + break + return ok + + if cp_value == 0x200D: + if pos > 0: + if _combining_class(ord(label[pos - 1])) == _virama_combining_class: + return True + return False + + else: + return False + + +def valid_contexto(label: str, pos: int, exception: bool = False) -> bool: + cp_value = ord(label[pos]) + + if cp_value == 0x00B7: + if 0 < pos < len(label) - 1: + if ord(label[pos - 1]) == 0x006C and ord(label[pos + 1]) == 0x006C: + return True + return False + + elif cp_value == 0x0375: + if pos < len(label) - 1 and len(label) > 1: + return _is_script(label[pos + 1], "Greek") + return False + + elif cp_value == 0x05F3 or cp_value == 0x05F4: + if pos > 0: + return _is_script(label[pos - 1], "Hebrew") + return False + + elif cp_value == 0x30FB: + for cp in label: + if cp == "\u30fb": + continue + if _is_script(cp, "Hiragana") or _is_script(cp, "Katakana") or _is_script(cp, "Han"): + return True + return False + + elif 0x660 <= cp_value <= 0x669: + for cp in label: + if 0x6F0 <= ord(cp) <= 0x06F9: + return False + return True + + elif 0x6F0 <= cp_value <= 0x6F9: + for cp in label: + if 0x660 <= ord(cp) <= 0x0669: + return False + return True + + return False + + +def check_label(label: Union[str, bytes, bytearray]) -> None: + if isinstance(label, (bytes, bytearray)): + label = label.decode("utf-8") + if len(label) == 0: + raise IDNAError("Empty Label") + + check_nfc(label) + check_hyphen_ok(label) + check_initial_combiner(label) + + for pos, cp in enumerate(label): + cp_value = ord(cp) + if intranges_contain(cp_value, idnadata.codepoint_classes["PVALID"]): + continue + elif intranges_contain(cp_value, idnadata.codepoint_classes["CONTEXTJ"]): + try: + if not valid_contextj(label, pos): + raise InvalidCodepointContext( + "Joiner {} not allowed at position {} in {}".format(_unot(cp_value), pos + 1, repr(label)) + ) + except ValueError: + raise IDNAError( + "Unknown codepoint adjacent to joiner {} at position {} in {}".format( + _unot(cp_value), pos + 1, repr(label) + ) + ) + elif intranges_contain(cp_value, idnadata.codepoint_classes["CONTEXTO"]): + if not valid_contexto(label, pos): + raise InvalidCodepointContext( + "Codepoint {} not allowed at position {} in {}".format(_unot(cp_value), pos + 1, repr(label)) + ) + else: + raise InvalidCodepoint( + "Codepoint {} at position {} of {} not allowed".format(_unot(cp_value), pos + 1, repr(label)) + ) + + check_bidi(label) + + +def alabel(label: str) -> bytes: + try: + label_bytes = label.encode("ascii") + ulabel(label_bytes) + if not valid_label_length(label_bytes): + raise IDNAError("Label too long") + return label_bytes + except UnicodeEncodeError: + pass + + check_label(label) + label_bytes = _alabel_prefix + _punycode(label) + + if not valid_label_length(label_bytes): + raise IDNAError("Label too long") + + return label_bytes + + +def ulabel(label: Union[str, bytes, bytearray]) -> str: + if not isinstance(label, (bytes, bytearray)): + try: + label_bytes = label.encode("ascii") + except UnicodeEncodeError: + check_label(label) + return label + else: + label_bytes = label + + label_bytes = label_bytes.lower() + if label_bytes.startswith(_alabel_prefix): + label_bytes = label_bytes[len(_alabel_prefix) :] + if not label_bytes: + raise IDNAError("Malformed A-label, no Punycode eligible content found") + if label_bytes.decode("ascii")[-1] == "-": + raise IDNAError("A-label must not end with a hyphen") + else: + check_label(label_bytes) + return label_bytes.decode("ascii") + + try: + label = label_bytes.decode("punycode") + except UnicodeError: + raise IDNAError("Invalid A-label") + check_label(label) + return label + + +def uts46_remap(domain: str, std3_rules: bool = True, transitional: bool = False) -> str: + """Re-map the characters in the string according to UTS46 processing.""" + from .uts46data import uts46data + + output = "" + + for pos, char in enumerate(domain): + code_point = ord(char) + try: + uts46row = uts46data[code_point if code_point < 256 else bisect.bisect_left(uts46data, (code_point, "Z")) - 1] + status = uts46row[1] + replacement: Optional[str] = None + if len(uts46row) == 3: + replacement = uts46row[2] + if ( + status == "V" + or (status == "D" and not transitional) + or (status == "3" and not std3_rules and replacement is None) + ): + output += char + elif replacement is not None and ( + status == "M" or (status == "3" and not std3_rules) or (status == "D" and transitional) + ): + output += replacement + elif status != "I": + raise IndexError() + except IndexError: + raise InvalidCodepoint( + "Codepoint {} not allowed at position {} in {}".format(_unot(code_point), pos + 1, repr(domain)) + ) + + return unicodedata.normalize("NFC", output) + + +def encode( + s: Union[str, bytes, bytearray], + strict: bool = False, + uts46: bool = False, + std3_rules: bool = False, + transitional: bool = False, +) -> bytes: + if not isinstance(s, str): + try: + s = str(s, "ascii") + except UnicodeDecodeError: + raise IDNAError("should pass a unicode string to the function rather than a byte string.") + if uts46: + s = uts46_remap(s, std3_rules, transitional) + trailing_dot = False + result = [] + if strict: + labels = s.split(".") + else: + labels = _unicode_dots_re.split(s) + if not labels or labels == [""]: + raise IDNAError("Empty domain") + if labels[-1] == "": + del labels[-1] + trailing_dot = True + for label in labels: + s = alabel(label) + if s: + result.append(s) + else: + raise IDNAError("Empty label") + if trailing_dot: + result.append(b"") + s = b".".join(result) + if not valid_string_length(s, trailing_dot): + raise IDNAError("Domain too long") + return s + + +def decode( + s: Union[str, bytes, bytearray], + strict: bool = False, + uts46: bool = False, + std3_rules: bool = False, +) -> str: + try: + if not isinstance(s, str): + s = str(s, "ascii") + except UnicodeDecodeError: + raise IDNAError("Invalid ASCII in A-label") + if uts46: + s = uts46_remap(s, std3_rules, False) + trailing_dot = False + result = [] + if not strict: + labels = _unicode_dots_re.split(s) + else: + labels = s.split(".") + if not labels or labels == [""]: + raise IDNAError("Empty domain") + if not labels[-1]: + del labels[-1] + trailing_dot = True + for label in labels: + s = ulabel(label) + if s: + result.append(s) + else: + raise IDNAError("Empty label") + if trailing_dot: + result.append("") + return ".".join(result) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna/idnadata.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna/idnadata.py new file mode 100755 index 00000000..4be60046 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna/idnadata.py @@ -0,0 +1,4243 @@ +# This file is automatically generated by tools/idna-data + +__version__ = "15.1.0" +scripts = { + "Greek": ( + 0x37000000374, + 0x37500000378, + 0x37A0000037E, + 0x37F00000380, + 0x38400000385, + 0x38600000387, + 0x3880000038B, + 0x38C0000038D, + 0x38E000003A2, + 0x3A3000003E2, + 0x3F000000400, + 0x1D2600001D2B, + 0x1D5D00001D62, + 0x1D6600001D6B, + 0x1DBF00001DC0, + 0x1F0000001F16, + 0x1F1800001F1E, + 0x1F2000001F46, + 0x1F4800001F4E, + 0x1F5000001F58, + 0x1F5900001F5A, + 0x1F5B00001F5C, + 0x1F5D00001F5E, + 0x1F5F00001F7E, + 0x1F8000001FB5, + 0x1FB600001FC5, + 0x1FC600001FD4, + 0x1FD600001FDC, + 0x1FDD00001FF0, + 0x1FF200001FF5, + 0x1FF600001FFF, + 0x212600002127, + 0xAB650000AB66, + 0x101400001018F, + 0x101A0000101A1, + 0x1D2000001D246, + ), + "Han": ( + 0x2E8000002E9A, + 0x2E9B00002EF4, + 0x2F0000002FD6, + 0x300500003006, + 0x300700003008, + 0x30210000302A, + 0x30380000303C, + 0x340000004DC0, + 0x4E000000A000, + 0xF9000000FA6E, + 0xFA700000FADA, + 0x16FE200016FE4, + 0x16FF000016FF2, + 0x200000002A6E0, + 0x2A7000002B73A, + 0x2B7400002B81E, + 0x2B8200002CEA2, + 0x2CEB00002EBE1, + 0x2EBF00002EE5E, + 0x2F8000002FA1E, + 0x300000003134B, + 0x31350000323B0, + ), + "Hebrew": ( + 0x591000005C8, + 0x5D0000005EB, + 0x5EF000005F5, + 0xFB1D0000FB37, + 0xFB380000FB3D, + 0xFB3E0000FB3F, + 0xFB400000FB42, + 0xFB430000FB45, + 0xFB460000FB50, + ), + "Hiragana": ( + 0x304100003097, + 0x309D000030A0, + 0x1B0010001B120, + 0x1B1320001B133, + 0x1B1500001B153, + 0x1F2000001F201, + ), + "Katakana": ( + 0x30A1000030FB, + 0x30FD00003100, + 0x31F000003200, + 0x32D0000032FF, + 0x330000003358, + 0xFF660000FF70, + 0xFF710000FF9E, + 0x1AFF00001AFF4, + 0x1AFF50001AFFC, + 0x1AFFD0001AFFF, + 0x1B0000001B001, + 0x1B1200001B123, + 0x1B1550001B156, + 0x1B1640001B168, + ), +} +joining_types = { + 0xAD: 84, + 0x300: 84, + 0x301: 84, + 0x302: 84, + 0x303: 84, + 0x304: 84, + 0x305: 84, + 0x306: 84, + 0x307: 84, + 0x308: 84, + 0x309: 84, + 0x30A: 84, + 0x30B: 84, + 0x30C: 84, + 0x30D: 84, + 0x30E: 84, + 0x30F: 84, + 0x310: 84, + 0x311: 84, + 0x312: 84, + 0x313: 84, + 0x314: 84, + 0x315: 84, + 0x316: 84, + 0x317: 84, + 0x318: 84, + 0x319: 84, + 0x31A: 84, + 0x31B: 84, + 0x31C: 84, + 0x31D: 84, + 0x31E: 84, + 0x31F: 84, + 0x320: 84, + 0x321: 84, + 0x322: 84, + 0x323: 84, + 0x324: 84, + 0x325: 84, + 0x326: 84, + 0x327: 84, + 0x328: 84, + 0x329: 84, + 0x32A: 84, + 0x32B: 84, + 0x32C: 84, + 0x32D: 84, + 0x32E: 84, + 0x32F: 84, + 0x330: 84, + 0x331: 84, + 0x332: 84, + 0x333: 84, + 0x334: 84, + 0x335: 84, + 0x336: 84, + 0x337: 84, + 0x338: 84, + 0x339: 84, + 0x33A: 84, + 0x33B: 84, + 0x33C: 84, + 0x33D: 84, + 0x33E: 84, + 0x33F: 84, + 0x340: 84, + 0x341: 84, + 0x342: 84, + 0x343: 84, + 0x344: 84, + 0x345: 84, + 0x346: 84, + 0x347: 84, + 0x348: 84, + 0x349: 84, + 0x34A: 84, + 0x34B: 84, + 0x34C: 84, + 0x34D: 84, + 0x34E: 84, + 0x34F: 84, + 0x350: 84, + 0x351: 84, + 0x352: 84, + 0x353: 84, + 0x354: 84, + 0x355: 84, + 0x356: 84, + 0x357: 84, + 0x358: 84, + 0x359: 84, + 0x35A: 84, + 0x35B: 84, + 0x35C: 84, + 0x35D: 84, + 0x35E: 84, + 0x35F: 84, + 0x360: 84, + 0x361: 84, + 0x362: 84, + 0x363: 84, + 0x364: 84, + 0x365: 84, + 0x366: 84, + 0x367: 84, + 0x368: 84, + 0x369: 84, + 0x36A: 84, + 0x36B: 84, + 0x36C: 84, + 0x36D: 84, + 0x36E: 84, + 0x36F: 84, + 0x483: 84, + 0x484: 84, + 0x485: 84, + 0x486: 84, + 0x487: 84, + 0x488: 84, + 0x489: 84, + 0x591: 84, + 0x592: 84, + 0x593: 84, + 0x594: 84, + 0x595: 84, + 0x596: 84, + 0x597: 84, + 0x598: 84, + 0x599: 84, + 0x59A: 84, + 0x59B: 84, + 0x59C: 84, + 0x59D: 84, + 0x59E: 84, + 0x59F: 84, + 0x5A0: 84, + 0x5A1: 84, + 0x5A2: 84, + 0x5A3: 84, + 0x5A4: 84, + 0x5A5: 84, + 0x5A6: 84, + 0x5A7: 84, + 0x5A8: 84, + 0x5A9: 84, + 0x5AA: 84, + 0x5AB: 84, + 0x5AC: 84, + 0x5AD: 84, + 0x5AE: 84, + 0x5AF: 84, + 0x5B0: 84, + 0x5B1: 84, + 0x5B2: 84, + 0x5B3: 84, + 0x5B4: 84, + 0x5B5: 84, + 0x5B6: 84, + 0x5B7: 84, + 0x5B8: 84, + 0x5B9: 84, + 0x5BA: 84, + 0x5BB: 84, + 0x5BC: 84, + 0x5BD: 84, + 0x5BF: 84, + 0x5C1: 84, + 0x5C2: 84, + 0x5C4: 84, + 0x5C5: 84, + 0x5C7: 84, + 0x610: 84, + 0x611: 84, + 0x612: 84, + 0x613: 84, + 0x614: 84, + 0x615: 84, + 0x616: 84, + 0x617: 84, + 0x618: 84, + 0x619: 84, + 0x61A: 84, + 0x61C: 84, + 0x620: 68, + 0x622: 82, + 0x623: 82, + 0x624: 82, + 0x625: 82, + 0x626: 68, + 0x627: 82, + 0x628: 68, + 0x629: 82, + 0x62A: 68, + 0x62B: 68, + 0x62C: 68, + 0x62D: 68, + 0x62E: 68, + 0x62F: 82, + 0x630: 82, + 0x631: 82, + 0x632: 82, + 0x633: 68, + 0x634: 68, + 0x635: 68, + 0x636: 68, + 0x637: 68, + 0x638: 68, + 0x639: 68, + 0x63A: 68, + 0x63B: 68, + 0x63C: 68, + 0x63D: 68, + 0x63E: 68, + 0x63F: 68, + 0x640: 67, + 0x641: 68, + 0x642: 68, + 0x643: 68, + 0x644: 68, + 0x645: 68, + 0x646: 68, + 0x647: 68, + 0x648: 82, + 0x649: 68, + 0x64A: 68, + 0x64B: 84, + 0x64C: 84, + 0x64D: 84, + 0x64E: 84, + 0x64F: 84, + 0x650: 84, + 0x651: 84, + 0x652: 84, + 0x653: 84, + 0x654: 84, + 0x655: 84, + 0x656: 84, + 0x657: 84, + 0x658: 84, + 0x659: 84, + 0x65A: 84, + 0x65B: 84, + 0x65C: 84, + 0x65D: 84, + 0x65E: 84, + 0x65F: 84, + 0x66E: 68, + 0x66F: 68, + 0x670: 84, + 0x671: 82, + 0x672: 82, + 0x673: 82, + 0x675: 82, + 0x676: 82, + 0x677: 82, + 0x678: 68, + 0x679: 68, + 0x67A: 68, + 0x67B: 68, + 0x67C: 68, + 0x67D: 68, + 0x67E: 68, + 0x67F: 68, + 0x680: 68, + 0x681: 68, + 0x682: 68, + 0x683: 68, + 0x684: 68, + 0x685: 68, + 0x686: 68, + 0x687: 68, + 0x688: 82, + 0x689: 82, + 0x68A: 82, + 0x68B: 82, + 0x68C: 82, + 0x68D: 82, + 0x68E: 82, + 0x68F: 82, + 0x690: 82, + 0x691: 82, + 0x692: 82, + 0x693: 82, + 0x694: 82, + 0x695: 82, + 0x696: 82, + 0x697: 82, + 0x698: 82, + 0x699: 82, + 0x69A: 68, + 0x69B: 68, + 0x69C: 68, + 0x69D: 68, + 0x69E: 68, + 0x69F: 68, + 0x6A0: 68, + 0x6A1: 68, + 0x6A2: 68, + 0x6A3: 68, + 0x6A4: 68, + 0x6A5: 68, + 0x6A6: 68, + 0x6A7: 68, + 0x6A8: 68, + 0x6A9: 68, + 0x6AA: 68, + 0x6AB: 68, + 0x6AC: 68, + 0x6AD: 68, + 0x6AE: 68, + 0x6AF: 68, + 0x6B0: 68, + 0x6B1: 68, + 0x6B2: 68, + 0x6B3: 68, + 0x6B4: 68, + 0x6B5: 68, + 0x6B6: 68, + 0x6B7: 68, + 0x6B8: 68, + 0x6B9: 68, + 0x6BA: 68, + 0x6BB: 68, + 0x6BC: 68, + 0x6BD: 68, + 0x6BE: 68, + 0x6BF: 68, + 0x6C0: 82, + 0x6C1: 68, + 0x6C2: 68, + 0x6C3: 82, + 0x6C4: 82, + 0x6C5: 82, + 0x6C6: 82, + 0x6C7: 82, + 0x6C8: 82, + 0x6C9: 82, + 0x6CA: 82, + 0x6CB: 82, + 0x6CC: 68, + 0x6CD: 82, + 0x6CE: 68, + 0x6CF: 82, + 0x6D0: 68, + 0x6D1: 68, + 0x6D2: 82, + 0x6D3: 82, + 0x6D5: 82, + 0x6D6: 84, + 0x6D7: 84, + 0x6D8: 84, + 0x6D9: 84, + 0x6DA: 84, + 0x6DB: 84, + 0x6DC: 84, + 0x6DF: 84, + 0x6E0: 84, + 0x6E1: 84, + 0x6E2: 84, + 0x6E3: 84, + 0x6E4: 84, + 0x6E7: 84, + 0x6E8: 84, + 0x6EA: 84, + 0x6EB: 84, + 0x6EC: 84, + 0x6ED: 84, + 0x6EE: 82, + 0x6EF: 82, + 0x6FA: 68, + 0x6FB: 68, + 0x6FC: 68, + 0x6FF: 68, + 0x70F: 84, + 0x710: 82, + 0x711: 84, + 0x712: 68, + 0x713: 68, + 0x714: 68, + 0x715: 82, + 0x716: 82, + 0x717: 82, + 0x718: 82, + 0x719: 82, + 0x71A: 68, + 0x71B: 68, + 0x71C: 68, + 0x71D: 68, + 0x71E: 82, + 0x71F: 68, + 0x720: 68, + 0x721: 68, + 0x722: 68, + 0x723: 68, + 0x724: 68, + 0x725: 68, + 0x726: 68, + 0x727: 68, + 0x728: 82, + 0x729: 68, + 0x72A: 82, + 0x72B: 68, + 0x72C: 82, + 0x72D: 68, + 0x72E: 68, + 0x72F: 82, + 0x730: 84, + 0x731: 84, + 0x732: 84, + 0x733: 84, + 0x734: 84, + 0x735: 84, + 0x736: 84, + 0x737: 84, + 0x738: 84, + 0x739: 84, + 0x73A: 84, + 0x73B: 84, + 0x73C: 84, + 0x73D: 84, + 0x73E: 84, + 0x73F: 84, + 0x740: 84, + 0x741: 84, + 0x742: 84, + 0x743: 84, + 0x744: 84, + 0x745: 84, + 0x746: 84, + 0x747: 84, + 0x748: 84, + 0x749: 84, + 0x74A: 84, + 0x74D: 82, + 0x74E: 68, + 0x74F: 68, + 0x750: 68, + 0x751: 68, + 0x752: 68, + 0x753: 68, + 0x754: 68, + 0x755: 68, + 0x756: 68, + 0x757: 68, + 0x758: 68, + 0x759: 82, + 0x75A: 82, + 0x75B: 82, + 0x75C: 68, + 0x75D: 68, + 0x75E: 68, + 0x75F: 68, + 0x760: 68, + 0x761: 68, + 0x762: 68, + 0x763: 68, + 0x764: 68, + 0x765: 68, + 0x766: 68, + 0x767: 68, + 0x768: 68, + 0x769: 68, + 0x76A: 68, + 0x76B: 82, + 0x76C: 82, + 0x76D: 68, + 0x76E: 68, + 0x76F: 68, + 0x770: 68, + 0x771: 82, + 0x772: 68, + 0x773: 82, + 0x774: 82, + 0x775: 68, + 0x776: 68, + 0x777: 68, + 0x778: 82, + 0x779: 82, + 0x77A: 68, + 0x77B: 68, + 0x77C: 68, + 0x77D: 68, + 0x77E: 68, + 0x77F: 68, + 0x7A6: 84, + 0x7A7: 84, + 0x7A8: 84, + 0x7A9: 84, + 0x7AA: 84, + 0x7AB: 84, + 0x7AC: 84, + 0x7AD: 84, + 0x7AE: 84, + 0x7AF: 84, + 0x7B0: 84, + 0x7CA: 68, + 0x7CB: 68, + 0x7CC: 68, + 0x7CD: 68, + 0x7CE: 68, + 0x7CF: 68, + 0x7D0: 68, + 0x7D1: 68, + 0x7D2: 68, + 0x7D3: 68, + 0x7D4: 68, + 0x7D5: 68, + 0x7D6: 68, + 0x7D7: 68, + 0x7D8: 68, + 0x7D9: 68, + 0x7DA: 68, + 0x7DB: 68, + 0x7DC: 68, + 0x7DD: 68, + 0x7DE: 68, + 0x7DF: 68, + 0x7E0: 68, + 0x7E1: 68, + 0x7E2: 68, + 0x7E3: 68, + 0x7E4: 68, + 0x7E5: 68, + 0x7E6: 68, + 0x7E7: 68, + 0x7E8: 68, + 0x7E9: 68, + 0x7EA: 68, + 0x7EB: 84, + 0x7EC: 84, + 0x7ED: 84, + 0x7EE: 84, + 0x7EF: 84, + 0x7F0: 84, + 0x7F1: 84, + 0x7F2: 84, + 0x7F3: 84, + 0x7FA: 67, + 0x7FD: 84, + 0x816: 84, + 0x817: 84, + 0x818: 84, + 0x819: 84, + 0x81B: 84, + 0x81C: 84, + 0x81D: 84, + 0x81E: 84, + 0x81F: 84, + 0x820: 84, + 0x821: 84, + 0x822: 84, + 0x823: 84, + 0x825: 84, + 0x826: 84, + 0x827: 84, + 0x829: 84, + 0x82A: 84, + 0x82B: 84, + 0x82C: 84, + 0x82D: 84, + 0x840: 82, + 0x841: 68, + 0x842: 68, + 0x843: 68, + 0x844: 68, + 0x845: 68, + 0x846: 82, + 0x847: 82, + 0x848: 68, + 0x849: 82, + 0x84A: 68, + 0x84B: 68, + 0x84C: 68, + 0x84D: 68, + 0x84E: 68, + 0x84F: 68, + 0x850: 68, + 0x851: 68, + 0x852: 68, + 0x853: 68, + 0x854: 82, + 0x855: 68, + 0x856: 82, + 0x857: 82, + 0x858: 82, + 0x859: 84, + 0x85A: 84, + 0x85B: 84, + 0x860: 68, + 0x862: 68, + 0x863: 68, + 0x864: 68, + 0x865: 68, + 0x867: 82, + 0x868: 68, + 0x869: 82, + 0x86A: 82, + 0x870: 82, + 0x871: 82, + 0x872: 82, + 0x873: 82, + 0x874: 82, + 0x875: 82, + 0x876: 82, + 0x877: 82, + 0x878: 82, + 0x879: 82, + 0x87A: 82, + 0x87B: 82, + 0x87C: 82, + 0x87D: 82, + 0x87E: 82, + 0x87F: 82, + 0x880: 82, + 0x881: 82, + 0x882: 82, + 0x883: 67, + 0x884: 67, + 0x885: 67, + 0x886: 68, + 0x889: 68, + 0x88A: 68, + 0x88B: 68, + 0x88C: 68, + 0x88D: 68, + 0x88E: 82, + 0x898: 84, + 0x899: 84, + 0x89A: 84, + 0x89B: 84, + 0x89C: 84, + 0x89D: 84, + 0x89E: 84, + 0x89F: 84, + 0x8A0: 68, + 0x8A1: 68, + 0x8A2: 68, + 0x8A3: 68, + 0x8A4: 68, + 0x8A5: 68, + 0x8A6: 68, + 0x8A7: 68, + 0x8A8: 68, + 0x8A9: 68, + 0x8AA: 82, + 0x8AB: 82, + 0x8AC: 82, + 0x8AE: 82, + 0x8AF: 68, + 0x8B0: 68, + 0x8B1: 82, + 0x8B2: 82, + 0x8B3: 68, + 0x8B4: 68, + 0x8B5: 68, + 0x8B6: 68, + 0x8B7: 68, + 0x8B8: 68, + 0x8B9: 82, + 0x8BA: 68, + 0x8BB: 68, + 0x8BC: 68, + 0x8BD: 68, + 0x8BE: 68, + 0x8BF: 68, + 0x8C0: 68, + 0x8C1: 68, + 0x8C2: 68, + 0x8C3: 68, + 0x8C4: 68, + 0x8C5: 68, + 0x8C6: 68, + 0x8C7: 68, + 0x8C8: 68, + 0x8CA: 84, + 0x8CB: 84, + 0x8CC: 84, + 0x8CD: 84, + 0x8CE: 84, + 0x8CF: 84, + 0x8D0: 84, + 0x8D1: 84, + 0x8D2: 84, + 0x8D3: 84, + 0x8D4: 84, + 0x8D5: 84, + 0x8D6: 84, + 0x8D7: 84, + 0x8D8: 84, + 0x8D9: 84, + 0x8DA: 84, + 0x8DB: 84, + 0x8DC: 84, + 0x8DD: 84, + 0x8DE: 84, + 0x8DF: 84, + 0x8E0: 84, + 0x8E1: 84, + 0x8E3: 84, + 0x8E4: 84, + 0x8E5: 84, + 0x8E6: 84, + 0x8E7: 84, + 0x8E8: 84, + 0x8E9: 84, + 0x8EA: 84, + 0x8EB: 84, + 0x8EC: 84, + 0x8ED: 84, + 0x8EE: 84, + 0x8EF: 84, + 0x8F0: 84, + 0x8F1: 84, + 0x8F2: 84, + 0x8F3: 84, + 0x8F4: 84, + 0x8F5: 84, + 0x8F6: 84, + 0x8F7: 84, + 0x8F8: 84, + 0x8F9: 84, + 0x8FA: 84, + 0x8FB: 84, + 0x8FC: 84, + 0x8FD: 84, + 0x8FE: 84, + 0x8FF: 84, + 0x900: 84, + 0x901: 84, + 0x902: 84, + 0x93A: 84, + 0x93C: 84, + 0x941: 84, + 0x942: 84, + 0x943: 84, + 0x944: 84, + 0x945: 84, + 0x946: 84, + 0x947: 84, + 0x948: 84, + 0x94D: 84, + 0x951: 84, + 0x952: 84, + 0x953: 84, + 0x954: 84, + 0x955: 84, + 0x956: 84, + 0x957: 84, + 0x962: 84, + 0x963: 84, + 0x981: 84, + 0x9BC: 84, + 0x9C1: 84, + 0x9C2: 84, + 0x9C3: 84, + 0x9C4: 84, + 0x9CD: 84, + 0x9E2: 84, + 0x9E3: 84, + 0x9FE: 84, + 0xA01: 84, + 0xA02: 84, + 0xA3C: 84, + 0xA41: 84, + 0xA42: 84, + 0xA47: 84, + 0xA48: 84, + 0xA4B: 84, + 0xA4C: 84, + 0xA4D: 84, + 0xA51: 84, + 0xA70: 84, + 0xA71: 84, + 0xA75: 84, + 0xA81: 84, + 0xA82: 84, + 0xABC: 84, + 0xAC1: 84, + 0xAC2: 84, + 0xAC3: 84, + 0xAC4: 84, + 0xAC5: 84, + 0xAC7: 84, + 0xAC8: 84, + 0xACD: 84, + 0xAE2: 84, + 0xAE3: 84, + 0xAFA: 84, + 0xAFB: 84, + 0xAFC: 84, + 0xAFD: 84, + 0xAFE: 84, + 0xAFF: 84, + 0xB01: 84, + 0xB3C: 84, + 0xB3F: 84, + 0xB41: 84, + 0xB42: 84, + 0xB43: 84, + 0xB44: 84, + 0xB4D: 84, + 0xB55: 84, + 0xB56: 84, + 0xB62: 84, + 0xB63: 84, + 0xB82: 84, + 0xBC0: 84, + 0xBCD: 84, + 0xC00: 84, + 0xC04: 84, + 0xC3C: 84, + 0xC3E: 84, + 0xC3F: 84, + 0xC40: 84, + 0xC46: 84, + 0xC47: 84, + 0xC48: 84, + 0xC4A: 84, + 0xC4B: 84, + 0xC4C: 84, + 0xC4D: 84, + 0xC55: 84, + 0xC56: 84, + 0xC62: 84, + 0xC63: 84, + 0xC81: 84, + 0xCBC: 84, + 0xCBF: 84, + 0xCC6: 84, + 0xCCC: 84, + 0xCCD: 84, + 0xCE2: 84, + 0xCE3: 84, + 0xD00: 84, + 0xD01: 84, + 0xD3B: 84, + 0xD3C: 84, + 0xD41: 84, + 0xD42: 84, + 0xD43: 84, + 0xD44: 84, + 0xD4D: 84, + 0xD62: 84, + 0xD63: 84, + 0xD81: 84, + 0xDCA: 84, + 0xDD2: 84, + 0xDD3: 84, + 0xDD4: 84, + 0xDD6: 84, + 0xE31: 84, + 0xE34: 84, + 0xE35: 84, + 0xE36: 84, + 0xE37: 84, + 0xE38: 84, + 0xE39: 84, + 0xE3A: 84, + 0xE47: 84, + 0xE48: 84, + 0xE49: 84, + 0xE4A: 84, + 0xE4B: 84, + 0xE4C: 84, + 0xE4D: 84, + 0xE4E: 84, + 0xEB1: 84, + 0xEB4: 84, + 0xEB5: 84, + 0xEB6: 84, + 0xEB7: 84, + 0xEB8: 84, + 0xEB9: 84, + 0xEBA: 84, + 0xEBB: 84, + 0xEBC: 84, + 0xEC8: 84, + 0xEC9: 84, + 0xECA: 84, + 0xECB: 84, + 0xECC: 84, + 0xECD: 84, + 0xECE: 84, + 0xF18: 84, + 0xF19: 84, + 0xF35: 84, + 0xF37: 84, + 0xF39: 84, + 0xF71: 84, + 0xF72: 84, + 0xF73: 84, + 0xF74: 84, + 0xF75: 84, + 0xF76: 84, + 0xF77: 84, + 0xF78: 84, + 0xF79: 84, + 0xF7A: 84, + 0xF7B: 84, + 0xF7C: 84, + 0xF7D: 84, + 0xF7E: 84, + 0xF80: 84, + 0xF81: 84, + 0xF82: 84, + 0xF83: 84, + 0xF84: 84, + 0xF86: 84, + 0xF87: 84, + 0xF8D: 84, + 0xF8E: 84, + 0xF8F: 84, + 0xF90: 84, + 0xF91: 84, + 0xF92: 84, + 0xF93: 84, + 0xF94: 84, + 0xF95: 84, + 0xF96: 84, + 0xF97: 84, + 0xF99: 84, + 0xF9A: 84, + 0xF9B: 84, + 0xF9C: 84, + 0xF9D: 84, + 0xF9E: 84, + 0xF9F: 84, + 0xFA0: 84, + 0xFA1: 84, + 0xFA2: 84, + 0xFA3: 84, + 0xFA4: 84, + 0xFA5: 84, + 0xFA6: 84, + 0xFA7: 84, + 0xFA8: 84, + 0xFA9: 84, + 0xFAA: 84, + 0xFAB: 84, + 0xFAC: 84, + 0xFAD: 84, + 0xFAE: 84, + 0xFAF: 84, + 0xFB0: 84, + 0xFB1: 84, + 0xFB2: 84, + 0xFB3: 84, + 0xFB4: 84, + 0xFB5: 84, + 0xFB6: 84, + 0xFB7: 84, + 0xFB8: 84, + 0xFB9: 84, + 0xFBA: 84, + 0xFBB: 84, + 0xFBC: 84, + 0xFC6: 84, + 0x102D: 84, + 0x102E: 84, + 0x102F: 84, + 0x1030: 84, + 0x1032: 84, + 0x1033: 84, + 0x1034: 84, + 0x1035: 84, + 0x1036: 84, + 0x1037: 84, + 0x1039: 84, + 0x103A: 84, + 0x103D: 84, + 0x103E: 84, + 0x1058: 84, + 0x1059: 84, + 0x105E: 84, + 0x105F: 84, + 0x1060: 84, + 0x1071: 84, + 0x1072: 84, + 0x1073: 84, + 0x1074: 84, + 0x1082: 84, + 0x1085: 84, + 0x1086: 84, + 0x108D: 84, + 0x109D: 84, + 0x135D: 84, + 0x135E: 84, + 0x135F: 84, + 0x1712: 84, + 0x1713: 84, + 0x1714: 84, + 0x1732: 84, + 0x1733: 84, + 0x1752: 84, + 0x1753: 84, + 0x1772: 84, + 0x1773: 84, + 0x17B4: 84, + 0x17B5: 84, + 0x17B7: 84, + 0x17B8: 84, + 0x17B9: 84, + 0x17BA: 84, + 0x17BB: 84, + 0x17BC: 84, + 0x17BD: 84, + 0x17C6: 84, + 0x17C9: 84, + 0x17CA: 84, + 0x17CB: 84, + 0x17CC: 84, + 0x17CD: 84, + 0x17CE: 84, + 0x17CF: 84, + 0x17D0: 84, + 0x17D1: 84, + 0x17D2: 84, + 0x17D3: 84, + 0x17DD: 84, + 0x1807: 68, + 0x180A: 67, + 0x180B: 84, + 0x180C: 84, + 0x180D: 84, + 0x180F: 84, + 0x1820: 68, + 0x1821: 68, + 0x1822: 68, + 0x1823: 68, + 0x1824: 68, + 0x1825: 68, + 0x1826: 68, + 0x1827: 68, + 0x1828: 68, + 0x1829: 68, + 0x182A: 68, + 0x182B: 68, + 0x182C: 68, + 0x182D: 68, + 0x182E: 68, + 0x182F: 68, + 0x1830: 68, + 0x1831: 68, + 0x1832: 68, + 0x1833: 68, + 0x1834: 68, + 0x1835: 68, + 0x1836: 68, + 0x1837: 68, + 0x1838: 68, + 0x1839: 68, + 0x183A: 68, + 0x183B: 68, + 0x183C: 68, + 0x183D: 68, + 0x183E: 68, + 0x183F: 68, + 0x1840: 68, + 0x1841: 68, + 0x1842: 68, + 0x1843: 68, + 0x1844: 68, + 0x1845: 68, + 0x1846: 68, + 0x1847: 68, + 0x1848: 68, + 0x1849: 68, + 0x184A: 68, + 0x184B: 68, + 0x184C: 68, + 0x184D: 68, + 0x184E: 68, + 0x184F: 68, + 0x1850: 68, + 0x1851: 68, + 0x1852: 68, + 0x1853: 68, + 0x1854: 68, + 0x1855: 68, + 0x1856: 68, + 0x1857: 68, + 0x1858: 68, + 0x1859: 68, + 0x185A: 68, + 0x185B: 68, + 0x185C: 68, + 0x185D: 68, + 0x185E: 68, + 0x185F: 68, + 0x1860: 68, + 0x1861: 68, + 0x1862: 68, + 0x1863: 68, + 0x1864: 68, + 0x1865: 68, + 0x1866: 68, + 0x1867: 68, + 0x1868: 68, + 0x1869: 68, + 0x186A: 68, + 0x186B: 68, + 0x186C: 68, + 0x186D: 68, + 0x186E: 68, + 0x186F: 68, + 0x1870: 68, + 0x1871: 68, + 0x1872: 68, + 0x1873: 68, + 0x1874: 68, + 0x1875: 68, + 0x1876: 68, + 0x1877: 68, + 0x1878: 68, + 0x1885: 84, + 0x1886: 84, + 0x1887: 68, + 0x1888: 68, + 0x1889: 68, + 0x188A: 68, + 0x188B: 68, + 0x188C: 68, + 0x188D: 68, + 0x188E: 68, + 0x188F: 68, + 0x1890: 68, + 0x1891: 68, + 0x1892: 68, + 0x1893: 68, + 0x1894: 68, + 0x1895: 68, + 0x1896: 68, + 0x1897: 68, + 0x1898: 68, + 0x1899: 68, + 0x189A: 68, + 0x189B: 68, + 0x189C: 68, + 0x189D: 68, + 0x189E: 68, + 0x189F: 68, + 0x18A0: 68, + 0x18A1: 68, + 0x18A2: 68, + 0x18A3: 68, + 0x18A4: 68, + 0x18A5: 68, + 0x18A6: 68, + 0x18A7: 68, + 0x18A8: 68, + 0x18A9: 84, + 0x18AA: 68, + 0x1920: 84, + 0x1921: 84, + 0x1922: 84, + 0x1927: 84, + 0x1928: 84, + 0x1932: 84, + 0x1939: 84, + 0x193A: 84, + 0x193B: 84, + 0x1A17: 84, + 0x1A18: 84, + 0x1A1B: 84, + 0x1A56: 84, + 0x1A58: 84, + 0x1A59: 84, + 0x1A5A: 84, + 0x1A5B: 84, + 0x1A5C: 84, + 0x1A5D: 84, + 0x1A5E: 84, + 0x1A60: 84, + 0x1A62: 84, + 0x1A65: 84, + 0x1A66: 84, + 0x1A67: 84, + 0x1A68: 84, + 0x1A69: 84, + 0x1A6A: 84, + 0x1A6B: 84, + 0x1A6C: 84, + 0x1A73: 84, + 0x1A74: 84, + 0x1A75: 84, + 0x1A76: 84, + 0x1A77: 84, + 0x1A78: 84, + 0x1A79: 84, + 0x1A7A: 84, + 0x1A7B: 84, + 0x1A7C: 84, + 0x1A7F: 84, + 0x1AB0: 84, + 0x1AB1: 84, + 0x1AB2: 84, + 0x1AB3: 84, + 0x1AB4: 84, + 0x1AB5: 84, + 0x1AB6: 84, + 0x1AB7: 84, + 0x1AB8: 84, + 0x1AB9: 84, + 0x1ABA: 84, + 0x1ABB: 84, + 0x1ABC: 84, + 0x1ABD: 84, + 0x1ABE: 84, + 0x1ABF: 84, + 0x1AC0: 84, + 0x1AC1: 84, + 0x1AC2: 84, + 0x1AC3: 84, + 0x1AC4: 84, + 0x1AC5: 84, + 0x1AC6: 84, + 0x1AC7: 84, + 0x1AC8: 84, + 0x1AC9: 84, + 0x1ACA: 84, + 0x1ACB: 84, + 0x1ACC: 84, + 0x1ACD: 84, + 0x1ACE: 84, + 0x1B00: 84, + 0x1B01: 84, + 0x1B02: 84, + 0x1B03: 84, + 0x1B34: 84, + 0x1B36: 84, + 0x1B37: 84, + 0x1B38: 84, + 0x1B39: 84, + 0x1B3A: 84, + 0x1B3C: 84, + 0x1B42: 84, + 0x1B6B: 84, + 0x1B6C: 84, + 0x1B6D: 84, + 0x1B6E: 84, + 0x1B6F: 84, + 0x1B70: 84, + 0x1B71: 84, + 0x1B72: 84, + 0x1B73: 84, + 0x1B80: 84, + 0x1B81: 84, + 0x1BA2: 84, + 0x1BA3: 84, + 0x1BA4: 84, + 0x1BA5: 84, + 0x1BA8: 84, + 0x1BA9: 84, + 0x1BAB: 84, + 0x1BAC: 84, + 0x1BAD: 84, + 0x1BE6: 84, + 0x1BE8: 84, + 0x1BE9: 84, + 0x1BED: 84, + 0x1BEF: 84, + 0x1BF0: 84, + 0x1BF1: 84, + 0x1C2C: 84, + 0x1C2D: 84, + 0x1C2E: 84, + 0x1C2F: 84, + 0x1C30: 84, + 0x1C31: 84, + 0x1C32: 84, + 0x1C33: 84, + 0x1C36: 84, + 0x1C37: 84, + 0x1CD0: 84, + 0x1CD1: 84, + 0x1CD2: 84, + 0x1CD4: 84, + 0x1CD5: 84, + 0x1CD6: 84, + 0x1CD7: 84, + 0x1CD8: 84, + 0x1CD9: 84, + 0x1CDA: 84, + 0x1CDB: 84, + 0x1CDC: 84, + 0x1CDD: 84, + 0x1CDE: 84, + 0x1CDF: 84, + 0x1CE0: 84, + 0x1CE2: 84, + 0x1CE3: 84, + 0x1CE4: 84, + 0x1CE5: 84, + 0x1CE6: 84, + 0x1CE7: 84, + 0x1CE8: 84, + 0x1CED: 84, + 0x1CF4: 84, + 0x1CF8: 84, + 0x1CF9: 84, + 0x1DC0: 84, + 0x1DC1: 84, + 0x1DC2: 84, + 0x1DC3: 84, + 0x1DC4: 84, + 0x1DC5: 84, + 0x1DC6: 84, + 0x1DC7: 84, + 0x1DC8: 84, + 0x1DC9: 84, + 0x1DCA: 84, + 0x1DCB: 84, + 0x1DCC: 84, + 0x1DCD: 84, + 0x1DCE: 84, + 0x1DCF: 84, + 0x1DD0: 84, + 0x1DD1: 84, + 0x1DD2: 84, + 0x1DD3: 84, + 0x1DD4: 84, + 0x1DD5: 84, + 0x1DD6: 84, + 0x1DD7: 84, + 0x1DD8: 84, + 0x1DD9: 84, + 0x1DDA: 84, + 0x1DDB: 84, + 0x1DDC: 84, + 0x1DDD: 84, + 0x1DDE: 84, + 0x1DDF: 84, + 0x1DE0: 84, + 0x1DE1: 84, + 0x1DE2: 84, + 0x1DE3: 84, + 0x1DE4: 84, + 0x1DE5: 84, + 0x1DE6: 84, + 0x1DE7: 84, + 0x1DE8: 84, + 0x1DE9: 84, + 0x1DEA: 84, + 0x1DEB: 84, + 0x1DEC: 84, + 0x1DED: 84, + 0x1DEE: 84, + 0x1DEF: 84, + 0x1DF0: 84, + 0x1DF1: 84, + 0x1DF2: 84, + 0x1DF3: 84, + 0x1DF4: 84, + 0x1DF5: 84, + 0x1DF6: 84, + 0x1DF7: 84, + 0x1DF8: 84, + 0x1DF9: 84, + 0x1DFA: 84, + 0x1DFB: 84, + 0x1DFC: 84, + 0x1DFD: 84, + 0x1DFE: 84, + 0x1DFF: 84, + 0x200B: 84, + 0x200D: 67, + 0x200E: 84, + 0x200F: 84, + 0x202A: 84, + 0x202B: 84, + 0x202C: 84, + 0x202D: 84, + 0x202E: 84, + 0x2060: 84, + 0x2061: 84, + 0x2062: 84, + 0x2063: 84, + 0x2064: 84, + 0x206A: 84, + 0x206B: 84, + 0x206C: 84, + 0x206D: 84, + 0x206E: 84, + 0x206F: 84, + 0x20D0: 84, + 0x20D1: 84, + 0x20D2: 84, + 0x20D3: 84, + 0x20D4: 84, + 0x20D5: 84, + 0x20D6: 84, + 0x20D7: 84, + 0x20D8: 84, + 0x20D9: 84, + 0x20DA: 84, + 0x20DB: 84, + 0x20DC: 84, + 0x20DD: 84, + 0x20DE: 84, + 0x20DF: 84, + 0x20E0: 84, + 0x20E1: 84, + 0x20E2: 84, + 0x20E3: 84, + 0x20E4: 84, + 0x20E5: 84, + 0x20E6: 84, + 0x20E7: 84, + 0x20E8: 84, + 0x20E9: 84, + 0x20EA: 84, + 0x20EB: 84, + 0x20EC: 84, + 0x20ED: 84, + 0x20EE: 84, + 0x20EF: 84, + 0x20F0: 84, + 0x2CEF: 84, + 0x2CF0: 84, + 0x2CF1: 84, + 0x2D7F: 84, + 0x2DE0: 84, + 0x2DE1: 84, + 0x2DE2: 84, + 0x2DE3: 84, + 0x2DE4: 84, + 0x2DE5: 84, + 0x2DE6: 84, + 0x2DE7: 84, + 0x2DE8: 84, + 0x2DE9: 84, + 0x2DEA: 84, + 0x2DEB: 84, + 0x2DEC: 84, + 0x2DED: 84, + 0x2DEE: 84, + 0x2DEF: 84, + 0x2DF0: 84, + 0x2DF1: 84, + 0x2DF2: 84, + 0x2DF3: 84, + 0x2DF4: 84, + 0x2DF5: 84, + 0x2DF6: 84, + 0x2DF7: 84, + 0x2DF8: 84, + 0x2DF9: 84, + 0x2DFA: 84, + 0x2DFB: 84, + 0x2DFC: 84, + 0x2DFD: 84, + 0x2DFE: 84, + 0x2DFF: 84, + 0x302A: 84, + 0x302B: 84, + 0x302C: 84, + 0x302D: 84, + 0x3099: 84, + 0x309A: 84, + 0xA66F: 84, + 0xA670: 84, + 0xA671: 84, + 0xA672: 84, + 0xA674: 84, + 0xA675: 84, + 0xA676: 84, + 0xA677: 84, + 0xA678: 84, + 0xA679: 84, + 0xA67A: 84, + 0xA67B: 84, + 0xA67C: 84, + 0xA67D: 84, + 0xA69E: 84, + 0xA69F: 84, + 0xA6F0: 84, + 0xA6F1: 84, + 0xA802: 84, + 0xA806: 84, + 0xA80B: 84, + 0xA825: 84, + 0xA826: 84, + 0xA82C: 84, + 0xA840: 68, + 0xA841: 68, + 0xA842: 68, + 0xA843: 68, + 0xA844: 68, + 0xA845: 68, + 0xA846: 68, + 0xA847: 68, + 0xA848: 68, + 0xA849: 68, + 0xA84A: 68, + 0xA84B: 68, + 0xA84C: 68, + 0xA84D: 68, + 0xA84E: 68, + 0xA84F: 68, + 0xA850: 68, + 0xA851: 68, + 0xA852: 68, + 0xA853: 68, + 0xA854: 68, + 0xA855: 68, + 0xA856: 68, + 0xA857: 68, + 0xA858: 68, + 0xA859: 68, + 0xA85A: 68, + 0xA85B: 68, + 0xA85C: 68, + 0xA85D: 68, + 0xA85E: 68, + 0xA85F: 68, + 0xA860: 68, + 0xA861: 68, + 0xA862: 68, + 0xA863: 68, + 0xA864: 68, + 0xA865: 68, + 0xA866: 68, + 0xA867: 68, + 0xA868: 68, + 0xA869: 68, + 0xA86A: 68, + 0xA86B: 68, + 0xA86C: 68, + 0xA86D: 68, + 0xA86E: 68, + 0xA86F: 68, + 0xA870: 68, + 0xA871: 68, + 0xA872: 76, + 0xA8C4: 84, + 0xA8C5: 84, + 0xA8E0: 84, + 0xA8E1: 84, + 0xA8E2: 84, + 0xA8E3: 84, + 0xA8E4: 84, + 0xA8E5: 84, + 0xA8E6: 84, + 0xA8E7: 84, + 0xA8E8: 84, + 0xA8E9: 84, + 0xA8EA: 84, + 0xA8EB: 84, + 0xA8EC: 84, + 0xA8ED: 84, + 0xA8EE: 84, + 0xA8EF: 84, + 0xA8F0: 84, + 0xA8F1: 84, + 0xA8FF: 84, + 0xA926: 84, + 0xA927: 84, + 0xA928: 84, + 0xA929: 84, + 0xA92A: 84, + 0xA92B: 84, + 0xA92C: 84, + 0xA92D: 84, + 0xA947: 84, + 0xA948: 84, + 0xA949: 84, + 0xA94A: 84, + 0xA94B: 84, + 0xA94C: 84, + 0xA94D: 84, + 0xA94E: 84, + 0xA94F: 84, + 0xA950: 84, + 0xA951: 84, + 0xA980: 84, + 0xA981: 84, + 0xA982: 84, + 0xA9B3: 84, + 0xA9B6: 84, + 0xA9B7: 84, + 0xA9B8: 84, + 0xA9B9: 84, + 0xA9BC: 84, + 0xA9BD: 84, + 0xA9E5: 84, + 0xAA29: 84, + 0xAA2A: 84, + 0xAA2B: 84, + 0xAA2C: 84, + 0xAA2D: 84, + 0xAA2E: 84, + 0xAA31: 84, + 0xAA32: 84, + 0xAA35: 84, + 0xAA36: 84, + 0xAA43: 84, + 0xAA4C: 84, + 0xAA7C: 84, + 0xAAB0: 84, + 0xAAB2: 84, + 0xAAB3: 84, + 0xAAB4: 84, + 0xAAB7: 84, + 0xAAB8: 84, + 0xAABE: 84, + 0xAABF: 84, + 0xAAC1: 84, + 0xAAEC: 84, + 0xAAED: 84, + 0xAAF6: 84, + 0xABE5: 84, + 0xABE8: 84, + 0xABED: 84, + 0xFB1E: 84, + 0xFE00: 84, + 0xFE01: 84, + 0xFE02: 84, + 0xFE03: 84, + 0xFE04: 84, + 0xFE05: 84, + 0xFE06: 84, + 0xFE07: 84, + 0xFE08: 84, + 0xFE09: 84, + 0xFE0A: 84, + 0xFE0B: 84, + 0xFE0C: 84, + 0xFE0D: 84, + 0xFE0E: 84, + 0xFE0F: 84, + 0xFE20: 84, + 0xFE21: 84, + 0xFE22: 84, + 0xFE23: 84, + 0xFE24: 84, + 0xFE25: 84, + 0xFE26: 84, + 0xFE27: 84, + 0xFE28: 84, + 0xFE29: 84, + 0xFE2A: 84, + 0xFE2B: 84, + 0xFE2C: 84, + 0xFE2D: 84, + 0xFE2E: 84, + 0xFE2F: 84, + 0xFEFF: 84, + 0xFFF9: 84, + 0xFFFA: 84, + 0xFFFB: 84, + 0x101FD: 84, + 0x102E0: 84, + 0x10376: 84, + 0x10377: 84, + 0x10378: 84, + 0x10379: 84, + 0x1037A: 84, + 0x10A01: 84, + 0x10A02: 84, + 0x10A03: 84, + 0x10A05: 84, + 0x10A06: 84, + 0x10A0C: 84, + 0x10A0D: 84, + 0x10A0E: 84, + 0x10A0F: 84, + 0x10A38: 84, + 0x10A39: 84, + 0x10A3A: 84, + 0x10A3F: 84, + 0x10AC0: 68, + 0x10AC1: 68, + 0x10AC2: 68, + 0x10AC3: 68, + 0x10AC4: 68, + 0x10AC5: 82, + 0x10AC7: 82, + 0x10AC9: 82, + 0x10ACA: 82, + 0x10ACD: 76, + 0x10ACE: 82, + 0x10ACF: 82, + 0x10AD0: 82, + 0x10AD1: 82, + 0x10AD2: 82, + 0x10AD3: 68, + 0x10AD4: 68, + 0x10AD5: 68, + 0x10AD6: 68, + 0x10AD7: 76, + 0x10AD8: 68, + 0x10AD9: 68, + 0x10ADA: 68, + 0x10ADB: 68, + 0x10ADC: 68, + 0x10ADD: 82, + 0x10ADE: 68, + 0x10ADF: 68, + 0x10AE0: 68, + 0x10AE1: 82, + 0x10AE4: 82, + 0x10AE5: 84, + 0x10AE6: 84, + 0x10AEB: 68, + 0x10AEC: 68, + 0x10AED: 68, + 0x10AEE: 68, + 0x10AEF: 82, + 0x10B80: 68, + 0x10B81: 82, + 0x10B82: 68, + 0x10B83: 82, + 0x10B84: 82, + 0x10B85: 82, + 0x10B86: 68, + 0x10B87: 68, + 0x10B88: 68, + 0x10B89: 82, + 0x10B8A: 68, + 0x10B8B: 68, + 0x10B8C: 82, + 0x10B8D: 68, + 0x10B8E: 82, + 0x10B8F: 82, + 0x10B90: 68, + 0x10B91: 82, + 0x10BA9: 82, + 0x10BAA: 82, + 0x10BAB: 82, + 0x10BAC: 82, + 0x10BAD: 68, + 0x10BAE: 68, + 0x10D00: 76, + 0x10D01: 68, + 0x10D02: 68, + 0x10D03: 68, + 0x10D04: 68, + 0x10D05: 68, + 0x10D06: 68, + 0x10D07: 68, + 0x10D08: 68, + 0x10D09: 68, + 0x10D0A: 68, + 0x10D0B: 68, + 0x10D0C: 68, + 0x10D0D: 68, + 0x10D0E: 68, + 0x10D0F: 68, + 0x10D10: 68, + 0x10D11: 68, + 0x10D12: 68, + 0x10D13: 68, + 0x10D14: 68, + 0x10D15: 68, + 0x10D16: 68, + 0x10D17: 68, + 0x10D18: 68, + 0x10D19: 68, + 0x10D1A: 68, + 0x10D1B: 68, + 0x10D1C: 68, + 0x10D1D: 68, + 0x10D1E: 68, + 0x10D1F: 68, + 0x10D20: 68, + 0x10D21: 68, + 0x10D22: 82, + 0x10D23: 68, + 0x10D24: 84, + 0x10D25: 84, + 0x10D26: 84, + 0x10D27: 84, + 0x10EAB: 84, + 0x10EAC: 84, + 0x10EFD: 84, + 0x10EFE: 84, + 0x10EFF: 84, + 0x10F30: 68, + 0x10F31: 68, + 0x10F32: 68, + 0x10F33: 82, + 0x10F34: 68, + 0x10F35: 68, + 0x10F36: 68, + 0x10F37: 68, + 0x10F38: 68, + 0x10F39: 68, + 0x10F3A: 68, + 0x10F3B: 68, + 0x10F3C: 68, + 0x10F3D: 68, + 0x10F3E: 68, + 0x10F3F: 68, + 0x10F40: 68, + 0x10F41: 68, + 0x10F42: 68, + 0x10F43: 68, + 0x10F44: 68, + 0x10F46: 84, + 0x10F47: 84, + 0x10F48: 84, + 0x10F49: 84, + 0x10F4A: 84, + 0x10F4B: 84, + 0x10F4C: 84, + 0x10F4D: 84, + 0x10F4E: 84, + 0x10F4F: 84, + 0x10F50: 84, + 0x10F51: 68, + 0x10F52: 68, + 0x10F53: 68, + 0x10F54: 82, + 0x10F70: 68, + 0x10F71: 68, + 0x10F72: 68, + 0x10F73: 68, + 0x10F74: 82, + 0x10F75: 82, + 0x10F76: 68, + 0x10F77: 68, + 0x10F78: 68, + 0x10F79: 68, + 0x10F7A: 68, + 0x10F7B: 68, + 0x10F7C: 68, + 0x10F7D: 68, + 0x10F7E: 68, + 0x10F7F: 68, + 0x10F80: 68, + 0x10F81: 68, + 0x10F82: 84, + 0x10F83: 84, + 0x10F84: 84, + 0x10F85: 84, + 0x10FB0: 68, + 0x10FB2: 68, + 0x10FB3: 68, + 0x10FB4: 82, + 0x10FB5: 82, + 0x10FB6: 82, + 0x10FB8: 68, + 0x10FB9: 82, + 0x10FBA: 82, + 0x10FBB: 68, + 0x10FBC: 68, + 0x10FBD: 82, + 0x10FBE: 68, + 0x10FBF: 68, + 0x10FC1: 68, + 0x10FC2: 82, + 0x10FC3: 82, + 0x10FC4: 68, + 0x10FC9: 82, + 0x10FCA: 68, + 0x10FCB: 76, + 0x11001: 84, + 0x11038: 84, + 0x11039: 84, + 0x1103A: 84, + 0x1103B: 84, + 0x1103C: 84, + 0x1103D: 84, + 0x1103E: 84, + 0x1103F: 84, + 0x11040: 84, + 0x11041: 84, + 0x11042: 84, + 0x11043: 84, + 0x11044: 84, + 0x11045: 84, + 0x11046: 84, + 0x11070: 84, + 0x11073: 84, + 0x11074: 84, + 0x1107F: 84, + 0x11080: 84, + 0x11081: 84, + 0x110B3: 84, + 0x110B4: 84, + 0x110B5: 84, + 0x110B6: 84, + 0x110B9: 84, + 0x110BA: 84, + 0x110C2: 84, + 0x11100: 84, + 0x11101: 84, + 0x11102: 84, + 0x11127: 84, + 0x11128: 84, + 0x11129: 84, + 0x1112A: 84, + 0x1112B: 84, + 0x1112D: 84, + 0x1112E: 84, + 0x1112F: 84, + 0x11130: 84, + 0x11131: 84, + 0x11132: 84, + 0x11133: 84, + 0x11134: 84, + 0x11173: 84, + 0x11180: 84, + 0x11181: 84, + 0x111B6: 84, + 0x111B7: 84, + 0x111B8: 84, + 0x111B9: 84, + 0x111BA: 84, + 0x111BB: 84, + 0x111BC: 84, + 0x111BD: 84, + 0x111BE: 84, + 0x111C9: 84, + 0x111CA: 84, + 0x111CB: 84, + 0x111CC: 84, + 0x111CF: 84, + 0x1122F: 84, + 0x11230: 84, + 0x11231: 84, + 0x11234: 84, + 0x11236: 84, + 0x11237: 84, + 0x1123E: 84, + 0x11241: 84, + 0x112DF: 84, + 0x112E3: 84, + 0x112E4: 84, + 0x112E5: 84, + 0x112E6: 84, + 0x112E7: 84, + 0x112E8: 84, + 0x112E9: 84, + 0x112EA: 84, + 0x11300: 84, + 0x11301: 84, + 0x1133B: 84, + 0x1133C: 84, + 0x11340: 84, + 0x11366: 84, + 0x11367: 84, + 0x11368: 84, + 0x11369: 84, + 0x1136A: 84, + 0x1136B: 84, + 0x1136C: 84, + 0x11370: 84, + 0x11371: 84, + 0x11372: 84, + 0x11373: 84, + 0x11374: 84, + 0x11438: 84, + 0x11439: 84, + 0x1143A: 84, + 0x1143B: 84, + 0x1143C: 84, + 0x1143D: 84, + 0x1143E: 84, + 0x1143F: 84, + 0x11442: 84, + 0x11443: 84, + 0x11444: 84, + 0x11446: 84, + 0x1145E: 84, + 0x114B3: 84, + 0x114B4: 84, + 0x114B5: 84, + 0x114B6: 84, + 0x114B7: 84, + 0x114B8: 84, + 0x114BA: 84, + 0x114BF: 84, + 0x114C0: 84, + 0x114C2: 84, + 0x114C3: 84, + 0x115B2: 84, + 0x115B3: 84, + 0x115B4: 84, + 0x115B5: 84, + 0x115BC: 84, + 0x115BD: 84, + 0x115BF: 84, + 0x115C0: 84, + 0x115DC: 84, + 0x115DD: 84, + 0x11633: 84, + 0x11634: 84, + 0x11635: 84, + 0x11636: 84, + 0x11637: 84, + 0x11638: 84, + 0x11639: 84, + 0x1163A: 84, + 0x1163D: 84, + 0x1163F: 84, + 0x11640: 84, + 0x116AB: 84, + 0x116AD: 84, + 0x116B0: 84, + 0x116B1: 84, + 0x116B2: 84, + 0x116B3: 84, + 0x116B4: 84, + 0x116B5: 84, + 0x116B7: 84, + 0x1171D: 84, + 0x1171E: 84, + 0x1171F: 84, + 0x11722: 84, + 0x11723: 84, + 0x11724: 84, + 0x11725: 84, + 0x11727: 84, + 0x11728: 84, + 0x11729: 84, + 0x1172A: 84, + 0x1172B: 84, + 0x1182F: 84, + 0x11830: 84, + 0x11831: 84, + 0x11832: 84, + 0x11833: 84, + 0x11834: 84, + 0x11835: 84, + 0x11836: 84, + 0x11837: 84, + 0x11839: 84, + 0x1183A: 84, + 0x1193B: 84, + 0x1193C: 84, + 0x1193E: 84, + 0x11943: 84, + 0x119D4: 84, + 0x119D5: 84, + 0x119D6: 84, + 0x119D7: 84, + 0x119DA: 84, + 0x119DB: 84, + 0x119E0: 84, + 0x11A01: 84, + 0x11A02: 84, + 0x11A03: 84, + 0x11A04: 84, + 0x11A05: 84, + 0x11A06: 84, + 0x11A07: 84, + 0x11A08: 84, + 0x11A09: 84, + 0x11A0A: 84, + 0x11A33: 84, + 0x11A34: 84, + 0x11A35: 84, + 0x11A36: 84, + 0x11A37: 84, + 0x11A38: 84, + 0x11A3B: 84, + 0x11A3C: 84, + 0x11A3D: 84, + 0x11A3E: 84, + 0x11A47: 84, + 0x11A51: 84, + 0x11A52: 84, + 0x11A53: 84, + 0x11A54: 84, + 0x11A55: 84, + 0x11A56: 84, + 0x11A59: 84, + 0x11A5A: 84, + 0x11A5B: 84, + 0x11A8A: 84, + 0x11A8B: 84, + 0x11A8C: 84, + 0x11A8D: 84, + 0x11A8E: 84, + 0x11A8F: 84, + 0x11A90: 84, + 0x11A91: 84, + 0x11A92: 84, + 0x11A93: 84, + 0x11A94: 84, + 0x11A95: 84, + 0x11A96: 84, + 0x11A98: 84, + 0x11A99: 84, + 0x11C30: 84, + 0x11C31: 84, + 0x11C32: 84, + 0x11C33: 84, + 0x11C34: 84, + 0x11C35: 84, + 0x11C36: 84, + 0x11C38: 84, + 0x11C39: 84, + 0x11C3A: 84, + 0x11C3B: 84, + 0x11C3C: 84, + 0x11C3D: 84, + 0x11C3F: 84, + 0x11C92: 84, + 0x11C93: 84, + 0x11C94: 84, + 0x11C95: 84, + 0x11C96: 84, + 0x11C97: 84, + 0x11C98: 84, + 0x11C99: 84, + 0x11C9A: 84, + 0x11C9B: 84, + 0x11C9C: 84, + 0x11C9D: 84, + 0x11C9E: 84, + 0x11C9F: 84, + 0x11CA0: 84, + 0x11CA1: 84, + 0x11CA2: 84, + 0x11CA3: 84, + 0x11CA4: 84, + 0x11CA5: 84, + 0x11CA6: 84, + 0x11CA7: 84, + 0x11CAA: 84, + 0x11CAB: 84, + 0x11CAC: 84, + 0x11CAD: 84, + 0x11CAE: 84, + 0x11CAF: 84, + 0x11CB0: 84, + 0x11CB2: 84, + 0x11CB3: 84, + 0x11CB5: 84, + 0x11CB6: 84, + 0x11D31: 84, + 0x11D32: 84, + 0x11D33: 84, + 0x11D34: 84, + 0x11D35: 84, + 0x11D36: 84, + 0x11D3A: 84, + 0x11D3C: 84, + 0x11D3D: 84, + 0x11D3F: 84, + 0x11D40: 84, + 0x11D41: 84, + 0x11D42: 84, + 0x11D43: 84, + 0x11D44: 84, + 0x11D45: 84, + 0x11D47: 84, + 0x11D90: 84, + 0x11D91: 84, + 0x11D95: 84, + 0x11D97: 84, + 0x11EF3: 84, + 0x11EF4: 84, + 0x11F00: 84, + 0x11F01: 84, + 0x11F36: 84, + 0x11F37: 84, + 0x11F38: 84, + 0x11F39: 84, + 0x11F3A: 84, + 0x11F40: 84, + 0x11F42: 84, + 0x13430: 84, + 0x13431: 84, + 0x13432: 84, + 0x13433: 84, + 0x13434: 84, + 0x13435: 84, + 0x13436: 84, + 0x13437: 84, + 0x13438: 84, + 0x13439: 84, + 0x1343A: 84, + 0x1343B: 84, + 0x1343C: 84, + 0x1343D: 84, + 0x1343E: 84, + 0x1343F: 84, + 0x13440: 84, + 0x13447: 84, + 0x13448: 84, + 0x13449: 84, + 0x1344A: 84, + 0x1344B: 84, + 0x1344C: 84, + 0x1344D: 84, + 0x1344E: 84, + 0x1344F: 84, + 0x13450: 84, + 0x13451: 84, + 0x13452: 84, + 0x13453: 84, + 0x13454: 84, + 0x13455: 84, + 0x16AF0: 84, + 0x16AF1: 84, + 0x16AF2: 84, + 0x16AF3: 84, + 0x16AF4: 84, + 0x16B30: 84, + 0x16B31: 84, + 0x16B32: 84, + 0x16B33: 84, + 0x16B34: 84, + 0x16B35: 84, + 0x16B36: 84, + 0x16F4F: 84, + 0x16F8F: 84, + 0x16F90: 84, + 0x16F91: 84, + 0x16F92: 84, + 0x16FE4: 84, + 0x1BC9D: 84, + 0x1BC9E: 84, + 0x1BCA0: 84, + 0x1BCA1: 84, + 0x1BCA2: 84, + 0x1BCA3: 84, + 0x1CF00: 84, + 0x1CF01: 84, + 0x1CF02: 84, + 0x1CF03: 84, + 0x1CF04: 84, + 0x1CF05: 84, + 0x1CF06: 84, + 0x1CF07: 84, + 0x1CF08: 84, + 0x1CF09: 84, + 0x1CF0A: 84, + 0x1CF0B: 84, + 0x1CF0C: 84, + 0x1CF0D: 84, + 0x1CF0E: 84, + 0x1CF0F: 84, + 0x1CF10: 84, + 0x1CF11: 84, + 0x1CF12: 84, + 0x1CF13: 84, + 0x1CF14: 84, + 0x1CF15: 84, + 0x1CF16: 84, + 0x1CF17: 84, + 0x1CF18: 84, + 0x1CF19: 84, + 0x1CF1A: 84, + 0x1CF1B: 84, + 0x1CF1C: 84, + 0x1CF1D: 84, + 0x1CF1E: 84, + 0x1CF1F: 84, + 0x1CF20: 84, + 0x1CF21: 84, + 0x1CF22: 84, + 0x1CF23: 84, + 0x1CF24: 84, + 0x1CF25: 84, + 0x1CF26: 84, + 0x1CF27: 84, + 0x1CF28: 84, + 0x1CF29: 84, + 0x1CF2A: 84, + 0x1CF2B: 84, + 0x1CF2C: 84, + 0x1CF2D: 84, + 0x1CF30: 84, + 0x1CF31: 84, + 0x1CF32: 84, + 0x1CF33: 84, + 0x1CF34: 84, + 0x1CF35: 84, + 0x1CF36: 84, + 0x1CF37: 84, + 0x1CF38: 84, + 0x1CF39: 84, + 0x1CF3A: 84, + 0x1CF3B: 84, + 0x1CF3C: 84, + 0x1CF3D: 84, + 0x1CF3E: 84, + 0x1CF3F: 84, + 0x1CF40: 84, + 0x1CF41: 84, + 0x1CF42: 84, + 0x1CF43: 84, + 0x1CF44: 84, + 0x1CF45: 84, + 0x1CF46: 84, + 0x1D167: 84, + 0x1D168: 84, + 0x1D169: 84, + 0x1D173: 84, + 0x1D174: 84, + 0x1D175: 84, + 0x1D176: 84, + 0x1D177: 84, + 0x1D178: 84, + 0x1D179: 84, + 0x1D17A: 84, + 0x1D17B: 84, + 0x1D17C: 84, + 0x1D17D: 84, + 0x1D17E: 84, + 0x1D17F: 84, + 0x1D180: 84, + 0x1D181: 84, + 0x1D182: 84, + 0x1D185: 84, + 0x1D186: 84, + 0x1D187: 84, + 0x1D188: 84, + 0x1D189: 84, + 0x1D18A: 84, + 0x1D18B: 84, + 0x1D1AA: 84, + 0x1D1AB: 84, + 0x1D1AC: 84, + 0x1D1AD: 84, + 0x1D242: 84, + 0x1D243: 84, + 0x1D244: 84, + 0x1DA00: 84, + 0x1DA01: 84, + 0x1DA02: 84, + 0x1DA03: 84, + 0x1DA04: 84, + 0x1DA05: 84, + 0x1DA06: 84, + 0x1DA07: 84, + 0x1DA08: 84, + 0x1DA09: 84, + 0x1DA0A: 84, + 0x1DA0B: 84, + 0x1DA0C: 84, + 0x1DA0D: 84, + 0x1DA0E: 84, + 0x1DA0F: 84, + 0x1DA10: 84, + 0x1DA11: 84, + 0x1DA12: 84, + 0x1DA13: 84, + 0x1DA14: 84, + 0x1DA15: 84, + 0x1DA16: 84, + 0x1DA17: 84, + 0x1DA18: 84, + 0x1DA19: 84, + 0x1DA1A: 84, + 0x1DA1B: 84, + 0x1DA1C: 84, + 0x1DA1D: 84, + 0x1DA1E: 84, + 0x1DA1F: 84, + 0x1DA20: 84, + 0x1DA21: 84, + 0x1DA22: 84, + 0x1DA23: 84, + 0x1DA24: 84, + 0x1DA25: 84, + 0x1DA26: 84, + 0x1DA27: 84, + 0x1DA28: 84, + 0x1DA29: 84, + 0x1DA2A: 84, + 0x1DA2B: 84, + 0x1DA2C: 84, + 0x1DA2D: 84, + 0x1DA2E: 84, + 0x1DA2F: 84, + 0x1DA30: 84, + 0x1DA31: 84, + 0x1DA32: 84, + 0x1DA33: 84, + 0x1DA34: 84, + 0x1DA35: 84, + 0x1DA36: 84, + 0x1DA3B: 84, + 0x1DA3C: 84, + 0x1DA3D: 84, + 0x1DA3E: 84, + 0x1DA3F: 84, + 0x1DA40: 84, + 0x1DA41: 84, + 0x1DA42: 84, + 0x1DA43: 84, + 0x1DA44: 84, + 0x1DA45: 84, + 0x1DA46: 84, + 0x1DA47: 84, + 0x1DA48: 84, + 0x1DA49: 84, + 0x1DA4A: 84, + 0x1DA4B: 84, + 0x1DA4C: 84, + 0x1DA4D: 84, + 0x1DA4E: 84, + 0x1DA4F: 84, + 0x1DA50: 84, + 0x1DA51: 84, + 0x1DA52: 84, + 0x1DA53: 84, + 0x1DA54: 84, + 0x1DA55: 84, + 0x1DA56: 84, + 0x1DA57: 84, + 0x1DA58: 84, + 0x1DA59: 84, + 0x1DA5A: 84, + 0x1DA5B: 84, + 0x1DA5C: 84, + 0x1DA5D: 84, + 0x1DA5E: 84, + 0x1DA5F: 84, + 0x1DA60: 84, + 0x1DA61: 84, + 0x1DA62: 84, + 0x1DA63: 84, + 0x1DA64: 84, + 0x1DA65: 84, + 0x1DA66: 84, + 0x1DA67: 84, + 0x1DA68: 84, + 0x1DA69: 84, + 0x1DA6A: 84, + 0x1DA6B: 84, + 0x1DA6C: 84, + 0x1DA75: 84, + 0x1DA84: 84, + 0x1DA9B: 84, + 0x1DA9C: 84, + 0x1DA9D: 84, + 0x1DA9E: 84, + 0x1DA9F: 84, + 0x1DAA1: 84, + 0x1DAA2: 84, + 0x1DAA3: 84, + 0x1DAA4: 84, + 0x1DAA5: 84, + 0x1DAA6: 84, + 0x1DAA7: 84, + 0x1DAA8: 84, + 0x1DAA9: 84, + 0x1DAAA: 84, + 0x1DAAB: 84, + 0x1DAAC: 84, + 0x1DAAD: 84, + 0x1DAAE: 84, + 0x1DAAF: 84, + 0x1E000: 84, + 0x1E001: 84, + 0x1E002: 84, + 0x1E003: 84, + 0x1E004: 84, + 0x1E005: 84, + 0x1E006: 84, + 0x1E008: 84, + 0x1E009: 84, + 0x1E00A: 84, + 0x1E00B: 84, + 0x1E00C: 84, + 0x1E00D: 84, + 0x1E00E: 84, + 0x1E00F: 84, + 0x1E010: 84, + 0x1E011: 84, + 0x1E012: 84, + 0x1E013: 84, + 0x1E014: 84, + 0x1E015: 84, + 0x1E016: 84, + 0x1E017: 84, + 0x1E018: 84, + 0x1E01B: 84, + 0x1E01C: 84, + 0x1E01D: 84, + 0x1E01E: 84, + 0x1E01F: 84, + 0x1E020: 84, + 0x1E021: 84, + 0x1E023: 84, + 0x1E024: 84, + 0x1E026: 84, + 0x1E027: 84, + 0x1E028: 84, + 0x1E029: 84, + 0x1E02A: 84, + 0x1E08F: 84, + 0x1E130: 84, + 0x1E131: 84, + 0x1E132: 84, + 0x1E133: 84, + 0x1E134: 84, + 0x1E135: 84, + 0x1E136: 84, + 0x1E2AE: 84, + 0x1E2EC: 84, + 0x1E2ED: 84, + 0x1E2EE: 84, + 0x1E2EF: 84, + 0x1E4EC: 84, + 0x1E4ED: 84, + 0x1E4EE: 84, + 0x1E4EF: 84, + 0x1E8D0: 84, + 0x1E8D1: 84, + 0x1E8D2: 84, + 0x1E8D3: 84, + 0x1E8D4: 84, + 0x1E8D5: 84, + 0x1E8D6: 84, + 0x1E900: 68, + 0x1E901: 68, + 0x1E902: 68, + 0x1E903: 68, + 0x1E904: 68, + 0x1E905: 68, + 0x1E906: 68, + 0x1E907: 68, + 0x1E908: 68, + 0x1E909: 68, + 0x1E90A: 68, + 0x1E90B: 68, + 0x1E90C: 68, + 0x1E90D: 68, + 0x1E90E: 68, + 0x1E90F: 68, + 0x1E910: 68, + 0x1E911: 68, + 0x1E912: 68, + 0x1E913: 68, + 0x1E914: 68, + 0x1E915: 68, + 0x1E916: 68, + 0x1E917: 68, + 0x1E918: 68, + 0x1E919: 68, + 0x1E91A: 68, + 0x1E91B: 68, + 0x1E91C: 68, + 0x1E91D: 68, + 0x1E91E: 68, + 0x1E91F: 68, + 0x1E920: 68, + 0x1E921: 68, + 0x1E922: 68, + 0x1E923: 68, + 0x1E924: 68, + 0x1E925: 68, + 0x1E926: 68, + 0x1E927: 68, + 0x1E928: 68, + 0x1E929: 68, + 0x1E92A: 68, + 0x1E92B: 68, + 0x1E92C: 68, + 0x1E92D: 68, + 0x1E92E: 68, + 0x1E92F: 68, + 0x1E930: 68, + 0x1E931: 68, + 0x1E932: 68, + 0x1E933: 68, + 0x1E934: 68, + 0x1E935: 68, + 0x1E936: 68, + 0x1E937: 68, + 0x1E938: 68, + 0x1E939: 68, + 0x1E93A: 68, + 0x1E93B: 68, + 0x1E93C: 68, + 0x1E93D: 68, + 0x1E93E: 68, + 0x1E93F: 68, + 0x1E940: 68, + 0x1E941: 68, + 0x1E942: 68, + 0x1E943: 68, + 0x1E944: 84, + 0x1E945: 84, + 0x1E946: 84, + 0x1E947: 84, + 0x1E948: 84, + 0x1E949: 84, + 0x1E94A: 84, + 0x1E94B: 84, + 0xE0001: 84, + 0xE0020: 84, + 0xE0021: 84, + 0xE0022: 84, + 0xE0023: 84, + 0xE0024: 84, + 0xE0025: 84, + 0xE0026: 84, + 0xE0027: 84, + 0xE0028: 84, + 0xE0029: 84, + 0xE002A: 84, + 0xE002B: 84, + 0xE002C: 84, + 0xE002D: 84, + 0xE002E: 84, + 0xE002F: 84, + 0xE0030: 84, + 0xE0031: 84, + 0xE0032: 84, + 0xE0033: 84, + 0xE0034: 84, + 0xE0035: 84, + 0xE0036: 84, + 0xE0037: 84, + 0xE0038: 84, + 0xE0039: 84, + 0xE003A: 84, + 0xE003B: 84, + 0xE003C: 84, + 0xE003D: 84, + 0xE003E: 84, + 0xE003F: 84, + 0xE0040: 84, + 0xE0041: 84, + 0xE0042: 84, + 0xE0043: 84, + 0xE0044: 84, + 0xE0045: 84, + 0xE0046: 84, + 0xE0047: 84, + 0xE0048: 84, + 0xE0049: 84, + 0xE004A: 84, + 0xE004B: 84, + 0xE004C: 84, + 0xE004D: 84, + 0xE004E: 84, + 0xE004F: 84, + 0xE0050: 84, + 0xE0051: 84, + 0xE0052: 84, + 0xE0053: 84, + 0xE0054: 84, + 0xE0055: 84, + 0xE0056: 84, + 0xE0057: 84, + 0xE0058: 84, + 0xE0059: 84, + 0xE005A: 84, + 0xE005B: 84, + 0xE005C: 84, + 0xE005D: 84, + 0xE005E: 84, + 0xE005F: 84, + 0xE0060: 84, + 0xE0061: 84, + 0xE0062: 84, + 0xE0063: 84, + 0xE0064: 84, + 0xE0065: 84, + 0xE0066: 84, + 0xE0067: 84, + 0xE0068: 84, + 0xE0069: 84, + 0xE006A: 84, + 0xE006B: 84, + 0xE006C: 84, + 0xE006D: 84, + 0xE006E: 84, + 0xE006F: 84, + 0xE0070: 84, + 0xE0071: 84, + 0xE0072: 84, + 0xE0073: 84, + 0xE0074: 84, + 0xE0075: 84, + 0xE0076: 84, + 0xE0077: 84, + 0xE0078: 84, + 0xE0079: 84, + 0xE007A: 84, + 0xE007B: 84, + 0xE007C: 84, + 0xE007D: 84, + 0xE007E: 84, + 0xE007F: 84, + 0xE0100: 84, + 0xE0101: 84, + 0xE0102: 84, + 0xE0103: 84, + 0xE0104: 84, + 0xE0105: 84, + 0xE0106: 84, + 0xE0107: 84, + 0xE0108: 84, + 0xE0109: 84, + 0xE010A: 84, + 0xE010B: 84, + 0xE010C: 84, + 0xE010D: 84, + 0xE010E: 84, + 0xE010F: 84, + 0xE0110: 84, + 0xE0111: 84, + 0xE0112: 84, + 0xE0113: 84, + 0xE0114: 84, + 0xE0115: 84, + 0xE0116: 84, + 0xE0117: 84, + 0xE0118: 84, + 0xE0119: 84, + 0xE011A: 84, + 0xE011B: 84, + 0xE011C: 84, + 0xE011D: 84, + 0xE011E: 84, + 0xE011F: 84, + 0xE0120: 84, + 0xE0121: 84, + 0xE0122: 84, + 0xE0123: 84, + 0xE0124: 84, + 0xE0125: 84, + 0xE0126: 84, + 0xE0127: 84, + 0xE0128: 84, + 0xE0129: 84, + 0xE012A: 84, + 0xE012B: 84, + 0xE012C: 84, + 0xE012D: 84, + 0xE012E: 84, + 0xE012F: 84, + 0xE0130: 84, + 0xE0131: 84, + 0xE0132: 84, + 0xE0133: 84, + 0xE0134: 84, + 0xE0135: 84, + 0xE0136: 84, + 0xE0137: 84, + 0xE0138: 84, + 0xE0139: 84, + 0xE013A: 84, + 0xE013B: 84, + 0xE013C: 84, + 0xE013D: 84, + 0xE013E: 84, + 0xE013F: 84, + 0xE0140: 84, + 0xE0141: 84, + 0xE0142: 84, + 0xE0143: 84, + 0xE0144: 84, + 0xE0145: 84, + 0xE0146: 84, + 0xE0147: 84, + 0xE0148: 84, + 0xE0149: 84, + 0xE014A: 84, + 0xE014B: 84, + 0xE014C: 84, + 0xE014D: 84, + 0xE014E: 84, + 0xE014F: 84, + 0xE0150: 84, + 0xE0151: 84, + 0xE0152: 84, + 0xE0153: 84, + 0xE0154: 84, + 0xE0155: 84, + 0xE0156: 84, + 0xE0157: 84, + 0xE0158: 84, + 0xE0159: 84, + 0xE015A: 84, + 0xE015B: 84, + 0xE015C: 84, + 0xE015D: 84, + 0xE015E: 84, + 0xE015F: 84, + 0xE0160: 84, + 0xE0161: 84, + 0xE0162: 84, + 0xE0163: 84, + 0xE0164: 84, + 0xE0165: 84, + 0xE0166: 84, + 0xE0167: 84, + 0xE0168: 84, + 0xE0169: 84, + 0xE016A: 84, + 0xE016B: 84, + 0xE016C: 84, + 0xE016D: 84, + 0xE016E: 84, + 0xE016F: 84, + 0xE0170: 84, + 0xE0171: 84, + 0xE0172: 84, + 0xE0173: 84, + 0xE0174: 84, + 0xE0175: 84, + 0xE0176: 84, + 0xE0177: 84, + 0xE0178: 84, + 0xE0179: 84, + 0xE017A: 84, + 0xE017B: 84, + 0xE017C: 84, + 0xE017D: 84, + 0xE017E: 84, + 0xE017F: 84, + 0xE0180: 84, + 0xE0181: 84, + 0xE0182: 84, + 0xE0183: 84, + 0xE0184: 84, + 0xE0185: 84, + 0xE0186: 84, + 0xE0187: 84, + 0xE0188: 84, + 0xE0189: 84, + 0xE018A: 84, + 0xE018B: 84, + 0xE018C: 84, + 0xE018D: 84, + 0xE018E: 84, + 0xE018F: 84, + 0xE0190: 84, + 0xE0191: 84, + 0xE0192: 84, + 0xE0193: 84, + 0xE0194: 84, + 0xE0195: 84, + 0xE0196: 84, + 0xE0197: 84, + 0xE0198: 84, + 0xE0199: 84, + 0xE019A: 84, + 0xE019B: 84, + 0xE019C: 84, + 0xE019D: 84, + 0xE019E: 84, + 0xE019F: 84, + 0xE01A0: 84, + 0xE01A1: 84, + 0xE01A2: 84, + 0xE01A3: 84, + 0xE01A4: 84, + 0xE01A5: 84, + 0xE01A6: 84, + 0xE01A7: 84, + 0xE01A8: 84, + 0xE01A9: 84, + 0xE01AA: 84, + 0xE01AB: 84, + 0xE01AC: 84, + 0xE01AD: 84, + 0xE01AE: 84, + 0xE01AF: 84, + 0xE01B0: 84, + 0xE01B1: 84, + 0xE01B2: 84, + 0xE01B3: 84, + 0xE01B4: 84, + 0xE01B5: 84, + 0xE01B6: 84, + 0xE01B7: 84, + 0xE01B8: 84, + 0xE01B9: 84, + 0xE01BA: 84, + 0xE01BB: 84, + 0xE01BC: 84, + 0xE01BD: 84, + 0xE01BE: 84, + 0xE01BF: 84, + 0xE01C0: 84, + 0xE01C1: 84, + 0xE01C2: 84, + 0xE01C3: 84, + 0xE01C4: 84, + 0xE01C5: 84, + 0xE01C6: 84, + 0xE01C7: 84, + 0xE01C8: 84, + 0xE01C9: 84, + 0xE01CA: 84, + 0xE01CB: 84, + 0xE01CC: 84, + 0xE01CD: 84, + 0xE01CE: 84, + 0xE01CF: 84, + 0xE01D0: 84, + 0xE01D1: 84, + 0xE01D2: 84, + 0xE01D3: 84, + 0xE01D4: 84, + 0xE01D5: 84, + 0xE01D6: 84, + 0xE01D7: 84, + 0xE01D8: 84, + 0xE01D9: 84, + 0xE01DA: 84, + 0xE01DB: 84, + 0xE01DC: 84, + 0xE01DD: 84, + 0xE01DE: 84, + 0xE01DF: 84, + 0xE01E0: 84, + 0xE01E1: 84, + 0xE01E2: 84, + 0xE01E3: 84, + 0xE01E4: 84, + 0xE01E5: 84, + 0xE01E6: 84, + 0xE01E7: 84, + 0xE01E8: 84, + 0xE01E9: 84, + 0xE01EA: 84, + 0xE01EB: 84, + 0xE01EC: 84, + 0xE01ED: 84, + 0xE01EE: 84, + 0xE01EF: 84, +} +codepoint_classes = { + "PVALID": ( + 0x2D0000002E, + 0x300000003A, + 0x610000007B, + 0xDF000000F7, + 0xF800000100, + 0x10100000102, + 0x10300000104, + 0x10500000106, + 0x10700000108, + 0x1090000010A, + 0x10B0000010C, + 0x10D0000010E, + 0x10F00000110, + 0x11100000112, + 0x11300000114, + 0x11500000116, + 0x11700000118, + 0x1190000011A, + 0x11B0000011C, + 0x11D0000011E, + 0x11F00000120, + 0x12100000122, + 0x12300000124, + 0x12500000126, + 0x12700000128, + 0x1290000012A, + 0x12B0000012C, + 0x12D0000012E, + 0x12F00000130, + 0x13100000132, + 0x13500000136, + 0x13700000139, + 0x13A0000013B, + 0x13C0000013D, + 0x13E0000013F, + 0x14200000143, + 0x14400000145, + 0x14600000147, + 0x14800000149, + 0x14B0000014C, + 0x14D0000014E, + 0x14F00000150, + 0x15100000152, + 0x15300000154, + 0x15500000156, + 0x15700000158, + 0x1590000015A, + 0x15B0000015C, + 0x15D0000015E, + 0x15F00000160, + 0x16100000162, + 0x16300000164, + 0x16500000166, + 0x16700000168, + 0x1690000016A, + 0x16B0000016C, + 0x16D0000016E, + 0x16F00000170, + 0x17100000172, + 0x17300000174, + 0x17500000176, + 0x17700000178, + 0x17A0000017B, + 0x17C0000017D, + 0x17E0000017F, + 0x18000000181, + 0x18300000184, + 0x18500000186, + 0x18800000189, + 0x18C0000018E, + 0x19200000193, + 0x19500000196, + 0x1990000019C, + 0x19E0000019F, + 0x1A1000001A2, + 0x1A3000001A4, + 0x1A5000001A6, + 0x1A8000001A9, + 0x1AA000001AC, + 0x1AD000001AE, + 0x1B0000001B1, + 0x1B4000001B5, + 0x1B6000001B7, + 0x1B9000001BC, + 0x1BD000001C4, + 0x1CE000001CF, + 0x1D0000001D1, + 0x1D2000001D3, + 0x1D4000001D5, + 0x1D6000001D7, + 0x1D8000001D9, + 0x1DA000001DB, + 0x1DC000001DE, + 0x1DF000001E0, + 0x1E1000001E2, + 0x1E3000001E4, + 0x1E5000001E6, + 0x1E7000001E8, + 0x1E9000001EA, + 0x1EB000001EC, + 0x1ED000001EE, + 0x1EF000001F1, + 0x1F5000001F6, + 0x1F9000001FA, + 0x1FB000001FC, + 0x1FD000001FE, + 0x1FF00000200, + 0x20100000202, + 0x20300000204, + 0x20500000206, + 0x20700000208, + 0x2090000020A, + 0x20B0000020C, + 0x20D0000020E, + 0x20F00000210, + 0x21100000212, + 0x21300000214, + 0x21500000216, + 0x21700000218, + 0x2190000021A, + 0x21B0000021C, + 0x21D0000021E, + 0x21F00000220, + 0x22100000222, + 0x22300000224, + 0x22500000226, + 0x22700000228, + 0x2290000022A, + 0x22B0000022C, + 0x22D0000022E, + 0x22F00000230, + 0x23100000232, + 0x2330000023A, + 0x23C0000023D, + 0x23F00000241, + 0x24200000243, + 0x24700000248, + 0x2490000024A, + 0x24B0000024C, + 0x24D0000024E, + 0x24F000002B0, + 0x2B9000002C2, + 0x2C6000002D2, + 0x2EC000002ED, + 0x2EE000002EF, + 0x30000000340, + 0x34200000343, + 0x3460000034F, + 0x35000000370, + 0x37100000372, + 0x37300000374, + 0x37700000378, + 0x37B0000037E, + 0x39000000391, + 0x3AC000003CF, + 0x3D7000003D8, + 0x3D9000003DA, + 0x3DB000003DC, + 0x3DD000003DE, + 0x3DF000003E0, + 0x3E1000003E2, + 0x3E3000003E4, + 0x3E5000003E6, + 0x3E7000003E8, + 0x3E9000003EA, + 0x3EB000003EC, + 0x3ED000003EE, + 0x3EF000003F0, + 0x3F3000003F4, + 0x3F8000003F9, + 0x3FB000003FD, + 0x43000000460, + 0x46100000462, + 0x46300000464, + 0x46500000466, + 0x46700000468, + 0x4690000046A, + 0x46B0000046C, + 0x46D0000046E, + 0x46F00000470, + 0x47100000472, + 0x47300000474, + 0x47500000476, + 0x47700000478, + 0x4790000047A, + 0x47B0000047C, + 0x47D0000047E, + 0x47F00000480, + 0x48100000482, + 0x48300000488, + 0x48B0000048C, + 0x48D0000048E, + 0x48F00000490, + 0x49100000492, + 0x49300000494, + 0x49500000496, + 0x49700000498, + 0x4990000049A, + 0x49B0000049C, + 0x49D0000049E, + 0x49F000004A0, + 0x4A1000004A2, + 0x4A3000004A4, + 0x4A5000004A6, + 0x4A7000004A8, + 0x4A9000004AA, + 0x4AB000004AC, + 0x4AD000004AE, + 0x4AF000004B0, + 0x4B1000004B2, + 0x4B3000004B4, + 0x4B5000004B6, + 0x4B7000004B8, + 0x4B9000004BA, + 0x4BB000004BC, + 0x4BD000004BE, + 0x4BF000004C0, + 0x4C2000004C3, + 0x4C4000004C5, + 0x4C6000004C7, + 0x4C8000004C9, + 0x4CA000004CB, + 0x4CC000004CD, + 0x4CE000004D0, + 0x4D1000004D2, + 0x4D3000004D4, + 0x4D5000004D6, + 0x4D7000004D8, + 0x4D9000004DA, + 0x4DB000004DC, + 0x4DD000004DE, + 0x4DF000004E0, + 0x4E1000004E2, + 0x4E3000004E4, + 0x4E5000004E6, + 0x4E7000004E8, + 0x4E9000004EA, + 0x4EB000004EC, + 0x4ED000004EE, + 0x4EF000004F0, + 0x4F1000004F2, + 0x4F3000004F4, + 0x4F5000004F6, + 0x4F7000004F8, + 0x4F9000004FA, + 0x4FB000004FC, + 0x4FD000004FE, + 0x4FF00000500, + 0x50100000502, + 0x50300000504, + 0x50500000506, + 0x50700000508, + 0x5090000050A, + 0x50B0000050C, + 0x50D0000050E, + 0x50F00000510, + 0x51100000512, + 0x51300000514, + 0x51500000516, + 0x51700000518, + 0x5190000051A, + 0x51B0000051C, + 0x51D0000051E, + 0x51F00000520, + 0x52100000522, + 0x52300000524, + 0x52500000526, + 0x52700000528, + 0x5290000052A, + 0x52B0000052C, + 0x52D0000052E, + 0x52F00000530, + 0x5590000055A, + 0x56000000587, + 0x58800000589, + 0x591000005BE, + 0x5BF000005C0, + 0x5C1000005C3, + 0x5C4000005C6, + 0x5C7000005C8, + 0x5D0000005EB, + 0x5EF000005F3, + 0x6100000061B, + 0x62000000640, + 0x64100000660, + 0x66E00000675, + 0x679000006D4, + 0x6D5000006DD, + 0x6DF000006E9, + 0x6EA000006F0, + 0x6FA00000700, + 0x7100000074B, + 0x74D000007B2, + 0x7C0000007F6, + 0x7FD000007FE, + 0x8000000082E, + 0x8400000085C, + 0x8600000086B, + 0x87000000888, + 0x8890000088F, + 0x898000008E2, + 0x8E300000958, + 0x96000000964, + 0x96600000970, + 0x97100000984, + 0x9850000098D, + 0x98F00000991, + 0x993000009A9, + 0x9AA000009B1, + 0x9B2000009B3, + 0x9B6000009BA, + 0x9BC000009C5, + 0x9C7000009C9, + 0x9CB000009CF, + 0x9D7000009D8, + 0x9E0000009E4, + 0x9E6000009F2, + 0x9FC000009FD, + 0x9FE000009FF, + 0xA0100000A04, + 0xA0500000A0B, + 0xA0F00000A11, + 0xA1300000A29, + 0xA2A00000A31, + 0xA3200000A33, + 0xA3500000A36, + 0xA3800000A3A, + 0xA3C00000A3D, + 0xA3E00000A43, + 0xA4700000A49, + 0xA4B00000A4E, + 0xA5100000A52, + 0xA5C00000A5D, + 0xA6600000A76, + 0xA8100000A84, + 0xA8500000A8E, + 0xA8F00000A92, + 0xA9300000AA9, + 0xAAA00000AB1, + 0xAB200000AB4, + 0xAB500000ABA, + 0xABC00000AC6, + 0xAC700000ACA, + 0xACB00000ACE, + 0xAD000000AD1, + 0xAE000000AE4, + 0xAE600000AF0, + 0xAF900000B00, + 0xB0100000B04, + 0xB0500000B0D, + 0xB0F00000B11, + 0xB1300000B29, + 0xB2A00000B31, + 0xB3200000B34, + 0xB3500000B3A, + 0xB3C00000B45, + 0xB4700000B49, + 0xB4B00000B4E, + 0xB5500000B58, + 0xB5F00000B64, + 0xB6600000B70, + 0xB7100000B72, + 0xB8200000B84, + 0xB8500000B8B, + 0xB8E00000B91, + 0xB9200000B96, + 0xB9900000B9B, + 0xB9C00000B9D, + 0xB9E00000BA0, + 0xBA300000BA5, + 0xBA800000BAB, + 0xBAE00000BBA, + 0xBBE00000BC3, + 0xBC600000BC9, + 0xBCA00000BCE, + 0xBD000000BD1, + 0xBD700000BD8, + 0xBE600000BF0, + 0xC0000000C0D, + 0xC0E00000C11, + 0xC1200000C29, + 0xC2A00000C3A, + 0xC3C00000C45, + 0xC4600000C49, + 0xC4A00000C4E, + 0xC5500000C57, + 0xC5800000C5B, + 0xC5D00000C5E, + 0xC6000000C64, + 0xC6600000C70, + 0xC8000000C84, + 0xC8500000C8D, + 0xC8E00000C91, + 0xC9200000CA9, + 0xCAA00000CB4, + 0xCB500000CBA, + 0xCBC00000CC5, + 0xCC600000CC9, + 0xCCA00000CCE, + 0xCD500000CD7, + 0xCDD00000CDF, + 0xCE000000CE4, + 0xCE600000CF0, + 0xCF100000CF4, + 0xD0000000D0D, + 0xD0E00000D11, + 0xD1200000D45, + 0xD4600000D49, + 0xD4A00000D4F, + 0xD5400000D58, + 0xD5F00000D64, + 0xD6600000D70, + 0xD7A00000D80, + 0xD8100000D84, + 0xD8500000D97, + 0xD9A00000DB2, + 0xDB300000DBC, + 0xDBD00000DBE, + 0xDC000000DC7, + 0xDCA00000DCB, + 0xDCF00000DD5, + 0xDD600000DD7, + 0xDD800000DE0, + 0xDE600000DF0, + 0xDF200000DF4, + 0xE0100000E33, + 0xE3400000E3B, + 0xE4000000E4F, + 0xE5000000E5A, + 0xE8100000E83, + 0xE8400000E85, + 0xE8600000E8B, + 0xE8C00000EA4, + 0xEA500000EA6, + 0xEA700000EB3, + 0xEB400000EBE, + 0xEC000000EC5, + 0xEC600000EC7, + 0xEC800000ECF, + 0xED000000EDA, + 0xEDE00000EE0, + 0xF0000000F01, + 0xF0B00000F0C, + 0xF1800000F1A, + 0xF2000000F2A, + 0xF3500000F36, + 0xF3700000F38, + 0xF3900000F3A, + 0xF3E00000F43, + 0xF4400000F48, + 0xF4900000F4D, + 0xF4E00000F52, + 0xF5300000F57, + 0xF5800000F5C, + 0xF5D00000F69, + 0xF6A00000F6D, + 0xF7100000F73, + 0xF7400000F75, + 0xF7A00000F81, + 0xF8200000F85, + 0xF8600000F93, + 0xF9400000F98, + 0xF9900000F9D, + 0xF9E00000FA2, + 0xFA300000FA7, + 0xFA800000FAC, + 0xFAD00000FB9, + 0xFBA00000FBD, + 0xFC600000FC7, + 0x10000000104A, + 0x10500000109E, + 0x10D0000010FB, + 0x10FD00001100, + 0x120000001249, + 0x124A0000124E, + 0x125000001257, + 0x125800001259, + 0x125A0000125E, + 0x126000001289, + 0x128A0000128E, + 0x1290000012B1, + 0x12B2000012B6, + 0x12B8000012BF, + 0x12C0000012C1, + 0x12C2000012C6, + 0x12C8000012D7, + 0x12D800001311, + 0x131200001316, + 0x13180000135B, + 0x135D00001360, + 0x138000001390, + 0x13A0000013F6, + 0x14010000166D, + 0x166F00001680, + 0x16810000169B, + 0x16A0000016EB, + 0x16F1000016F9, + 0x170000001716, + 0x171F00001735, + 0x174000001754, + 0x17600000176D, + 0x176E00001771, + 0x177200001774, + 0x1780000017B4, + 0x17B6000017D4, + 0x17D7000017D8, + 0x17DC000017DE, + 0x17E0000017EA, + 0x18100000181A, + 0x182000001879, + 0x1880000018AB, + 0x18B0000018F6, + 0x19000000191F, + 0x19200000192C, + 0x19300000193C, + 0x19460000196E, + 0x197000001975, + 0x1980000019AC, + 0x19B0000019CA, + 0x19D0000019DA, + 0x1A0000001A1C, + 0x1A2000001A5F, + 0x1A6000001A7D, + 0x1A7F00001A8A, + 0x1A9000001A9A, + 0x1AA700001AA8, + 0x1AB000001ABE, + 0x1ABF00001ACF, + 0x1B0000001B4D, + 0x1B5000001B5A, + 0x1B6B00001B74, + 0x1B8000001BF4, + 0x1C0000001C38, + 0x1C4000001C4A, + 0x1C4D00001C7E, + 0x1CD000001CD3, + 0x1CD400001CFB, + 0x1D0000001D2C, + 0x1D2F00001D30, + 0x1D3B00001D3C, + 0x1D4E00001D4F, + 0x1D6B00001D78, + 0x1D7900001D9B, + 0x1DC000001E00, + 0x1E0100001E02, + 0x1E0300001E04, + 0x1E0500001E06, + 0x1E0700001E08, + 0x1E0900001E0A, + 0x1E0B00001E0C, + 0x1E0D00001E0E, + 0x1E0F00001E10, + 0x1E1100001E12, + 0x1E1300001E14, + 0x1E1500001E16, + 0x1E1700001E18, + 0x1E1900001E1A, + 0x1E1B00001E1C, + 0x1E1D00001E1E, + 0x1E1F00001E20, + 0x1E2100001E22, + 0x1E2300001E24, + 0x1E2500001E26, + 0x1E2700001E28, + 0x1E2900001E2A, + 0x1E2B00001E2C, + 0x1E2D00001E2E, + 0x1E2F00001E30, + 0x1E3100001E32, + 0x1E3300001E34, + 0x1E3500001E36, + 0x1E3700001E38, + 0x1E3900001E3A, + 0x1E3B00001E3C, + 0x1E3D00001E3E, + 0x1E3F00001E40, + 0x1E4100001E42, + 0x1E4300001E44, + 0x1E4500001E46, + 0x1E4700001E48, + 0x1E4900001E4A, + 0x1E4B00001E4C, + 0x1E4D00001E4E, + 0x1E4F00001E50, + 0x1E5100001E52, + 0x1E5300001E54, + 0x1E5500001E56, + 0x1E5700001E58, + 0x1E5900001E5A, + 0x1E5B00001E5C, + 0x1E5D00001E5E, + 0x1E5F00001E60, + 0x1E6100001E62, + 0x1E6300001E64, + 0x1E6500001E66, + 0x1E6700001E68, + 0x1E6900001E6A, + 0x1E6B00001E6C, + 0x1E6D00001E6E, + 0x1E6F00001E70, + 0x1E7100001E72, + 0x1E7300001E74, + 0x1E7500001E76, + 0x1E7700001E78, + 0x1E7900001E7A, + 0x1E7B00001E7C, + 0x1E7D00001E7E, + 0x1E7F00001E80, + 0x1E8100001E82, + 0x1E8300001E84, + 0x1E8500001E86, + 0x1E8700001E88, + 0x1E8900001E8A, + 0x1E8B00001E8C, + 0x1E8D00001E8E, + 0x1E8F00001E90, + 0x1E9100001E92, + 0x1E9300001E94, + 0x1E9500001E9A, + 0x1E9C00001E9E, + 0x1E9F00001EA0, + 0x1EA100001EA2, + 0x1EA300001EA4, + 0x1EA500001EA6, + 0x1EA700001EA8, + 0x1EA900001EAA, + 0x1EAB00001EAC, + 0x1EAD00001EAE, + 0x1EAF00001EB0, + 0x1EB100001EB2, + 0x1EB300001EB4, + 0x1EB500001EB6, + 0x1EB700001EB8, + 0x1EB900001EBA, + 0x1EBB00001EBC, + 0x1EBD00001EBE, + 0x1EBF00001EC0, + 0x1EC100001EC2, + 0x1EC300001EC4, + 0x1EC500001EC6, + 0x1EC700001EC8, + 0x1EC900001ECA, + 0x1ECB00001ECC, + 0x1ECD00001ECE, + 0x1ECF00001ED0, + 0x1ED100001ED2, + 0x1ED300001ED4, + 0x1ED500001ED6, + 0x1ED700001ED8, + 0x1ED900001EDA, + 0x1EDB00001EDC, + 0x1EDD00001EDE, + 0x1EDF00001EE0, + 0x1EE100001EE2, + 0x1EE300001EE4, + 0x1EE500001EE6, + 0x1EE700001EE8, + 0x1EE900001EEA, + 0x1EEB00001EEC, + 0x1EED00001EEE, + 0x1EEF00001EF0, + 0x1EF100001EF2, + 0x1EF300001EF4, + 0x1EF500001EF6, + 0x1EF700001EF8, + 0x1EF900001EFA, + 0x1EFB00001EFC, + 0x1EFD00001EFE, + 0x1EFF00001F08, + 0x1F1000001F16, + 0x1F2000001F28, + 0x1F3000001F38, + 0x1F4000001F46, + 0x1F5000001F58, + 0x1F6000001F68, + 0x1F7000001F71, + 0x1F7200001F73, + 0x1F7400001F75, + 0x1F7600001F77, + 0x1F7800001F79, + 0x1F7A00001F7B, + 0x1F7C00001F7D, + 0x1FB000001FB2, + 0x1FB600001FB7, + 0x1FC600001FC7, + 0x1FD000001FD3, + 0x1FD600001FD8, + 0x1FE000001FE3, + 0x1FE400001FE8, + 0x1FF600001FF7, + 0x214E0000214F, + 0x218400002185, + 0x2C3000002C60, + 0x2C6100002C62, + 0x2C6500002C67, + 0x2C6800002C69, + 0x2C6A00002C6B, + 0x2C6C00002C6D, + 0x2C7100002C72, + 0x2C7300002C75, + 0x2C7600002C7C, + 0x2C8100002C82, + 0x2C8300002C84, + 0x2C8500002C86, + 0x2C8700002C88, + 0x2C8900002C8A, + 0x2C8B00002C8C, + 0x2C8D00002C8E, + 0x2C8F00002C90, + 0x2C9100002C92, + 0x2C9300002C94, + 0x2C9500002C96, + 0x2C9700002C98, + 0x2C9900002C9A, + 0x2C9B00002C9C, + 0x2C9D00002C9E, + 0x2C9F00002CA0, + 0x2CA100002CA2, + 0x2CA300002CA4, + 0x2CA500002CA6, + 0x2CA700002CA8, + 0x2CA900002CAA, + 0x2CAB00002CAC, + 0x2CAD00002CAE, + 0x2CAF00002CB0, + 0x2CB100002CB2, + 0x2CB300002CB4, + 0x2CB500002CB6, + 0x2CB700002CB8, + 0x2CB900002CBA, + 0x2CBB00002CBC, + 0x2CBD00002CBE, + 0x2CBF00002CC0, + 0x2CC100002CC2, + 0x2CC300002CC4, + 0x2CC500002CC6, + 0x2CC700002CC8, + 0x2CC900002CCA, + 0x2CCB00002CCC, + 0x2CCD00002CCE, + 0x2CCF00002CD0, + 0x2CD100002CD2, + 0x2CD300002CD4, + 0x2CD500002CD6, + 0x2CD700002CD8, + 0x2CD900002CDA, + 0x2CDB00002CDC, + 0x2CDD00002CDE, + 0x2CDF00002CE0, + 0x2CE100002CE2, + 0x2CE300002CE5, + 0x2CEC00002CED, + 0x2CEE00002CF2, + 0x2CF300002CF4, + 0x2D0000002D26, + 0x2D2700002D28, + 0x2D2D00002D2E, + 0x2D3000002D68, + 0x2D7F00002D97, + 0x2DA000002DA7, + 0x2DA800002DAF, + 0x2DB000002DB7, + 0x2DB800002DBF, + 0x2DC000002DC7, + 0x2DC800002DCF, + 0x2DD000002DD7, + 0x2DD800002DDF, + 0x2DE000002E00, + 0x2E2F00002E30, + 0x300500003008, + 0x302A0000302E, + 0x303C0000303D, + 0x304100003097, + 0x30990000309B, + 0x309D0000309F, + 0x30A1000030FB, + 0x30FC000030FF, + 0x310500003130, + 0x31A0000031C0, + 0x31F000003200, + 0x340000004DC0, + 0x4E000000A48D, + 0xA4D00000A4FE, + 0xA5000000A60D, + 0xA6100000A62C, + 0xA6410000A642, + 0xA6430000A644, + 0xA6450000A646, + 0xA6470000A648, + 0xA6490000A64A, + 0xA64B0000A64C, + 0xA64D0000A64E, + 0xA64F0000A650, + 0xA6510000A652, + 0xA6530000A654, + 0xA6550000A656, + 0xA6570000A658, + 0xA6590000A65A, + 0xA65B0000A65C, + 0xA65D0000A65E, + 0xA65F0000A660, + 0xA6610000A662, + 0xA6630000A664, + 0xA6650000A666, + 0xA6670000A668, + 0xA6690000A66A, + 0xA66B0000A66C, + 0xA66D0000A670, + 0xA6740000A67E, + 0xA67F0000A680, + 0xA6810000A682, + 0xA6830000A684, + 0xA6850000A686, + 0xA6870000A688, + 0xA6890000A68A, + 0xA68B0000A68C, + 0xA68D0000A68E, + 0xA68F0000A690, + 0xA6910000A692, + 0xA6930000A694, + 0xA6950000A696, + 0xA6970000A698, + 0xA6990000A69A, + 0xA69B0000A69C, + 0xA69E0000A6E6, + 0xA6F00000A6F2, + 0xA7170000A720, + 0xA7230000A724, + 0xA7250000A726, + 0xA7270000A728, + 0xA7290000A72A, + 0xA72B0000A72C, + 0xA72D0000A72E, + 0xA72F0000A732, + 0xA7330000A734, + 0xA7350000A736, + 0xA7370000A738, + 0xA7390000A73A, + 0xA73B0000A73C, + 0xA73D0000A73E, + 0xA73F0000A740, + 0xA7410000A742, + 0xA7430000A744, + 0xA7450000A746, + 0xA7470000A748, + 0xA7490000A74A, + 0xA74B0000A74C, + 0xA74D0000A74E, + 0xA74F0000A750, + 0xA7510000A752, + 0xA7530000A754, + 0xA7550000A756, + 0xA7570000A758, + 0xA7590000A75A, + 0xA75B0000A75C, + 0xA75D0000A75E, + 0xA75F0000A760, + 0xA7610000A762, + 0xA7630000A764, + 0xA7650000A766, + 0xA7670000A768, + 0xA7690000A76A, + 0xA76B0000A76C, + 0xA76D0000A76E, + 0xA76F0000A770, + 0xA7710000A779, + 0xA77A0000A77B, + 0xA77C0000A77D, + 0xA77F0000A780, + 0xA7810000A782, + 0xA7830000A784, + 0xA7850000A786, + 0xA7870000A789, + 0xA78C0000A78D, + 0xA78E0000A790, + 0xA7910000A792, + 0xA7930000A796, + 0xA7970000A798, + 0xA7990000A79A, + 0xA79B0000A79C, + 0xA79D0000A79E, + 0xA79F0000A7A0, + 0xA7A10000A7A2, + 0xA7A30000A7A4, + 0xA7A50000A7A6, + 0xA7A70000A7A8, + 0xA7A90000A7AA, + 0xA7AF0000A7B0, + 0xA7B50000A7B6, + 0xA7B70000A7B8, + 0xA7B90000A7BA, + 0xA7BB0000A7BC, + 0xA7BD0000A7BE, + 0xA7BF0000A7C0, + 0xA7C10000A7C2, + 0xA7C30000A7C4, + 0xA7C80000A7C9, + 0xA7CA0000A7CB, + 0xA7D10000A7D2, + 0xA7D30000A7D4, + 0xA7D50000A7D6, + 0xA7D70000A7D8, + 0xA7D90000A7DA, + 0xA7F60000A7F8, + 0xA7FA0000A828, + 0xA82C0000A82D, + 0xA8400000A874, + 0xA8800000A8C6, + 0xA8D00000A8DA, + 0xA8E00000A8F8, + 0xA8FB0000A8FC, + 0xA8FD0000A92E, + 0xA9300000A954, + 0xA9800000A9C1, + 0xA9CF0000A9DA, + 0xA9E00000A9FF, + 0xAA000000AA37, + 0xAA400000AA4E, + 0xAA500000AA5A, + 0xAA600000AA77, + 0xAA7A0000AAC3, + 0xAADB0000AADE, + 0xAAE00000AAF0, + 0xAAF20000AAF7, + 0xAB010000AB07, + 0xAB090000AB0F, + 0xAB110000AB17, + 0xAB200000AB27, + 0xAB280000AB2F, + 0xAB300000AB5B, + 0xAB600000AB69, + 0xABC00000ABEB, + 0xABEC0000ABEE, + 0xABF00000ABFA, + 0xAC000000D7A4, + 0xFA0E0000FA10, + 0xFA110000FA12, + 0xFA130000FA15, + 0xFA1F0000FA20, + 0xFA210000FA22, + 0xFA230000FA25, + 0xFA270000FA2A, + 0xFB1E0000FB1F, + 0xFE200000FE30, + 0xFE730000FE74, + 0x100000001000C, + 0x1000D00010027, + 0x100280001003B, + 0x1003C0001003E, + 0x1003F0001004E, + 0x100500001005E, + 0x10080000100FB, + 0x101FD000101FE, + 0x102800001029D, + 0x102A0000102D1, + 0x102E0000102E1, + 0x1030000010320, + 0x1032D00010341, + 0x103420001034A, + 0x103500001037B, + 0x103800001039E, + 0x103A0000103C4, + 0x103C8000103D0, + 0x104280001049E, + 0x104A0000104AA, + 0x104D8000104FC, + 0x1050000010528, + 0x1053000010564, + 0x10597000105A2, + 0x105A3000105B2, + 0x105B3000105BA, + 0x105BB000105BD, + 0x1060000010737, + 0x1074000010756, + 0x1076000010768, + 0x1078000010781, + 0x1080000010806, + 0x1080800010809, + 0x1080A00010836, + 0x1083700010839, + 0x1083C0001083D, + 0x1083F00010856, + 0x1086000010877, + 0x108800001089F, + 0x108E0000108F3, + 0x108F4000108F6, + 0x1090000010916, + 0x109200001093A, + 0x10980000109B8, + 0x109BE000109C0, + 0x10A0000010A04, + 0x10A0500010A07, + 0x10A0C00010A14, + 0x10A1500010A18, + 0x10A1900010A36, + 0x10A3800010A3B, + 0x10A3F00010A40, + 0x10A6000010A7D, + 0x10A8000010A9D, + 0x10AC000010AC8, + 0x10AC900010AE7, + 0x10B0000010B36, + 0x10B4000010B56, + 0x10B6000010B73, + 0x10B8000010B92, + 0x10C0000010C49, + 0x10CC000010CF3, + 0x10D0000010D28, + 0x10D3000010D3A, + 0x10E8000010EAA, + 0x10EAB00010EAD, + 0x10EB000010EB2, + 0x10EFD00010F1D, + 0x10F2700010F28, + 0x10F3000010F51, + 0x10F7000010F86, + 0x10FB000010FC5, + 0x10FE000010FF7, + 0x1100000011047, + 0x1106600011076, + 0x1107F000110BB, + 0x110C2000110C3, + 0x110D0000110E9, + 0x110F0000110FA, + 0x1110000011135, + 0x1113600011140, + 0x1114400011148, + 0x1115000011174, + 0x1117600011177, + 0x11180000111C5, + 0x111C9000111CD, + 0x111CE000111DB, + 0x111DC000111DD, + 0x1120000011212, + 0x1121300011238, + 0x1123E00011242, + 0x1128000011287, + 0x1128800011289, + 0x1128A0001128E, + 0x1128F0001129E, + 0x1129F000112A9, + 0x112B0000112EB, + 0x112F0000112FA, + 0x1130000011304, + 0x113050001130D, + 0x1130F00011311, + 0x1131300011329, + 0x1132A00011331, + 0x1133200011334, + 0x113350001133A, + 0x1133B00011345, + 0x1134700011349, + 0x1134B0001134E, + 0x1135000011351, + 0x1135700011358, + 0x1135D00011364, + 0x113660001136D, + 0x1137000011375, + 0x114000001144B, + 0x114500001145A, + 0x1145E00011462, + 0x11480000114C6, + 0x114C7000114C8, + 0x114D0000114DA, + 0x11580000115B6, + 0x115B8000115C1, + 0x115D8000115DE, + 0x1160000011641, + 0x1164400011645, + 0x116500001165A, + 0x11680000116B9, + 0x116C0000116CA, + 0x117000001171B, + 0x1171D0001172C, + 0x117300001173A, + 0x1174000011747, + 0x118000001183B, + 0x118C0000118EA, + 0x118FF00011907, + 0x119090001190A, + 0x1190C00011914, + 0x1191500011917, + 0x1191800011936, + 0x1193700011939, + 0x1193B00011944, + 0x119500001195A, + 0x119A0000119A8, + 0x119AA000119D8, + 0x119DA000119E2, + 0x119E3000119E5, + 0x11A0000011A3F, + 0x11A4700011A48, + 0x11A5000011A9A, + 0x11A9D00011A9E, + 0x11AB000011AF9, + 0x11C0000011C09, + 0x11C0A00011C37, + 0x11C3800011C41, + 0x11C5000011C5A, + 0x11C7200011C90, + 0x11C9200011CA8, + 0x11CA900011CB7, + 0x11D0000011D07, + 0x11D0800011D0A, + 0x11D0B00011D37, + 0x11D3A00011D3B, + 0x11D3C00011D3E, + 0x11D3F00011D48, + 0x11D5000011D5A, + 0x11D6000011D66, + 0x11D6700011D69, + 0x11D6A00011D8F, + 0x11D9000011D92, + 0x11D9300011D99, + 0x11DA000011DAA, + 0x11EE000011EF7, + 0x11F0000011F11, + 0x11F1200011F3B, + 0x11F3E00011F43, + 0x11F5000011F5A, + 0x11FB000011FB1, + 0x120000001239A, + 0x1248000012544, + 0x12F9000012FF1, + 0x1300000013430, + 0x1344000013456, + 0x1440000014647, + 0x1680000016A39, + 0x16A4000016A5F, + 0x16A6000016A6A, + 0x16A7000016ABF, + 0x16AC000016ACA, + 0x16AD000016AEE, + 0x16AF000016AF5, + 0x16B0000016B37, + 0x16B4000016B44, + 0x16B5000016B5A, + 0x16B6300016B78, + 0x16B7D00016B90, + 0x16E6000016E80, + 0x16F0000016F4B, + 0x16F4F00016F88, + 0x16F8F00016FA0, + 0x16FE000016FE2, + 0x16FE300016FE5, + 0x16FF000016FF2, + 0x17000000187F8, + 0x1880000018CD6, + 0x18D0000018D09, + 0x1AFF00001AFF4, + 0x1AFF50001AFFC, + 0x1AFFD0001AFFF, + 0x1B0000001B123, + 0x1B1320001B133, + 0x1B1500001B153, + 0x1B1550001B156, + 0x1B1640001B168, + 0x1B1700001B2FC, + 0x1BC000001BC6B, + 0x1BC700001BC7D, + 0x1BC800001BC89, + 0x1BC900001BC9A, + 0x1BC9D0001BC9F, + 0x1CF000001CF2E, + 0x1CF300001CF47, + 0x1DA000001DA37, + 0x1DA3B0001DA6D, + 0x1DA750001DA76, + 0x1DA840001DA85, + 0x1DA9B0001DAA0, + 0x1DAA10001DAB0, + 0x1DF000001DF1F, + 0x1DF250001DF2B, + 0x1E0000001E007, + 0x1E0080001E019, + 0x1E01B0001E022, + 0x1E0230001E025, + 0x1E0260001E02B, + 0x1E08F0001E090, + 0x1E1000001E12D, + 0x1E1300001E13E, + 0x1E1400001E14A, + 0x1E14E0001E14F, + 0x1E2900001E2AF, + 0x1E2C00001E2FA, + 0x1E4D00001E4FA, + 0x1E7E00001E7E7, + 0x1E7E80001E7EC, + 0x1E7ED0001E7EF, + 0x1E7F00001E7FF, + 0x1E8000001E8C5, + 0x1E8D00001E8D7, + 0x1E9220001E94C, + 0x1E9500001E95A, + 0x200000002A6E0, + 0x2A7000002B73A, + 0x2B7400002B81E, + 0x2B8200002CEA2, + 0x2CEB00002EBE1, + 0x2EBF00002EE5E, + 0x300000003134B, + 0x31350000323B0, + ), + "CONTEXTJ": (0x200C0000200E,), + "CONTEXTO": ( + 0xB7000000B8, + 0x37500000376, + 0x5F3000005F5, + 0x6600000066A, + 0x6F0000006FA, + 0x30FB000030FC, + ), +} diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna/intranges.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna/intranges.py new file mode 100755 index 00000000..7bfaa8d8 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna/intranges.py @@ -0,0 +1,57 @@ +""" +Given a list of integers, made up of (hopefully) a small number of long runs +of consecutive integers, compute a representation of the form +((start1, end1), (start2, end2) ...). Then answer the question "was x present +in the original list?" in time O(log(# runs)). +""" + +import bisect +from typing import List, Tuple + + +def intranges_from_list(list_: List[int]) -> Tuple[int, ...]: + """Represent a list of integers as a sequence of ranges: + ((start_0, end_0), (start_1, end_1), ...), such that the original + integers are exactly those x such that start_i <= x < end_i for some i. + + Ranges are encoded as single integers (start << 32 | end), not as tuples. + """ + + sorted_list = sorted(list_) + ranges = [] + last_write = -1 + for i in range(len(sorted_list)): + if i + 1 < len(sorted_list): + if sorted_list[i] == sorted_list[i + 1] - 1: + continue + current_range = sorted_list[last_write + 1 : i + 1] + ranges.append(_encode_range(current_range[0], current_range[-1] + 1)) + last_write = i + + return tuple(ranges) + + +def _encode_range(start: int, end: int) -> int: + return (start << 32) | end + + +def _decode_range(r: int) -> Tuple[int, int]: + return (r >> 32), (r & ((1 << 32) - 1)) + + +def intranges_contain(int_: int, ranges: Tuple[int, ...]) -> bool: + """Determine if `int_` falls into one of the ranges in `ranges`.""" + tuple_ = _encode_range(int_, 0) + pos = bisect.bisect_left(ranges, tuple_) + # we could be immediately ahead of a tuple (start, end) + # with start < int_ <= end + if pos > 0: + left, right = _decode_range(ranges[pos - 1]) + if left <= int_ < right: + return True + # or we could be immediately behind a tuple (int_, end) + if pos < len(ranges): + left, _ = _decode_range(ranges[pos]) + if left == int_: + return True + return False diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna/package_data.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna/package_data.py new file mode 100755 index 00000000..514ff7e2 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna/package_data.py @@ -0,0 +1 @@ +__version__ = "3.10" diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna/py.typed b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna/py.typed new file mode 100755 index 00000000..e69de29b diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna/uts46data.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna/uts46data.py new file mode 100755 index 00000000..eb894327 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/idna/uts46data.py @@ -0,0 +1,8681 @@ +# This file is automatically generated by tools/idna-data +# vim: set fileencoding=utf-8 : + +from typing import List, Tuple, Union + +"""IDNA Mapping Table from UTS46.""" + + +__version__ = "15.1.0" + + +def _seg_0() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x0, "3"), + (0x1, "3"), + (0x2, "3"), + (0x3, "3"), + (0x4, "3"), + (0x5, "3"), + (0x6, "3"), + (0x7, "3"), + (0x8, "3"), + (0x9, "3"), + (0xA, "3"), + (0xB, "3"), + (0xC, "3"), + (0xD, "3"), + (0xE, "3"), + (0xF, "3"), + (0x10, "3"), + (0x11, "3"), + (0x12, "3"), + (0x13, "3"), + (0x14, "3"), + (0x15, "3"), + (0x16, "3"), + (0x17, "3"), + (0x18, "3"), + (0x19, "3"), + (0x1A, "3"), + (0x1B, "3"), + (0x1C, "3"), + (0x1D, "3"), + (0x1E, "3"), + (0x1F, "3"), + (0x20, "3"), + (0x21, "3"), + (0x22, "3"), + (0x23, "3"), + (0x24, "3"), + (0x25, "3"), + (0x26, "3"), + (0x27, "3"), + (0x28, "3"), + (0x29, "3"), + (0x2A, "3"), + (0x2B, "3"), + (0x2C, "3"), + (0x2D, "V"), + (0x2E, "V"), + (0x2F, "3"), + (0x30, "V"), + (0x31, "V"), + (0x32, "V"), + (0x33, "V"), + (0x34, "V"), + (0x35, "V"), + (0x36, "V"), + (0x37, "V"), + (0x38, "V"), + (0x39, "V"), + (0x3A, "3"), + (0x3B, "3"), + (0x3C, "3"), + (0x3D, "3"), + (0x3E, "3"), + (0x3F, "3"), + (0x40, "3"), + (0x41, "M", "a"), + (0x42, "M", "b"), + (0x43, "M", "c"), + (0x44, "M", "d"), + (0x45, "M", "e"), + (0x46, "M", "f"), + (0x47, "M", "g"), + (0x48, "M", "h"), + (0x49, "M", "i"), + (0x4A, "M", "j"), + (0x4B, "M", "k"), + (0x4C, "M", "l"), + (0x4D, "M", "m"), + (0x4E, "M", "n"), + (0x4F, "M", "o"), + (0x50, "M", "p"), + (0x51, "M", "q"), + (0x52, "M", "r"), + (0x53, "M", "s"), + (0x54, "M", "t"), + (0x55, "M", "u"), + (0x56, "M", "v"), + (0x57, "M", "w"), + (0x58, "M", "x"), + (0x59, "M", "y"), + (0x5A, "M", "z"), + (0x5B, "3"), + (0x5C, "3"), + (0x5D, "3"), + (0x5E, "3"), + (0x5F, "3"), + (0x60, "3"), + (0x61, "V"), + (0x62, "V"), + (0x63, "V"), + ] + + +def _seg_1() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x64, "V"), + (0x65, "V"), + (0x66, "V"), + (0x67, "V"), + (0x68, "V"), + (0x69, "V"), + (0x6A, "V"), + (0x6B, "V"), + (0x6C, "V"), + (0x6D, "V"), + (0x6E, "V"), + (0x6F, "V"), + (0x70, "V"), + (0x71, "V"), + (0x72, "V"), + (0x73, "V"), + (0x74, "V"), + (0x75, "V"), + (0x76, "V"), + (0x77, "V"), + (0x78, "V"), + (0x79, "V"), + (0x7A, "V"), + (0x7B, "3"), + (0x7C, "3"), + (0x7D, "3"), + (0x7E, "3"), + (0x7F, "3"), + (0x80, "X"), + (0x81, "X"), + (0x82, "X"), + (0x83, "X"), + (0x84, "X"), + (0x85, "X"), + (0x86, "X"), + (0x87, "X"), + (0x88, "X"), + (0x89, "X"), + (0x8A, "X"), + (0x8B, "X"), + (0x8C, "X"), + (0x8D, "X"), + (0x8E, "X"), + (0x8F, "X"), + (0x90, "X"), + (0x91, "X"), + (0x92, "X"), + (0x93, "X"), + (0x94, "X"), + (0x95, "X"), + (0x96, "X"), + (0x97, "X"), + (0x98, "X"), + (0x99, "X"), + (0x9A, "X"), + (0x9B, "X"), + (0x9C, "X"), + (0x9D, "X"), + (0x9E, "X"), + (0x9F, "X"), + (0xA0, "3", " "), + (0xA1, "V"), + (0xA2, "V"), + (0xA3, "V"), + (0xA4, "V"), + (0xA5, "V"), + (0xA6, "V"), + (0xA7, "V"), + (0xA8, "3", " ̈"), + (0xA9, "V"), + (0xAA, "M", "a"), + (0xAB, "V"), + (0xAC, "V"), + (0xAD, "I"), + (0xAE, "V"), + (0xAF, "3", " ̄"), + (0xB0, "V"), + (0xB1, "V"), + (0xB2, "M", "2"), + (0xB3, "M", "3"), + (0xB4, "3", " ́"), + (0xB5, "M", "μ"), + (0xB6, "V"), + (0xB7, "V"), + (0xB8, "3", " ̧"), + (0xB9, "M", "1"), + (0xBA, "M", "o"), + (0xBB, "V"), + (0xBC, "M", "1⁄4"), + (0xBD, "M", "1⁄2"), + (0xBE, "M", "3⁄4"), + (0xBF, "V"), + (0xC0, "M", "à"), + (0xC1, "M", "á"), + (0xC2, "M", "â"), + (0xC3, "M", "ã"), + (0xC4, "M", "ä"), + (0xC5, "M", "å"), + (0xC6, "M", "æ"), + (0xC7, "M", "ç"), + ] + + +def _seg_2() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xC8, "M", "è"), + (0xC9, "M", "é"), + (0xCA, "M", "ê"), + (0xCB, "M", "ë"), + (0xCC, "M", "ì"), + (0xCD, "M", "í"), + (0xCE, "M", "î"), + (0xCF, "M", "ï"), + (0xD0, "M", "ð"), + (0xD1, "M", "ñ"), + (0xD2, "M", "ò"), + (0xD3, "M", "ó"), + (0xD4, "M", "ô"), + (0xD5, "M", "õ"), + (0xD6, "M", "ö"), + (0xD7, "V"), + (0xD8, "M", "ø"), + (0xD9, "M", "ù"), + (0xDA, "M", "ú"), + (0xDB, "M", "û"), + (0xDC, "M", "ü"), + (0xDD, "M", "ý"), + (0xDE, "M", "þ"), + (0xDF, "D", "ss"), + (0xE0, "V"), + (0xE1, "V"), + (0xE2, "V"), + (0xE3, "V"), + (0xE4, "V"), + (0xE5, "V"), + (0xE6, "V"), + (0xE7, "V"), + (0xE8, "V"), + (0xE9, "V"), + (0xEA, "V"), + (0xEB, "V"), + (0xEC, "V"), + (0xED, "V"), + (0xEE, "V"), + (0xEF, "V"), + (0xF0, "V"), + (0xF1, "V"), + (0xF2, "V"), + (0xF3, "V"), + (0xF4, "V"), + (0xF5, "V"), + (0xF6, "V"), + (0xF7, "V"), + (0xF8, "V"), + (0xF9, "V"), + (0xFA, "V"), + (0xFB, "V"), + (0xFC, "V"), + (0xFD, "V"), + (0xFE, "V"), + (0xFF, "V"), + (0x100, "M", "ā"), + (0x101, "V"), + (0x102, "M", "ă"), + (0x103, "V"), + (0x104, "M", "ą"), + (0x105, "V"), + (0x106, "M", "ć"), + (0x107, "V"), + (0x108, "M", "ĉ"), + (0x109, "V"), + (0x10A, "M", "ċ"), + (0x10B, "V"), + (0x10C, "M", "č"), + (0x10D, "V"), + (0x10E, "M", "ď"), + (0x10F, "V"), + (0x110, "M", "đ"), + (0x111, "V"), + (0x112, "M", "ē"), + (0x113, "V"), + (0x114, "M", "ĕ"), + (0x115, "V"), + (0x116, "M", "ė"), + (0x117, "V"), + (0x118, "M", "ę"), + (0x119, "V"), + (0x11A, "M", "ě"), + (0x11B, "V"), + (0x11C, "M", "ĝ"), + (0x11D, "V"), + (0x11E, "M", "ğ"), + (0x11F, "V"), + (0x120, "M", "ġ"), + (0x121, "V"), + (0x122, "M", "ģ"), + (0x123, "V"), + (0x124, "M", "ĥ"), + (0x125, "V"), + (0x126, "M", "ħ"), + (0x127, "V"), + (0x128, "M", "ĩ"), + (0x129, "V"), + (0x12A, "M", "ī"), + (0x12B, "V"), + ] + + +def _seg_3() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x12C, "M", "ĭ"), + (0x12D, "V"), + (0x12E, "M", "į"), + (0x12F, "V"), + (0x130, "M", "i̇"), + (0x131, "V"), + (0x132, "M", "ij"), + (0x134, "M", "ĵ"), + (0x135, "V"), + (0x136, "M", "ķ"), + (0x137, "V"), + (0x139, "M", "ĺ"), + (0x13A, "V"), + (0x13B, "M", "ļ"), + (0x13C, "V"), + (0x13D, "M", "ľ"), + (0x13E, "V"), + (0x13F, "M", "l·"), + (0x141, "M", "ł"), + (0x142, "V"), + (0x143, "M", "ń"), + (0x144, "V"), + (0x145, "M", "ņ"), + (0x146, "V"), + (0x147, "M", "ň"), + (0x148, "V"), + (0x149, "M", "ʼn"), + (0x14A, "M", "ŋ"), + (0x14B, "V"), + (0x14C, "M", "ō"), + (0x14D, "V"), + (0x14E, "M", "ŏ"), + (0x14F, "V"), + (0x150, "M", "ő"), + (0x151, "V"), + (0x152, "M", "œ"), + (0x153, "V"), + (0x154, "M", "ŕ"), + (0x155, "V"), + (0x156, "M", "ŗ"), + (0x157, "V"), + (0x158, "M", "ř"), + (0x159, "V"), + (0x15A, "M", "ś"), + (0x15B, "V"), + (0x15C, "M", "ŝ"), + (0x15D, "V"), + (0x15E, "M", "ş"), + (0x15F, "V"), + (0x160, "M", "š"), + (0x161, "V"), + (0x162, "M", "ţ"), + (0x163, "V"), + (0x164, "M", "ť"), + (0x165, "V"), + (0x166, "M", "ŧ"), + (0x167, "V"), + (0x168, "M", "ũ"), + (0x169, "V"), + (0x16A, "M", "ū"), + (0x16B, "V"), + (0x16C, "M", "ŭ"), + (0x16D, "V"), + (0x16E, "M", "ů"), + (0x16F, "V"), + (0x170, "M", "ű"), + (0x171, "V"), + (0x172, "M", "ų"), + (0x173, "V"), + (0x174, "M", "ŵ"), + (0x175, "V"), + (0x176, "M", "ŷ"), + (0x177, "V"), + (0x178, "M", "ÿ"), + (0x179, "M", "ź"), + (0x17A, "V"), + (0x17B, "M", "ż"), + (0x17C, "V"), + (0x17D, "M", "ž"), + (0x17E, "V"), + (0x17F, "M", "s"), + (0x180, "V"), + (0x181, "M", "ɓ"), + (0x182, "M", "ƃ"), + (0x183, "V"), + (0x184, "M", "ƅ"), + (0x185, "V"), + (0x186, "M", "ɔ"), + (0x187, "M", "ƈ"), + (0x188, "V"), + (0x189, "M", "ɖ"), + (0x18A, "M", "ɗ"), + (0x18B, "M", "ƌ"), + (0x18C, "V"), + (0x18E, "M", "ǝ"), + (0x18F, "M", "ə"), + (0x190, "M", "ɛ"), + (0x191, "M", "ƒ"), + (0x192, "V"), + (0x193, "M", "ɠ"), + ] + + +def _seg_4() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x194, "M", "ɣ"), + (0x195, "V"), + (0x196, "M", "ɩ"), + (0x197, "M", "ɨ"), + (0x198, "M", "ƙ"), + (0x199, "V"), + (0x19C, "M", "ɯ"), + (0x19D, "M", "ɲ"), + (0x19E, "V"), + (0x19F, "M", "ɵ"), + (0x1A0, "M", "ơ"), + (0x1A1, "V"), + (0x1A2, "M", "ƣ"), + (0x1A3, "V"), + (0x1A4, "M", "ƥ"), + (0x1A5, "V"), + (0x1A6, "M", "ʀ"), + (0x1A7, "M", "ƨ"), + (0x1A8, "V"), + (0x1A9, "M", "ʃ"), + (0x1AA, "V"), + (0x1AC, "M", "ƭ"), + (0x1AD, "V"), + (0x1AE, "M", "ʈ"), + (0x1AF, "M", "ư"), + (0x1B0, "V"), + (0x1B1, "M", "ʊ"), + (0x1B2, "M", "ʋ"), + (0x1B3, "M", "ƴ"), + (0x1B4, "V"), + (0x1B5, "M", "ƶ"), + (0x1B6, "V"), + (0x1B7, "M", "ʒ"), + (0x1B8, "M", "ƹ"), + (0x1B9, "V"), + (0x1BC, "M", "ƽ"), + (0x1BD, "V"), + (0x1C4, "M", "dž"), + (0x1C7, "M", "lj"), + (0x1CA, "M", "nj"), + (0x1CD, "M", "ǎ"), + (0x1CE, "V"), + (0x1CF, "M", "ǐ"), + (0x1D0, "V"), + (0x1D1, "M", "ǒ"), + (0x1D2, "V"), + (0x1D3, "M", "ǔ"), + (0x1D4, "V"), + (0x1D5, "M", "ǖ"), + (0x1D6, "V"), + (0x1D7, "M", "ǘ"), + (0x1D8, "V"), + (0x1D9, "M", "ǚ"), + (0x1DA, "V"), + (0x1DB, "M", "ǜ"), + (0x1DC, "V"), + (0x1DE, "M", "ǟ"), + (0x1DF, "V"), + (0x1E0, "M", "ǡ"), + (0x1E1, "V"), + (0x1E2, "M", "ǣ"), + (0x1E3, "V"), + (0x1E4, "M", "ǥ"), + (0x1E5, "V"), + (0x1E6, "M", "ǧ"), + (0x1E7, "V"), + (0x1E8, "M", "ǩ"), + (0x1E9, "V"), + (0x1EA, "M", "ǫ"), + (0x1EB, "V"), + (0x1EC, "M", "ǭ"), + (0x1ED, "V"), + (0x1EE, "M", "ǯ"), + (0x1EF, "V"), + (0x1F1, "M", "dz"), + (0x1F4, "M", "ǵ"), + (0x1F5, "V"), + (0x1F6, "M", "ƕ"), + (0x1F7, "M", "ƿ"), + (0x1F8, "M", "ǹ"), + (0x1F9, "V"), + (0x1FA, "M", "ǻ"), + (0x1FB, "V"), + (0x1FC, "M", "ǽ"), + (0x1FD, "V"), + (0x1FE, "M", "ǿ"), + (0x1FF, "V"), + (0x200, "M", "ȁ"), + (0x201, "V"), + (0x202, "M", "ȃ"), + (0x203, "V"), + (0x204, "M", "ȅ"), + (0x205, "V"), + (0x206, "M", "ȇ"), + (0x207, "V"), + (0x208, "M", "ȉ"), + (0x209, "V"), + (0x20A, "M", "ȋ"), + (0x20B, "V"), + (0x20C, "M", "ȍ"), + ] + + +def _seg_5() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x20D, "V"), + (0x20E, "M", "ȏ"), + (0x20F, "V"), + (0x210, "M", "ȑ"), + (0x211, "V"), + (0x212, "M", "ȓ"), + (0x213, "V"), + (0x214, "M", "ȕ"), + (0x215, "V"), + (0x216, "M", "ȗ"), + (0x217, "V"), + (0x218, "M", "ș"), + (0x219, "V"), + (0x21A, "M", "ț"), + (0x21B, "V"), + (0x21C, "M", "ȝ"), + (0x21D, "V"), + (0x21E, "M", "ȟ"), + (0x21F, "V"), + (0x220, "M", "ƞ"), + (0x221, "V"), + (0x222, "M", "ȣ"), + (0x223, "V"), + (0x224, "M", "ȥ"), + (0x225, "V"), + (0x226, "M", "ȧ"), + (0x227, "V"), + (0x228, "M", "ȩ"), + (0x229, "V"), + (0x22A, "M", "ȫ"), + (0x22B, "V"), + (0x22C, "M", "ȭ"), + (0x22D, "V"), + (0x22E, "M", "ȯ"), + (0x22F, "V"), + (0x230, "M", "ȱ"), + (0x231, "V"), + (0x232, "M", "ȳ"), + (0x233, "V"), + (0x23A, "M", "ⱥ"), + (0x23B, "M", "ȼ"), + (0x23C, "V"), + (0x23D, "M", "ƚ"), + (0x23E, "M", "ⱦ"), + (0x23F, "V"), + (0x241, "M", "ɂ"), + (0x242, "V"), + (0x243, "M", "ƀ"), + (0x244, "M", "ʉ"), + (0x245, "M", "ʌ"), + (0x246, "M", "ɇ"), + (0x247, "V"), + (0x248, "M", "ɉ"), + (0x249, "V"), + (0x24A, "M", "ɋ"), + (0x24B, "V"), + (0x24C, "M", "ɍ"), + (0x24D, "V"), + (0x24E, "M", "ɏ"), + (0x24F, "V"), + (0x2B0, "M", "h"), + (0x2B1, "M", "ɦ"), + (0x2B2, "M", "j"), + (0x2B3, "M", "r"), + (0x2B4, "M", "ɹ"), + (0x2B5, "M", "ɻ"), + (0x2B6, "M", "ʁ"), + (0x2B7, "M", "w"), + (0x2B8, "M", "y"), + (0x2B9, "V"), + (0x2D8, "3", " ̆"), + (0x2D9, "3", " ̇"), + (0x2DA, "3", " ̊"), + (0x2DB, "3", " ̨"), + (0x2DC, "3", " ̃"), + (0x2DD, "3", " ̋"), + (0x2DE, "V"), + (0x2E0, "M", "ɣ"), + (0x2E1, "M", "l"), + (0x2E2, "M", "s"), + (0x2E3, "M", "x"), + (0x2E4, "M", "ʕ"), + (0x2E5, "V"), + (0x340, "M", "̀"), + (0x341, "M", "́"), + (0x342, "V"), + (0x343, "M", "̓"), + (0x344, "M", "̈́"), + (0x345, "M", "ι"), + (0x346, "V"), + (0x34F, "I"), + (0x350, "V"), + (0x370, "M", "ͱ"), + (0x371, "V"), + (0x372, "M", "ͳ"), + (0x373, "V"), + (0x374, "M", "ʹ"), + (0x375, "V"), + (0x376, "M", "ͷ"), + (0x377, "V"), + ] + + +def _seg_6() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x378, "X"), + (0x37A, "3", " ι"), + (0x37B, "V"), + (0x37E, "3", ";"), + (0x37F, "M", "ϳ"), + (0x380, "X"), + (0x384, "3", " ́"), + (0x385, "3", " ̈́"), + (0x386, "M", "ά"), + (0x387, "M", "·"), + (0x388, "M", "έ"), + (0x389, "M", "ή"), + (0x38A, "M", "ί"), + (0x38B, "X"), + (0x38C, "M", "ό"), + (0x38D, "X"), + (0x38E, "M", "ύ"), + (0x38F, "M", "ώ"), + (0x390, "V"), + (0x391, "M", "α"), + (0x392, "M", "β"), + (0x393, "M", "γ"), + (0x394, "M", "δ"), + (0x395, "M", "ε"), + (0x396, "M", "ζ"), + (0x397, "M", "η"), + (0x398, "M", "θ"), + (0x399, "M", "ι"), + (0x39A, "M", "κ"), + (0x39B, "M", "λ"), + (0x39C, "M", "μ"), + (0x39D, "M", "ν"), + (0x39E, "M", "ξ"), + (0x39F, "M", "ο"), + (0x3A0, "M", "π"), + (0x3A1, "M", "ρ"), + (0x3A2, "X"), + (0x3A3, "M", "σ"), + (0x3A4, "M", "τ"), + (0x3A5, "M", "υ"), + (0x3A6, "M", "φ"), + (0x3A7, "M", "χ"), + (0x3A8, "M", "ψ"), + (0x3A9, "M", "ω"), + (0x3AA, "M", "ϊ"), + (0x3AB, "M", "ϋ"), + (0x3AC, "V"), + (0x3C2, "D", "σ"), + (0x3C3, "V"), + (0x3CF, "M", "ϗ"), + (0x3D0, "M", "β"), + (0x3D1, "M", "θ"), + (0x3D2, "M", "υ"), + (0x3D3, "M", "ύ"), + (0x3D4, "M", "ϋ"), + (0x3D5, "M", "φ"), + (0x3D6, "M", "π"), + (0x3D7, "V"), + (0x3D8, "M", "ϙ"), + (0x3D9, "V"), + (0x3DA, "M", "ϛ"), + (0x3DB, "V"), + (0x3DC, "M", "ϝ"), + (0x3DD, "V"), + (0x3DE, "M", "ϟ"), + (0x3DF, "V"), + (0x3E0, "M", "ϡ"), + (0x3E1, "V"), + (0x3E2, "M", "ϣ"), + (0x3E3, "V"), + (0x3E4, "M", "ϥ"), + (0x3E5, "V"), + (0x3E6, "M", "ϧ"), + (0x3E7, "V"), + (0x3E8, "M", "ϩ"), + (0x3E9, "V"), + (0x3EA, "M", "ϫ"), + (0x3EB, "V"), + (0x3EC, "M", "ϭ"), + (0x3ED, "V"), + (0x3EE, "M", "ϯ"), + (0x3EF, "V"), + (0x3F0, "M", "κ"), + (0x3F1, "M", "ρ"), + (0x3F2, "M", "σ"), + (0x3F3, "V"), + (0x3F4, "M", "θ"), + (0x3F5, "M", "ε"), + (0x3F6, "V"), + (0x3F7, "M", "ϸ"), + (0x3F8, "V"), + (0x3F9, "M", "σ"), + (0x3FA, "M", "ϻ"), + (0x3FB, "V"), + (0x3FD, "M", "ͻ"), + (0x3FE, "M", "ͼ"), + (0x3FF, "M", "ͽ"), + (0x400, "M", "ѐ"), + (0x401, "M", "ё"), + (0x402, "M", "ђ"), + ] + + +def _seg_7() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x403, "M", "ѓ"), + (0x404, "M", "є"), + (0x405, "M", "ѕ"), + (0x406, "M", "і"), + (0x407, "M", "ї"), + (0x408, "M", "ј"), + (0x409, "M", "љ"), + (0x40A, "M", "њ"), + (0x40B, "M", "ћ"), + (0x40C, "M", "ќ"), + (0x40D, "M", "ѝ"), + (0x40E, "M", "ў"), + (0x40F, "M", "џ"), + (0x410, "M", "а"), + (0x411, "M", "б"), + (0x412, "M", "в"), + (0x413, "M", "г"), + (0x414, "M", "д"), + (0x415, "M", "е"), + (0x416, "M", "ж"), + (0x417, "M", "з"), + (0x418, "M", "и"), + (0x419, "M", "й"), + (0x41A, "M", "к"), + (0x41B, "M", "л"), + (0x41C, "M", "м"), + (0x41D, "M", "н"), + (0x41E, "M", "о"), + (0x41F, "M", "п"), + (0x420, "M", "р"), + (0x421, "M", "с"), + (0x422, "M", "т"), + (0x423, "M", "у"), + (0x424, "M", "ф"), + (0x425, "M", "х"), + (0x426, "M", "ц"), + (0x427, "M", "ч"), + (0x428, "M", "ш"), + (0x429, "M", "щ"), + (0x42A, "M", "ъ"), + (0x42B, "M", "ы"), + (0x42C, "M", "ь"), + (0x42D, "M", "э"), + (0x42E, "M", "ю"), + (0x42F, "M", "я"), + (0x430, "V"), + (0x460, "M", "ѡ"), + (0x461, "V"), + (0x462, "M", "ѣ"), + (0x463, "V"), + (0x464, "M", "ѥ"), + (0x465, "V"), + (0x466, "M", "ѧ"), + (0x467, "V"), + (0x468, "M", "ѩ"), + (0x469, "V"), + (0x46A, "M", "ѫ"), + (0x46B, "V"), + (0x46C, "M", "ѭ"), + (0x46D, "V"), + (0x46E, "M", "ѯ"), + (0x46F, "V"), + (0x470, "M", "ѱ"), + (0x471, "V"), + (0x472, "M", "ѳ"), + (0x473, "V"), + (0x474, "M", "ѵ"), + (0x475, "V"), + (0x476, "M", "ѷ"), + (0x477, "V"), + (0x478, "M", "ѹ"), + (0x479, "V"), + (0x47A, "M", "ѻ"), + (0x47B, "V"), + (0x47C, "M", "ѽ"), + (0x47D, "V"), + (0x47E, "M", "ѿ"), + (0x47F, "V"), + (0x480, "M", "ҁ"), + (0x481, "V"), + (0x48A, "M", "ҋ"), + (0x48B, "V"), + (0x48C, "M", "ҍ"), + (0x48D, "V"), + (0x48E, "M", "ҏ"), + (0x48F, "V"), + (0x490, "M", "ґ"), + (0x491, "V"), + (0x492, "M", "ғ"), + (0x493, "V"), + (0x494, "M", "ҕ"), + (0x495, "V"), + (0x496, "M", "җ"), + (0x497, "V"), + (0x498, "M", "ҙ"), + (0x499, "V"), + (0x49A, "M", "қ"), + (0x49B, "V"), + (0x49C, "M", "ҝ"), + (0x49D, "V"), + ] + + +def _seg_8() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x49E, "M", "ҟ"), + (0x49F, "V"), + (0x4A0, "M", "ҡ"), + (0x4A1, "V"), + (0x4A2, "M", "ң"), + (0x4A3, "V"), + (0x4A4, "M", "ҥ"), + (0x4A5, "V"), + (0x4A6, "M", "ҧ"), + (0x4A7, "V"), + (0x4A8, "M", "ҩ"), + (0x4A9, "V"), + (0x4AA, "M", "ҫ"), + (0x4AB, "V"), + (0x4AC, "M", "ҭ"), + (0x4AD, "V"), + (0x4AE, "M", "ү"), + (0x4AF, "V"), + (0x4B0, "M", "ұ"), + (0x4B1, "V"), + (0x4B2, "M", "ҳ"), + (0x4B3, "V"), + (0x4B4, "M", "ҵ"), + (0x4B5, "V"), + (0x4B6, "M", "ҷ"), + (0x4B7, "V"), + (0x4B8, "M", "ҹ"), + (0x4B9, "V"), + (0x4BA, "M", "һ"), + (0x4BB, "V"), + (0x4BC, "M", "ҽ"), + (0x4BD, "V"), + (0x4BE, "M", "ҿ"), + (0x4BF, "V"), + (0x4C0, "X"), + (0x4C1, "M", "ӂ"), + (0x4C2, "V"), + (0x4C3, "M", "ӄ"), + (0x4C4, "V"), + (0x4C5, "M", "ӆ"), + (0x4C6, "V"), + (0x4C7, "M", "ӈ"), + (0x4C8, "V"), + (0x4C9, "M", "ӊ"), + (0x4CA, "V"), + (0x4CB, "M", "ӌ"), + (0x4CC, "V"), + (0x4CD, "M", "ӎ"), + (0x4CE, "V"), + (0x4D0, "M", "ӑ"), + (0x4D1, "V"), + (0x4D2, "M", "ӓ"), + (0x4D3, "V"), + (0x4D4, "M", "ӕ"), + (0x4D5, "V"), + (0x4D6, "M", "ӗ"), + (0x4D7, "V"), + (0x4D8, "M", "ә"), + (0x4D9, "V"), + (0x4DA, "M", "ӛ"), + (0x4DB, "V"), + (0x4DC, "M", "ӝ"), + (0x4DD, "V"), + (0x4DE, "M", "ӟ"), + (0x4DF, "V"), + (0x4E0, "M", "ӡ"), + (0x4E1, "V"), + (0x4E2, "M", "ӣ"), + (0x4E3, "V"), + (0x4E4, "M", "ӥ"), + (0x4E5, "V"), + (0x4E6, "M", "ӧ"), + (0x4E7, "V"), + (0x4E8, "M", "ө"), + (0x4E9, "V"), + (0x4EA, "M", "ӫ"), + (0x4EB, "V"), + (0x4EC, "M", "ӭ"), + (0x4ED, "V"), + (0x4EE, "M", "ӯ"), + (0x4EF, "V"), + (0x4F0, "M", "ӱ"), + (0x4F1, "V"), + (0x4F2, "M", "ӳ"), + (0x4F3, "V"), + (0x4F4, "M", "ӵ"), + (0x4F5, "V"), + (0x4F6, "M", "ӷ"), + (0x4F7, "V"), + (0x4F8, "M", "ӹ"), + (0x4F9, "V"), + (0x4FA, "M", "ӻ"), + (0x4FB, "V"), + (0x4FC, "M", "ӽ"), + (0x4FD, "V"), + (0x4FE, "M", "ӿ"), + (0x4FF, "V"), + (0x500, "M", "ԁ"), + (0x501, "V"), + (0x502, "M", "ԃ"), + ] + + +def _seg_9() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x503, "V"), + (0x504, "M", "ԅ"), + (0x505, "V"), + (0x506, "M", "ԇ"), + (0x507, "V"), + (0x508, "M", "ԉ"), + (0x509, "V"), + (0x50A, "M", "ԋ"), + (0x50B, "V"), + (0x50C, "M", "ԍ"), + (0x50D, "V"), + (0x50E, "M", "ԏ"), + (0x50F, "V"), + (0x510, "M", "ԑ"), + (0x511, "V"), + (0x512, "M", "ԓ"), + (0x513, "V"), + (0x514, "M", "ԕ"), + (0x515, "V"), + (0x516, "M", "ԗ"), + (0x517, "V"), + (0x518, "M", "ԙ"), + (0x519, "V"), + (0x51A, "M", "ԛ"), + (0x51B, "V"), + (0x51C, "M", "ԝ"), + (0x51D, "V"), + (0x51E, "M", "ԟ"), + (0x51F, "V"), + (0x520, "M", "ԡ"), + (0x521, "V"), + (0x522, "M", "ԣ"), + (0x523, "V"), + (0x524, "M", "ԥ"), + (0x525, "V"), + (0x526, "M", "ԧ"), + (0x527, "V"), + (0x528, "M", "ԩ"), + (0x529, "V"), + (0x52A, "M", "ԫ"), + (0x52B, "V"), + (0x52C, "M", "ԭ"), + (0x52D, "V"), + (0x52E, "M", "ԯ"), + (0x52F, "V"), + (0x530, "X"), + (0x531, "M", "ա"), + (0x532, "M", "բ"), + (0x533, "M", "գ"), + (0x534, "M", "դ"), + (0x535, "M", "ե"), + (0x536, "M", "զ"), + (0x537, "M", "է"), + (0x538, "M", "ը"), + (0x539, "M", "թ"), + (0x53A, "M", "ժ"), + (0x53B, "M", "ի"), + (0x53C, "M", "լ"), + (0x53D, "M", "խ"), + (0x53E, "M", "ծ"), + (0x53F, "M", "կ"), + (0x540, "M", "հ"), + (0x541, "M", "ձ"), + (0x542, "M", "ղ"), + (0x543, "M", "ճ"), + (0x544, "M", "մ"), + (0x545, "M", "յ"), + (0x546, "M", "ն"), + (0x547, "M", "շ"), + (0x548, "M", "ո"), + (0x549, "M", "չ"), + (0x54A, "M", "պ"), + (0x54B, "M", "ջ"), + (0x54C, "M", "ռ"), + (0x54D, "M", "ս"), + (0x54E, "M", "վ"), + (0x54F, "M", "տ"), + (0x550, "M", "ր"), + (0x551, "M", "ց"), + (0x552, "M", "ւ"), + (0x553, "M", "փ"), + (0x554, "M", "ք"), + (0x555, "M", "օ"), + (0x556, "M", "ֆ"), + (0x557, "X"), + (0x559, "V"), + (0x587, "M", "եւ"), + (0x588, "V"), + (0x58B, "X"), + (0x58D, "V"), + (0x590, "X"), + (0x591, "V"), + (0x5C8, "X"), + (0x5D0, "V"), + (0x5EB, "X"), + (0x5EF, "V"), + (0x5F5, "X"), + (0x606, "V"), + (0x61C, "X"), + (0x61D, "V"), + ] + + +def _seg_10() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x675, "M", "اٴ"), + (0x676, "M", "وٴ"), + (0x677, "M", "ۇٴ"), + (0x678, "M", "يٴ"), + (0x679, "V"), + (0x6DD, "X"), + (0x6DE, "V"), + (0x70E, "X"), + (0x710, "V"), + (0x74B, "X"), + (0x74D, "V"), + (0x7B2, "X"), + (0x7C0, "V"), + (0x7FB, "X"), + (0x7FD, "V"), + (0x82E, "X"), + (0x830, "V"), + (0x83F, "X"), + (0x840, "V"), + (0x85C, "X"), + (0x85E, "V"), + (0x85F, "X"), + (0x860, "V"), + (0x86B, "X"), + (0x870, "V"), + (0x88F, "X"), + (0x898, "V"), + (0x8E2, "X"), + (0x8E3, "V"), + (0x958, "M", "क़"), + (0x959, "M", "ख़"), + (0x95A, "M", "ग़"), + (0x95B, "M", "ज़"), + (0x95C, "M", "ड़"), + (0x95D, "M", "ढ़"), + (0x95E, "M", "फ़"), + (0x95F, "M", "य़"), + (0x960, "V"), + (0x984, "X"), + (0x985, "V"), + (0x98D, "X"), + (0x98F, "V"), + (0x991, "X"), + (0x993, "V"), + (0x9A9, "X"), + (0x9AA, "V"), + (0x9B1, "X"), + (0x9B2, "V"), + (0x9B3, "X"), + (0x9B6, "V"), + (0x9BA, "X"), + (0x9BC, "V"), + (0x9C5, "X"), + (0x9C7, "V"), + (0x9C9, "X"), + (0x9CB, "V"), + (0x9CF, "X"), + (0x9D7, "V"), + (0x9D8, "X"), + (0x9DC, "M", "ড়"), + (0x9DD, "M", "ঢ়"), + (0x9DE, "X"), + (0x9DF, "M", "য়"), + (0x9E0, "V"), + (0x9E4, "X"), + (0x9E6, "V"), + (0x9FF, "X"), + (0xA01, "V"), + (0xA04, "X"), + (0xA05, "V"), + (0xA0B, "X"), + (0xA0F, "V"), + (0xA11, "X"), + (0xA13, "V"), + (0xA29, "X"), + (0xA2A, "V"), + (0xA31, "X"), + (0xA32, "V"), + (0xA33, "M", "ਲ਼"), + (0xA34, "X"), + (0xA35, "V"), + (0xA36, "M", "ਸ਼"), + (0xA37, "X"), + (0xA38, "V"), + (0xA3A, "X"), + (0xA3C, "V"), + (0xA3D, "X"), + (0xA3E, "V"), + (0xA43, "X"), + (0xA47, "V"), + (0xA49, "X"), + (0xA4B, "V"), + (0xA4E, "X"), + (0xA51, "V"), + (0xA52, "X"), + (0xA59, "M", "ਖ਼"), + (0xA5A, "M", "ਗ਼"), + (0xA5B, "M", "ਜ਼"), + (0xA5C, "V"), + (0xA5D, "X"), + ] + + +def _seg_11() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xA5E, "M", "ਫ਼"), + (0xA5F, "X"), + (0xA66, "V"), + (0xA77, "X"), + (0xA81, "V"), + (0xA84, "X"), + (0xA85, "V"), + (0xA8E, "X"), + (0xA8F, "V"), + (0xA92, "X"), + (0xA93, "V"), + (0xAA9, "X"), + (0xAAA, "V"), + (0xAB1, "X"), + (0xAB2, "V"), + (0xAB4, "X"), + (0xAB5, "V"), + (0xABA, "X"), + (0xABC, "V"), + (0xAC6, "X"), + (0xAC7, "V"), + (0xACA, "X"), + (0xACB, "V"), + (0xACE, "X"), + (0xAD0, "V"), + (0xAD1, "X"), + (0xAE0, "V"), + (0xAE4, "X"), + (0xAE6, "V"), + (0xAF2, "X"), + (0xAF9, "V"), + (0xB00, "X"), + (0xB01, "V"), + (0xB04, "X"), + (0xB05, "V"), + (0xB0D, "X"), + (0xB0F, "V"), + (0xB11, "X"), + (0xB13, "V"), + (0xB29, "X"), + (0xB2A, "V"), + (0xB31, "X"), + (0xB32, "V"), + (0xB34, "X"), + (0xB35, "V"), + (0xB3A, "X"), + (0xB3C, "V"), + (0xB45, "X"), + (0xB47, "V"), + (0xB49, "X"), + (0xB4B, "V"), + (0xB4E, "X"), + (0xB55, "V"), + (0xB58, "X"), + (0xB5C, "M", "ଡ଼"), + (0xB5D, "M", "ଢ଼"), + (0xB5E, "X"), + (0xB5F, "V"), + (0xB64, "X"), + (0xB66, "V"), + (0xB78, "X"), + (0xB82, "V"), + (0xB84, "X"), + (0xB85, "V"), + (0xB8B, "X"), + (0xB8E, "V"), + (0xB91, "X"), + (0xB92, "V"), + (0xB96, "X"), + (0xB99, "V"), + (0xB9B, "X"), + (0xB9C, "V"), + (0xB9D, "X"), + (0xB9E, "V"), + (0xBA0, "X"), + (0xBA3, "V"), + (0xBA5, "X"), + (0xBA8, "V"), + (0xBAB, "X"), + (0xBAE, "V"), + (0xBBA, "X"), + (0xBBE, "V"), + (0xBC3, "X"), + (0xBC6, "V"), + (0xBC9, "X"), + (0xBCA, "V"), + (0xBCE, "X"), + (0xBD0, "V"), + (0xBD1, "X"), + (0xBD7, "V"), + (0xBD8, "X"), + (0xBE6, "V"), + (0xBFB, "X"), + (0xC00, "V"), + (0xC0D, "X"), + (0xC0E, "V"), + (0xC11, "X"), + (0xC12, "V"), + (0xC29, "X"), + (0xC2A, "V"), + ] + + +def _seg_12() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xC3A, "X"), + (0xC3C, "V"), + (0xC45, "X"), + (0xC46, "V"), + (0xC49, "X"), + (0xC4A, "V"), + (0xC4E, "X"), + (0xC55, "V"), + (0xC57, "X"), + (0xC58, "V"), + (0xC5B, "X"), + (0xC5D, "V"), + (0xC5E, "X"), + (0xC60, "V"), + (0xC64, "X"), + (0xC66, "V"), + (0xC70, "X"), + (0xC77, "V"), + (0xC8D, "X"), + (0xC8E, "V"), + (0xC91, "X"), + (0xC92, "V"), + (0xCA9, "X"), + (0xCAA, "V"), + (0xCB4, "X"), + (0xCB5, "V"), + (0xCBA, "X"), + (0xCBC, "V"), + (0xCC5, "X"), + (0xCC6, "V"), + (0xCC9, "X"), + (0xCCA, "V"), + (0xCCE, "X"), + (0xCD5, "V"), + (0xCD7, "X"), + (0xCDD, "V"), + (0xCDF, "X"), + (0xCE0, "V"), + (0xCE4, "X"), + (0xCE6, "V"), + (0xCF0, "X"), + (0xCF1, "V"), + (0xCF4, "X"), + (0xD00, "V"), + (0xD0D, "X"), + (0xD0E, "V"), + (0xD11, "X"), + (0xD12, "V"), + (0xD45, "X"), + (0xD46, "V"), + (0xD49, "X"), + (0xD4A, "V"), + (0xD50, "X"), + (0xD54, "V"), + (0xD64, "X"), + (0xD66, "V"), + (0xD80, "X"), + (0xD81, "V"), + (0xD84, "X"), + (0xD85, "V"), + (0xD97, "X"), + (0xD9A, "V"), + (0xDB2, "X"), + (0xDB3, "V"), + (0xDBC, "X"), + (0xDBD, "V"), + (0xDBE, "X"), + (0xDC0, "V"), + (0xDC7, "X"), + (0xDCA, "V"), + (0xDCB, "X"), + (0xDCF, "V"), + (0xDD5, "X"), + (0xDD6, "V"), + (0xDD7, "X"), + (0xDD8, "V"), + (0xDE0, "X"), + (0xDE6, "V"), + (0xDF0, "X"), + (0xDF2, "V"), + (0xDF5, "X"), + (0xE01, "V"), + (0xE33, "M", "ํา"), + (0xE34, "V"), + (0xE3B, "X"), + (0xE3F, "V"), + (0xE5C, "X"), + (0xE81, "V"), + (0xE83, "X"), + (0xE84, "V"), + (0xE85, "X"), + (0xE86, "V"), + (0xE8B, "X"), + (0xE8C, "V"), + (0xEA4, "X"), + (0xEA5, "V"), + (0xEA6, "X"), + (0xEA7, "V"), + (0xEB3, "M", "ໍາ"), + (0xEB4, "V"), + ] + + +def _seg_13() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xEBE, "X"), + (0xEC0, "V"), + (0xEC5, "X"), + (0xEC6, "V"), + (0xEC7, "X"), + (0xEC8, "V"), + (0xECF, "X"), + (0xED0, "V"), + (0xEDA, "X"), + (0xEDC, "M", "ຫນ"), + (0xEDD, "M", "ຫມ"), + (0xEDE, "V"), + (0xEE0, "X"), + (0xF00, "V"), + (0xF0C, "M", "་"), + (0xF0D, "V"), + (0xF43, "M", "གྷ"), + (0xF44, "V"), + (0xF48, "X"), + (0xF49, "V"), + (0xF4D, "M", "ཌྷ"), + (0xF4E, "V"), + (0xF52, "M", "དྷ"), + (0xF53, "V"), + (0xF57, "M", "བྷ"), + (0xF58, "V"), + (0xF5C, "M", "ཛྷ"), + (0xF5D, "V"), + (0xF69, "M", "ཀྵ"), + (0xF6A, "V"), + (0xF6D, "X"), + (0xF71, "V"), + (0xF73, "M", "ཱི"), + (0xF74, "V"), + (0xF75, "M", "ཱུ"), + (0xF76, "M", "ྲྀ"), + (0xF77, "M", "ྲཱྀ"), + (0xF78, "M", "ླྀ"), + (0xF79, "M", "ླཱྀ"), + (0xF7A, "V"), + (0xF81, "M", "ཱྀ"), + (0xF82, "V"), + (0xF93, "M", "ྒྷ"), + (0xF94, "V"), + (0xF98, "X"), + (0xF99, "V"), + (0xF9D, "M", "ྜྷ"), + (0xF9E, "V"), + (0xFA2, "M", "ྡྷ"), + (0xFA3, "V"), + (0xFA7, "M", "ྦྷ"), + (0xFA8, "V"), + (0xFAC, "M", "ྫྷ"), + (0xFAD, "V"), + (0xFB9, "M", "ྐྵ"), + (0xFBA, "V"), + (0xFBD, "X"), + (0xFBE, "V"), + (0xFCD, "X"), + (0xFCE, "V"), + (0xFDB, "X"), + (0x1000, "V"), + (0x10A0, "X"), + (0x10C7, "M", "ⴧ"), + (0x10C8, "X"), + (0x10CD, "M", "ⴭ"), + (0x10CE, "X"), + (0x10D0, "V"), + (0x10FC, "M", "ნ"), + (0x10FD, "V"), + (0x115F, "X"), + (0x1161, "V"), + (0x1249, "X"), + (0x124A, "V"), + (0x124E, "X"), + (0x1250, "V"), + (0x1257, "X"), + (0x1258, "V"), + (0x1259, "X"), + (0x125A, "V"), + (0x125E, "X"), + (0x1260, "V"), + (0x1289, "X"), + (0x128A, "V"), + (0x128E, "X"), + (0x1290, "V"), + (0x12B1, "X"), + (0x12B2, "V"), + (0x12B6, "X"), + (0x12B8, "V"), + (0x12BF, "X"), + (0x12C0, "V"), + (0x12C1, "X"), + (0x12C2, "V"), + (0x12C6, "X"), + (0x12C8, "V"), + (0x12D7, "X"), + (0x12D8, "V"), + (0x1311, "X"), + (0x1312, "V"), + ] + + +def _seg_14() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1316, "X"), + (0x1318, "V"), + (0x135B, "X"), + (0x135D, "V"), + (0x137D, "X"), + (0x1380, "V"), + (0x139A, "X"), + (0x13A0, "V"), + (0x13F6, "X"), + (0x13F8, "M", "Ᏸ"), + (0x13F9, "M", "Ᏹ"), + (0x13FA, "M", "Ᏺ"), + (0x13FB, "M", "Ᏻ"), + (0x13FC, "M", "Ᏼ"), + (0x13FD, "M", "Ᏽ"), + (0x13FE, "X"), + (0x1400, "V"), + (0x1680, "X"), + (0x1681, "V"), + (0x169D, "X"), + (0x16A0, "V"), + (0x16F9, "X"), + (0x1700, "V"), + (0x1716, "X"), + (0x171F, "V"), + (0x1737, "X"), + (0x1740, "V"), + (0x1754, "X"), + (0x1760, "V"), + (0x176D, "X"), + (0x176E, "V"), + (0x1771, "X"), + (0x1772, "V"), + (0x1774, "X"), + (0x1780, "V"), + (0x17B4, "X"), + (0x17B6, "V"), + (0x17DE, "X"), + (0x17E0, "V"), + (0x17EA, "X"), + (0x17F0, "V"), + (0x17FA, "X"), + (0x1800, "V"), + (0x1806, "X"), + (0x1807, "V"), + (0x180B, "I"), + (0x180E, "X"), + (0x180F, "I"), + (0x1810, "V"), + (0x181A, "X"), + (0x1820, "V"), + (0x1879, "X"), + (0x1880, "V"), + (0x18AB, "X"), + (0x18B0, "V"), + (0x18F6, "X"), + (0x1900, "V"), + (0x191F, "X"), + (0x1920, "V"), + (0x192C, "X"), + (0x1930, "V"), + (0x193C, "X"), + (0x1940, "V"), + (0x1941, "X"), + (0x1944, "V"), + (0x196E, "X"), + (0x1970, "V"), + (0x1975, "X"), + (0x1980, "V"), + (0x19AC, "X"), + (0x19B0, "V"), + (0x19CA, "X"), + (0x19D0, "V"), + (0x19DB, "X"), + (0x19DE, "V"), + (0x1A1C, "X"), + (0x1A1E, "V"), + (0x1A5F, "X"), + (0x1A60, "V"), + (0x1A7D, "X"), + (0x1A7F, "V"), + (0x1A8A, "X"), + (0x1A90, "V"), + (0x1A9A, "X"), + (0x1AA0, "V"), + (0x1AAE, "X"), + (0x1AB0, "V"), + (0x1ACF, "X"), + (0x1B00, "V"), + (0x1B4D, "X"), + (0x1B50, "V"), + (0x1B7F, "X"), + (0x1B80, "V"), + (0x1BF4, "X"), + (0x1BFC, "V"), + (0x1C38, "X"), + (0x1C3B, "V"), + (0x1C4A, "X"), + (0x1C4D, "V"), + (0x1C80, "M", "в"), + ] + + +def _seg_15() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1C81, "M", "д"), + (0x1C82, "M", "о"), + (0x1C83, "M", "с"), + (0x1C84, "M", "т"), + (0x1C86, "M", "ъ"), + (0x1C87, "M", "ѣ"), + (0x1C88, "M", "ꙋ"), + (0x1C89, "X"), + (0x1C90, "M", "ა"), + (0x1C91, "M", "ბ"), + (0x1C92, "M", "გ"), + (0x1C93, "M", "დ"), + (0x1C94, "M", "ე"), + (0x1C95, "M", "ვ"), + (0x1C96, "M", "ზ"), + (0x1C97, "M", "თ"), + (0x1C98, "M", "ი"), + (0x1C99, "M", "კ"), + (0x1C9A, "M", "ლ"), + (0x1C9B, "M", "მ"), + (0x1C9C, "M", "ნ"), + (0x1C9D, "M", "ო"), + (0x1C9E, "M", "პ"), + (0x1C9F, "M", "ჟ"), + (0x1CA0, "M", "რ"), + (0x1CA1, "M", "ს"), + (0x1CA2, "M", "ტ"), + (0x1CA3, "M", "უ"), + (0x1CA4, "M", "ფ"), + (0x1CA5, "M", "ქ"), + (0x1CA6, "M", "ღ"), + (0x1CA7, "M", "ყ"), + (0x1CA8, "M", "შ"), + (0x1CA9, "M", "ჩ"), + (0x1CAA, "M", "ც"), + (0x1CAB, "M", "ძ"), + (0x1CAC, "M", "წ"), + (0x1CAD, "M", "ჭ"), + (0x1CAE, "M", "ხ"), + (0x1CAF, "M", "ჯ"), + (0x1CB0, "M", "ჰ"), + (0x1CB1, "M", "ჱ"), + (0x1CB2, "M", "ჲ"), + (0x1CB3, "M", "ჳ"), + (0x1CB4, "M", "ჴ"), + (0x1CB5, "M", "ჵ"), + (0x1CB6, "M", "ჶ"), + (0x1CB7, "M", "ჷ"), + (0x1CB8, "M", "ჸ"), + (0x1CB9, "M", "ჹ"), + (0x1CBA, "M", "ჺ"), + (0x1CBB, "X"), + (0x1CBD, "M", "ჽ"), + (0x1CBE, "M", "ჾ"), + (0x1CBF, "M", "ჿ"), + (0x1CC0, "V"), + (0x1CC8, "X"), + (0x1CD0, "V"), + (0x1CFB, "X"), + (0x1D00, "V"), + (0x1D2C, "M", "a"), + (0x1D2D, "M", "æ"), + (0x1D2E, "M", "b"), + (0x1D2F, "V"), + (0x1D30, "M", "d"), + (0x1D31, "M", "e"), + (0x1D32, "M", "ǝ"), + (0x1D33, "M", "g"), + (0x1D34, "M", "h"), + (0x1D35, "M", "i"), + (0x1D36, "M", "j"), + (0x1D37, "M", "k"), + (0x1D38, "M", "l"), + (0x1D39, "M", "m"), + (0x1D3A, "M", "n"), + (0x1D3B, "V"), + (0x1D3C, "M", "o"), + (0x1D3D, "M", "ȣ"), + (0x1D3E, "M", "p"), + (0x1D3F, "M", "r"), + (0x1D40, "M", "t"), + (0x1D41, "M", "u"), + (0x1D42, "M", "w"), + (0x1D43, "M", "a"), + (0x1D44, "M", "ɐ"), + (0x1D45, "M", "ɑ"), + (0x1D46, "M", "ᴂ"), + (0x1D47, "M", "b"), + (0x1D48, "M", "d"), + (0x1D49, "M", "e"), + (0x1D4A, "M", "ə"), + (0x1D4B, "M", "ɛ"), + (0x1D4C, "M", "ɜ"), + (0x1D4D, "M", "g"), + (0x1D4E, "V"), + (0x1D4F, "M", "k"), + (0x1D50, "M", "m"), + (0x1D51, "M", "ŋ"), + (0x1D52, "M", "o"), + (0x1D53, "M", "ɔ"), + ] + + +def _seg_16() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D54, "M", "ᴖ"), + (0x1D55, "M", "ᴗ"), + (0x1D56, "M", "p"), + (0x1D57, "M", "t"), + (0x1D58, "M", "u"), + (0x1D59, "M", "ᴝ"), + (0x1D5A, "M", "ɯ"), + (0x1D5B, "M", "v"), + (0x1D5C, "M", "ᴥ"), + (0x1D5D, "M", "β"), + (0x1D5E, "M", "γ"), + (0x1D5F, "M", "δ"), + (0x1D60, "M", "φ"), + (0x1D61, "M", "χ"), + (0x1D62, "M", "i"), + (0x1D63, "M", "r"), + (0x1D64, "M", "u"), + (0x1D65, "M", "v"), + (0x1D66, "M", "β"), + (0x1D67, "M", "γ"), + (0x1D68, "M", "ρ"), + (0x1D69, "M", "φ"), + (0x1D6A, "M", "χ"), + (0x1D6B, "V"), + (0x1D78, "M", "н"), + (0x1D79, "V"), + (0x1D9B, "M", "ɒ"), + (0x1D9C, "M", "c"), + (0x1D9D, "M", "ɕ"), + (0x1D9E, "M", "ð"), + (0x1D9F, "M", "ɜ"), + (0x1DA0, "M", "f"), + (0x1DA1, "M", "ɟ"), + (0x1DA2, "M", "ɡ"), + (0x1DA3, "M", "ɥ"), + (0x1DA4, "M", "ɨ"), + (0x1DA5, "M", "ɩ"), + (0x1DA6, "M", "ɪ"), + (0x1DA7, "M", "ᵻ"), + (0x1DA8, "M", "ʝ"), + (0x1DA9, "M", "ɭ"), + (0x1DAA, "M", "ᶅ"), + (0x1DAB, "M", "ʟ"), + (0x1DAC, "M", "ɱ"), + (0x1DAD, "M", "ɰ"), + (0x1DAE, "M", "ɲ"), + (0x1DAF, "M", "ɳ"), + (0x1DB0, "M", "ɴ"), + (0x1DB1, "M", "ɵ"), + (0x1DB2, "M", "ɸ"), + (0x1DB3, "M", "ʂ"), + (0x1DB4, "M", "ʃ"), + (0x1DB5, "M", "ƫ"), + (0x1DB6, "M", "ʉ"), + (0x1DB7, "M", "ʊ"), + (0x1DB8, "M", "ᴜ"), + (0x1DB9, "M", "ʋ"), + (0x1DBA, "M", "ʌ"), + (0x1DBB, "M", "z"), + (0x1DBC, "M", "ʐ"), + (0x1DBD, "M", "ʑ"), + (0x1DBE, "M", "ʒ"), + (0x1DBF, "M", "θ"), + (0x1DC0, "V"), + (0x1E00, "M", "ḁ"), + (0x1E01, "V"), + (0x1E02, "M", "ḃ"), + (0x1E03, "V"), + (0x1E04, "M", "ḅ"), + (0x1E05, "V"), + (0x1E06, "M", "ḇ"), + (0x1E07, "V"), + (0x1E08, "M", "ḉ"), + (0x1E09, "V"), + (0x1E0A, "M", "ḋ"), + (0x1E0B, "V"), + (0x1E0C, "M", "ḍ"), + (0x1E0D, "V"), + (0x1E0E, "M", "ḏ"), + (0x1E0F, "V"), + (0x1E10, "M", "ḑ"), + (0x1E11, "V"), + (0x1E12, "M", "ḓ"), + (0x1E13, "V"), + (0x1E14, "M", "ḕ"), + (0x1E15, "V"), + (0x1E16, "M", "ḗ"), + (0x1E17, "V"), + (0x1E18, "M", "ḙ"), + (0x1E19, "V"), + (0x1E1A, "M", "ḛ"), + (0x1E1B, "V"), + (0x1E1C, "M", "ḝ"), + (0x1E1D, "V"), + (0x1E1E, "M", "ḟ"), + (0x1E1F, "V"), + (0x1E20, "M", "ḡ"), + (0x1E21, "V"), + (0x1E22, "M", "ḣ"), + (0x1E23, "V"), + ] + + +def _seg_17() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1E24, "M", "ḥ"), + (0x1E25, "V"), + (0x1E26, "M", "ḧ"), + (0x1E27, "V"), + (0x1E28, "M", "ḩ"), + (0x1E29, "V"), + (0x1E2A, "M", "ḫ"), + (0x1E2B, "V"), + (0x1E2C, "M", "ḭ"), + (0x1E2D, "V"), + (0x1E2E, "M", "ḯ"), + (0x1E2F, "V"), + (0x1E30, "M", "ḱ"), + (0x1E31, "V"), + (0x1E32, "M", "ḳ"), + (0x1E33, "V"), + (0x1E34, "M", "ḵ"), + (0x1E35, "V"), + (0x1E36, "M", "ḷ"), + (0x1E37, "V"), + (0x1E38, "M", "ḹ"), + (0x1E39, "V"), + (0x1E3A, "M", "ḻ"), + (0x1E3B, "V"), + (0x1E3C, "M", "ḽ"), + (0x1E3D, "V"), + (0x1E3E, "M", "ḿ"), + (0x1E3F, "V"), + (0x1E40, "M", "ṁ"), + (0x1E41, "V"), + (0x1E42, "M", "ṃ"), + (0x1E43, "V"), + (0x1E44, "M", "ṅ"), + (0x1E45, "V"), + (0x1E46, "M", "ṇ"), + (0x1E47, "V"), + (0x1E48, "M", "ṉ"), + (0x1E49, "V"), + (0x1E4A, "M", "ṋ"), + (0x1E4B, "V"), + (0x1E4C, "M", "ṍ"), + (0x1E4D, "V"), + (0x1E4E, "M", "ṏ"), + (0x1E4F, "V"), + (0x1E50, "M", "ṑ"), + (0x1E51, "V"), + (0x1E52, "M", "ṓ"), + (0x1E53, "V"), + (0x1E54, "M", "ṕ"), + (0x1E55, "V"), + (0x1E56, "M", "ṗ"), + (0x1E57, "V"), + (0x1E58, "M", "ṙ"), + (0x1E59, "V"), + (0x1E5A, "M", "ṛ"), + (0x1E5B, "V"), + (0x1E5C, "M", "ṝ"), + (0x1E5D, "V"), + (0x1E5E, "M", "ṟ"), + (0x1E5F, "V"), + (0x1E60, "M", "ṡ"), + (0x1E61, "V"), + (0x1E62, "M", "ṣ"), + (0x1E63, "V"), + (0x1E64, "M", "ṥ"), + (0x1E65, "V"), + (0x1E66, "M", "ṧ"), + (0x1E67, "V"), + (0x1E68, "M", "ṩ"), + (0x1E69, "V"), + (0x1E6A, "M", "ṫ"), + (0x1E6B, "V"), + (0x1E6C, "M", "ṭ"), + (0x1E6D, "V"), + (0x1E6E, "M", "ṯ"), + (0x1E6F, "V"), + (0x1E70, "M", "ṱ"), + (0x1E71, "V"), + (0x1E72, "M", "ṳ"), + (0x1E73, "V"), + (0x1E74, "M", "ṵ"), + (0x1E75, "V"), + (0x1E76, "M", "ṷ"), + (0x1E77, "V"), + (0x1E78, "M", "ṹ"), + (0x1E79, "V"), + (0x1E7A, "M", "ṻ"), + (0x1E7B, "V"), + (0x1E7C, "M", "ṽ"), + (0x1E7D, "V"), + (0x1E7E, "M", "ṿ"), + (0x1E7F, "V"), + (0x1E80, "M", "ẁ"), + (0x1E81, "V"), + (0x1E82, "M", "ẃ"), + (0x1E83, "V"), + (0x1E84, "M", "ẅ"), + (0x1E85, "V"), + (0x1E86, "M", "ẇ"), + (0x1E87, "V"), + ] + + +def _seg_18() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1E88, "M", "ẉ"), + (0x1E89, "V"), + (0x1E8A, "M", "ẋ"), + (0x1E8B, "V"), + (0x1E8C, "M", "ẍ"), + (0x1E8D, "V"), + (0x1E8E, "M", "ẏ"), + (0x1E8F, "V"), + (0x1E90, "M", "ẑ"), + (0x1E91, "V"), + (0x1E92, "M", "ẓ"), + (0x1E93, "V"), + (0x1E94, "M", "ẕ"), + (0x1E95, "V"), + (0x1E9A, "M", "aʾ"), + (0x1E9B, "M", "ṡ"), + (0x1E9C, "V"), + (0x1E9E, "M", "ß"), + (0x1E9F, "V"), + (0x1EA0, "M", "ạ"), + (0x1EA1, "V"), + (0x1EA2, "M", "ả"), + (0x1EA3, "V"), + (0x1EA4, "M", "ấ"), + (0x1EA5, "V"), + (0x1EA6, "M", "ầ"), + (0x1EA7, "V"), + (0x1EA8, "M", "ẩ"), + (0x1EA9, "V"), + (0x1EAA, "M", "ẫ"), + (0x1EAB, "V"), + (0x1EAC, "M", "ậ"), + (0x1EAD, "V"), + (0x1EAE, "M", "ắ"), + (0x1EAF, "V"), + (0x1EB0, "M", "ằ"), + (0x1EB1, "V"), + (0x1EB2, "M", "ẳ"), + (0x1EB3, "V"), + (0x1EB4, "M", "ẵ"), + (0x1EB5, "V"), + (0x1EB6, "M", "ặ"), + (0x1EB7, "V"), + (0x1EB8, "M", "ẹ"), + (0x1EB9, "V"), + (0x1EBA, "M", "ẻ"), + (0x1EBB, "V"), + (0x1EBC, "M", "ẽ"), + (0x1EBD, "V"), + (0x1EBE, "M", "ế"), + (0x1EBF, "V"), + (0x1EC0, "M", "ề"), + (0x1EC1, "V"), + (0x1EC2, "M", "ể"), + (0x1EC3, "V"), + (0x1EC4, "M", "ễ"), + (0x1EC5, "V"), + (0x1EC6, "M", "ệ"), + (0x1EC7, "V"), + (0x1EC8, "M", "ỉ"), + (0x1EC9, "V"), + (0x1ECA, "M", "ị"), + (0x1ECB, "V"), + (0x1ECC, "M", "ọ"), + (0x1ECD, "V"), + (0x1ECE, "M", "ỏ"), + (0x1ECF, "V"), + (0x1ED0, "M", "ố"), + (0x1ED1, "V"), + (0x1ED2, "M", "ồ"), + (0x1ED3, "V"), + (0x1ED4, "M", "ổ"), + (0x1ED5, "V"), + (0x1ED6, "M", "ỗ"), + (0x1ED7, "V"), + (0x1ED8, "M", "ộ"), + (0x1ED9, "V"), + (0x1EDA, "M", "ớ"), + (0x1EDB, "V"), + (0x1EDC, "M", "ờ"), + (0x1EDD, "V"), + (0x1EDE, "M", "ở"), + (0x1EDF, "V"), + (0x1EE0, "M", "ỡ"), + (0x1EE1, "V"), + (0x1EE2, "M", "ợ"), + (0x1EE3, "V"), + (0x1EE4, "M", "ụ"), + (0x1EE5, "V"), + (0x1EE6, "M", "ủ"), + (0x1EE7, "V"), + (0x1EE8, "M", "ứ"), + (0x1EE9, "V"), + (0x1EEA, "M", "ừ"), + (0x1EEB, "V"), + (0x1EEC, "M", "ử"), + (0x1EED, "V"), + (0x1EEE, "M", "ữ"), + (0x1EEF, "V"), + (0x1EF0, "M", "ự"), + ] + + +def _seg_19() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1EF1, "V"), + (0x1EF2, "M", "ỳ"), + (0x1EF3, "V"), + (0x1EF4, "M", "ỵ"), + (0x1EF5, "V"), + (0x1EF6, "M", "ỷ"), + (0x1EF7, "V"), + (0x1EF8, "M", "ỹ"), + (0x1EF9, "V"), + (0x1EFA, "M", "ỻ"), + (0x1EFB, "V"), + (0x1EFC, "M", "ỽ"), + (0x1EFD, "V"), + (0x1EFE, "M", "ỿ"), + (0x1EFF, "V"), + (0x1F08, "M", "ἀ"), + (0x1F09, "M", "ἁ"), + (0x1F0A, "M", "ἂ"), + (0x1F0B, "M", "ἃ"), + (0x1F0C, "M", "ἄ"), + (0x1F0D, "M", "ἅ"), + (0x1F0E, "M", "ἆ"), + (0x1F0F, "M", "ἇ"), + (0x1F10, "V"), + (0x1F16, "X"), + (0x1F18, "M", "ἐ"), + (0x1F19, "M", "ἑ"), + (0x1F1A, "M", "ἒ"), + (0x1F1B, "M", "ἓ"), + (0x1F1C, "M", "ἔ"), + (0x1F1D, "M", "ἕ"), + (0x1F1E, "X"), + (0x1F20, "V"), + (0x1F28, "M", "ἠ"), + (0x1F29, "M", "ἡ"), + (0x1F2A, "M", "ἢ"), + (0x1F2B, "M", "ἣ"), + (0x1F2C, "M", "ἤ"), + (0x1F2D, "M", "ἥ"), + (0x1F2E, "M", "ἦ"), + (0x1F2F, "M", "ἧ"), + (0x1F30, "V"), + (0x1F38, "M", "ἰ"), + (0x1F39, "M", "ἱ"), + (0x1F3A, "M", "ἲ"), + (0x1F3B, "M", "ἳ"), + (0x1F3C, "M", "ἴ"), + (0x1F3D, "M", "ἵ"), + (0x1F3E, "M", "ἶ"), + (0x1F3F, "M", "ἷ"), + (0x1F40, "V"), + (0x1F46, "X"), + (0x1F48, "M", "ὀ"), + (0x1F49, "M", "ὁ"), + (0x1F4A, "M", "ὂ"), + (0x1F4B, "M", "ὃ"), + (0x1F4C, "M", "ὄ"), + (0x1F4D, "M", "ὅ"), + (0x1F4E, "X"), + (0x1F50, "V"), + (0x1F58, "X"), + (0x1F59, "M", "ὑ"), + (0x1F5A, "X"), + (0x1F5B, "M", "ὓ"), + (0x1F5C, "X"), + (0x1F5D, "M", "ὕ"), + (0x1F5E, "X"), + (0x1F5F, "M", "ὗ"), + (0x1F60, "V"), + (0x1F68, "M", "ὠ"), + (0x1F69, "M", "ὡ"), + (0x1F6A, "M", "ὢ"), + (0x1F6B, "M", "ὣ"), + (0x1F6C, "M", "ὤ"), + (0x1F6D, "M", "ὥ"), + (0x1F6E, "M", "ὦ"), + (0x1F6F, "M", "ὧ"), + (0x1F70, "V"), + (0x1F71, "M", "ά"), + (0x1F72, "V"), + (0x1F73, "M", "έ"), + (0x1F74, "V"), + (0x1F75, "M", "ή"), + (0x1F76, "V"), + (0x1F77, "M", "ί"), + (0x1F78, "V"), + (0x1F79, "M", "ό"), + (0x1F7A, "V"), + (0x1F7B, "M", "ύ"), + (0x1F7C, "V"), + (0x1F7D, "M", "ώ"), + (0x1F7E, "X"), + (0x1F80, "M", "ἀι"), + (0x1F81, "M", "ἁι"), + (0x1F82, "M", "ἂι"), + (0x1F83, "M", "ἃι"), + (0x1F84, "M", "ἄι"), + (0x1F85, "M", "ἅι"), + (0x1F86, "M", "ἆι"), + (0x1F87, "M", "ἇι"), + ] + + +def _seg_20() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1F88, "M", "ἀι"), + (0x1F89, "M", "ἁι"), + (0x1F8A, "M", "ἂι"), + (0x1F8B, "M", "ἃι"), + (0x1F8C, "M", "ἄι"), + (0x1F8D, "M", "ἅι"), + (0x1F8E, "M", "ἆι"), + (0x1F8F, "M", "ἇι"), + (0x1F90, "M", "ἠι"), + (0x1F91, "M", "ἡι"), + (0x1F92, "M", "ἢι"), + (0x1F93, "M", "ἣι"), + (0x1F94, "M", "ἤι"), + (0x1F95, "M", "ἥι"), + (0x1F96, "M", "ἦι"), + (0x1F97, "M", "ἧι"), + (0x1F98, "M", "ἠι"), + (0x1F99, "M", "ἡι"), + (0x1F9A, "M", "ἢι"), + (0x1F9B, "M", "ἣι"), + (0x1F9C, "M", "ἤι"), + (0x1F9D, "M", "ἥι"), + (0x1F9E, "M", "ἦι"), + (0x1F9F, "M", "ἧι"), + (0x1FA0, "M", "ὠι"), + (0x1FA1, "M", "ὡι"), + (0x1FA2, "M", "ὢι"), + (0x1FA3, "M", "ὣι"), + (0x1FA4, "M", "ὤι"), + (0x1FA5, "M", "ὥι"), + (0x1FA6, "M", "ὦι"), + (0x1FA7, "M", "ὧι"), + (0x1FA8, "M", "ὠι"), + (0x1FA9, "M", "ὡι"), + (0x1FAA, "M", "ὢι"), + (0x1FAB, "M", "ὣι"), + (0x1FAC, "M", "ὤι"), + (0x1FAD, "M", "ὥι"), + (0x1FAE, "M", "ὦι"), + (0x1FAF, "M", "ὧι"), + (0x1FB0, "V"), + (0x1FB2, "M", "ὰι"), + (0x1FB3, "M", "αι"), + (0x1FB4, "M", "άι"), + (0x1FB5, "X"), + (0x1FB6, "V"), + (0x1FB7, "M", "ᾶι"), + (0x1FB8, "M", "ᾰ"), + (0x1FB9, "M", "ᾱ"), + (0x1FBA, "M", "ὰ"), + (0x1FBB, "M", "ά"), + (0x1FBC, "M", "αι"), + (0x1FBD, "3", " ̓"), + (0x1FBE, "M", "ι"), + (0x1FBF, "3", " ̓"), + (0x1FC0, "3", " ͂"), + (0x1FC1, "3", " ̈͂"), + (0x1FC2, "M", "ὴι"), + (0x1FC3, "M", "ηι"), + (0x1FC4, "M", "ήι"), + (0x1FC5, "X"), + (0x1FC6, "V"), + (0x1FC7, "M", "ῆι"), + (0x1FC8, "M", "ὲ"), + (0x1FC9, "M", "έ"), + (0x1FCA, "M", "ὴ"), + (0x1FCB, "M", "ή"), + (0x1FCC, "M", "ηι"), + (0x1FCD, "3", " ̓̀"), + (0x1FCE, "3", " ̓́"), + (0x1FCF, "3", " ̓͂"), + (0x1FD0, "V"), + (0x1FD3, "M", "ΐ"), + (0x1FD4, "X"), + (0x1FD6, "V"), + (0x1FD8, "M", "ῐ"), + (0x1FD9, "M", "ῑ"), + (0x1FDA, "M", "ὶ"), + (0x1FDB, "M", "ί"), + (0x1FDC, "X"), + (0x1FDD, "3", " ̔̀"), + (0x1FDE, "3", " ̔́"), + (0x1FDF, "3", " ̔͂"), + (0x1FE0, "V"), + (0x1FE3, "M", "ΰ"), + (0x1FE4, "V"), + (0x1FE8, "M", "ῠ"), + (0x1FE9, "M", "ῡ"), + (0x1FEA, "M", "ὺ"), + (0x1FEB, "M", "ύ"), + (0x1FEC, "M", "ῥ"), + (0x1FED, "3", " ̈̀"), + (0x1FEE, "3", " ̈́"), + (0x1FEF, "3", "`"), + (0x1FF0, "X"), + (0x1FF2, "M", "ὼι"), + (0x1FF3, "M", "ωι"), + (0x1FF4, "M", "ώι"), + (0x1FF5, "X"), + (0x1FF6, "V"), + ] + + +def _seg_21() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1FF7, "M", "ῶι"), + (0x1FF8, "M", "ὸ"), + (0x1FF9, "M", "ό"), + (0x1FFA, "M", "ὼ"), + (0x1FFB, "M", "ώ"), + (0x1FFC, "M", "ωι"), + (0x1FFD, "3", " ́"), + (0x1FFE, "3", " ̔"), + (0x1FFF, "X"), + (0x2000, "3", " "), + (0x200B, "I"), + (0x200C, "D", ""), + (0x200E, "X"), + (0x2010, "V"), + (0x2011, "M", "‐"), + (0x2012, "V"), + (0x2017, "3", " ̳"), + (0x2018, "V"), + (0x2024, "X"), + (0x2027, "V"), + (0x2028, "X"), + (0x202F, "3", " "), + (0x2030, "V"), + (0x2033, "M", "′′"), + (0x2034, "M", "′′′"), + (0x2035, "V"), + (0x2036, "M", "‵‵"), + (0x2037, "M", "‵‵‵"), + (0x2038, "V"), + (0x203C, "3", "!!"), + (0x203D, "V"), + (0x203E, "3", " ̅"), + (0x203F, "V"), + (0x2047, "3", "??"), + (0x2048, "3", "?!"), + (0x2049, "3", "!?"), + (0x204A, "V"), + (0x2057, "M", "′′′′"), + (0x2058, "V"), + (0x205F, "3", " "), + (0x2060, "I"), + (0x2061, "X"), + (0x2064, "I"), + (0x2065, "X"), + (0x2070, "M", "0"), + (0x2071, "M", "i"), + (0x2072, "X"), + (0x2074, "M", "4"), + (0x2075, "M", "5"), + (0x2076, "M", "6"), + (0x2077, "M", "7"), + (0x2078, "M", "8"), + (0x2079, "M", "9"), + (0x207A, "3", "+"), + (0x207B, "M", "−"), + (0x207C, "3", "="), + (0x207D, "3", "("), + (0x207E, "3", ")"), + (0x207F, "M", "n"), + (0x2080, "M", "0"), + (0x2081, "M", "1"), + (0x2082, "M", "2"), + (0x2083, "M", "3"), + (0x2084, "M", "4"), + (0x2085, "M", "5"), + (0x2086, "M", "6"), + (0x2087, "M", "7"), + (0x2088, "M", "8"), + (0x2089, "M", "9"), + (0x208A, "3", "+"), + (0x208B, "M", "−"), + (0x208C, "3", "="), + (0x208D, "3", "("), + (0x208E, "3", ")"), + (0x208F, "X"), + (0x2090, "M", "a"), + (0x2091, "M", "e"), + (0x2092, "M", "o"), + (0x2093, "M", "x"), + (0x2094, "M", "ə"), + (0x2095, "M", "h"), + (0x2096, "M", "k"), + (0x2097, "M", "l"), + (0x2098, "M", "m"), + (0x2099, "M", "n"), + (0x209A, "M", "p"), + (0x209B, "M", "s"), + (0x209C, "M", "t"), + (0x209D, "X"), + (0x20A0, "V"), + (0x20A8, "M", "rs"), + (0x20A9, "V"), + (0x20C1, "X"), + (0x20D0, "V"), + (0x20F1, "X"), + (0x2100, "3", "a/c"), + (0x2101, "3", "a/s"), + (0x2102, "M", "c"), + (0x2103, "M", "°c"), + (0x2104, "V"), + ] + + +def _seg_22() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2105, "3", "c/o"), + (0x2106, "3", "c/u"), + (0x2107, "M", "ɛ"), + (0x2108, "V"), + (0x2109, "M", "°f"), + (0x210A, "M", "g"), + (0x210B, "M", "h"), + (0x210F, "M", "ħ"), + (0x2110, "M", "i"), + (0x2112, "M", "l"), + (0x2114, "V"), + (0x2115, "M", "n"), + (0x2116, "M", "no"), + (0x2117, "V"), + (0x2119, "M", "p"), + (0x211A, "M", "q"), + (0x211B, "M", "r"), + (0x211E, "V"), + (0x2120, "M", "sm"), + (0x2121, "M", "tel"), + (0x2122, "M", "tm"), + (0x2123, "V"), + (0x2124, "M", "z"), + (0x2125, "V"), + (0x2126, "M", "ω"), + (0x2127, "V"), + (0x2128, "M", "z"), + (0x2129, "V"), + (0x212A, "M", "k"), + (0x212B, "M", "å"), + (0x212C, "M", "b"), + (0x212D, "M", "c"), + (0x212E, "V"), + (0x212F, "M", "e"), + (0x2131, "M", "f"), + (0x2132, "X"), + (0x2133, "M", "m"), + (0x2134, "M", "o"), + (0x2135, "M", "א"), + (0x2136, "M", "ב"), + (0x2137, "M", "ג"), + (0x2138, "M", "ד"), + (0x2139, "M", "i"), + (0x213A, "V"), + (0x213B, "M", "fax"), + (0x213C, "M", "π"), + (0x213D, "M", "γ"), + (0x213F, "M", "π"), + (0x2140, "M", "∑"), + (0x2141, "V"), + (0x2145, "M", "d"), + (0x2147, "M", "e"), + (0x2148, "M", "i"), + (0x2149, "M", "j"), + (0x214A, "V"), + (0x2150, "M", "1⁄7"), + (0x2151, "M", "1⁄9"), + (0x2152, "M", "1⁄10"), + (0x2153, "M", "1⁄3"), + (0x2154, "M", "2⁄3"), + (0x2155, "M", "1⁄5"), + (0x2156, "M", "2⁄5"), + (0x2157, "M", "3⁄5"), + (0x2158, "M", "4⁄5"), + (0x2159, "M", "1⁄6"), + (0x215A, "M", "5⁄6"), + (0x215B, "M", "1⁄8"), + (0x215C, "M", "3⁄8"), + (0x215D, "M", "5⁄8"), + (0x215E, "M", "7⁄8"), + (0x215F, "M", "1⁄"), + (0x2160, "M", "i"), + (0x2161, "M", "ii"), + (0x2162, "M", "iii"), + (0x2163, "M", "iv"), + (0x2164, "M", "v"), + (0x2165, "M", "vi"), + (0x2166, "M", "vii"), + (0x2167, "M", "viii"), + (0x2168, "M", "ix"), + (0x2169, "M", "x"), + (0x216A, "M", "xi"), + (0x216B, "M", "xii"), + (0x216C, "M", "l"), + (0x216D, "M", "c"), + (0x216E, "M", "d"), + (0x216F, "M", "m"), + (0x2170, "M", "i"), + (0x2171, "M", "ii"), + (0x2172, "M", "iii"), + (0x2173, "M", "iv"), + (0x2174, "M", "v"), + (0x2175, "M", "vi"), + (0x2176, "M", "vii"), + (0x2177, "M", "viii"), + (0x2178, "M", "ix"), + (0x2179, "M", "x"), + (0x217A, "M", "xi"), + (0x217B, "M", "xii"), + (0x217C, "M", "l"), + ] + + +def _seg_23() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x217D, "M", "c"), + (0x217E, "M", "d"), + (0x217F, "M", "m"), + (0x2180, "V"), + (0x2183, "X"), + (0x2184, "V"), + (0x2189, "M", "0⁄3"), + (0x218A, "V"), + (0x218C, "X"), + (0x2190, "V"), + (0x222C, "M", "∫∫"), + (0x222D, "M", "∫∫∫"), + (0x222E, "V"), + (0x222F, "M", "∮∮"), + (0x2230, "M", "∮∮∮"), + (0x2231, "V"), + (0x2329, "M", "〈"), + (0x232A, "M", "〉"), + (0x232B, "V"), + (0x2427, "X"), + (0x2440, "V"), + (0x244B, "X"), + (0x2460, "M", "1"), + (0x2461, "M", "2"), + (0x2462, "M", "3"), + (0x2463, "M", "4"), + (0x2464, "M", "5"), + (0x2465, "M", "6"), + (0x2466, "M", "7"), + (0x2467, "M", "8"), + (0x2468, "M", "9"), + (0x2469, "M", "10"), + (0x246A, "M", "11"), + (0x246B, "M", "12"), + (0x246C, "M", "13"), + (0x246D, "M", "14"), + (0x246E, "M", "15"), + (0x246F, "M", "16"), + (0x2470, "M", "17"), + (0x2471, "M", "18"), + (0x2472, "M", "19"), + (0x2473, "M", "20"), + (0x2474, "3", "(1)"), + (0x2475, "3", "(2)"), + (0x2476, "3", "(3)"), + (0x2477, "3", "(4)"), + (0x2478, "3", "(5)"), + (0x2479, "3", "(6)"), + (0x247A, "3", "(7)"), + (0x247B, "3", "(8)"), + (0x247C, "3", "(9)"), + (0x247D, "3", "(10)"), + (0x247E, "3", "(11)"), + (0x247F, "3", "(12)"), + (0x2480, "3", "(13)"), + (0x2481, "3", "(14)"), + (0x2482, "3", "(15)"), + (0x2483, "3", "(16)"), + (0x2484, "3", "(17)"), + (0x2485, "3", "(18)"), + (0x2486, "3", "(19)"), + (0x2487, "3", "(20)"), + (0x2488, "X"), + (0x249C, "3", "(a)"), + (0x249D, "3", "(b)"), + (0x249E, "3", "(c)"), + (0x249F, "3", "(d)"), + (0x24A0, "3", "(e)"), + (0x24A1, "3", "(f)"), + (0x24A2, "3", "(g)"), + (0x24A3, "3", "(h)"), + (0x24A4, "3", "(i)"), + (0x24A5, "3", "(j)"), + (0x24A6, "3", "(k)"), + (0x24A7, "3", "(l)"), + (0x24A8, "3", "(m)"), + (0x24A9, "3", "(n)"), + (0x24AA, "3", "(o)"), + (0x24AB, "3", "(p)"), + (0x24AC, "3", "(q)"), + (0x24AD, "3", "(r)"), + (0x24AE, "3", "(s)"), + (0x24AF, "3", "(t)"), + (0x24B0, "3", "(u)"), + (0x24B1, "3", "(v)"), + (0x24B2, "3", "(w)"), + (0x24B3, "3", "(x)"), + (0x24B4, "3", "(y)"), + (0x24B5, "3", "(z)"), + (0x24B6, "M", "a"), + (0x24B7, "M", "b"), + (0x24B8, "M", "c"), + (0x24B9, "M", "d"), + (0x24BA, "M", "e"), + (0x24BB, "M", "f"), + (0x24BC, "M", "g"), + (0x24BD, "M", "h"), + (0x24BE, "M", "i"), + (0x24BF, "M", "j"), + (0x24C0, "M", "k"), + ] + + +def _seg_24() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x24C1, "M", "l"), + (0x24C2, "M", "m"), + (0x24C3, "M", "n"), + (0x24C4, "M", "o"), + (0x24C5, "M", "p"), + (0x24C6, "M", "q"), + (0x24C7, "M", "r"), + (0x24C8, "M", "s"), + (0x24C9, "M", "t"), + (0x24CA, "M", "u"), + (0x24CB, "M", "v"), + (0x24CC, "M", "w"), + (0x24CD, "M", "x"), + (0x24CE, "M", "y"), + (0x24CF, "M", "z"), + (0x24D0, "M", "a"), + (0x24D1, "M", "b"), + (0x24D2, "M", "c"), + (0x24D3, "M", "d"), + (0x24D4, "M", "e"), + (0x24D5, "M", "f"), + (0x24D6, "M", "g"), + (0x24D7, "M", "h"), + (0x24D8, "M", "i"), + (0x24D9, "M", "j"), + (0x24DA, "M", "k"), + (0x24DB, "M", "l"), + (0x24DC, "M", "m"), + (0x24DD, "M", "n"), + (0x24DE, "M", "o"), + (0x24DF, "M", "p"), + (0x24E0, "M", "q"), + (0x24E1, "M", "r"), + (0x24E2, "M", "s"), + (0x24E3, "M", "t"), + (0x24E4, "M", "u"), + (0x24E5, "M", "v"), + (0x24E6, "M", "w"), + (0x24E7, "M", "x"), + (0x24E8, "M", "y"), + (0x24E9, "M", "z"), + (0x24EA, "M", "0"), + (0x24EB, "V"), + (0x2A0C, "M", "∫∫∫∫"), + (0x2A0D, "V"), + (0x2A74, "3", "::="), + (0x2A75, "3", "=="), + (0x2A76, "3", "==="), + (0x2A77, "V"), + (0x2ADC, "M", "⫝̸"), + (0x2ADD, "V"), + (0x2B74, "X"), + (0x2B76, "V"), + (0x2B96, "X"), + (0x2B97, "V"), + (0x2C00, "M", "ⰰ"), + (0x2C01, "M", "ⰱ"), + (0x2C02, "M", "ⰲ"), + (0x2C03, "M", "ⰳ"), + (0x2C04, "M", "ⰴ"), + (0x2C05, "M", "ⰵ"), + (0x2C06, "M", "ⰶ"), + (0x2C07, "M", "ⰷ"), + (0x2C08, "M", "ⰸ"), + (0x2C09, "M", "ⰹ"), + (0x2C0A, "M", "ⰺ"), + (0x2C0B, "M", "ⰻ"), + (0x2C0C, "M", "ⰼ"), + (0x2C0D, "M", "ⰽ"), + (0x2C0E, "M", "ⰾ"), + (0x2C0F, "M", "ⰿ"), + (0x2C10, "M", "ⱀ"), + (0x2C11, "M", "ⱁ"), + (0x2C12, "M", "ⱂ"), + (0x2C13, "M", "ⱃ"), + (0x2C14, "M", "ⱄ"), + (0x2C15, "M", "ⱅ"), + (0x2C16, "M", "ⱆ"), + (0x2C17, "M", "ⱇ"), + (0x2C18, "M", "ⱈ"), + (0x2C19, "M", "ⱉ"), + (0x2C1A, "M", "ⱊ"), + (0x2C1B, "M", "ⱋ"), + (0x2C1C, "M", "ⱌ"), + (0x2C1D, "M", "ⱍ"), + (0x2C1E, "M", "ⱎ"), + (0x2C1F, "M", "ⱏ"), + (0x2C20, "M", "ⱐ"), + (0x2C21, "M", "ⱑ"), + (0x2C22, "M", "ⱒ"), + (0x2C23, "M", "ⱓ"), + (0x2C24, "M", "ⱔ"), + (0x2C25, "M", "ⱕ"), + (0x2C26, "M", "ⱖ"), + (0x2C27, "M", "ⱗ"), + (0x2C28, "M", "ⱘ"), + (0x2C29, "M", "ⱙ"), + (0x2C2A, "M", "ⱚ"), + (0x2C2B, "M", "ⱛ"), + (0x2C2C, "M", "ⱜ"), + ] + + +def _seg_25() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2C2D, "M", "ⱝ"), + (0x2C2E, "M", "ⱞ"), + (0x2C2F, "M", "ⱟ"), + (0x2C30, "V"), + (0x2C60, "M", "ⱡ"), + (0x2C61, "V"), + (0x2C62, "M", "ɫ"), + (0x2C63, "M", "ᵽ"), + (0x2C64, "M", "ɽ"), + (0x2C65, "V"), + (0x2C67, "M", "ⱨ"), + (0x2C68, "V"), + (0x2C69, "M", "ⱪ"), + (0x2C6A, "V"), + (0x2C6B, "M", "ⱬ"), + (0x2C6C, "V"), + (0x2C6D, "M", "ɑ"), + (0x2C6E, "M", "ɱ"), + (0x2C6F, "M", "ɐ"), + (0x2C70, "M", "ɒ"), + (0x2C71, "V"), + (0x2C72, "M", "ⱳ"), + (0x2C73, "V"), + (0x2C75, "M", "ⱶ"), + (0x2C76, "V"), + (0x2C7C, "M", "j"), + (0x2C7D, "M", "v"), + (0x2C7E, "M", "ȿ"), + (0x2C7F, "M", "ɀ"), + (0x2C80, "M", "ⲁ"), + (0x2C81, "V"), + (0x2C82, "M", "ⲃ"), + (0x2C83, "V"), + (0x2C84, "M", "ⲅ"), + (0x2C85, "V"), + (0x2C86, "M", "ⲇ"), + (0x2C87, "V"), + (0x2C88, "M", "ⲉ"), + (0x2C89, "V"), + (0x2C8A, "M", "ⲋ"), + (0x2C8B, "V"), + (0x2C8C, "M", "ⲍ"), + (0x2C8D, "V"), + (0x2C8E, "M", "ⲏ"), + (0x2C8F, "V"), + (0x2C90, "M", "ⲑ"), + (0x2C91, "V"), + (0x2C92, "M", "ⲓ"), + (0x2C93, "V"), + (0x2C94, "M", "ⲕ"), + (0x2C95, "V"), + (0x2C96, "M", "ⲗ"), + (0x2C97, "V"), + (0x2C98, "M", "ⲙ"), + (0x2C99, "V"), + (0x2C9A, "M", "ⲛ"), + (0x2C9B, "V"), + (0x2C9C, "M", "ⲝ"), + (0x2C9D, "V"), + (0x2C9E, "M", "ⲟ"), + (0x2C9F, "V"), + (0x2CA0, "M", "ⲡ"), + (0x2CA1, "V"), + (0x2CA2, "M", "ⲣ"), + (0x2CA3, "V"), + (0x2CA4, "M", "ⲥ"), + (0x2CA5, "V"), + (0x2CA6, "M", "ⲧ"), + (0x2CA7, "V"), + (0x2CA8, "M", "ⲩ"), + (0x2CA9, "V"), + (0x2CAA, "M", "ⲫ"), + (0x2CAB, "V"), + (0x2CAC, "M", "ⲭ"), + (0x2CAD, "V"), + (0x2CAE, "M", "ⲯ"), + (0x2CAF, "V"), + (0x2CB0, "M", "ⲱ"), + (0x2CB1, "V"), + (0x2CB2, "M", "ⲳ"), + (0x2CB3, "V"), + (0x2CB4, "M", "ⲵ"), + (0x2CB5, "V"), + (0x2CB6, "M", "ⲷ"), + (0x2CB7, "V"), + (0x2CB8, "M", "ⲹ"), + (0x2CB9, "V"), + (0x2CBA, "M", "ⲻ"), + (0x2CBB, "V"), + (0x2CBC, "M", "ⲽ"), + (0x2CBD, "V"), + (0x2CBE, "M", "ⲿ"), + (0x2CBF, "V"), + (0x2CC0, "M", "ⳁ"), + (0x2CC1, "V"), + (0x2CC2, "M", "ⳃ"), + (0x2CC3, "V"), + (0x2CC4, "M", "ⳅ"), + (0x2CC5, "V"), + (0x2CC6, "M", "ⳇ"), + ] + + +def _seg_26() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2CC7, "V"), + (0x2CC8, "M", "ⳉ"), + (0x2CC9, "V"), + (0x2CCA, "M", "ⳋ"), + (0x2CCB, "V"), + (0x2CCC, "M", "ⳍ"), + (0x2CCD, "V"), + (0x2CCE, "M", "ⳏ"), + (0x2CCF, "V"), + (0x2CD0, "M", "ⳑ"), + (0x2CD1, "V"), + (0x2CD2, "M", "ⳓ"), + (0x2CD3, "V"), + (0x2CD4, "M", "ⳕ"), + (0x2CD5, "V"), + (0x2CD6, "M", "ⳗ"), + (0x2CD7, "V"), + (0x2CD8, "M", "ⳙ"), + (0x2CD9, "V"), + (0x2CDA, "M", "ⳛ"), + (0x2CDB, "V"), + (0x2CDC, "M", "ⳝ"), + (0x2CDD, "V"), + (0x2CDE, "M", "ⳟ"), + (0x2CDF, "V"), + (0x2CE0, "M", "ⳡ"), + (0x2CE1, "V"), + (0x2CE2, "M", "ⳣ"), + (0x2CE3, "V"), + (0x2CEB, "M", "ⳬ"), + (0x2CEC, "V"), + (0x2CED, "M", "ⳮ"), + (0x2CEE, "V"), + (0x2CF2, "M", "ⳳ"), + (0x2CF3, "V"), + (0x2CF4, "X"), + (0x2CF9, "V"), + (0x2D26, "X"), + (0x2D27, "V"), + (0x2D28, "X"), + (0x2D2D, "V"), + (0x2D2E, "X"), + (0x2D30, "V"), + (0x2D68, "X"), + (0x2D6F, "M", "ⵡ"), + (0x2D70, "V"), + (0x2D71, "X"), + (0x2D7F, "V"), + (0x2D97, "X"), + (0x2DA0, "V"), + (0x2DA7, "X"), + (0x2DA8, "V"), + (0x2DAF, "X"), + (0x2DB0, "V"), + (0x2DB7, "X"), + (0x2DB8, "V"), + (0x2DBF, "X"), + (0x2DC0, "V"), + (0x2DC7, "X"), + (0x2DC8, "V"), + (0x2DCF, "X"), + (0x2DD0, "V"), + (0x2DD7, "X"), + (0x2DD8, "V"), + (0x2DDF, "X"), + (0x2DE0, "V"), + (0x2E5E, "X"), + (0x2E80, "V"), + (0x2E9A, "X"), + (0x2E9B, "V"), + (0x2E9F, "M", "母"), + (0x2EA0, "V"), + (0x2EF3, "M", "龟"), + (0x2EF4, "X"), + (0x2F00, "M", "一"), + (0x2F01, "M", "丨"), + (0x2F02, "M", "丶"), + (0x2F03, "M", "丿"), + (0x2F04, "M", "乙"), + (0x2F05, "M", "亅"), + (0x2F06, "M", "二"), + (0x2F07, "M", "亠"), + (0x2F08, "M", "人"), + (0x2F09, "M", "儿"), + (0x2F0A, "M", "入"), + (0x2F0B, "M", "八"), + (0x2F0C, "M", "冂"), + (0x2F0D, "M", "冖"), + (0x2F0E, "M", "冫"), + (0x2F0F, "M", "几"), + (0x2F10, "M", "凵"), + (0x2F11, "M", "刀"), + (0x2F12, "M", "力"), + (0x2F13, "M", "勹"), + (0x2F14, "M", "匕"), + (0x2F15, "M", "匚"), + (0x2F16, "M", "匸"), + (0x2F17, "M", "十"), + (0x2F18, "M", "卜"), + (0x2F19, "M", "卩"), + ] + + +def _seg_27() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2F1A, "M", "厂"), + (0x2F1B, "M", "厶"), + (0x2F1C, "M", "又"), + (0x2F1D, "M", "口"), + (0x2F1E, "M", "囗"), + (0x2F1F, "M", "土"), + (0x2F20, "M", "士"), + (0x2F21, "M", "夂"), + (0x2F22, "M", "夊"), + (0x2F23, "M", "夕"), + (0x2F24, "M", "大"), + (0x2F25, "M", "女"), + (0x2F26, "M", "子"), + (0x2F27, "M", "宀"), + (0x2F28, "M", "寸"), + (0x2F29, "M", "小"), + (0x2F2A, "M", "尢"), + (0x2F2B, "M", "尸"), + (0x2F2C, "M", "屮"), + (0x2F2D, "M", "山"), + (0x2F2E, "M", "巛"), + (0x2F2F, "M", "工"), + (0x2F30, "M", "己"), + (0x2F31, "M", "巾"), + (0x2F32, "M", "干"), + (0x2F33, "M", "幺"), + (0x2F34, "M", "广"), + (0x2F35, "M", "廴"), + (0x2F36, "M", "廾"), + (0x2F37, "M", "弋"), + (0x2F38, "M", "弓"), + (0x2F39, "M", "彐"), + (0x2F3A, "M", "彡"), + (0x2F3B, "M", "彳"), + (0x2F3C, "M", "心"), + (0x2F3D, "M", "戈"), + (0x2F3E, "M", "戶"), + (0x2F3F, "M", "手"), + (0x2F40, "M", "支"), + (0x2F41, "M", "攴"), + (0x2F42, "M", "文"), + (0x2F43, "M", "斗"), + (0x2F44, "M", "斤"), + (0x2F45, "M", "方"), + (0x2F46, "M", "无"), + (0x2F47, "M", "日"), + (0x2F48, "M", "曰"), + (0x2F49, "M", "月"), + (0x2F4A, "M", "木"), + (0x2F4B, "M", "欠"), + (0x2F4C, "M", "止"), + (0x2F4D, "M", "歹"), + (0x2F4E, "M", "殳"), + (0x2F4F, "M", "毋"), + (0x2F50, "M", "比"), + (0x2F51, "M", "毛"), + (0x2F52, "M", "氏"), + (0x2F53, "M", "气"), + (0x2F54, "M", "水"), + (0x2F55, "M", "火"), + (0x2F56, "M", "爪"), + (0x2F57, "M", "父"), + (0x2F58, "M", "爻"), + (0x2F59, "M", "爿"), + (0x2F5A, "M", "片"), + (0x2F5B, "M", "牙"), + (0x2F5C, "M", "牛"), + (0x2F5D, "M", "犬"), + (0x2F5E, "M", "玄"), + (0x2F5F, "M", "玉"), + (0x2F60, "M", "瓜"), + (0x2F61, "M", "瓦"), + (0x2F62, "M", "甘"), + (0x2F63, "M", "生"), + (0x2F64, "M", "用"), + (0x2F65, "M", "田"), + (0x2F66, "M", "疋"), + (0x2F67, "M", "疒"), + (0x2F68, "M", "癶"), + (0x2F69, "M", "白"), + (0x2F6A, "M", "皮"), + (0x2F6B, "M", "皿"), + (0x2F6C, "M", "目"), + (0x2F6D, "M", "矛"), + (0x2F6E, "M", "矢"), + (0x2F6F, "M", "石"), + (0x2F70, "M", "示"), + (0x2F71, "M", "禸"), + (0x2F72, "M", "禾"), + (0x2F73, "M", "穴"), + (0x2F74, "M", "立"), + (0x2F75, "M", "竹"), + (0x2F76, "M", "米"), + (0x2F77, "M", "糸"), + (0x2F78, "M", "缶"), + (0x2F79, "M", "网"), + (0x2F7A, "M", "羊"), + (0x2F7B, "M", "羽"), + (0x2F7C, "M", "老"), + (0x2F7D, "M", "而"), + ] + + +def _seg_28() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2F7E, "M", "耒"), + (0x2F7F, "M", "耳"), + (0x2F80, "M", "聿"), + (0x2F81, "M", "肉"), + (0x2F82, "M", "臣"), + (0x2F83, "M", "自"), + (0x2F84, "M", "至"), + (0x2F85, "M", "臼"), + (0x2F86, "M", "舌"), + (0x2F87, "M", "舛"), + (0x2F88, "M", "舟"), + (0x2F89, "M", "艮"), + (0x2F8A, "M", "色"), + (0x2F8B, "M", "艸"), + (0x2F8C, "M", "虍"), + (0x2F8D, "M", "虫"), + (0x2F8E, "M", "血"), + (0x2F8F, "M", "行"), + (0x2F90, "M", "衣"), + (0x2F91, "M", "襾"), + (0x2F92, "M", "見"), + (0x2F93, "M", "角"), + (0x2F94, "M", "言"), + (0x2F95, "M", "谷"), + (0x2F96, "M", "豆"), + (0x2F97, "M", "豕"), + (0x2F98, "M", "豸"), + (0x2F99, "M", "貝"), + (0x2F9A, "M", "赤"), + (0x2F9B, "M", "走"), + (0x2F9C, "M", "足"), + (0x2F9D, "M", "身"), + (0x2F9E, "M", "車"), + (0x2F9F, "M", "辛"), + (0x2FA0, "M", "辰"), + (0x2FA1, "M", "辵"), + (0x2FA2, "M", "邑"), + (0x2FA3, "M", "酉"), + (0x2FA4, "M", "釆"), + (0x2FA5, "M", "里"), + (0x2FA6, "M", "金"), + (0x2FA7, "M", "長"), + (0x2FA8, "M", "門"), + (0x2FA9, "M", "阜"), + (0x2FAA, "M", "隶"), + (0x2FAB, "M", "隹"), + (0x2FAC, "M", "雨"), + (0x2FAD, "M", "靑"), + (0x2FAE, "M", "非"), + (0x2FAF, "M", "面"), + (0x2FB0, "M", "革"), + (0x2FB1, "M", "韋"), + (0x2FB2, "M", "韭"), + (0x2FB3, "M", "音"), + (0x2FB4, "M", "頁"), + (0x2FB5, "M", "風"), + (0x2FB6, "M", "飛"), + (0x2FB7, "M", "食"), + (0x2FB8, "M", "首"), + (0x2FB9, "M", "香"), + (0x2FBA, "M", "馬"), + (0x2FBB, "M", "骨"), + (0x2FBC, "M", "高"), + (0x2FBD, "M", "髟"), + (0x2FBE, "M", "鬥"), + (0x2FBF, "M", "鬯"), + (0x2FC0, "M", "鬲"), + (0x2FC1, "M", "鬼"), + (0x2FC2, "M", "魚"), + (0x2FC3, "M", "鳥"), + (0x2FC4, "M", "鹵"), + (0x2FC5, "M", "鹿"), + (0x2FC6, "M", "麥"), + (0x2FC7, "M", "麻"), + (0x2FC8, "M", "黃"), + (0x2FC9, "M", "黍"), + (0x2FCA, "M", "黑"), + (0x2FCB, "M", "黹"), + (0x2FCC, "M", "黽"), + (0x2FCD, "M", "鼎"), + (0x2FCE, "M", "鼓"), + (0x2FCF, "M", "鼠"), + (0x2FD0, "M", "鼻"), + (0x2FD1, "M", "齊"), + (0x2FD2, "M", "齒"), + (0x2FD3, "M", "龍"), + (0x2FD4, "M", "龜"), + (0x2FD5, "M", "龠"), + (0x2FD6, "X"), + (0x3000, "3", " "), + (0x3001, "V"), + (0x3002, "M", "."), + (0x3003, "V"), + (0x3036, "M", "〒"), + (0x3037, "V"), + (0x3038, "M", "十"), + (0x3039, "M", "卄"), + (0x303A, "M", "卅"), + (0x303B, "V"), + (0x3040, "X"), + ] + + +def _seg_29() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x3041, "V"), + (0x3097, "X"), + (0x3099, "V"), + (0x309B, "3", " ゙"), + (0x309C, "3", " ゚"), + (0x309D, "V"), + (0x309F, "M", "より"), + (0x30A0, "V"), + (0x30FF, "M", "コト"), + (0x3100, "X"), + (0x3105, "V"), + (0x3130, "X"), + (0x3131, "M", "ᄀ"), + (0x3132, "M", "ᄁ"), + (0x3133, "M", "ᆪ"), + (0x3134, "M", "ᄂ"), + (0x3135, "M", "ᆬ"), + (0x3136, "M", "ᆭ"), + (0x3137, "M", "ᄃ"), + (0x3138, "M", "ᄄ"), + (0x3139, "M", "ᄅ"), + (0x313A, "M", "ᆰ"), + (0x313B, "M", "ᆱ"), + (0x313C, "M", "ᆲ"), + (0x313D, "M", "ᆳ"), + (0x313E, "M", "ᆴ"), + (0x313F, "M", "ᆵ"), + (0x3140, "M", "ᄚ"), + (0x3141, "M", "ᄆ"), + (0x3142, "M", "ᄇ"), + (0x3143, "M", "ᄈ"), + (0x3144, "M", "ᄡ"), + (0x3145, "M", "ᄉ"), + (0x3146, "M", "ᄊ"), + (0x3147, "M", "ᄋ"), + (0x3148, "M", "ᄌ"), + (0x3149, "M", "ᄍ"), + (0x314A, "M", "ᄎ"), + (0x314B, "M", "ᄏ"), + (0x314C, "M", "ᄐ"), + (0x314D, "M", "ᄑ"), + (0x314E, "M", "ᄒ"), + (0x314F, "M", "ᅡ"), + (0x3150, "M", "ᅢ"), + (0x3151, "M", "ᅣ"), + (0x3152, "M", "ᅤ"), + (0x3153, "M", "ᅥ"), + (0x3154, "M", "ᅦ"), + (0x3155, "M", "ᅧ"), + (0x3156, "M", "ᅨ"), + (0x3157, "M", "ᅩ"), + (0x3158, "M", "ᅪ"), + (0x3159, "M", "ᅫ"), + (0x315A, "M", "ᅬ"), + (0x315B, "M", "ᅭ"), + (0x315C, "M", "ᅮ"), + (0x315D, "M", "ᅯ"), + (0x315E, "M", "ᅰ"), + (0x315F, "M", "ᅱ"), + (0x3160, "M", "ᅲ"), + (0x3161, "M", "ᅳ"), + (0x3162, "M", "ᅴ"), + (0x3163, "M", "ᅵ"), + (0x3164, "X"), + (0x3165, "M", "ᄔ"), + (0x3166, "M", "ᄕ"), + (0x3167, "M", "ᇇ"), + (0x3168, "M", "ᇈ"), + (0x3169, "M", "ᇌ"), + (0x316A, "M", "ᇎ"), + (0x316B, "M", "ᇓ"), + (0x316C, "M", "ᇗ"), + (0x316D, "M", "ᇙ"), + (0x316E, "M", "ᄜ"), + (0x316F, "M", "ᇝ"), + (0x3170, "M", "ᇟ"), + (0x3171, "M", "ᄝ"), + (0x3172, "M", "ᄞ"), + (0x3173, "M", "ᄠ"), + (0x3174, "M", "ᄢ"), + (0x3175, "M", "ᄣ"), + (0x3176, "M", "ᄧ"), + (0x3177, "M", "ᄩ"), + (0x3178, "M", "ᄫ"), + (0x3179, "M", "ᄬ"), + (0x317A, "M", "ᄭ"), + (0x317B, "M", "ᄮ"), + (0x317C, "M", "ᄯ"), + (0x317D, "M", "ᄲ"), + (0x317E, "M", "ᄶ"), + (0x317F, "M", "ᅀ"), + (0x3180, "M", "ᅇ"), + (0x3181, "M", "ᅌ"), + (0x3182, "M", "ᇱ"), + (0x3183, "M", "ᇲ"), + (0x3184, "M", "ᅗ"), + (0x3185, "M", "ᅘ"), + (0x3186, "M", "ᅙ"), + (0x3187, "M", "ᆄ"), + (0x3188, "M", "ᆅ"), + ] + + +def _seg_30() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x3189, "M", "ᆈ"), + (0x318A, "M", "ᆑ"), + (0x318B, "M", "ᆒ"), + (0x318C, "M", "ᆔ"), + (0x318D, "M", "ᆞ"), + (0x318E, "M", "ᆡ"), + (0x318F, "X"), + (0x3190, "V"), + (0x3192, "M", "一"), + (0x3193, "M", "二"), + (0x3194, "M", "三"), + (0x3195, "M", "四"), + (0x3196, "M", "上"), + (0x3197, "M", "中"), + (0x3198, "M", "下"), + (0x3199, "M", "甲"), + (0x319A, "M", "乙"), + (0x319B, "M", "丙"), + (0x319C, "M", "丁"), + (0x319D, "M", "天"), + (0x319E, "M", "地"), + (0x319F, "M", "人"), + (0x31A0, "V"), + (0x31E4, "X"), + (0x31F0, "V"), + (0x3200, "3", "(ᄀ)"), + (0x3201, "3", "(ᄂ)"), + (0x3202, "3", "(ᄃ)"), + (0x3203, "3", "(ᄅ)"), + (0x3204, "3", "(ᄆ)"), + (0x3205, "3", "(ᄇ)"), + (0x3206, "3", "(ᄉ)"), + (0x3207, "3", "(ᄋ)"), + (0x3208, "3", "(ᄌ)"), + (0x3209, "3", "(ᄎ)"), + (0x320A, "3", "(ᄏ)"), + (0x320B, "3", "(ᄐ)"), + (0x320C, "3", "(ᄑ)"), + (0x320D, "3", "(ᄒ)"), + (0x320E, "3", "(가)"), + (0x320F, "3", "(나)"), + (0x3210, "3", "(다)"), + (0x3211, "3", "(라)"), + (0x3212, "3", "(마)"), + (0x3213, "3", "(바)"), + (0x3214, "3", "(사)"), + (0x3215, "3", "(아)"), + (0x3216, "3", "(자)"), + (0x3217, "3", "(차)"), + (0x3218, "3", "(카)"), + (0x3219, "3", "(타)"), + (0x321A, "3", "(파)"), + (0x321B, "3", "(하)"), + (0x321C, "3", "(주)"), + (0x321D, "3", "(오전)"), + (0x321E, "3", "(오후)"), + (0x321F, "X"), + (0x3220, "3", "(一)"), + (0x3221, "3", "(二)"), + (0x3222, "3", "(三)"), + (0x3223, "3", "(四)"), + (0x3224, "3", "(五)"), + (0x3225, "3", "(六)"), + (0x3226, "3", "(七)"), + (0x3227, "3", "(八)"), + (0x3228, "3", "(九)"), + (0x3229, "3", "(十)"), + (0x322A, "3", "(月)"), + (0x322B, "3", "(火)"), + (0x322C, "3", "(水)"), + (0x322D, "3", "(木)"), + (0x322E, "3", "(金)"), + (0x322F, "3", "(土)"), + (0x3230, "3", "(日)"), + (0x3231, "3", "(株)"), + (0x3232, "3", "(有)"), + (0x3233, "3", "(社)"), + (0x3234, "3", "(名)"), + (0x3235, "3", "(特)"), + (0x3236, "3", "(財)"), + (0x3237, "3", "(祝)"), + (0x3238, "3", "(労)"), + (0x3239, "3", "(代)"), + (0x323A, "3", "(呼)"), + (0x323B, "3", "(学)"), + (0x323C, "3", "(監)"), + (0x323D, "3", "(企)"), + (0x323E, "3", "(資)"), + (0x323F, "3", "(協)"), + (0x3240, "3", "(祭)"), + (0x3241, "3", "(休)"), + (0x3242, "3", "(自)"), + (0x3243, "3", "(至)"), + (0x3244, "M", "問"), + (0x3245, "M", "幼"), + (0x3246, "M", "文"), + (0x3247, "M", "箏"), + (0x3248, "V"), + (0x3250, "M", "pte"), + (0x3251, "M", "21"), + ] + + +def _seg_31() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x3252, "M", "22"), + (0x3253, "M", "23"), + (0x3254, "M", "24"), + (0x3255, "M", "25"), + (0x3256, "M", "26"), + (0x3257, "M", "27"), + (0x3258, "M", "28"), + (0x3259, "M", "29"), + (0x325A, "M", "30"), + (0x325B, "M", "31"), + (0x325C, "M", "32"), + (0x325D, "M", "33"), + (0x325E, "M", "34"), + (0x325F, "M", "35"), + (0x3260, "M", "ᄀ"), + (0x3261, "M", "ᄂ"), + (0x3262, "M", "ᄃ"), + (0x3263, "M", "ᄅ"), + (0x3264, "M", "ᄆ"), + (0x3265, "M", "ᄇ"), + (0x3266, "M", "ᄉ"), + (0x3267, "M", "ᄋ"), + (0x3268, "M", "ᄌ"), + (0x3269, "M", "ᄎ"), + (0x326A, "M", "ᄏ"), + (0x326B, "M", "ᄐ"), + (0x326C, "M", "ᄑ"), + (0x326D, "M", "ᄒ"), + (0x326E, "M", "가"), + (0x326F, "M", "나"), + (0x3270, "M", "다"), + (0x3271, "M", "라"), + (0x3272, "M", "마"), + (0x3273, "M", "바"), + (0x3274, "M", "사"), + (0x3275, "M", "아"), + (0x3276, "M", "자"), + (0x3277, "M", "차"), + (0x3278, "M", "카"), + (0x3279, "M", "타"), + (0x327A, "M", "파"), + (0x327B, "M", "하"), + (0x327C, "M", "참고"), + (0x327D, "M", "주의"), + (0x327E, "M", "우"), + (0x327F, "V"), + (0x3280, "M", "一"), + (0x3281, "M", "二"), + (0x3282, "M", "三"), + (0x3283, "M", "四"), + (0x3284, "M", "五"), + (0x3285, "M", "六"), + (0x3286, "M", "七"), + (0x3287, "M", "八"), + (0x3288, "M", "九"), + (0x3289, "M", "十"), + (0x328A, "M", "月"), + (0x328B, "M", "火"), + (0x328C, "M", "水"), + (0x328D, "M", "木"), + (0x328E, "M", "金"), + (0x328F, "M", "土"), + (0x3290, "M", "日"), + (0x3291, "M", "株"), + (0x3292, "M", "有"), + (0x3293, "M", "社"), + (0x3294, "M", "名"), + (0x3295, "M", "特"), + (0x3296, "M", "財"), + (0x3297, "M", "祝"), + (0x3298, "M", "労"), + (0x3299, "M", "秘"), + (0x329A, "M", "男"), + (0x329B, "M", "女"), + (0x329C, "M", "適"), + (0x329D, "M", "優"), + (0x329E, "M", "印"), + (0x329F, "M", "注"), + (0x32A0, "M", "項"), + (0x32A1, "M", "休"), + (0x32A2, "M", "写"), + (0x32A3, "M", "正"), + (0x32A4, "M", "上"), + (0x32A5, "M", "中"), + (0x32A6, "M", "下"), + (0x32A7, "M", "左"), + (0x32A8, "M", "右"), + (0x32A9, "M", "医"), + (0x32AA, "M", "宗"), + (0x32AB, "M", "学"), + (0x32AC, "M", "監"), + (0x32AD, "M", "企"), + (0x32AE, "M", "資"), + (0x32AF, "M", "協"), + (0x32B0, "M", "夜"), + (0x32B1, "M", "36"), + (0x32B2, "M", "37"), + (0x32B3, "M", "38"), + (0x32B4, "M", "39"), + (0x32B5, "M", "40"), + ] + + +def _seg_32() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x32B6, "M", "41"), + (0x32B7, "M", "42"), + (0x32B8, "M", "43"), + (0x32B9, "M", "44"), + (0x32BA, "M", "45"), + (0x32BB, "M", "46"), + (0x32BC, "M", "47"), + (0x32BD, "M", "48"), + (0x32BE, "M", "49"), + (0x32BF, "M", "50"), + (0x32C0, "M", "1月"), + (0x32C1, "M", "2月"), + (0x32C2, "M", "3月"), + (0x32C3, "M", "4月"), + (0x32C4, "M", "5月"), + (0x32C5, "M", "6月"), + (0x32C6, "M", "7月"), + (0x32C7, "M", "8月"), + (0x32C8, "M", "9月"), + (0x32C9, "M", "10月"), + (0x32CA, "M", "11月"), + (0x32CB, "M", "12月"), + (0x32CC, "M", "hg"), + (0x32CD, "M", "erg"), + (0x32CE, "M", "ev"), + (0x32CF, "M", "ltd"), + (0x32D0, "M", "ア"), + (0x32D1, "M", "イ"), + (0x32D2, "M", "ウ"), + (0x32D3, "M", "エ"), + (0x32D4, "M", "オ"), + (0x32D5, "M", "カ"), + (0x32D6, "M", "キ"), + (0x32D7, "M", "ク"), + (0x32D8, "M", "ケ"), + (0x32D9, "M", "コ"), + (0x32DA, "M", "サ"), + (0x32DB, "M", "シ"), + (0x32DC, "M", "ス"), + (0x32DD, "M", "セ"), + (0x32DE, "M", "ソ"), + (0x32DF, "M", "タ"), + (0x32E0, "M", "チ"), + (0x32E1, "M", "ツ"), + (0x32E2, "M", "テ"), + (0x32E3, "M", "ト"), + (0x32E4, "M", "ナ"), + (0x32E5, "M", "ニ"), + (0x32E6, "M", "ヌ"), + (0x32E7, "M", "ネ"), + (0x32E8, "M", "ノ"), + (0x32E9, "M", "ハ"), + (0x32EA, "M", "ヒ"), + (0x32EB, "M", "フ"), + (0x32EC, "M", "ヘ"), + (0x32ED, "M", "ホ"), + (0x32EE, "M", "マ"), + (0x32EF, "M", "ミ"), + (0x32F0, "M", "ム"), + (0x32F1, "M", "メ"), + (0x32F2, "M", "モ"), + (0x32F3, "M", "ヤ"), + (0x32F4, "M", "ユ"), + (0x32F5, "M", "ヨ"), + (0x32F6, "M", "ラ"), + (0x32F7, "M", "リ"), + (0x32F8, "M", "ル"), + (0x32F9, "M", "レ"), + (0x32FA, "M", "ロ"), + (0x32FB, "M", "ワ"), + (0x32FC, "M", "ヰ"), + (0x32FD, "M", "ヱ"), + (0x32FE, "M", "ヲ"), + (0x32FF, "M", "令和"), + (0x3300, "M", "アパート"), + (0x3301, "M", "アルファ"), + (0x3302, "M", "アンペア"), + (0x3303, "M", "アール"), + (0x3304, "M", "イニング"), + (0x3305, "M", "インチ"), + (0x3306, "M", "ウォン"), + (0x3307, "M", "エスクード"), + (0x3308, "M", "エーカー"), + (0x3309, "M", "オンス"), + (0x330A, "M", "オーム"), + (0x330B, "M", "カイリ"), + (0x330C, "M", "カラット"), + (0x330D, "M", "カロリー"), + (0x330E, "M", "ガロン"), + (0x330F, "M", "ガンマ"), + (0x3310, "M", "ギガ"), + (0x3311, "M", "ギニー"), + (0x3312, "M", "キュリー"), + (0x3313, "M", "ギルダー"), + (0x3314, "M", "キロ"), + (0x3315, "M", "キログラム"), + (0x3316, "M", "キロメートル"), + (0x3317, "M", "キロワット"), + (0x3318, "M", "グラム"), + (0x3319, "M", "グラムトン"), + ] + + +def _seg_33() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x331A, "M", "クルゼイロ"), + (0x331B, "M", "クローネ"), + (0x331C, "M", "ケース"), + (0x331D, "M", "コルナ"), + (0x331E, "M", "コーポ"), + (0x331F, "M", "サイクル"), + (0x3320, "M", "サンチーム"), + (0x3321, "M", "シリング"), + (0x3322, "M", "センチ"), + (0x3323, "M", "セント"), + (0x3324, "M", "ダース"), + (0x3325, "M", "デシ"), + (0x3326, "M", "ドル"), + (0x3327, "M", "トン"), + (0x3328, "M", "ナノ"), + (0x3329, "M", "ノット"), + (0x332A, "M", "ハイツ"), + (0x332B, "M", "パーセント"), + (0x332C, "M", "パーツ"), + (0x332D, "M", "バーレル"), + (0x332E, "M", "ピアストル"), + (0x332F, "M", "ピクル"), + (0x3330, "M", "ピコ"), + (0x3331, "M", "ビル"), + (0x3332, "M", "ファラッド"), + (0x3333, "M", "フィート"), + (0x3334, "M", "ブッシェル"), + (0x3335, "M", "フラン"), + (0x3336, "M", "ヘクタール"), + (0x3337, "M", "ペソ"), + (0x3338, "M", "ペニヒ"), + (0x3339, "M", "ヘルツ"), + (0x333A, "M", "ペンス"), + (0x333B, "M", "ページ"), + (0x333C, "M", "ベータ"), + (0x333D, "M", "ポイント"), + (0x333E, "M", "ボルト"), + (0x333F, "M", "ホン"), + (0x3340, "M", "ポンド"), + (0x3341, "M", "ホール"), + (0x3342, "M", "ホーン"), + (0x3343, "M", "マイクロ"), + (0x3344, "M", "マイル"), + (0x3345, "M", "マッハ"), + (0x3346, "M", "マルク"), + (0x3347, "M", "マンション"), + (0x3348, "M", "ミクロン"), + (0x3349, "M", "ミリ"), + (0x334A, "M", "ミリバール"), + (0x334B, "M", "メガ"), + (0x334C, "M", "メガトン"), + (0x334D, "M", "メートル"), + (0x334E, "M", "ヤード"), + (0x334F, "M", "ヤール"), + (0x3350, "M", "ユアン"), + (0x3351, "M", "リットル"), + (0x3352, "M", "リラ"), + (0x3353, "M", "ルピー"), + (0x3354, "M", "ルーブル"), + (0x3355, "M", "レム"), + (0x3356, "M", "レントゲン"), + (0x3357, "M", "ワット"), + (0x3358, "M", "0点"), + (0x3359, "M", "1点"), + (0x335A, "M", "2点"), + (0x335B, "M", "3点"), + (0x335C, "M", "4点"), + (0x335D, "M", "5点"), + (0x335E, "M", "6点"), + (0x335F, "M", "7点"), + (0x3360, "M", "8点"), + (0x3361, "M", "9点"), + (0x3362, "M", "10点"), + (0x3363, "M", "11点"), + (0x3364, "M", "12点"), + (0x3365, "M", "13点"), + (0x3366, "M", "14点"), + (0x3367, "M", "15点"), + (0x3368, "M", "16点"), + (0x3369, "M", "17点"), + (0x336A, "M", "18点"), + (0x336B, "M", "19点"), + (0x336C, "M", "20点"), + (0x336D, "M", "21点"), + (0x336E, "M", "22点"), + (0x336F, "M", "23点"), + (0x3370, "M", "24点"), + (0x3371, "M", "hpa"), + (0x3372, "M", "da"), + (0x3373, "M", "au"), + (0x3374, "M", "bar"), + (0x3375, "M", "ov"), + (0x3376, "M", "pc"), + (0x3377, "M", "dm"), + (0x3378, "M", "dm2"), + (0x3379, "M", "dm3"), + (0x337A, "M", "iu"), + (0x337B, "M", "平成"), + (0x337C, "M", "昭和"), + (0x337D, "M", "大正"), + ] + + +def _seg_34() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x337E, "M", "明治"), + (0x337F, "M", "株式会社"), + (0x3380, "M", "pa"), + (0x3381, "M", "na"), + (0x3382, "M", "μa"), + (0x3383, "M", "ma"), + (0x3384, "M", "ka"), + (0x3385, "M", "kb"), + (0x3386, "M", "mb"), + (0x3387, "M", "gb"), + (0x3388, "M", "cal"), + (0x3389, "M", "kcal"), + (0x338A, "M", "pf"), + (0x338B, "M", "nf"), + (0x338C, "M", "μf"), + (0x338D, "M", "μg"), + (0x338E, "M", "mg"), + (0x338F, "M", "kg"), + (0x3390, "M", "hz"), + (0x3391, "M", "khz"), + (0x3392, "M", "mhz"), + (0x3393, "M", "ghz"), + (0x3394, "M", "thz"), + (0x3395, "M", "μl"), + (0x3396, "M", "ml"), + (0x3397, "M", "dl"), + (0x3398, "M", "kl"), + (0x3399, "M", "fm"), + (0x339A, "M", "nm"), + (0x339B, "M", "μm"), + (0x339C, "M", "mm"), + (0x339D, "M", "cm"), + (0x339E, "M", "km"), + (0x339F, "M", "mm2"), + (0x33A0, "M", "cm2"), + (0x33A1, "M", "m2"), + (0x33A2, "M", "km2"), + (0x33A3, "M", "mm3"), + (0x33A4, "M", "cm3"), + (0x33A5, "M", "m3"), + (0x33A6, "M", "km3"), + (0x33A7, "M", "m∕s"), + (0x33A8, "M", "m∕s2"), + (0x33A9, "M", "pa"), + (0x33AA, "M", "kpa"), + (0x33AB, "M", "mpa"), + (0x33AC, "M", "gpa"), + (0x33AD, "M", "rad"), + (0x33AE, "M", "rad∕s"), + (0x33AF, "M", "rad∕s2"), + (0x33B0, "M", "ps"), + (0x33B1, "M", "ns"), + (0x33B2, "M", "μs"), + (0x33B3, "M", "ms"), + (0x33B4, "M", "pv"), + (0x33B5, "M", "nv"), + (0x33B6, "M", "μv"), + (0x33B7, "M", "mv"), + (0x33B8, "M", "kv"), + (0x33B9, "M", "mv"), + (0x33BA, "M", "pw"), + (0x33BB, "M", "nw"), + (0x33BC, "M", "μw"), + (0x33BD, "M", "mw"), + (0x33BE, "M", "kw"), + (0x33BF, "M", "mw"), + (0x33C0, "M", "kω"), + (0x33C1, "M", "mω"), + (0x33C2, "X"), + (0x33C3, "M", "bq"), + (0x33C4, "M", "cc"), + (0x33C5, "M", "cd"), + (0x33C6, "M", "c∕kg"), + (0x33C7, "X"), + (0x33C8, "M", "db"), + (0x33C9, "M", "gy"), + (0x33CA, "M", "ha"), + (0x33CB, "M", "hp"), + (0x33CC, "M", "in"), + (0x33CD, "M", "kk"), + (0x33CE, "M", "km"), + (0x33CF, "M", "kt"), + (0x33D0, "M", "lm"), + (0x33D1, "M", "ln"), + (0x33D2, "M", "log"), + (0x33D3, "M", "lx"), + (0x33D4, "M", "mb"), + (0x33D5, "M", "mil"), + (0x33D6, "M", "mol"), + (0x33D7, "M", "ph"), + (0x33D8, "X"), + (0x33D9, "M", "ppm"), + (0x33DA, "M", "pr"), + (0x33DB, "M", "sr"), + (0x33DC, "M", "sv"), + (0x33DD, "M", "wb"), + (0x33DE, "M", "v∕m"), + (0x33DF, "M", "a∕m"), + (0x33E0, "M", "1日"), + (0x33E1, "M", "2日"), + ] + + +def _seg_35() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x33E2, "M", "3日"), + (0x33E3, "M", "4日"), + (0x33E4, "M", "5日"), + (0x33E5, "M", "6日"), + (0x33E6, "M", "7日"), + (0x33E7, "M", "8日"), + (0x33E8, "M", "9日"), + (0x33E9, "M", "10日"), + (0x33EA, "M", "11日"), + (0x33EB, "M", "12日"), + (0x33EC, "M", "13日"), + (0x33ED, "M", "14日"), + (0x33EE, "M", "15日"), + (0x33EF, "M", "16日"), + (0x33F0, "M", "17日"), + (0x33F1, "M", "18日"), + (0x33F2, "M", "19日"), + (0x33F3, "M", "20日"), + (0x33F4, "M", "21日"), + (0x33F5, "M", "22日"), + (0x33F6, "M", "23日"), + (0x33F7, "M", "24日"), + (0x33F8, "M", "25日"), + (0x33F9, "M", "26日"), + (0x33FA, "M", "27日"), + (0x33FB, "M", "28日"), + (0x33FC, "M", "29日"), + (0x33FD, "M", "30日"), + (0x33FE, "M", "31日"), + (0x33FF, "M", "gal"), + (0x3400, "V"), + (0xA48D, "X"), + (0xA490, "V"), + (0xA4C7, "X"), + (0xA4D0, "V"), + (0xA62C, "X"), + (0xA640, "M", "ꙁ"), + (0xA641, "V"), + (0xA642, "M", "ꙃ"), + (0xA643, "V"), + (0xA644, "M", "ꙅ"), + (0xA645, "V"), + (0xA646, "M", "ꙇ"), + (0xA647, "V"), + (0xA648, "M", "ꙉ"), + (0xA649, "V"), + (0xA64A, "M", "ꙋ"), + (0xA64B, "V"), + (0xA64C, "M", "ꙍ"), + (0xA64D, "V"), + (0xA64E, "M", "ꙏ"), + (0xA64F, "V"), + (0xA650, "M", "ꙑ"), + (0xA651, "V"), + (0xA652, "M", "ꙓ"), + (0xA653, "V"), + (0xA654, "M", "ꙕ"), + (0xA655, "V"), + (0xA656, "M", "ꙗ"), + (0xA657, "V"), + (0xA658, "M", "ꙙ"), + (0xA659, "V"), + (0xA65A, "M", "ꙛ"), + (0xA65B, "V"), + (0xA65C, "M", "ꙝ"), + (0xA65D, "V"), + (0xA65E, "M", "ꙟ"), + (0xA65F, "V"), + (0xA660, "M", "ꙡ"), + (0xA661, "V"), + (0xA662, "M", "ꙣ"), + (0xA663, "V"), + (0xA664, "M", "ꙥ"), + (0xA665, "V"), + (0xA666, "M", "ꙧ"), + (0xA667, "V"), + (0xA668, "M", "ꙩ"), + (0xA669, "V"), + (0xA66A, "M", "ꙫ"), + (0xA66B, "V"), + (0xA66C, "M", "ꙭ"), + (0xA66D, "V"), + (0xA680, "M", "ꚁ"), + (0xA681, "V"), + (0xA682, "M", "ꚃ"), + (0xA683, "V"), + (0xA684, "M", "ꚅ"), + (0xA685, "V"), + (0xA686, "M", "ꚇ"), + (0xA687, "V"), + (0xA688, "M", "ꚉ"), + (0xA689, "V"), + (0xA68A, "M", "ꚋ"), + (0xA68B, "V"), + (0xA68C, "M", "ꚍ"), + (0xA68D, "V"), + (0xA68E, "M", "ꚏ"), + (0xA68F, "V"), + (0xA690, "M", "ꚑ"), + (0xA691, "V"), + ] + + +def _seg_36() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xA692, "M", "ꚓ"), + (0xA693, "V"), + (0xA694, "M", "ꚕ"), + (0xA695, "V"), + (0xA696, "M", "ꚗ"), + (0xA697, "V"), + (0xA698, "M", "ꚙ"), + (0xA699, "V"), + (0xA69A, "M", "ꚛ"), + (0xA69B, "V"), + (0xA69C, "M", "ъ"), + (0xA69D, "M", "ь"), + (0xA69E, "V"), + (0xA6F8, "X"), + (0xA700, "V"), + (0xA722, "M", "ꜣ"), + (0xA723, "V"), + (0xA724, "M", "ꜥ"), + (0xA725, "V"), + (0xA726, "M", "ꜧ"), + (0xA727, "V"), + (0xA728, "M", "ꜩ"), + (0xA729, "V"), + (0xA72A, "M", "ꜫ"), + (0xA72B, "V"), + (0xA72C, "M", "ꜭ"), + (0xA72D, "V"), + (0xA72E, "M", "ꜯ"), + (0xA72F, "V"), + (0xA732, "M", "ꜳ"), + (0xA733, "V"), + (0xA734, "M", "ꜵ"), + (0xA735, "V"), + (0xA736, "M", "ꜷ"), + (0xA737, "V"), + (0xA738, "M", "ꜹ"), + (0xA739, "V"), + (0xA73A, "M", "ꜻ"), + (0xA73B, "V"), + (0xA73C, "M", "ꜽ"), + (0xA73D, "V"), + (0xA73E, "M", "ꜿ"), + (0xA73F, "V"), + (0xA740, "M", "ꝁ"), + (0xA741, "V"), + (0xA742, "M", "ꝃ"), + (0xA743, "V"), + (0xA744, "M", "ꝅ"), + (0xA745, "V"), + (0xA746, "M", "ꝇ"), + (0xA747, "V"), + (0xA748, "M", "ꝉ"), + (0xA749, "V"), + (0xA74A, "M", "ꝋ"), + (0xA74B, "V"), + (0xA74C, "M", "ꝍ"), + (0xA74D, "V"), + (0xA74E, "M", "ꝏ"), + (0xA74F, "V"), + (0xA750, "M", "ꝑ"), + (0xA751, "V"), + (0xA752, "M", "ꝓ"), + (0xA753, "V"), + (0xA754, "M", "ꝕ"), + (0xA755, "V"), + (0xA756, "M", "ꝗ"), + (0xA757, "V"), + (0xA758, "M", "ꝙ"), + (0xA759, "V"), + (0xA75A, "M", "ꝛ"), + (0xA75B, "V"), + (0xA75C, "M", "ꝝ"), + (0xA75D, "V"), + (0xA75E, "M", "ꝟ"), + (0xA75F, "V"), + (0xA760, "M", "ꝡ"), + (0xA761, "V"), + (0xA762, "M", "ꝣ"), + (0xA763, "V"), + (0xA764, "M", "ꝥ"), + (0xA765, "V"), + (0xA766, "M", "ꝧ"), + (0xA767, "V"), + (0xA768, "M", "ꝩ"), + (0xA769, "V"), + (0xA76A, "M", "ꝫ"), + (0xA76B, "V"), + (0xA76C, "M", "ꝭ"), + (0xA76D, "V"), + (0xA76E, "M", "ꝯ"), + (0xA76F, "V"), + (0xA770, "M", "ꝯ"), + (0xA771, "V"), + (0xA779, "M", "ꝺ"), + (0xA77A, "V"), + (0xA77B, "M", "ꝼ"), + (0xA77C, "V"), + (0xA77D, "M", "ᵹ"), + (0xA77E, "M", "ꝿ"), + (0xA77F, "V"), + ] + + +def _seg_37() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xA780, "M", "ꞁ"), + (0xA781, "V"), + (0xA782, "M", "ꞃ"), + (0xA783, "V"), + (0xA784, "M", "ꞅ"), + (0xA785, "V"), + (0xA786, "M", "ꞇ"), + (0xA787, "V"), + (0xA78B, "M", "ꞌ"), + (0xA78C, "V"), + (0xA78D, "M", "ɥ"), + (0xA78E, "V"), + (0xA790, "M", "ꞑ"), + (0xA791, "V"), + (0xA792, "M", "ꞓ"), + (0xA793, "V"), + (0xA796, "M", "ꞗ"), + (0xA797, "V"), + (0xA798, "M", "ꞙ"), + (0xA799, "V"), + (0xA79A, "M", "ꞛ"), + (0xA79B, "V"), + (0xA79C, "M", "ꞝ"), + (0xA79D, "V"), + (0xA79E, "M", "ꞟ"), + (0xA79F, "V"), + (0xA7A0, "M", "ꞡ"), + (0xA7A1, "V"), + (0xA7A2, "M", "ꞣ"), + (0xA7A3, "V"), + (0xA7A4, "M", "ꞥ"), + (0xA7A5, "V"), + (0xA7A6, "M", "ꞧ"), + (0xA7A7, "V"), + (0xA7A8, "M", "ꞩ"), + (0xA7A9, "V"), + (0xA7AA, "M", "ɦ"), + (0xA7AB, "M", "ɜ"), + (0xA7AC, "M", "ɡ"), + (0xA7AD, "M", "ɬ"), + (0xA7AE, "M", "ɪ"), + (0xA7AF, "V"), + (0xA7B0, "M", "ʞ"), + (0xA7B1, "M", "ʇ"), + (0xA7B2, "M", "ʝ"), + (0xA7B3, "M", "ꭓ"), + (0xA7B4, "M", "ꞵ"), + (0xA7B5, "V"), + (0xA7B6, "M", "ꞷ"), + (0xA7B7, "V"), + (0xA7B8, "M", "ꞹ"), + (0xA7B9, "V"), + (0xA7BA, "M", "ꞻ"), + (0xA7BB, "V"), + (0xA7BC, "M", "ꞽ"), + (0xA7BD, "V"), + (0xA7BE, "M", "ꞿ"), + (0xA7BF, "V"), + (0xA7C0, "M", "ꟁ"), + (0xA7C1, "V"), + (0xA7C2, "M", "ꟃ"), + (0xA7C3, "V"), + (0xA7C4, "M", "ꞔ"), + (0xA7C5, "M", "ʂ"), + (0xA7C6, "M", "ᶎ"), + (0xA7C7, "M", "ꟈ"), + (0xA7C8, "V"), + (0xA7C9, "M", "ꟊ"), + (0xA7CA, "V"), + (0xA7CB, "X"), + (0xA7D0, "M", "ꟑ"), + (0xA7D1, "V"), + (0xA7D2, "X"), + (0xA7D3, "V"), + (0xA7D4, "X"), + (0xA7D5, "V"), + (0xA7D6, "M", "ꟗ"), + (0xA7D7, "V"), + (0xA7D8, "M", "ꟙ"), + (0xA7D9, "V"), + (0xA7DA, "X"), + (0xA7F2, "M", "c"), + (0xA7F3, "M", "f"), + (0xA7F4, "M", "q"), + (0xA7F5, "M", "ꟶ"), + (0xA7F6, "V"), + (0xA7F8, "M", "ħ"), + (0xA7F9, "M", "œ"), + (0xA7FA, "V"), + (0xA82D, "X"), + (0xA830, "V"), + (0xA83A, "X"), + (0xA840, "V"), + (0xA878, "X"), + (0xA880, "V"), + (0xA8C6, "X"), + (0xA8CE, "V"), + (0xA8DA, "X"), + (0xA8E0, "V"), + (0xA954, "X"), + ] + + +def _seg_38() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xA95F, "V"), + (0xA97D, "X"), + (0xA980, "V"), + (0xA9CE, "X"), + (0xA9CF, "V"), + (0xA9DA, "X"), + (0xA9DE, "V"), + (0xA9FF, "X"), + (0xAA00, "V"), + (0xAA37, "X"), + (0xAA40, "V"), + (0xAA4E, "X"), + (0xAA50, "V"), + (0xAA5A, "X"), + (0xAA5C, "V"), + (0xAAC3, "X"), + (0xAADB, "V"), + (0xAAF7, "X"), + (0xAB01, "V"), + (0xAB07, "X"), + (0xAB09, "V"), + (0xAB0F, "X"), + (0xAB11, "V"), + (0xAB17, "X"), + (0xAB20, "V"), + (0xAB27, "X"), + (0xAB28, "V"), + (0xAB2F, "X"), + (0xAB30, "V"), + (0xAB5C, "M", "ꜧ"), + (0xAB5D, "M", "ꬷ"), + (0xAB5E, "M", "ɫ"), + (0xAB5F, "M", "ꭒ"), + (0xAB60, "V"), + (0xAB69, "M", "ʍ"), + (0xAB6A, "V"), + (0xAB6C, "X"), + (0xAB70, "M", "Ꭰ"), + (0xAB71, "M", "Ꭱ"), + (0xAB72, "M", "Ꭲ"), + (0xAB73, "M", "Ꭳ"), + (0xAB74, "M", "Ꭴ"), + (0xAB75, "M", "Ꭵ"), + (0xAB76, "M", "Ꭶ"), + (0xAB77, "M", "Ꭷ"), + (0xAB78, "M", "Ꭸ"), + (0xAB79, "M", "Ꭹ"), + (0xAB7A, "M", "Ꭺ"), + (0xAB7B, "M", "Ꭻ"), + (0xAB7C, "M", "Ꭼ"), + (0xAB7D, "M", "Ꭽ"), + (0xAB7E, "M", "Ꭾ"), + (0xAB7F, "M", "Ꭿ"), + (0xAB80, "M", "Ꮀ"), + (0xAB81, "M", "Ꮁ"), + (0xAB82, "M", "Ꮂ"), + (0xAB83, "M", "Ꮃ"), + (0xAB84, "M", "Ꮄ"), + (0xAB85, "M", "Ꮅ"), + (0xAB86, "M", "Ꮆ"), + (0xAB87, "M", "Ꮇ"), + (0xAB88, "M", "Ꮈ"), + (0xAB89, "M", "Ꮉ"), + (0xAB8A, "M", "Ꮊ"), + (0xAB8B, "M", "Ꮋ"), + (0xAB8C, "M", "Ꮌ"), + (0xAB8D, "M", "Ꮍ"), + (0xAB8E, "M", "Ꮎ"), + (0xAB8F, "M", "Ꮏ"), + (0xAB90, "M", "Ꮐ"), + (0xAB91, "M", "Ꮑ"), + (0xAB92, "M", "Ꮒ"), + (0xAB93, "M", "Ꮓ"), + (0xAB94, "M", "Ꮔ"), + (0xAB95, "M", "Ꮕ"), + (0xAB96, "M", "Ꮖ"), + (0xAB97, "M", "Ꮗ"), + (0xAB98, "M", "Ꮘ"), + (0xAB99, "M", "Ꮙ"), + (0xAB9A, "M", "Ꮚ"), + (0xAB9B, "M", "Ꮛ"), + (0xAB9C, "M", "Ꮜ"), + (0xAB9D, "M", "Ꮝ"), + (0xAB9E, "M", "Ꮞ"), + (0xAB9F, "M", "Ꮟ"), + (0xABA0, "M", "Ꮠ"), + (0xABA1, "M", "Ꮡ"), + (0xABA2, "M", "Ꮢ"), + (0xABA3, "M", "Ꮣ"), + (0xABA4, "M", "Ꮤ"), + (0xABA5, "M", "Ꮥ"), + (0xABA6, "M", "Ꮦ"), + (0xABA7, "M", "Ꮧ"), + (0xABA8, "M", "Ꮨ"), + (0xABA9, "M", "Ꮩ"), + (0xABAA, "M", "Ꮪ"), + (0xABAB, "M", "Ꮫ"), + (0xABAC, "M", "Ꮬ"), + (0xABAD, "M", "Ꮭ"), + (0xABAE, "M", "Ꮮ"), + ] + + +def _seg_39() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xABAF, "M", "Ꮯ"), + (0xABB0, "M", "Ꮰ"), + (0xABB1, "M", "Ꮱ"), + (0xABB2, "M", "Ꮲ"), + (0xABB3, "M", "Ꮳ"), + (0xABB4, "M", "Ꮴ"), + (0xABB5, "M", "Ꮵ"), + (0xABB6, "M", "Ꮶ"), + (0xABB7, "M", "Ꮷ"), + (0xABB8, "M", "Ꮸ"), + (0xABB9, "M", "Ꮹ"), + (0xABBA, "M", "Ꮺ"), + (0xABBB, "M", "Ꮻ"), + (0xABBC, "M", "Ꮼ"), + (0xABBD, "M", "Ꮽ"), + (0xABBE, "M", "Ꮾ"), + (0xABBF, "M", "Ꮿ"), + (0xABC0, "V"), + (0xABEE, "X"), + (0xABF0, "V"), + (0xABFA, "X"), + (0xAC00, "V"), + (0xD7A4, "X"), + (0xD7B0, "V"), + (0xD7C7, "X"), + (0xD7CB, "V"), + (0xD7FC, "X"), + (0xF900, "M", "豈"), + (0xF901, "M", "更"), + (0xF902, "M", "車"), + (0xF903, "M", "賈"), + (0xF904, "M", "滑"), + (0xF905, "M", "串"), + (0xF906, "M", "句"), + (0xF907, "M", "龜"), + (0xF909, "M", "契"), + (0xF90A, "M", "金"), + (0xF90B, "M", "喇"), + (0xF90C, "M", "奈"), + (0xF90D, "M", "懶"), + (0xF90E, "M", "癩"), + (0xF90F, "M", "羅"), + (0xF910, "M", "蘿"), + (0xF911, "M", "螺"), + (0xF912, "M", "裸"), + (0xF913, "M", "邏"), + (0xF914, "M", "樂"), + (0xF915, "M", "洛"), + (0xF916, "M", "烙"), + (0xF917, "M", "珞"), + (0xF918, "M", "落"), + (0xF919, "M", "酪"), + (0xF91A, "M", "駱"), + (0xF91B, "M", "亂"), + (0xF91C, "M", "卵"), + (0xF91D, "M", "欄"), + (0xF91E, "M", "爛"), + (0xF91F, "M", "蘭"), + (0xF920, "M", "鸞"), + (0xF921, "M", "嵐"), + (0xF922, "M", "濫"), + (0xF923, "M", "藍"), + (0xF924, "M", "襤"), + (0xF925, "M", "拉"), + (0xF926, "M", "臘"), + (0xF927, "M", "蠟"), + (0xF928, "M", "廊"), + (0xF929, "M", "朗"), + (0xF92A, "M", "浪"), + (0xF92B, "M", "狼"), + (0xF92C, "M", "郎"), + (0xF92D, "M", "來"), + (0xF92E, "M", "冷"), + (0xF92F, "M", "勞"), + (0xF930, "M", "擄"), + (0xF931, "M", "櫓"), + (0xF932, "M", "爐"), + (0xF933, "M", "盧"), + (0xF934, "M", "老"), + (0xF935, "M", "蘆"), + (0xF936, "M", "虜"), + (0xF937, "M", "路"), + (0xF938, "M", "露"), + (0xF939, "M", "魯"), + (0xF93A, "M", "鷺"), + (0xF93B, "M", "碌"), + (0xF93C, "M", "祿"), + (0xF93D, "M", "綠"), + (0xF93E, "M", "菉"), + (0xF93F, "M", "錄"), + (0xF940, "M", "鹿"), + (0xF941, "M", "論"), + (0xF942, "M", "壟"), + (0xF943, "M", "弄"), + (0xF944, "M", "籠"), + (0xF945, "M", "聾"), + (0xF946, "M", "牢"), + (0xF947, "M", "磊"), + (0xF948, "M", "賂"), + (0xF949, "M", "雷"), + ] + + +def _seg_40() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xF94A, "M", "壘"), + (0xF94B, "M", "屢"), + (0xF94C, "M", "樓"), + (0xF94D, "M", "淚"), + (0xF94E, "M", "漏"), + (0xF94F, "M", "累"), + (0xF950, "M", "縷"), + (0xF951, "M", "陋"), + (0xF952, "M", "勒"), + (0xF953, "M", "肋"), + (0xF954, "M", "凜"), + (0xF955, "M", "凌"), + (0xF956, "M", "稜"), + (0xF957, "M", "綾"), + (0xF958, "M", "菱"), + (0xF959, "M", "陵"), + (0xF95A, "M", "讀"), + (0xF95B, "M", "拏"), + (0xF95C, "M", "樂"), + (0xF95D, "M", "諾"), + (0xF95E, "M", "丹"), + (0xF95F, "M", "寧"), + (0xF960, "M", "怒"), + (0xF961, "M", "率"), + (0xF962, "M", "異"), + (0xF963, "M", "北"), + (0xF964, "M", "磻"), + (0xF965, "M", "便"), + (0xF966, "M", "復"), + (0xF967, "M", "不"), + (0xF968, "M", "泌"), + (0xF969, "M", "數"), + (0xF96A, "M", "索"), + (0xF96B, "M", "參"), + (0xF96C, "M", "塞"), + (0xF96D, "M", "省"), + (0xF96E, "M", "葉"), + (0xF96F, "M", "說"), + (0xF970, "M", "殺"), + (0xF971, "M", "辰"), + (0xF972, "M", "沈"), + (0xF973, "M", "拾"), + (0xF974, "M", "若"), + (0xF975, "M", "掠"), + (0xF976, "M", "略"), + (0xF977, "M", "亮"), + (0xF978, "M", "兩"), + (0xF979, "M", "凉"), + (0xF97A, "M", "梁"), + (0xF97B, "M", "糧"), + (0xF97C, "M", "良"), + (0xF97D, "M", "諒"), + (0xF97E, "M", "量"), + (0xF97F, "M", "勵"), + (0xF980, "M", "呂"), + (0xF981, "M", "女"), + (0xF982, "M", "廬"), + (0xF983, "M", "旅"), + (0xF984, "M", "濾"), + (0xF985, "M", "礪"), + (0xF986, "M", "閭"), + (0xF987, "M", "驪"), + (0xF988, "M", "麗"), + (0xF989, "M", "黎"), + (0xF98A, "M", "力"), + (0xF98B, "M", "曆"), + (0xF98C, "M", "歷"), + (0xF98D, "M", "轢"), + (0xF98E, "M", "年"), + (0xF98F, "M", "憐"), + (0xF990, "M", "戀"), + (0xF991, "M", "撚"), + (0xF992, "M", "漣"), + (0xF993, "M", "煉"), + (0xF994, "M", "璉"), + (0xF995, "M", "秊"), + (0xF996, "M", "練"), + (0xF997, "M", "聯"), + (0xF998, "M", "輦"), + (0xF999, "M", "蓮"), + (0xF99A, "M", "連"), + (0xF99B, "M", "鍊"), + (0xF99C, "M", "列"), + (0xF99D, "M", "劣"), + (0xF99E, "M", "咽"), + (0xF99F, "M", "烈"), + (0xF9A0, "M", "裂"), + (0xF9A1, "M", "說"), + (0xF9A2, "M", "廉"), + (0xF9A3, "M", "念"), + (0xF9A4, "M", "捻"), + (0xF9A5, "M", "殮"), + (0xF9A6, "M", "簾"), + (0xF9A7, "M", "獵"), + (0xF9A8, "M", "令"), + (0xF9A9, "M", "囹"), + (0xF9AA, "M", "寧"), + (0xF9AB, "M", "嶺"), + (0xF9AC, "M", "怜"), + (0xF9AD, "M", "玲"), + ] + + +def _seg_41() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xF9AE, "M", "瑩"), + (0xF9AF, "M", "羚"), + (0xF9B0, "M", "聆"), + (0xF9B1, "M", "鈴"), + (0xF9B2, "M", "零"), + (0xF9B3, "M", "靈"), + (0xF9B4, "M", "領"), + (0xF9B5, "M", "例"), + (0xF9B6, "M", "禮"), + (0xF9B7, "M", "醴"), + (0xF9B8, "M", "隸"), + (0xF9B9, "M", "惡"), + (0xF9BA, "M", "了"), + (0xF9BB, "M", "僚"), + (0xF9BC, "M", "寮"), + (0xF9BD, "M", "尿"), + (0xF9BE, "M", "料"), + (0xF9BF, "M", "樂"), + (0xF9C0, "M", "燎"), + (0xF9C1, "M", "療"), + (0xF9C2, "M", "蓼"), + (0xF9C3, "M", "遼"), + (0xF9C4, "M", "龍"), + (0xF9C5, "M", "暈"), + (0xF9C6, "M", "阮"), + (0xF9C7, "M", "劉"), + (0xF9C8, "M", "杻"), + (0xF9C9, "M", "柳"), + (0xF9CA, "M", "流"), + (0xF9CB, "M", "溜"), + (0xF9CC, "M", "琉"), + (0xF9CD, "M", "留"), + (0xF9CE, "M", "硫"), + (0xF9CF, "M", "紐"), + (0xF9D0, "M", "類"), + (0xF9D1, "M", "六"), + (0xF9D2, "M", "戮"), + (0xF9D3, "M", "陸"), + (0xF9D4, "M", "倫"), + (0xF9D5, "M", "崙"), + (0xF9D6, "M", "淪"), + (0xF9D7, "M", "輪"), + (0xF9D8, "M", "律"), + (0xF9D9, "M", "慄"), + (0xF9DA, "M", "栗"), + (0xF9DB, "M", "率"), + (0xF9DC, "M", "隆"), + (0xF9DD, "M", "利"), + (0xF9DE, "M", "吏"), + (0xF9DF, "M", "履"), + (0xF9E0, "M", "易"), + (0xF9E1, "M", "李"), + (0xF9E2, "M", "梨"), + (0xF9E3, "M", "泥"), + (0xF9E4, "M", "理"), + (0xF9E5, "M", "痢"), + (0xF9E6, "M", "罹"), + (0xF9E7, "M", "裏"), + (0xF9E8, "M", "裡"), + (0xF9E9, "M", "里"), + (0xF9EA, "M", "離"), + (0xF9EB, "M", "匿"), + (0xF9EC, "M", "溺"), + (0xF9ED, "M", "吝"), + (0xF9EE, "M", "燐"), + (0xF9EF, "M", "璘"), + (0xF9F0, "M", "藺"), + (0xF9F1, "M", "隣"), + (0xF9F2, "M", "鱗"), + (0xF9F3, "M", "麟"), + (0xF9F4, "M", "林"), + (0xF9F5, "M", "淋"), + (0xF9F6, "M", "臨"), + (0xF9F7, "M", "立"), + (0xF9F8, "M", "笠"), + (0xF9F9, "M", "粒"), + (0xF9FA, "M", "狀"), + (0xF9FB, "M", "炙"), + (0xF9FC, "M", "識"), + (0xF9FD, "M", "什"), + (0xF9FE, "M", "茶"), + (0xF9FF, "M", "刺"), + (0xFA00, "M", "切"), + (0xFA01, "M", "度"), + (0xFA02, "M", "拓"), + (0xFA03, "M", "糖"), + (0xFA04, "M", "宅"), + (0xFA05, "M", "洞"), + (0xFA06, "M", "暴"), + (0xFA07, "M", "輻"), + (0xFA08, "M", "行"), + (0xFA09, "M", "降"), + (0xFA0A, "M", "見"), + (0xFA0B, "M", "廓"), + (0xFA0C, "M", "兀"), + (0xFA0D, "M", "嗀"), + (0xFA0E, "V"), + (0xFA10, "M", "塚"), + (0xFA11, "V"), + (0xFA12, "M", "晴"), + ] + + +def _seg_42() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFA13, "V"), + (0xFA15, "M", "凞"), + (0xFA16, "M", "猪"), + (0xFA17, "M", "益"), + (0xFA18, "M", "礼"), + (0xFA19, "M", "神"), + (0xFA1A, "M", "祥"), + (0xFA1B, "M", "福"), + (0xFA1C, "M", "靖"), + (0xFA1D, "M", "精"), + (0xFA1E, "M", "羽"), + (0xFA1F, "V"), + (0xFA20, "M", "蘒"), + (0xFA21, "V"), + (0xFA22, "M", "諸"), + (0xFA23, "V"), + (0xFA25, "M", "逸"), + (0xFA26, "M", "都"), + (0xFA27, "V"), + (0xFA2A, "M", "飯"), + (0xFA2B, "M", "飼"), + (0xFA2C, "M", "館"), + (0xFA2D, "M", "鶴"), + (0xFA2E, "M", "郞"), + (0xFA2F, "M", "隷"), + (0xFA30, "M", "侮"), + (0xFA31, "M", "僧"), + (0xFA32, "M", "免"), + (0xFA33, "M", "勉"), + (0xFA34, "M", "勤"), + (0xFA35, "M", "卑"), + (0xFA36, "M", "喝"), + (0xFA37, "M", "嘆"), + (0xFA38, "M", "器"), + (0xFA39, "M", "塀"), + (0xFA3A, "M", "墨"), + (0xFA3B, "M", "層"), + (0xFA3C, "M", "屮"), + (0xFA3D, "M", "悔"), + (0xFA3E, "M", "慨"), + (0xFA3F, "M", "憎"), + (0xFA40, "M", "懲"), + (0xFA41, "M", "敏"), + (0xFA42, "M", "既"), + (0xFA43, "M", "暑"), + (0xFA44, "M", "梅"), + (0xFA45, "M", "海"), + (0xFA46, "M", "渚"), + (0xFA47, "M", "漢"), + (0xFA48, "M", "煮"), + (0xFA49, "M", "爫"), + (0xFA4A, "M", "琢"), + (0xFA4B, "M", "碑"), + (0xFA4C, "M", "社"), + (0xFA4D, "M", "祉"), + (0xFA4E, "M", "祈"), + (0xFA4F, "M", "祐"), + (0xFA50, "M", "祖"), + (0xFA51, "M", "祝"), + (0xFA52, "M", "禍"), + (0xFA53, "M", "禎"), + (0xFA54, "M", "穀"), + (0xFA55, "M", "突"), + (0xFA56, "M", "節"), + (0xFA57, "M", "練"), + (0xFA58, "M", "縉"), + (0xFA59, "M", "繁"), + (0xFA5A, "M", "署"), + (0xFA5B, "M", "者"), + (0xFA5C, "M", "臭"), + (0xFA5D, "M", "艹"), + (0xFA5F, "M", "著"), + (0xFA60, "M", "褐"), + (0xFA61, "M", "視"), + (0xFA62, "M", "謁"), + (0xFA63, "M", "謹"), + (0xFA64, "M", "賓"), + (0xFA65, "M", "贈"), + (0xFA66, "M", "辶"), + (0xFA67, "M", "逸"), + (0xFA68, "M", "難"), + (0xFA69, "M", "響"), + (0xFA6A, "M", "頻"), + (0xFA6B, "M", "恵"), + (0xFA6C, "M", "𤋮"), + (0xFA6D, "M", "舘"), + (0xFA6E, "X"), + (0xFA70, "M", "並"), + (0xFA71, "M", "况"), + (0xFA72, "M", "全"), + (0xFA73, "M", "侀"), + (0xFA74, "M", "充"), + (0xFA75, "M", "冀"), + (0xFA76, "M", "勇"), + (0xFA77, "M", "勺"), + (0xFA78, "M", "喝"), + (0xFA79, "M", "啕"), + (0xFA7A, "M", "喙"), + (0xFA7B, "M", "嗢"), + (0xFA7C, "M", "塚"), + ] + + +def _seg_43() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFA7D, "M", "墳"), + (0xFA7E, "M", "奄"), + (0xFA7F, "M", "奔"), + (0xFA80, "M", "婢"), + (0xFA81, "M", "嬨"), + (0xFA82, "M", "廒"), + (0xFA83, "M", "廙"), + (0xFA84, "M", "彩"), + (0xFA85, "M", "徭"), + (0xFA86, "M", "惘"), + (0xFA87, "M", "慎"), + (0xFA88, "M", "愈"), + (0xFA89, "M", "憎"), + (0xFA8A, "M", "慠"), + (0xFA8B, "M", "懲"), + (0xFA8C, "M", "戴"), + (0xFA8D, "M", "揄"), + (0xFA8E, "M", "搜"), + (0xFA8F, "M", "摒"), + (0xFA90, "M", "敖"), + (0xFA91, "M", "晴"), + (0xFA92, "M", "朗"), + (0xFA93, "M", "望"), + (0xFA94, "M", "杖"), + (0xFA95, "M", "歹"), + (0xFA96, "M", "殺"), + (0xFA97, "M", "流"), + (0xFA98, "M", "滛"), + (0xFA99, "M", "滋"), + (0xFA9A, "M", "漢"), + (0xFA9B, "M", "瀞"), + (0xFA9C, "M", "煮"), + (0xFA9D, "M", "瞧"), + (0xFA9E, "M", "爵"), + (0xFA9F, "M", "犯"), + (0xFAA0, "M", "猪"), + (0xFAA1, "M", "瑱"), + (0xFAA2, "M", "甆"), + (0xFAA3, "M", "画"), + (0xFAA4, "M", "瘝"), + (0xFAA5, "M", "瘟"), + (0xFAA6, "M", "益"), + (0xFAA7, "M", "盛"), + (0xFAA8, "M", "直"), + (0xFAA9, "M", "睊"), + (0xFAAA, "M", "着"), + (0xFAAB, "M", "磌"), + (0xFAAC, "M", "窱"), + (0xFAAD, "M", "節"), + (0xFAAE, "M", "类"), + (0xFAAF, "M", "絛"), + (0xFAB0, "M", "練"), + (0xFAB1, "M", "缾"), + (0xFAB2, "M", "者"), + (0xFAB3, "M", "荒"), + (0xFAB4, "M", "華"), + (0xFAB5, "M", "蝹"), + (0xFAB6, "M", "襁"), + (0xFAB7, "M", "覆"), + (0xFAB8, "M", "視"), + (0xFAB9, "M", "調"), + (0xFABA, "M", "諸"), + (0xFABB, "M", "請"), + (0xFABC, "M", "謁"), + (0xFABD, "M", "諾"), + (0xFABE, "M", "諭"), + (0xFABF, "M", "謹"), + (0xFAC0, "M", "變"), + (0xFAC1, "M", "贈"), + (0xFAC2, "M", "輸"), + (0xFAC3, "M", "遲"), + (0xFAC4, "M", "醙"), + (0xFAC5, "M", "鉶"), + (0xFAC6, "M", "陼"), + (0xFAC7, "M", "難"), + (0xFAC8, "M", "靖"), + (0xFAC9, "M", "韛"), + (0xFACA, "M", "響"), + (0xFACB, "M", "頋"), + (0xFACC, "M", "頻"), + (0xFACD, "M", "鬒"), + (0xFACE, "M", "龜"), + (0xFACF, "M", "𢡊"), + (0xFAD0, "M", "𢡄"), + (0xFAD1, "M", "𣏕"), + (0xFAD2, "M", "㮝"), + (0xFAD3, "M", "䀘"), + (0xFAD4, "M", "䀹"), + (0xFAD5, "M", "𥉉"), + (0xFAD6, "M", "𥳐"), + (0xFAD7, "M", "𧻓"), + (0xFAD8, "M", "齃"), + (0xFAD9, "M", "龎"), + (0xFADA, "X"), + (0xFB00, "M", "ff"), + (0xFB01, "M", "fi"), + (0xFB02, "M", "fl"), + (0xFB03, "M", "ffi"), + (0xFB04, "M", "ffl"), + (0xFB05, "M", "st"), + ] + + +def _seg_44() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFB07, "X"), + (0xFB13, "M", "մն"), + (0xFB14, "M", "մե"), + (0xFB15, "M", "մի"), + (0xFB16, "M", "վն"), + (0xFB17, "M", "մխ"), + (0xFB18, "X"), + (0xFB1D, "M", "יִ"), + (0xFB1E, "V"), + (0xFB1F, "M", "ײַ"), + (0xFB20, "M", "ע"), + (0xFB21, "M", "א"), + (0xFB22, "M", "ד"), + (0xFB23, "M", "ה"), + (0xFB24, "M", "כ"), + (0xFB25, "M", "ל"), + (0xFB26, "M", "ם"), + (0xFB27, "M", "ר"), + (0xFB28, "M", "ת"), + (0xFB29, "3", "+"), + (0xFB2A, "M", "שׁ"), + (0xFB2B, "M", "שׂ"), + (0xFB2C, "M", "שּׁ"), + (0xFB2D, "M", "שּׂ"), + (0xFB2E, "M", "אַ"), + (0xFB2F, "M", "אָ"), + (0xFB30, "M", "אּ"), + (0xFB31, "M", "בּ"), + (0xFB32, "M", "גּ"), + (0xFB33, "M", "דּ"), + (0xFB34, "M", "הּ"), + (0xFB35, "M", "וּ"), + (0xFB36, "M", "זּ"), + (0xFB37, "X"), + (0xFB38, "M", "טּ"), + (0xFB39, "M", "יּ"), + (0xFB3A, "M", "ךּ"), + (0xFB3B, "M", "כּ"), + (0xFB3C, "M", "לּ"), + (0xFB3D, "X"), + (0xFB3E, "M", "מּ"), + (0xFB3F, "X"), + (0xFB40, "M", "נּ"), + (0xFB41, "M", "סּ"), + (0xFB42, "X"), + (0xFB43, "M", "ףּ"), + (0xFB44, "M", "פּ"), + (0xFB45, "X"), + (0xFB46, "M", "צּ"), + (0xFB47, "M", "קּ"), + (0xFB48, "M", "רּ"), + (0xFB49, "M", "שּ"), + (0xFB4A, "M", "תּ"), + (0xFB4B, "M", "וֹ"), + (0xFB4C, "M", "בֿ"), + (0xFB4D, "M", "כֿ"), + (0xFB4E, "M", "פֿ"), + (0xFB4F, "M", "אל"), + (0xFB50, "M", "ٱ"), + (0xFB52, "M", "ٻ"), + (0xFB56, "M", "پ"), + (0xFB5A, "M", "ڀ"), + (0xFB5E, "M", "ٺ"), + (0xFB62, "M", "ٿ"), + (0xFB66, "M", "ٹ"), + (0xFB6A, "M", "ڤ"), + (0xFB6E, "M", "ڦ"), + (0xFB72, "M", "ڄ"), + (0xFB76, "M", "ڃ"), + (0xFB7A, "M", "چ"), + (0xFB7E, "M", "ڇ"), + (0xFB82, "M", "ڍ"), + (0xFB84, "M", "ڌ"), + (0xFB86, "M", "ڎ"), + (0xFB88, "M", "ڈ"), + (0xFB8A, "M", "ژ"), + (0xFB8C, "M", "ڑ"), + (0xFB8E, "M", "ک"), + (0xFB92, "M", "گ"), + (0xFB96, "M", "ڳ"), + (0xFB9A, "M", "ڱ"), + (0xFB9E, "M", "ں"), + (0xFBA0, "M", "ڻ"), + (0xFBA4, "M", "ۀ"), + (0xFBA6, "M", "ہ"), + (0xFBAA, "M", "ھ"), + (0xFBAE, "M", "ے"), + (0xFBB0, "M", "ۓ"), + (0xFBB2, "V"), + (0xFBC3, "X"), + (0xFBD3, "M", "ڭ"), + (0xFBD7, "M", "ۇ"), + (0xFBD9, "M", "ۆ"), + (0xFBDB, "M", "ۈ"), + (0xFBDD, "M", "ۇٴ"), + (0xFBDE, "M", "ۋ"), + (0xFBE0, "M", "ۅ"), + (0xFBE2, "M", "ۉ"), + (0xFBE4, "M", "ې"), + (0xFBE8, "M", "ى"), + ] + + +def _seg_45() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFBEA, "M", "ئا"), + (0xFBEC, "M", "ئە"), + (0xFBEE, "M", "ئو"), + (0xFBF0, "M", "ئۇ"), + (0xFBF2, "M", "ئۆ"), + (0xFBF4, "M", "ئۈ"), + (0xFBF6, "M", "ئې"), + (0xFBF9, "M", "ئى"), + (0xFBFC, "M", "ی"), + (0xFC00, "M", "ئج"), + (0xFC01, "M", "ئح"), + (0xFC02, "M", "ئم"), + (0xFC03, "M", "ئى"), + (0xFC04, "M", "ئي"), + (0xFC05, "M", "بج"), + (0xFC06, "M", "بح"), + (0xFC07, "M", "بخ"), + (0xFC08, "M", "بم"), + (0xFC09, "M", "بى"), + (0xFC0A, "M", "بي"), + (0xFC0B, "M", "تج"), + (0xFC0C, "M", "تح"), + (0xFC0D, "M", "تخ"), + (0xFC0E, "M", "تم"), + (0xFC0F, "M", "تى"), + (0xFC10, "M", "تي"), + (0xFC11, "M", "ثج"), + (0xFC12, "M", "ثم"), + (0xFC13, "M", "ثى"), + (0xFC14, "M", "ثي"), + (0xFC15, "M", "جح"), + (0xFC16, "M", "جم"), + (0xFC17, "M", "حج"), + (0xFC18, "M", "حم"), + (0xFC19, "M", "خج"), + (0xFC1A, "M", "خح"), + (0xFC1B, "M", "خم"), + (0xFC1C, "M", "سج"), + (0xFC1D, "M", "سح"), + (0xFC1E, "M", "سخ"), + (0xFC1F, "M", "سم"), + (0xFC20, "M", "صح"), + (0xFC21, "M", "صم"), + (0xFC22, "M", "ضج"), + (0xFC23, "M", "ضح"), + (0xFC24, "M", "ضخ"), + (0xFC25, "M", "ضم"), + (0xFC26, "M", "طح"), + (0xFC27, "M", "طم"), + (0xFC28, "M", "ظم"), + (0xFC29, "M", "عج"), + (0xFC2A, "M", "عم"), + (0xFC2B, "M", "غج"), + (0xFC2C, "M", "غم"), + (0xFC2D, "M", "فج"), + (0xFC2E, "M", "فح"), + (0xFC2F, "M", "فخ"), + (0xFC30, "M", "فم"), + (0xFC31, "M", "فى"), + (0xFC32, "M", "في"), + (0xFC33, "M", "قح"), + (0xFC34, "M", "قم"), + (0xFC35, "M", "قى"), + (0xFC36, "M", "قي"), + (0xFC37, "M", "كا"), + (0xFC38, "M", "كج"), + (0xFC39, "M", "كح"), + (0xFC3A, "M", "كخ"), + (0xFC3B, "M", "كل"), + (0xFC3C, "M", "كم"), + (0xFC3D, "M", "كى"), + (0xFC3E, "M", "كي"), + (0xFC3F, "M", "لج"), + (0xFC40, "M", "لح"), + (0xFC41, "M", "لخ"), + (0xFC42, "M", "لم"), + (0xFC43, "M", "لى"), + (0xFC44, "M", "لي"), + (0xFC45, "M", "مج"), + (0xFC46, "M", "مح"), + (0xFC47, "M", "مخ"), + (0xFC48, "M", "مم"), + (0xFC49, "M", "مى"), + (0xFC4A, "M", "مي"), + (0xFC4B, "M", "نج"), + (0xFC4C, "M", "نح"), + (0xFC4D, "M", "نخ"), + (0xFC4E, "M", "نم"), + (0xFC4F, "M", "نى"), + (0xFC50, "M", "ني"), + (0xFC51, "M", "هج"), + (0xFC52, "M", "هم"), + (0xFC53, "M", "هى"), + (0xFC54, "M", "هي"), + (0xFC55, "M", "يج"), + (0xFC56, "M", "يح"), + (0xFC57, "M", "يخ"), + (0xFC58, "M", "يم"), + (0xFC59, "M", "يى"), + (0xFC5A, "M", "يي"), + ] + + +def _seg_46() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFC5B, "M", "ذٰ"), + (0xFC5C, "M", "رٰ"), + (0xFC5D, "M", "ىٰ"), + (0xFC5E, "3", " ٌّ"), + (0xFC5F, "3", " ٍّ"), + (0xFC60, "3", " َّ"), + (0xFC61, "3", " ُّ"), + (0xFC62, "3", " ِّ"), + (0xFC63, "3", " ّٰ"), + (0xFC64, "M", "ئر"), + (0xFC65, "M", "ئز"), + (0xFC66, "M", "ئم"), + (0xFC67, "M", "ئن"), + (0xFC68, "M", "ئى"), + (0xFC69, "M", "ئي"), + (0xFC6A, "M", "بر"), + (0xFC6B, "M", "بز"), + (0xFC6C, "M", "بم"), + (0xFC6D, "M", "بن"), + (0xFC6E, "M", "بى"), + (0xFC6F, "M", "بي"), + (0xFC70, "M", "تر"), + (0xFC71, "M", "تز"), + (0xFC72, "M", "تم"), + (0xFC73, "M", "تن"), + (0xFC74, "M", "تى"), + (0xFC75, "M", "تي"), + (0xFC76, "M", "ثر"), + (0xFC77, "M", "ثز"), + (0xFC78, "M", "ثم"), + (0xFC79, "M", "ثن"), + (0xFC7A, "M", "ثى"), + (0xFC7B, "M", "ثي"), + (0xFC7C, "M", "فى"), + (0xFC7D, "M", "في"), + (0xFC7E, "M", "قى"), + (0xFC7F, "M", "قي"), + (0xFC80, "M", "كا"), + (0xFC81, "M", "كل"), + (0xFC82, "M", "كم"), + (0xFC83, "M", "كى"), + (0xFC84, "M", "كي"), + (0xFC85, "M", "لم"), + (0xFC86, "M", "لى"), + (0xFC87, "M", "لي"), + (0xFC88, "M", "ما"), + (0xFC89, "M", "مم"), + (0xFC8A, "M", "نر"), + (0xFC8B, "M", "نز"), + (0xFC8C, "M", "نم"), + (0xFC8D, "M", "نن"), + (0xFC8E, "M", "نى"), + (0xFC8F, "M", "ني"), + (0xFC90, "M", "ىٰ"), + (0xFC91, "M", "ير"), + (0xFC92, "M", "يز"), + (0xFC93, "M", "يم"), + (0xFC94, "M", "ين"), + (0xFC95, "M", "يى"), + (0xFC96, "M", "يي"), + (0xFC97, "M", "ئج"), + (0xFC98, "M", "ئح"), + (0xFC99, "M", "ئخ"), + (0xFC9A, "M", "ئم"), + (0xFC9B, "M", "ئه"), + (0xFC9C, "M", "بج"), + (0xFC9D, "M", "بح"), + (0xFC9E, "M", "بخ"), + (0xFC9F, "M", "بم"), + (0xFCA0, "M", "به"), + (0xFCA1, "M", "تج"), + (0xFCA2, "M", "تح"), + (0xFCA3, "M", "تخ"), + (0xFCA4, "M", "تم"), + (0xFCA5, "M", "ته"), + (0xFCA6, "M", "ثم"), + (0xFCA7, "M", "جح"), + (0xFCA8, "M", "جم"), + (0xFCA9, "M", "حج"), + (0xFCAA, "M", "حم"), + (0xFCAB, "M", "خج"), + (0xFCAC, "M", "خم"), + (0xFCAD, "M", "سج"), + (0xFCAE, "M", "سح"), + (0xFCAF, "M", "سخ"), + (0xFCB0, "M", "سم"), + (0xFCB1, "M", "صح"), + (0xFCB2, "M", "صخ"), + (0xFCB3, "M", "صم"), + (0xFCB4, "M", "ضج"), + (0xFCB5, "M", "ضح"), + (0xFCB6, "M", "ضخ"), + (0xFCB7, "M", "ضم"), + (0xFCB8, "M", "طح"), + (0xFCB9, "M", "ظم"), + (0xFCBA, "M", "عج"), + (0xFCBB, "M", "عم"), + (0xFCBC, "M", "غج"), + (0xFCBD, "M", "غم"), + (0xFCBE, "M", "فج"), + ] + + +def _seg_47() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFCBF, "M", "فح"), + (0xFCC0, "M", "فخ"), + (0xFCC1, "M", "فم"), + (0xFCC2, "M", "قح"), + (0xFCC3, "M", "قم"), + (0xFCC4, "M", "كج"), + (0xFCC5, "M", "كح"), + (0xFCC6, "M", "كخ"), + (0xFCC7, "M", "كل"), + (0xFCC8, "M", "كم"), + (0xFCC9, "M", "لج"), + (0xFCCA, "M", "لح"), + (0xFCCB, "M", "لخ"), + (0xFCCC, "M", "لم"), + (0xFCCD, "M", "له"), + (0xFCCE, "M", "مج"), + (0xFCCF, "M", "مح"), + (0xFCD0, "M", "مخ"), + (0xFCD1, "M", "مم"), + (0xFCD2, "M", "نج"), + (0xFCD3, "M", "نح"), + (0xFCD4, "M", "نخ"), + (0xFCD5, "M", "نم"), + (0xFCD6, "M", "نه"), + (0xFCD7, "M", "هج"), + (0xFCD8, "M", "هم"), + (0xFCD9, "M", "هٰ"), + (0xFCDA, "M", "يج"), + (0xFCDB, "M", "يح"), + (0xFCDC, "M", "يخ"), + (0xFCDD, "M", "يم"), + (0xFCDE, "M", "يه"), + (0xFCDF, "M", "ئم"), + (0xFCE0, "M", "ئه"), + (0xFCE1, "M", "بم"), + (0xFCE2, "M", "به"), + (0xFCE3, "M", "تم"), + (0xFCE4, "M", "ته"), + (0xFCE5, "M", "ثم"), + (0xFCE6, "M", "ثه"), + (0xFCE7, "M", "سم"), + (0xFCE8, "M", "سه"), + (0xFCE9, "M", "شم"), + (0xFCEA, "M", "شه"), + (0xFCEB, "M", "كل"), + (0xFCEC, "M", "كم"), + (0xFCED, "M", "لم"), + (0xFCEE, "M", "نم"), + (0xFCEF, "M", "نه"), + (0xFCF0, "M", "يم"), + (0xFCF1, "M", "يه"), + (0xFCF2, "M", "ـَّ"), + (0xFCF3, "M", "ـُّ"), + (0xFCF4, "M", "ـِّ"), + (0xFCF5, "M", "طى"), + (0xFCF6, "M", "طي"), + (0xFCF7, "M", "عى"), + (0xFCF8, "M", "عي"), + (0xFCF9, "M", "غى"), + (0xFCFA, "M", "غي"), + (0xFCFB, "M", "سى"), + (0xFCFC, "M", "سي"), + (0xFCFD, "M", "شى"), + (0xFCFE, "M", "شي"), + (0xFCFF, "M", "حى"), + (0xFD00, "M", "حي"), + (0xFD01, "M", "جى"), + (0xFD02, "M", "جي"), + (0xFD03, "M", "خى"), + (0xFD04, "M", "خي"), + (0xFD05, "M", "صى"), + (0xFD06, "M", "صي"), + (0xFD07, "M", "ضى"), + (0xFD08, "M", "ضي"), + (0xFD09, "M", "شج"), + (0xFD0A, "M", "شح"), + (0xFD0B, "M", "شخ"), + (0xFD0C, "M", "شم"), + (0xFD0D, "M", "شر"), + (0xFD0E, "M", "سر"), + (0xFD0F, "M", "صر"), + (0xFD10, "M", "ضر"), + (0xFD11, "M", "طى"), + (0xFD12, "M", "طي"), + (0xFD13, "M", "عى"), + (0xFD14, "M", "عي"), + (0xFD15, "M", "غى"), + (0xFD16, "M", "غي"), + (0xFD17, "M", "سى"), + (0xFD18, "M", "سي"), + (0xFD19, "M", "شى"), + (0xFD1A, "M", "شي"), + (0xFD1B, "M", "حى"), + (0xFD1C, "M", "حي"), + (0xFD1D, "M", "جى"), + (0xFD1E, "M", "جي"), + (0xFD1F, "M", "خى"), + (0xFD20, "M", "خي"), + (0xFD21, "M", "صى"), + (0xFD22, "M", "صي"), + ] + + +def _seg_48() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFD23, "M", "ضى"), + (0xFD24, "M", "ضي"), + (0xFD25, "M", "شج"), + (0xFD26, "M", "شح"), + (0xFD27, "M", "شخ"), + (0xFD28, "M", "شم"), + (0xFD29, "M", "شر"), + (0xFD2A, "M", "سر"), + (0xFD2B, "M", "صر"), + (0xFD2C, "M", "ضر"), + (0xFD2D, "M", "شج"), + (0xFD2E, "M", "شح"), + (0xFD2F, "M", "شخ"), + (0xFD30, "M", "شم"), + (0xFD31, "M", "سه"), + (0xFD32, "M", "شه"), + (0xFD33, "M", "طم"), + (0xFD34, "M", "سج"), + (0xFD35, "M", "سح"), + (0xFD36, "M", "سخ"), + (0xFD37, "M", "شج"), + (0xFD38, "M", "شح"), + (0xFD39, "M", "شخ"), + (0xFD3A, "M", "طم"), + (0xFD3B, "M", "ظم"), + (0xFD3C, "M", "اً"), + (0xFD3E, "V"), + (0xFD50, "M", "تجم"), + (0xFD51, "M", "تحج"), + (0xFD53, "M", "تحم"), + (0xFD54, "M", "تخم"), + (0xFD55, "M", "تمج"), + (0xFD56, "M", "تمح"), + (0xFD57, "M", "تمخ"), + (0xFD58, "M", "جمح"), + (0xFD5A, "M", "حمي"), + (0xFD5B, "M", "حمى"), + (0xFD5C, "M", "سحج"), + (0xFD5D, "M", "سجح"), + (0xFD5E, "M", "سجى"), + (0xFD5F, "M", "سمح"), + (0xFD61, "M", "سمج"), + (0xFD62, "M", "سمم"), + (0xFD64, "M", "صحح"), + (0xFD66, "M", "صمم"), + (0xFD67, "M", "شحم"), + (0xFD69, "M", "شجي"), + (0xFD6A, "M", "شمخ"), + (0xFD6C, "M", "شمم"), + (0xFD6E, "M", "ضحى"), + (0xFD6F, "M", "ضخم"), + (0xFD71, "M", "طمح"), + (0xFD73, "M", "طمم"), + (0xFD74, "M", "طمي"), + (0xFD75, "M", "عجم"), + (0xFD76, "M", "عمم"), + (0xFD78, "M", "عمى"), + (0xFD79, "M", "غمم"), + (0xFD7A, "M", "غمي"), + (0xFD7B, "M", "غمى"), + (0xFD7C, "M", "فخم"), + (0xFD7E, "M", "قمح"), + (0xFD7F, "M", "قمم"), + (0xFD80, "M", "لحم"), + (0xFD81, "M", "لحي"), + (0xFD82, "M", "لحى"), + (0xFD83, "M", "لجج"), + (0xFD85, "M", "لخم"), + (0xFD87, "M", "لمح"), + (0xFD89, "M", "محج"), + (0xFD8A, "M", "محم"), + (0xFD8B, "M", "محي"), + (0xFD8C, "M", "مجح"), + (0xFD8D, "M", "مجم"), + (0xFD8E, "M", "مخج"), + (0xFD8F, "M", "مخم"), + (0xFD90, "X"), + (0xFD92, "M", "مجخ"), + (0xFD93, "M", "همج"), + (0xFD94, "M", "همم"), + (0xFD95, "M", "نحم"), + (0xFD96, "M", "نحى"), + (0xFD97, "M", "نجم"), + (0xFD99, "M", "نجى"), + (0xFD9A, "M", "نمي"), + (0xFD9B, "M", "نمى"), + (0xFD9C, "M", "يمم"), + (0xFD9E, "M", "بخي"), + (0xFD9F, "M", "تجي"), + (0xFDA0, "M", "تجى"), + (0xFDA1, "M", "تخي"), + (0xFDA2, "M", "تخى"), + (0xFDA3, "M", "تمي"), + (0xFDA4, "M", "تمى"), + (0xFDA5, "M", "جمي"), + (0xFDA6, "M", "جحى"), + (0xFDA7, "M", "جمى"), + (0xFDA8, "M", "سخى"), + (0xFDA9, "M", "صحي"), + (0xFDAA, "M", "شحي"), + ] + + +def _seg_49() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFDAB, "M", "ضحي"), + (0xFDAC, "M", "لجي"), + (0xFDAD, "M", "لمي"), + (0xFDAE, "M", "يحي"), + (0xFDAF, "M", "يجي"), + (0xFDB0, "M", "يمي"), + (0xFDB1, "M", "ممي"), + (0xFDB2, "M", "قمي"), + (0xFDB3, "M", "نحي"), + (0xFDB4, "M", "قمح"), + (0xFDB5, "M", "لحم"), + (0xFDB6, "M", "عمي"), + (0xFDB7, "M", "كمي"), + (0xFDB8, "M", "نجح"), + (0xFDB9, "M", "مخي"), + (0xFDBA, "M", "لجم"), + (0xFDBB, "M", "كمم"), + (0xFDBC, "M", "لجم"), + (0xFDBD, "M", "نجح"), + (0xFDBE, "M", "جحي"), + (0xFDBF, "M", "حجي"), + (0xFDC0, "M", "مجي"), + (0xFDC1, "M", "فمي"), + (0xFDC2, "M", "بحي"), + (0xFDC3, "M", "كمم"), + (0xFDC4, "M", "عجم"), + (0xFDC5, "M", "صمم"), + (0xFDC6, "M", "سخي"), + (0xFDC7, "M", "نجي"), + (0xFDC8, "X"), + (0xFDCF, "V"), + (0xFDD0, "X"), + (0xFDF0, "M", "صلے"), + (0xFDF1, "M", "قلے"), + (0xFDF2, "M", "الله"), + (0xFDF3, "M", "اكبر"), + (0xFDF4, "M", "محمد"), + (0xFDF5, "M", "صلعم"), + (0xFDF6, "M", "رسول"), + (0xFDF7, "M", "عليه"), + (0xFDF8, "M", "وسلم"), + (0xFDF9, "M", "صلى"), + (0xFDFA, "3", "صلى الله عليه وسلم"), + (0xFDFB, "3", "جل جلاله"), + (0xFDFC, "M", "ریال"), + (0xFDFD, "V"), + (0xFE00, "I"), + (0xFE10, "3", ","), + (0xFE11, "M", "、"), + (0xFE12, "X"), + (0xFE13, "3", ":"), + (0xFE14, "3", ";"), + (0xFE15, "3", "!"), + (0xFE16, "3", "?"), + (0xFE17, "M", "〖"), + (0xFE18, "M", "〗"), + (0xFE19, "X"), + (0xFE20, "V"), + (0xFE30, "X"), + (0xFE31, "M", "—"), + (0xFE32, "M", "–"), + (0xFE33, "3", "_"), + (0xFE35, "3", "("), + (0xFE36, "3", ")"), + (0xFE37, "3", "{"), + (0xFE38, "3", "}"), + (0xFE39, "M", "〔"), + (0xFE3A, "M", "〕"), + (0xFE3B, "M", "【"), + (0xFE3C, "M", "】"), + (0xFE3D, "M", "《"), + (0xFE3E, "M", "》"), + (0xFE3F, "M", "〈"), + (0xFE40, "M", "〉"), + (0xFE41, "M", "「"), + (0xFE42, "M", "」"), + (0xFE43, "M", "『"), + (0xFE44, "M", "』"), + (0xFE45, "V"), + (0xFE47, "3", "["), + (0xFE48, "3", "]"), + (0xFE49, "3", " ̅"), + (0xFE4D, "3", "_"), + (0xFE50, "3", ","), + (0xFE51, "M", "、"), + (0xFE52, "X"), + (0xFE54, "3", ";"), + (0xFE55, "3", ":"), + (0xFE56, "3", "?"), + (0xFE57, "3", "!"), + (0xFE58, "M", "—"), + (0xFE59, "3", "("), + (0xFE5A, "3", ")"), + (0xFE5B, "3", "{"), + (0xFE5C, "3", "}"), + (0xFE5D, "M", "〔"), + (0xFE5E, "M", "〕"), + (0xFE5F, "3", "#"), + (0xFE60, "3", "&"), + (0xFE61, "3", "*"), + ] + + +def _seg_50() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFE62, "3", "+"), + (0xFE63, "M", "-"), + (0xFE64, "3", "<"), + (0xFE65, "3", ">"), + (0xFE66, "3", "="), + (0xFE67, "X"), + (0xFE68, "3", "\\"), + (0xFE69, "3", "$"), + (0xFE6A, "3", "%"), + (0xFE6B, "3", "@"), + (0xFE6C, "X"), + (0xFE70, "3", " ً"), + (0xFE71, "M", "ـً"), + (0xFE72, "3", " ٌ"), + (0xFE73, "V"), + (0xFE74, "3", " ٍ"), + (0xFE75, "X"), + (0xFE76, "3", " َ"), + (0xFE77, "M", "ـَ"), + (0xFE78, "3", " ُ"), + (0xFE79, "M", "ـُ"), + (0xFE7A, "3", " ِ"), + (0xFE7B, "M", "ـِ"), + (0xFE7C, "3", " ّ"), + (0xFE7D, "M", "ـّ"), + (0xFE7E, "3", " ْ"), + (0xFE7F, "M", "ـْ"), + (0xFE80, "M", "ء"), + (0xFE81, "M", "آ"), + (0xFE83, "M", "أ"), + (0xFE85, "M", "ؤ"), + (0xFE87, "M", "إ"), + (0xFE89, "M", "ئ"), + (0xFE8D, "M", "ا"), + (0xFE8F, "M", "ب"), + (0xFE93, "M", "ة"), + (0xFE95, "M", "ت"), + (0xFE99, "M", "ث"), + (0xFE9D, "M", "ج"), + (0xFEA1, "M", "ح"), + (0xFEA5, "M", "خ"), + (0xFEA9, "M", "د"), + (0xFEAB, "M", "ذ"), + (0xFEAD, "M", "ر"), + (0xFEAF, "M", "ز"), + (0xFEB1, "M", "س"), + (0xFEB5, "M", "ش"), + (0xFEB9, "M", "ص"), + (0xFEBD, "M", "ض"), + (0xFEC1, "M", "ط"), + (0xFEC5, "M", "ظ"), + (0xFEC9, "M", "ع"), + (0xFECD, "M", "غ"), + (0xFED1, "M", "ف"), + (0xFED5, "M", "ق"), + (0xFED9, "M", "ك"), + (0xFEDD, "M", "ل"), + (0xFEE1, "M", "م"), + (0xFEE5, "M", "ن"), + (0xFEE9, "M", "ه"), + (0xFEED, "M", "و"), + (0xFEEF, "M", "ى"), + (0xFEF1, "M", "ي"), + (0xFEF5, "M", "لآ"), + (0xFEF7, "M", "لأ"), + (0xFEF9, "M", "لإ"), + (0xFEFB, "M", "لا"), + (0xFEFD, "X"), + (0xFEFF, "I"), + (0xFF00, "X"), + (0xFF01, "3", "!"), + (0xFF02, "3", '"'), + (0xFF03, "3", "#"), + (0xFF04, "3", "$"), + (0xFF05, "3", "%"), + (0xFF06, "3", "&"), + (0xFF07, "3", "'"), + (0xFF08, "3", "("), + (0xFF09, "3", ")"), + (0xFF0A, "3", "*"), + (0xFF0B, "3", "+"), + (0xFF0C, "3", ","), + (0xFF0D, "M", "-"), + (0xFF0E, "M", "."), + (0xFF0F, "3", "/"), + (0xFF10, "M", "0"), + (0xFF11, "M", "1"), + (0xFF12, "M", "2"), + (0xFF13, "M", "3"), + (0xFF14, "M", "4"), + (0xFF15, "M", "5"), + (0xFF16, "M", "6"), + (0xFF17, "M", "7"), + (0xFF18, "M", "8"), + (0xFF19, "M", "9"), + (0xFF1A, "3", ":"), + (0xFF1B, "3", ";"), + (0xFF1C, "3", "<"), + (0xFF1D, "3", "="), + (0xFF1E, "3", ">"), + ] + + +def _seg_51() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFF1F, "3", "?"), + (0xFF20, "3", "@"), + (0xFF21, "M", "a"), + (0xFF22, "M", "b"), + (0xFF23, "M", "c"), + (0xFF24, "M", "d"), + (0xFF25, "M", "e"), + (0xFF26, "M", "f"), + (0xFF27, "M", "g"), + (0xFF28, "M", "h"), + (0xFF29, "M", "i"), + (0xFF2A, "M", "j"), + (0xFF2B, "M", "k"), + (0xFF2C, "M", "l"), + (0xFF2D, "M", "m"), + (0xFF2E, "M", "n"), + (0xFF2F, "M", "o"), + (0xFF30, "M", "p"), + (0xFF31, "M", "q"), + (0xFF32, "M", "r"), + (0xFF33, "M", "s"), + (0xFF34, "M", "t"), + (0xFF35, "M", "u"), + (0xFF36, "M", "v"), + (0xFF37, "M", "w"), + (0xFF38, "M", "x"), + (0xFF39, "M", "y"), + (0xFF3A, "M", "z"), + (0xFF3B, "3", "["), + (0xFF3C, "3", "\\"), + (0xFF3D, "3", "]"), + (0xFF3E, "3", "^"), + (0xFF3F, "3", "_"), + (0xFF40, "3", "`"), + (0xFF41, "M", "a"), + (0xFF42, "M", "b"), + (0xFF43, "M", "c"), + (0xFF44, "M", "d"), + (0xFF45, "M", "e"), + (0xFF46, "M", "f"), + (0xFF47, "M", "g"), + (0xFF48, "M", "h"), + (0xFF49, "M", "i"), + (0xFF4A, "M", "j"), + (0xFF4B, "M", "k"), + (0xFF4C, "M", "l"), + (0xFF4D, "M", "m"), + (0xFF4E, "M", "n"), + (0xFF4F, "M", "o"), + (0xFF50, "M", "p"), + (0xFF51, "M", "q"), + (0xFF52, "M", "r"), + (0xFF53, "M", "s"), + (0xFF54, "M", "t"), + (0xFF55, "M", "u"), + (0xFF56, "M", "v"), + (0xFF57, "M", "w"), + (0xFF58, "M", "x"), + (0xFF59, "M", "y"), + (0xFF5A, "M", "z"), + (0xFF5B, "3", "{"), + (0xFF5C, "3", "|"), + (0xFF5D, "3", "}"), + (0xFF5E, "3", "~"), + (0xFF5F, "M", "⦅"), + (0xFF60, "M", "⦆"), + (0xFF61, "M", "."), + (0xFF62, "M", "「"), + (0xFF63, "M", "」"), + (0xFF64, "M", "、"), + (0xFF65, "M", "・"), + (0xFF66, "M", "ヲ"), + (0xFF67, "M", "ァ"), + (0xFF68, "M", "ィ"), + (0xFF69, "M", "ゥ"), + (0xFF6A, "M", "ェ"), + (0xFF6B, "M", "ォ"), + (0xFF6C, "M", "ャ"), + (0xFF6D, "M", "ュ"), + (0xFF6E, "M", "ョ"), + (0xFF6F, "M", "ッ"), + (0xFF70, "M", "ー"), + (0xFF71, "M", "ア"), + (0xFF72, "M", "イ"), + (0xFF73, "M", "ウ"), + (0xFF74, "M", "エ"), + (0xFF75, "M", "オ"), + (0xFF76, "M", "カ"), + (0xFF77, "M", "キ"), + (0xFF78, "M", "ク"), + (0xFF79, "M", "ケ"), + (0xFF7A, "M", "コ"), + (0xFF7B, "M", "サ"), + (0xFF7C, "M", "シ"), + (0xFF7D, "M", "ス"), + (0xFF7E, "M", "セ"), + (0xFF7F, "M", "ソ"), + (0xFF80, "M", "タ"), + (0xFF81, "M", "チ"), + (0xFF82, "M", "ツ"), + ] + + +def _seg_52() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFF83, "M", "テ"), + (0xFF84, "M", "ト"), + (0xFF85, "M", "ナ"), + (0xFF86, "M", "ニ"), + (0xFF87, "M", "ヌ"), + (0xFF88, "M", "ネ"), + (0xFF89, "M", "ノ"), + (0xFF8A, "M", "ハ"), + (0xFF8B, "M", "ヒ"), + (0xFF8C, "M", "フ"), + (0xFF8D, "M", "ヘ"), + (0xFF8E, "M", "ホ"), + (0xFF8F, "M", "マ"), + (0xFF90, "M", "ミ"), + (0xFF91, "M", "ム"), + (0xFF92, "M", "メ"), + (0xFF93, "M", "モ"), + (0xFF94, "M", "ヤ"), + (0xFF95, "M", "ユ"), + (0xFF96, "M", "ヨ"), + (0xFF97, "M", "ラ"), + (0xFF98, "M", "リ"), + (0xFF99, "M", "ル"), + (0xFF9A, "M", "レ"), + (0xFF9B, "M", "ロ"), + (0xFF9C, "M", "ワ"), + (0xFF9D, "M", "ン"), + (0xFF9E, "M", "゙"), + (0xFF9F, "M", "゚"), + (0xFFA0, "X"), + (0xFFA1, "M", "ᄀ"), + (0xFFA2, "M", "ᄁ"), + (0xFFA3, "M", "ᆪ"), + (0xFFA4, "M", "ᄂ"), + (0xFFA5, "M", "ᆬ"), + (0xFFA6, "M", "ᆭ"), + (0xFFA7, "M", "ᄃ"), + (0xFFA8, "M", "ᄄ"), + (0xFFA9, "M", "ᄅ"), + (0xFFAA, "M", "ᆰ"), + (0xFFAB, "M", "ᆱ"), + (0xFFAC, "M", "ᆲ"), + (0xFFAD, "M", "ᆳ"), + (0xFFAE, "M", "ᆴ"), + (0xFFAF, "M", "ᆵ"), + (0xFFB0, "M", "ᄚ"), + (0xFFB1, "M", "ᄆ"), + (0xFFB2, "M", "ᄇ"), + (0xFFB3, "M", "ᄈ"), + (0xFFB4, "M", "ᄡ"), + (0xFFB5, "M", "ᄉ"), + (0xFFB6, "M", "ᄊ"), + (0xFFB7, "M", "ᄋ"), + (0xFFB8, "M", "ᄌ"), + (0xFFB9, "M", "ᄍ"), + (0xFFBA, "M", "ᄎ"), + (0xFFBB, "M", "ᄏ"), + (0xFFBC, "M", "ᄐ"), + (0xFFBD, "M", "ᄑ"), + (0xFFBE, "M", "ᄒ"), + (0xFFBF, "X"), + (0xFFC2, "M", "ᅡ"), + (0xFFC3, "M", "ᅢ"), + (0xFFC4, "M", "ᅣ"), + (0xFFC5, "M", "ᅤ"), + (0xFFC6, "M", "ᅥ"), + (0xFFC7, "M", "ᅦ"), + (0xFFC8, "X"), + (0xFFCA, "M", "ᅧ"), + (0xFFCB, "M", "ᅨ"), + (0xFFCC, "M", "ᅩ"), + (0xFFCD, "M", "ᅪ"), + (0xFFCE, "M", "ᅫ"), + (0xFFCF, "M", "ᅬ"), + (0xFFD0, "X"), + (0xFFD2, "M", "ᅭ"), + (0xFFD3, "M", "ᅮ"), + (0xFFD4, "M", "ᅯ"), + (0xFFD5, "M", "ᅰ"), + (0xFFD6, "M", "ᅱ"), + (0xFFD7, "M", "ᅲ"), + (0xFFD8, "X"), + (0xFFDA, "M", "ᅳ"), + (0xFFDB, "M", "ᅴ"), + (0xFFDC, "M", "ᅵ"), + (0xFFDD, "X"), + (0xFFE0, "M", "¢"), + (0xFFE1, "M", "£"), + (0xFFE2, "M", "¬"), + (0xFFE3, "3", " ̄"), + (0xFFE4, "M", "¦"), + (0xFFE5, "M", "¥"), + (0xFFE6, "M", "₩"), + (0xFFE7, "X"), + (0xFFE8, "M", "│"), + (0xFFE9, "M", "←"), + (0xFFEA, "M", "↑"), + (0xFFEB, "M", "→"), + (0xFFEC, "M", "↓"), + (0xFFED, "M", "■"), + ] + + +def _seg_53() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0xFFEE, "M", "○"), + (0xFFEF, "X"), + (0x10000, "V"), + (0x1000C, "X"), + (0x1000D, "V"), + (0x10027, "X"), + (0x10028, "V"), + (0x1003B, "X"), + (0x1003C, "V"), + (0x1003E, "X"), + (0x1003F, "V"), + (0x1004E, "X"), + (0x10050, "V"), + (0x1005E, "X"), + (0x10080, "V"), + (0x100FB, "X"), + (0x10100, "V"), + (0x10103, "X"), + (0x10107, "V"), + (0x10134, "X"), + (0x10137, "V"), + (0x1018F, "X"), + (0x10190, "V"), + (0x1019D, "X"), + (0x101A0, "V"), + (0x101A1, "X"), + (0x101D0, "V"), + (0x101FE, "X"), + (0x10280, "V"), + (0x1029D, "X"), + (0x102A0, "V"), + (0x102D1, "X"), + (0x102E0, "V"), + (0x102FC, "X"), + (0x10300, "V"), + (0x10324, "X"), + (0x1032D, "V"), + (0x1034B, "X"), + (0x10350, "V"), + (0x1037B, "X"), + (0x10380, "V"), + (0x1039E, "X"), + (0x1039F, "V"), + (0x103C4, "X"), + (0x103C8, "V"), + (0x103D6, "X"), + (0x10400, "M", "𐐨"), + (0x10401, "M", "𐐩"), + (0x10402, "M", "𐐪"), + (0x10403, "M", "𐐫"), + (0x10404, "M", "𐐬"), + (0x10405, "M", "𐐭"), + (0x10406, "M", "𐐮"), + (0x10407, "M", "𐐯"), + (0x10408, "M", "𐐰"), + (0x10409, "M", "𐐱"), + (0x1040A, "M", "𐐲"), + (0x1040B, "M", "𐐳"), + (0x1040C, "M", "𐐴"), + (0x1040D, "M", "𐐵"), + (0x1040E, "M", "𐐶"), + (0x1040F, "M", "𐐷"), + (0x10410, "M", "𐐸"), + (0x10411, "M", "𐐹"), + (0x10412, "M", "𐐺"), + (0x10413, "M", "𐐻"), + (0x10414, "M", "𐐼"), + (0x10415, "M", "𐐽"), + (0x10416, "M", "𐐾"), + (0x10417, "M", "𐐿"), + (0x10418, "M", "𐑀"), + (0x10419, "M", "𐑁"), + (0x1041A, "M", "𐑂"), + (0x1041B, "M", "𐑃"), + (0x1041C, "M", "𐑄"), + (0x1041D, "M", "𐑅"), + (0x1041E, "M", "𐑆"), + (0x1041F, "M", "𐑇"), + (0x10420, "M", "𐑈"), + (0x10421, "M", "𐑉"), + (0x10422, "M", "𐑊"), + (0x10423, "M", "𐑋"), + (0x10424, "M", "𐑌"), + (0x10425, "M", "𐑍"), + (0x10426, "M", "𐑎"), + (0x10427, "M", "𐑏"), + (0x10428, "V"), + (0x1049E, "X"), + (0x104A0, "V"), + (0x104AA, "X"), + (0x104B0, "M", "𐓘"), + (0x104B1, "M", "𐓙"), + (0x104B2, "M", "𐓚"), + (0x104B3, "M", "𐓛"), + (0x104B4, "M", "𐓜"), + (0x104B5, "M", "𐓝"), + (0x104B6, "M", "𐓞"), + (0x104B7, "M", "𐓟"), + (0x104B8, "M", "𐓠"), + (0x104B9, "M", "𐓡"), + ] + + +def _seg_54() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x104BA, "M", "𐓢"), + (0x104BB, "M", "𐓣"), + (0x104BC, "M", "𐓤"), + (0x104BD, "M", "𐓥"), + (0x104BE, "M", "𐓦"), + (0x104BF, "M", "𐓧"), + (0x104C0, "M", "𐓨"), + (0x104C1, "M", "𐓩"), + (0x104C2, "M", "𐓪"), + (0x104C3, "M", "𐓫"), + (0x104C4, "M", "𐓬"), + (0x104C5, "M", "𐓭"), + (0x104C6, "M", "𐓮"), + (0x104C7, "M", "𐓯"), + (0x104C8, "M", "𐓰"), + (0x104C9, "M", "𐓱"), + (0x104CA, "M", "𐓲"), + (0x104CB, "M", "𐓳"), + (0x104CC, "M", "𐓴"), + (0x104CD, "M", "𐓵"), + (0x104CE, "M", "𐓶"), + (0x104CF, "M", "𐓷"), + (0x104D0, "M", "𐓸"), + (0x104D1, "M", "𐓹"), + (0x104D2, "M", "𐓺"), + (0x104D3, "M", "𐓻"), + (0x104D4, "X"), + (0x104D8, "V"), + (0x104FC, "X"), + (0x10500, "V"), + (0x10528, "X"), + (0x10530, "V"), + (0x10564, "X"), + (0x1056F, "V"), + (0x10570, "M", "𐖗"), + (0x10571, "M", "𐖘"), + (0x10572, "M", "𐖙"), + (0x10573, "M", "𐖚"), + (0x10574, "M", "𐖛"), + (0x10575, "M", "𐖜"), + (0x10576, "M", "𐖝"), + (0x10577, "M", "𐖞"), + (0x10578, "M", "𐖟"), + (0x10579, "M", "𐖠"), + (0x1057A, "M", "𐖡"), + (0x1057B, "X"), + (0x1057C, "M", "𐖣"), + (0x1057D, "M", "𐖤"), + (0x1057E, "M", "𐖥"), + (0x1057F, "M", "𐖦"), + (0x10580, "M", "𐖧"), + (0x10581, "M", "𐖨"), + (0x10582, "M", "𐖩"), + (0x10583, "M", "𐖪"), + (0x10584, "M", "𐖫"), + (0x10585, "M", "𐖬"), + (0x10586, "M", "𐖭"), + (0x10587, "M", "𐖮"), + (0x10588, "M", "𐖯"), + (0x10589, "M", "𐖰"), + (0x1058A, "M", "𐖱"), + (0x1058B, "X"), + (0x1058C, "M", "𐖳"), + (0x1058D, "M", "𐖴"), + (0x1058E, "M", "𐖵"), + (0x1058F, "M", "𐖶"), + (0x10590, "M", "𐖷"), + (0x10591, "M", "𐖸"), + (0x10592, "M", "𐖹"), + (0x10593, "X"), + (0x10594, "M", "𐖻"), + (0x10595, "M", "𐖼"), + (0x10596, "X"), + (0x10597, "V"), + (0x105A2, "X"), + (0x105A3, "V"), + (0x105B2, "X"), + (0x105B3, "V"), + (0x105BA, "X"), + (0x105BB, "V"), + (0x105BD, "X"), + (0x10600, "V"), + (0x10737, "X"), + (0x10740, "V"), + (0x10756, "X"), + (0x10760, "V"), + (0x10768, "X"), + (0x10780, "V"), + (0x10781, "M", "ː"), + (0x10782, "M", "ˑ"), + (0x10783, "M", "æ"), + (0x10784, "M", "ʙ"), + (0x10785, "M", "ɓ"), + (0x10786, "X"), + (0x10787, "M", "ʣ"), + (0x10788, "M", "ꭦ"), + (0x10789, "M", "ʥ"), + (0x1078A, "M", "ʤ"), + (0x1078B, "M", "ɖ"), + (0x1078C, "M", "ɗ"), + ] + + +def _seg_55() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1078D, "M", "ᶑ"), + (0x1078E, "M", "ɘ"), + (0x1078F, "M", "ɞ"), + (0x10790, "M", "ʩ"), + (0x10791, "M", "ɤ"), + (0x10792, "M", "ɢ"), + (0x10793, "M", "ɠ"), + (0x10794, "M", "ʛ"), + (0x10795, "M", "ħ"), + (0x10796, "M", "ʜ"), + (0x10797, "M", "ɧ"), + (0x10798, "M", "ʄ"), + (0x10799, "M", "ʪ"), + (0x1079A, "M", "ʫ"), + (0x1079B, "M", "ɬ"), + (0x1079C, "M", "𝼄"), + (0x1079D, "M", "ꞎ"), + (0x1079E, "M", "ɮ"), + (0x1079F, "M", "𝼅"), + (0x107A0, "M", "ʎ"), + (0x107A1, "M", "𝼆"), + (0x107A2, "M", "ø"), + (0x107A3, "M", "ɶ"), + (0x107A4, "M", "ɷ"), + (0x107A5, "M", "q"), + (0x107A6, "M", "ɺ"), + (0x107A7, "M", "𝼈"), + (0x107A8, "M", "ɽ"), + (0x107A9, "M", "ɾ"), + (0x107AA, "M", "ʀ"), + (0x107AB, "M", "ʨ"), + (0x107AC, "M", "ʦ"), + (0x107AD, "M", "ꭧ"), + (0x107AE, "M", "ʧ"), + (0x107AF, "M", "ʈ"), + (0x107B0, "M", "ⱱ"), + (0x107B1, "X"), + (0x107B2, "M", "ʏ"), + (0x107B3, "M", "ʡ"), + (0x107B4, "M", "ʢ"), + (0x107B5, "M", "ʘ"), + (0x107B6, "M", "ǀ"), + (0x107B7, "M", "ǁ"), + (0x107B8, "M", "ǂ"), + (0x107B9, "M", "𝼊"), + (0x107BA, "M", "𝼞"), + (0x107BB, "X"), + (0x10800, "V"), + (0x10806, "X"), + (0x10808, "V"), + (0x10809, "X"), + (0x1080A, "V"), + (0x10836, "X"), + (0x10837, "V"), + (0x10839, "X"), + (0x1083C, "V"), + (0x1083D, "X"), + (0x1083F, "V"), + (0x10856, "X"), + (0x10857, "V"), + (0x1089F, "X"), + (0x108A7, "V"), + (0x108B0, "X"), + (0x108E0, "V"), + (0x108F3, "X"), + (0x108F4, "V"), + (0x108F6, "X"), + (0x108FB, "V"), + (0x1091C, "X"), + (0x1091F, "V"), + (0x1093A, "X"), + (0x1093F, "V"), + (0x10940, "X"), + (0x10980, "V"), + (0x109B8, "X"), + (0x109BC, "V"), + (0x109D0, "X"), + (0x109D2, "V"), + (0x10A04, "X"), + (0x10A05, "V"), + (0x10A07, "X"), + (0x10A0C, "V"), + (0x10A14, "X"), + (0x10A15, "V"), + (0x10A18, "X"), + (0x10A19, "V"), + (0x10A36, "X"), + (0x10A38, "V"), + (0x10A3B, "X"), + (0x10A3F, "V"), + (0x10A49, "X"), + (0x10A50, "V"), + (0x10A59, "X"), + (0x10A60, "V"), + (0x10AA0, "X"), + (0x10AC0, "V"), + (0x10AE7, "X"), + (0x10AEB, "V"), + (0x10AF7, "X"), + (0x10B00, "V"), + ] + + +def _seg_56() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x10B36, "X"), + (0x10B39, "V"), + (0x10B56, "X"), + (0x10B58, "V"), + (0x10B73, "X"), + (0x10B78, "V"), + (0x10B92, "X"), + (0x10B99, "V"), + (0x10B9D, "X"), + (0x10BA9, "V"), + (0x10BB0, "X"), + (0x10C00, "V"), + (0x10C49, "X"), + (0x10C80, "M", "𐳀"), + (0x10C81, "M", "𐳁"), + (0x10C82, "M", "𐳂"), + (0x10C83, "M", "𐳃"), + (0x10C84, "M", "𐳄"), + (0x10C85, "M", "𐳅"), + (0x10C86, "M", "𐳆"), + (0x10C87, "M", "𐳇"), + (0x10C88, "M", "𐳈"), + (0x10C89, "M", "𐳉"), + (0x10C8A, "M", "𐳊"), + (0x10C8B, "M", "𐳋"), + (0x10C8C, "M", "𐳌"), + (0x10C8D, "M", "𐳍"), + (0x10C8E, "M", "𐳎"), + (0x10C8F, "M", "𐳏"), + (0x10C90, "M", "𐳐"), + (0x10C91, "M", "𐳑"), + (0x10C92, "M", "𐳒"), + (0x10C93, "M", "𐳓"), + (0x10C94, "M", "𐳔"), + (0x10C95, "M", "𐳕"), + (0x10C96, "M", "𐳖"), + (0x10C97, "M", "𐳗"), + (0x10C98, "M", "𐳘"), + (0x10C99, "M", "𐳙"), + (0x10C9A, "M", "𐳚"), + (0x10C9B, "M", "𐳛"), + (0x10C9C, "M", "𐳜"), + (0x10C9D, "M", "𐳝"), + (0x10C9E, "M", "𐳞"), + (0x10C9F, "M", "𐳟"), + (0x10CA0, "M", "𐳠"), + (0x10CA1, "M", "𐳡"), + (0x10CA2, "M", "𐳢"), + (0x10CA3, "M", "𐳣"), + (0x10CA4, "M", "𐳤"), + (0x10CA5, "M", "𐳥"), + (0x10CA6, "M", "𐳦"), + (0x10CA7, "M", "𐳧"), + (0x10CA8, "M", "𐳨"), + (0x10CA9, "M", "𐳩"), + (0x10CAA, "M", "𐳪"), + (0x10CAB, "M", "𐳫"), + (0x10CAC, "M", "𐳬"), + (0x10CAD, "M", "𐳭"), + (0x10CAE, "M", "𐳮"), + (0x10CAF, "M", "𐳯"), + (0x10CB0, "M", "𐳰"), + (0x10CB1, "M", "𐳱"), + (0x10CB2, "M", "𐳲"), + (0x10CB3, "X"), + (0x10CC0, "V"), + (0x10CF3, "X"), + (0x10CFA, "V"), + (0x10D28, "X"), + (0x10D30, "V"), + (0x10D3A, "X"), + (0x10E60, "V"), + (0x10E7F, "X"), + (0x10E80, "V"), + (0x10EAA, "X"), + (0x10EAB, "V"), + (0x10EAE, "X"), + (0x10EB0, "V"), + (0x10EB2, "X"), + (0x10EFD, "V"), + (0x10F28, "X"), + (0x10F30, "V"), + (0x10F5A, "X"), + (0x10F70, "V"), + (0x10F8A, "X"), + (0x10FB0, "V"), + (0x10FCC, "X"), + (0x10FE0, "V"), + (0x10FF7, "X"), + (0x11000, "V"), + (0x1104E, "X"), + (0x11052, "V"), + (0x11076, "X"), + (0x1107F, "V"), + (0x110BD, "X"), + (0x110BE, "V"), + (0x110C3, "X"), + (0x110D0, "V"), + (0x110E9, "X"), + (0x110F0, "V"), + ] + + +def _seg_57() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x110FA, "X"), + (0x11100, "V"), + (0x11135, "X"), + (0x11136, "V"), + (0x11148, "X"), + (0x11150, "V"), + (0x11177, "X"), + (0x11180, "V"), + (0x111E0, "X"), + (0x111E1, "V"), + (0x111F5, "X"), + (0x11200, "V"), + (0x11212, "X"), + (0x11213, "V"), + (0x11242, "X"), + (0x11280, "V"), + (0x11287, "X"), + (0x11288, "V"), + (0x11289, "X"), + (0x1128A, "V"), + (0x1128E, "X"), + (0x1128F, "V"), + (0x1129E, "X"), + (0x1129F, "V"), + (0x112AA, "X"), + (0x112B0, "V"), + (0x112EB, "X"), + (0x112F0, "V"), + (0x112FA, "X"), + (0x11300, "V"), + (0x11304, "X"), + (0x11305, "V"), + (0x1130D, "X"), + (0x1130F, "V"), + (0x11311, "X"), + (0x11313, "V"), + (0x11329, "X"), + (0x1132A, "V"), + (0x11331, "X"), + (0x11332, "V"), + (0x11334, "X"), + (0x11335, "V"), + (0x1133A, "X"), + (0x1133B, "V"), + (0x11345, "X"), + (0x11347, "V"), + (0x11349, "X"), + (0x1134B, "V"), + (0x1134E, "X"), + (0x11350, "V"), + (0x11351, "X"), + (0x11357, "V"), + (0x11358, "X"), + (0x1135D, "V"), + (0x11364, "X"), + (0x11366, "V"), + (0x1136D, "X"), + (0x11370, "V"), + (0x11375, "X"), + (0x11400, "V"), + (0x1145C, "X"), + (0x1145D, "V"), + (0x11462, "X"), + (0x11480, "V"), + (0x114C8, "X"), + (0x114D0, "V"), + (0x114DA, "X"), + (0x11580, "V"), + (0x115B6, "X"), + (0x115B8, "V"), + (0x115DE, "X"), + (0x11600, "V"), + (0x11645, "X"), + (0x11650, "V"), + (0x1165A, "X"), + (0x11660, "V"), + (0x1166D, "X"), + (0x11680, "V"), + (0x116BA, "X"), + (0x116C0, "V"), + (0x116CA, "X"), + (0x11700, "V"), + (0x1171B, "X"), + (0x1171D, "V"), + (0x1172C, "X"), + (0x11730, "V"), + (0x11747, "X"), + (0x11800, "V"), + (0x1183C, "X"), + (0x118A0, "M", "𑣀"), + (0x118A1, "M", "𑣁"), + (0x118A2, "M", "𑣂"), + (0x118A3, "M", "𑣃"), + (0x118A4, "M", "𑣄"), + (0x118A5, "M", "𑣅"), + (0x118A6, "M", "𑣆"), + (0x118A7, "M", "𑣇"), + (0x118A8, "M", "𑣈"), + (0x118A9, "M", "𑣉"), + (0x118AA, "M", "𑣊"), + ] + + +def _seg_58() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x118AB, "M", "𑣋"), + (0x118AC, "M", "𑣌"), + (0x118AD, "M", "𑣍"), + (0x118AE, "M", "𑣎"), + (0x118AF, "M", "𑣏"), + (0x118B0, "M", "𑣐"), + (0x118B1, "M", "𑣑"), + (0x118B2, "M", "𑣒"), + (0x118B3, "M", "𑣓"), + (0x118B4, "M", "𑣔"), + (0x118B5, "M", "𑣕"), + (0x118B6, "M", "𑣖"), + (0x118B7, "M", "𑣗"), + (0x118B8, "M", "𑣘"), + (0x118B9, "M", "𑣙"), + (0x118BA, "M", "𑣚"), + (0x118BB, "M", "𑣛"), + (0x118BC, "M", "𑣜"), + (0x118BD, "M", "𑣝"), + (0x118BE, "M", "𑣞"), + (0x118BF, "M", "𑣟"), + (0x118C0, "V"), + (0x118F3, "X"), + (0x118FF, "V"), + (0x11907, "X"), + (0x11909, "V"), + (0x1190A, "X"), + (0x1190C, "V"), + (0x11914, "X"), + (0x11915, "V"), + (0x11917, "X"), + (0x11918, "V"), + (0x11936, "X"), + (0x11937, "V"), + (0x11939, "X"), + (0x1193B, "V"), + (0x11947, "X"), + (0x11950, "V"), + (0x1195A, "X"), + (0x119A0, "V"), + (0x119A8, "X"), + (0x119AA, "V"), + (0x119D8, "X"), + (0x119DA, "V"), + (0x119E5, "X"), + (0x11A00, "V"), + (0x11A48, "X"), + (0x11A50, "V"), + (0x11AA3, "X"), + (0x11AB0, "V"), + (0x11AF9, "X"), + (0x11B00, "V"), + (0x11B0A, "X"), + (0x11C00, "V"), + (0x11C09, "X"), + (0x11C0A, "V"), + (0x11C37, "X"), + (0x11C38, "V"), + (0x11C46, "X"), + (0x11C50, "V"), + (0x11C6D, "X"), + (0x11C70, "V"), + (0x11C90, "X"), + (0x11C92, "V"), + (0x11CA8, "X"), + (0x11CA9, "V"), + (0x11CB7, "X"), + (0x11D00, "V"), + (0x11D07, "X"), + (0x11D08, "V"), + (0x11D0A, "X"), + (0x11D0B, "V"), + (0x11D37, "X"), + (0x11D3A, "V"), + (0x11D3B, "X"), + (0x11D3C, "V"), + (0x11D3E, "X"), + (0x11D3F, "V"), + (0x11D48, "X"), + (0x11D50, "V"), + (0x11D5A, "X"), + (0x11D60, "V"), + (0x11D66, "X"), + (0x11D67, "V"), + (0x11D69, "X"), + (0x11D6A, "V"), + (0x11D8F, "X"), + (0x11D90, "V"), + (0x11D92, "X"), + (0x11D93, "V"), + (0x11D99, "X"), + (0x11DA0, "V"), + (0x11DAA, "X"), + (0x11EE0, "V"), + (0x11EF9, "X"), + (0x11F00, "V"), + (0x11F11, "X"), + (0x11F12, "V"), + (0x11F3B, "X"), + (0x11F3E, "V"), + ] + + +def _seg_59() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x11F5A, "X"), + (0x11FB0, "V"), + (0x11FB1, "X"), + (0x11FC0, "V"), + (0x11FF2, "X"), + (0x11FFF, "V"), + (0x1239A, "X"), + (0x12400, "V"), + (0x1246F, "X"), + (0x12470, "V"), + (0x12475, "X"), + (0x12480, "V"), + (0x12544, "X"), + (0x12F90, "V"), + (0x12FF3, "X"), + (0x13000, "V"), + (0x13430, "X"), + (0x13440, "V"), + (0x13456, "X"), + (0x14400, "V"), + (0x14647, "X"), + (0x16800, "V"), + (0x16A39, "X"), + (0x16A40, "V"), + (0x16A5F, "X"), + (0x16A60, "V"), + (0x16A6A, "X"), + (0x16A6E, "V"), + (0x16ABF, "X"), + (0x16AC0, "V"), + (0x16ACA, "X"), + (0x16AD0, "V"), + (0x16AEE, "X"), + (0x16AF0, "V"), + (0x16AF6, "X"), + (0x16B00, "V"), + (0x16B46, "X"), + (0x16B50, "V"), + (0x16B5A, "X"), + (0x16B5B, "V"), + (0x16B62, "X"), + (0x16B63, "V"), + (0x16B78, "X"), + (0x16B7D, "V"), + (0x16B90, "X"), + (0x16E40, "M", "𖹠"), + (0x16E41, "M", "𖹡"), + (0x16E42, "M", "𖹢"), + (0x16E43, "M", "𖹣"), + (0x16E44, "M", "𖹤"), + (0x16E45, "M", "𖹥"), + (0x16E46, "M", "𖹦"), + (0x16E47, "M", "𖹧"), + (0x16E48, "M", "𖹨"), + (0x16E49, "M", "𖹩"), + (0x16E4A, "M", "𖹪"), + (0x16E4B, "M", "𖹫"), + (0x16E4C, "M", "𖹬"), + (0x16E4D, "M", "𖹭"), + (0x16E4E, "M", "𖹮"), + (0x16E4F, "M", "𖹯"), + (0x16E50, "M", "𖹰"), + (0x16E51, "M", "𖹱"), + (0x16E52, "M", "𖹲"), + (0x16E53, "M", "𖹳"), + (0x16E54, "M", "𖹴"), + (0x16E55, "M", "𖹵"), + (0x16E56, "M", "𖹶"), + (0x16E57, "M", "𖹷"), + (0x16E58, "M", "𖹸"), + (0x16E59, "M", "𖹹"), + (0x16E5A, "M", "𖹺"), + (0x16E5B, "M", "𖹻"), + (0x16E5C, "M", "𖹼"), + (0x16E5D, "M", "𖹽"), + (0x16E5E, "M", "𖹾"), + (0x16E5F, "M", "𖹿"), + (0x16E60, "V"), + (0x16E9B, "X"), + (0x16F00, "V"), + (0x16F4B, "X"), + (0x16F4F, "V"), + (0x16F88, "X"), + (0x16F8F, "V"), + (0x16FA0, "X"), + (0x16FE0, "V"), + (0x16FE5, "X"), + (0x16FF0, "V"), + (0x16FF2, "X"), + (0x17000, "V"), + (0x187F8, "X"), + (0x18800, "V"), + (0x18CD6, "X"), + (0x18D00, "V"), + (0x18D09, "X"), + (0x1AFF0, "V"), + (0x1AFF4, "X"), + (0x1AFF5, "V"), + (0x1AFFC, "X"), + (0x1AFFD, "V"), + ] + + +def _seg_60() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1AFFF, "X"), + (0x1B000, "V"), + (0x1B123, "X"), + (0x1B132, "V"), + (0x1B133, "X"), + (0x1B150, "V"), + (0x1B153, "X"), + (0x1B155, "V"), + (0x1B156, "X"), + (0x1B164, "V"), + (0x1B168, "X"), + (0x1B170, "V"), + (0x1B2FC, "X"), + (0x1BC00, "V"), + (0x1BC6B, "X"), + (0x1BC70, "V"), + (0x1BC7D, "X"), + (0x1BC80, "V"), + (0x1BC89, "X"), + (0x1BC90, "V"), + (0x1BC9A, "X"), + (0x1BC9C, "V"), + (0x1BCA0, "I"), + (0x1BCA4, "X"), + (0x1CF00, "V"), + (0x1CF2E, "X"), + (0x1CF30, "V"), + (0x1CF47, "X"), + (0x1CF50, "V"), + (0x1CFC4, "X"), + (0x1D000, "V"), + (0x1D0F6, "X"), + (0x1D100, "V"), + (0x1D127, "X"), + (0x1D129, "V"), + (0x1D15E, "M", "𝅗𝅥"), + (0x1D15F, "M", "𝅘𝅥"), + (0x1D160, "M", "𝅘𝅥𝅮"), + (0x1D161, "M", "𝅘𝅥𝅯"), + (0x1D162, "M", "𝅘𝅥𝅰"), + (0x1D163, "M", "𝅘𝅥𝅱"), + (0x1D164, "M", "𝅘𝅥𝅲"), + (0x1D165, "V"), + (0x1D173, "X"), + (0x1D17B, "V"), + (0x1D1BB, "M", "𝆹𝅥"), + (0x1D1BC, "M", "𝆺𝅥"), + (0x1D1BD, "M", "𝆹𝅥𝅮"), + (0x1D1BE, "M", "𝆺𝅥𝅮"), + (0x1D1BF, "M", "𝆹𝅥𝅯"), + (0x1D1C0, "M", "𝆺𝅥𝅯"), + (0x1D1C1, "V"), + (0x1D1EB, "X"), + (0x1D200, "V"), + (0x1D246, "X"), + (0x1D2C0, "V"), + (0x1D2D4, "X"), + (0x1D2E0, "V"), + (0x1D2F4, "X"), + (0x1D300, "V"), + (0x1D357, "X"), + (0x1D360, "V"), + (0x1D379, "X"), + (0x1D400, "M", "a"), + (0x1D401, "M", "b"), + (0x1D402, "M", "c"), + (0x1D403, "M", "d"), + (0x1D404, "M", "e"), + (0x1D405, "M", "f"), + (0x1D406, "M", "g"), + (0x1D407, "M", "h"), + (0x1D408, "M", "i"), + (0x1D409, "M", "j"), + (0x1D40A, "M", "k"), + (0x1D40B, "M", "l"), + (0x1D40C, "M", "m"), + (0x1D40D, "M", "n"), + (0x1D40E, "M", "o"), + (0x1D40F, "M", "p"), + (0x1D410, "M", "q"), + (0x1D411, "M", "r"), + (0x1D412, "M", "s"), + (0x1D413, "M", "t"), + (0x1D414, "M", "u"), + (0x1D415, "M", "v"), + (0x1D416, "M", "w"), + (0x1D417, "M", "x"), + (0x1D418, "M", "y"), + (0x1D419, "M", "z"), + (0x1D41A, "M", "a"), + (0x1D41B, "M", "b"), + (0x1D41C, "M", "c"), + (0x1D41D, "M", "d"), + (0x1D41E, "M", "e"), + (0x1D41F, "M", "f"), + (0x1D420, "M", "g"), + (0x1D421, "M", "h"), + (0x1D422, "M", "i"), + (0x1D423, "M", "j"), + (0x1D424, "M", "k"), + ] + + +def _seg_61() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D425, "M", "l"), + (0x1D426, "M", "m"), + (0x1D427, "M", "n"), + (0x1D428, "M", "o"), + (0x1D429, "M", "p"), + (0x1D42A, "M", "q"), + (0x1D42B, "M", "r"), + (0x1D42C, "M", "s"), + (0x1D42D, "M", "t"), + (0x1D42E, "M", "u"), + (0x1D42F, "M", "v"), + (0x1D430, "M", "w"), + (0x1D431, "M", "x"), + (0x1D432, "M", "y"), + (0x1D433, "M", "z"), + (0x1D434, "M", "a"), + (0x1D435, "M", "b"), + (0x1D436, "M", "c"), + (0x1D437, "M", "d"), + (0x1D438, "M", "e"), + (0x1D439, "M", "f"), + (0x1D43A, "M", "g"), + (0x1D43B, "M", "h"), + (0x1D43C, "M", "i"), + (0x1D43D, "M", "j"), + (0x1D43E, "M", "k"), + (0x1D43F, "M", "l"), + (0x1D440, "M", "m"), + (0x1D441, "M", "n"), + (0x1D442, "M", "o"), + (0x1D443, "M", "p"), + (0x1D444, "M", "q"), + (0x1D445, "M", "r"), + (0x1D446, "M", "s"), + (0x1D447, "M", "t"), + (0x1D448, "M", "u"), + (0x1D449, "M", "v"), + (0x1D44A, "M", "w"), + (0x1D44B, "M", "x"), + (0x1D44C, "M", "y"), + (0x1D44D, "M", "z"), + (0x1D44E, "M", "a"), + (0x1D44F, "M", "b"), + (0x1D450, "M", "c"), + (0x1D451, "M", "d"), + (0x1D452, "M", "e"), + (0x1D453, "M", "f"), + (0x1D454, "M", "g"), + (0x1D455, "X"), + (0x1D456, "M", "i"), + (0x1D457, "M", "j"), + (0x1D458, "M", "k"), + (0x1D459, "M", "l"), + (0x1D45A, "M", "m"), + (0x1D45B, "M", "n"), + (0x1D45C, "M", "o"), + (0x1D45D, "M", "p"), + (0x1D45E, "M", "q"), + (0x1D45F, "M", "r"), + (0x1D460, "M", "s"), + (0x1D461, "M", "t"), + (0x1D462, "M", "u"), + (0x1D463, "M", "v"), + (0x1D464, "M", "w"), + (0x1D465, "M", "x"), + (0x1D466, "M", "y"), + (0x1D467, "M", "z"), + (0x1D468, "M", "a"), + (0x1D469, "M", "b"), + (0x1D46A, "M", "c"), + (0x1D46B, "M", "d"), + (0x1D46C, "M", "e"), + (0x1D46D, "M", "f"), + (0x1D46E, "M", "g"), + (0x1D46F, "M", "h"), + (0x1D470, "M", "i"), + (0x1D471, "M", "j"), + (0x1D472, "M", "k"), + (0x1D473, "M", "l"), + (0x1D474, "M", "m"), + (0x1D475, "M", "n"), + (0x1D476, "M", "o"), + (0x1D477, "M", "p"), + (0x1D478, "M", "q"), + (0x1D479, "M", "r"), + (0x1D47A, "M", "s"), + (0x1D47B, "M", "t"), + (0x1D47C, "M", "u"), + (0x1D47D, "M", "v"), + (0x1D47E, "M", "w"), + (0x1D47F, "M", "x"), + (0x1D480, "M", "y"), + (0x1D481, "M", "z"), + (0x1D482, "M", "a"), + (0x1D483, "M", "b"), + (0x1D484, "M", "c"), + (0x1D485, "M", "d"), + (0x1D486, "M", "e"), + (0x1D487, "M", "f"), + (0x1D488, "M", "g"), + ] + + +def _seg_62() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D489, "M", "h"), + (0x1D48A, "M", "i"), + (0x1D48B, "M", "j"), + (0x1D48C, "M", "k"), + (0x1D48D, "M", "l"), + (0x1D48E, "M", "m"), + (0x1D48F, "M", "n"), + (0x1D490, "M", "o"), + (0x1D491, "M", "p"), + (0x1D492, "M", "q"), + (0x1D493, "M", "r"), + (0x1D494, "M", "s"), + (0x1D495, "M", "t"), + (0x1D496, "M", "u"), + (0x1D497, "M", "v"), + (0x1D498, "M", "w"), + (0x1D499, "M", "x"), + (0x1D49A, "M", "y"), + (0x1D49B, "M", "z"), + (0x1D49C, "M", "a"), + (0x1D49D, "X"), + (0x1D49E, "M", "c"), + (0x1D49F, "M", "d"), + (0x1D4A0, "X"), + (0x1D4A2, "M", "g"), + (0x1D4A3, "X"), + (0x1D4A5, "M", "j"), + (0x1D4A6, "M", "k"), + (0x1D4A7, "X"), + (0x1D4A9, "M", "n"), + (0x1D4AA, "M", "o"), + (0x1D4AB, "M", "p"), + (0x1D4AC, "M", "q"), + (0x1D4AD, "X"), + (0x1D4AE, "M", "s"), + (0x1D4AF, "M", "t"), + (0x1D4B0, "M", "u"), + (0x1D4B1, "M", "v"), + (0x1D4B2, "M", "w"), + (0x1D4B3, "M", "x"), + (0x1D4B4, "M", "y"), + (0x1D4B5, "M", "z"), + (0x1D4B6, "M", "a"), + (0x1D4B7, "M", "b"), + (0x1D4B8, "M", "c"), + (0x1D4B9, "M", "d"), + (0x1D4BA, "X"), + (0x1D4BB, "M", "f"), + (0x1D4BC, "X"), + (0x1D4BD, "M", "h"), + (0x1D4BE, "M", "i"), + (0x1D4BF, "M", "j"), + (0x1D4C0, "M", "k"), + (0x1D4C1, "M", "l"), + (0x1D4C2, "M", "m"), + (0x1D4C3, "M", "n"), + (0x1D4C4, "X"), + (0x1D4C5, "M", "p"), + (0x1D4C6, "M", "q"), + (0x1D4C7, "M", "r"), + (0x1D4C8, "M", "s"), + (0x1D4C9, "M", "t"), + (0x1D4CA, "M", "u"), + (0x1D4CB, "M", "v"), + (0x1D4CC, "M", "w"), + (0x1D4CD, "M", "x"), + (0x1D4CE, "M", "y"), + (0x1D4CF, "M", "z"), + (0x1D4D0, "M", "a"), + (0x1D4D1, "M", "b"), + (0x1D4D2, "M", "c"), + (0x1D4D3, "M", "d"), + (0x1D4D4, "M", "e"), + (0x1D4D5, "M", "f"), + (0x1D4D6, "M", "g"), + (0x1D4D7, "M", "h"), + (0x1D4D8, "M", "i"), + (0x1D4D9, "M", "j"), + (0x1D4DA, "M", "k"), + (0x1D4DB, "M", "l"), + (0x1D4DC, "M", "m"), + (0x1D4DD, "M", "n"), + (0x1D4DE, "M", "o"), + (0x1D4DF, "M", "p"), + (0x1D4E0, "M", "q"), + (0x1D4E1, "M", "r"), + (0x1D4E2, "M", "s"), + (0x1D4E3, "M", "t"), + (0x1D4E4, "M", "u"), + (0x1D4E5, "M", "v"), + (0x1D4E6, "M", "w"), + (0x1D4E7, "M", "x"), + (0x1D4E8, "M", "y"), + (0x1D4E9, "M", "z"), + (0x1D4EA, "M", "a"), + (0x1D4EB, "M", "b"), + (0x1D4EC, "M", "c"), + (0x1D4ED, "M", "d"), + (0x1D4EE, "M", "e"), + (0x1D4EF, "M", "f"), + ] + + +def _seg_63() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D4F0, "M", "g"), + (0x1D4F1, "M", "h"), + (0x1D4F2, "M", "i"), + (0x1D4F3, "M", "j"), + (0x1D4F4, "M", "k"), + (0x1D4F5, "M", "l"), + (0x1D4F6, "M", "m"), + (0x1D4F7, "M", "n"), + (0x1D4F8, "M", "o"), + (0x1D4F9, "M", "p"), + (0x1D4FA, "M", "q"), + (0x1D4FB, "M", "r"), + (0x1D4FC, "M", "s"), + (0x1D4FD, "M", "t"), + (0x1D4FE, "M", "u"), + (0x1D4FF, "M", "v"), + (0x1D500, "M", "w"), + (0x1D501, "M", "x"), + (0x1D502, "M", "y"), + (0x1D503, "M", "z"), + (0x1D504, "M", "a"), + (0x1D505, "M", "b"), + (0x1D506, "X"), + (0x1D507, "M", "d"), + (0x1D508, "M", "e"), + (0x1D509, "M", "f"), + (0x1D50A, "M", "g"), + (0x1D50B, "X"), + (0x1D50D, "M", "j"), + (0x1D50E, "M", "k"), + (0x1D50F, "M", "l"), + (0x1D510, "M", "m"), + (0x1D511, "M", "n"), + (0x1D512, "M", "o"), + (0x1D513, "M", "p"), + (0x1D514, "M", "q"), + (0x1D515, "X"), + (0x1D516, "M", "s"), + (0x1D517, "M", "t"), + (0x1D518, "M", "u"), + (0x1D519, "M", "v"), + (0x1D51A, "M", "w"), + (0x1D51B, "M", "x"), + (0x1D51C, "M", "y"), + (0x1D51D, "X"), + (0x1D51E, "M", "a"), + (0x1D51F, "M", "b"), + (0x1D520, "M", "c"), + (0x1D521, "M", "d"), + (0x1D522, "M", "e"), + (0x1D523, "M", "f"), + (0x1D524, "M", "g"), + (0x1D525, "M", "h"), + (0x1D526, "M", "i"), + (0x1D527, "M", "j"), + (0x1D528, "M", "k"), + (0x1D529, "M", "l"), + (0x1D52A, "M", "m"), + (0x1D52B, "M", "n"), + (0x1D52C, "M", "o"), + (0x1D52D, "M", "p"), + (0x1D52E, "M", "q"), + (0x1D52F, "M", "r"), + (0x1D530, "M", "s"), + (0x1D531, "M", "t"), + (0x1D532, "M", "u"), + (0x1D533, "M", "v"), + (0x1D534, "M", "w"), + (0x1D535, "M", "x"), + (0x1D536, "M", "y"), + (0x1D537, "M", "z"), + (0x1D538, "M", "a"), + (0x1D539, "M", "b"), + (0x1D53A, "X"), + (0x1D53B, "M", "d"), + (0x1D53C, "M", "e"), + (0x1D53D, "M", "f"), + (0x1D53E, "M", "g"), + (0x1D53F, "X"), + (0x1D540, "M", "i"), + (0x1D541, "M", "j"), + (0x1D542, "M", "k"), + (0x1D543, "M", "l"), + (0x1D544, "M", "m"), + (0x1D545, "X"), + (0x1D546, "M", "o"), + (0x1D547, "X"), + (0x1D54A, "M", "s"), + (0x1D54B, "M", "t"), + (0x1D54C, "M", "u"), + (0x1D54D, "M", "v"), + (0x1D54E, "M", "w"), + (0x1D54F, "M", "x"), + (0x1D550, "M", "y"), + (0x1D551, "X"), + (0x1D552, "M", "a"), + (0x1D553, "M", "b"), + (0x1D554, "M", "c"), + (0x1D555, "M", "d"), + (0x1D556, "M", "e"), + ] + + +def _seg_64() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D557, "M", "f"), + (0x1D558, "M", "g"), + (0x1D559, "M", "h"), + (0x1D55A, "M", "i"), + (0x1D55B, "M", "j"), + (0x1D55C, "M", "k"), + (0x1D55D, "M", "l"), + (0x1D55E, "M", "m"), + (0x1D55F, "M", "n"), + (0x1D560, "M", "o"), + (0x1D561, "M", "p"), + (0x1D562, "M", "q"), + (0x1D563, "M", "r"), + (0x1D564, "M", "s"), + (0x1D565, "M", "t"), + (0x1D566, "M", "u"), + (0x1D567, "M", "v"), + (0x1D568, "M", "w"), + (0x1D569, "M", "x"), + (0x1D56A, "M", "y"), + (0x1D56B, "M", "z"), + (0x1D56C, "M", "a"), + (0x1D56D, "M", "b"), + (0x1D56E, "M", "c"), + (0x1D56F, "M", "d"), + (0x1D570, "M", "e"), + (0x1D571, "M", "f"), + (0x1D572, "M", "g"), + (0x1D573, "M", "h"), + (0x1D574, "M", "i"), + (0x1D575, "M", "j"), + (0x1D576, "M", "k"), + (0x1D577, "M", "l"), + (0x1D578, "M", "m"), + (0x1D579, "M", "n"), + (0x1D57A, "M", "o"), + (0x1D57B, "M", "p"), + (0x1D57C, "M", "q"), + (0x1D57D, "M", "r"), + (0x1D57E, "M", "s"), + (0x1D57F, "M", "t"), + (0x1D580, "M", "u"), + (0x1D581, "M", "v"), + (0x1D582, "M", "w"), + (0x1D583, "M", "x"), + (0x1D584, "M", "y"), + (0x1D585, "M", "z"), + (0x1D586, "M", "a"), + (0x1D587, "M", "b"), + (0x1D588, "M", "c"), + (0x1D589, "M", "d"), + (0x1D58A, "M", "e"), + (0x1D58B, "M", "f"), + (0x1D58C, "M", "g"), + (0x1D58D, "M", "h"), + (0x1D58E, "M", "i"), + (0x1D58F, "M", "j"), + (0x1D590, "M", "k"), + (0x1D591, "M", "l"), + (0x1D592, "M", "m"), + (0x1D593, "M", "n"), + (0x1D594, "M", "o"), + (0x1D595, "M", "p"), + (0x1D596, "M", "q"), + (0x1D597, "M", "r"), + (0x1D598, "M", "s"), + (0x1D599, "M", "t"), + (0x1D59A, "M", "u"), + (0x1D59B, "M", "v"), + (0x1D59C, "M", "w"), + (0x1D59D, "M", "x"), + (0x1D59E, "M", "y"), + (0x1D59F, "M", "z"), + (0x1D5A0, "M", "a"), + (0x1D5A1, "M", "b"), + (0x1D5A2, "M", "c"), + (0x1D5A3, "M", "d"), + (0x1D5A4, "M", "e"), + (0x1D5A5, "M", "f"), + (0x1D5A6, "M", "g"), + (0x1D5A7, "M", "h"), + (0x1D5A8, "M", "i"), + (0x1D5A9, "M", "j"), + (0x1D5AA, "M", "k"), + (0x1D5AB, "M", "l"), + (0x1D5AC, "M", "m"), + (0x1D5AD, "M", "n"), + (0x1D5AE, "M", "o"), + (0x1D5AF, "M", "p"), + (0x1D5B0, "M", "q"), + (0x1D5B1, "M", "r"), + (0x1D5B2, "M", "s"), + (0x1D5B3, "M", "t"), + (0x1D5B4, "M", "u"), + (0x1D5B5, "M", "v"), + (0x1D5B6, "M", "w"), + (0x1D5B7, "M", "x"), + (0x1D5B8, "M", "y"), + (0x1D5B9, "M", "z"), + (0x1D5BA, "M", "a"), + ] + + +def _seg_65() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D5BB, "M", "b"), + (0x1D5BC, "M", "c"), + (0x1D5BD, "M", "d"), + (0x1D5BE, "M", "e"), + (0x1D5BF, "M", "f"), + (0x1D5C0, "M", "g"), + (0x1D5C1, "M", "h"), + (0x1D5C2, "M", "i"), + (0x1D5C3, "M", "j"), + (0x1D5C4, "M", "k"), + (0x1D5C5, "M", "l"), + (0x1D5C6, "M", "m"), + (0x1D5C7, "M", "n"), + (0x1D5C8, "M", "o"), + (0x1D5C9, "M", "p"), + (0x1D5CA, "M", "q"), + (0x1D5CB, "M", "r"), + (0x1D5CC, "M", "s"), + (0x1D5CD, "M", "t"), + (0x1D5CE, "M", "u"), + (0x1D5CF, "M", "v"), + (0x1D5D0, "M", "w"), + (0x1D5D1, "M", "x"), + (0x1D5D2, "M", "y"), + (0x1D5D3, "M", "z"), + (0x1D5D4, "M", "a"), + (0x1D5D5, "M", "b"), + (0x1D5D6, "M", "c"), + (0x1D5D7, "M", "d"), + (0x1D5D8, "M", "e"), + (0x1D5D9, "M", "f"), + (0x1D5DA, "M", "g"), + (0x1D5DB, "M", "h"), + (0x1D5DC, "M", "i"), + (0x1D5DD, "M", "j"), + (0x1D5DE, "M", "k"), + (0x1D5DF, "M", "l"), + (0x1D5E0, "M", "m"), + (0x1D5E1, "M", "n"), + (0x1D5E2, "M", "o"), + (0x1D5E3, "M", "p"), + (0x1D5E4, "M", "q"), + (0x1D5E5, "M", "r"), + (0x1D5E6, "M", "s"), + (0x1D5E7, "M", "t"), + (0x1D5E8, "M", "u"), + (0x1D5E9, "M", "v"), + (0x1D5EA, "M", "w"), + (0x1D5EB, "M", "x"), + (0x1D5EC, "M", "y"), + (0x1D5ED, "M", "z"), + (0x1D5EE, "M", "a"), + (0x1D5EF, "M", "b"), + (0x1D5F0, "M", "c"), + (0x1D5F1, "M", "d"), + (0x1D5F2, "M", "e"), + (0x1D5F3, "M", "f"), + (0x1D5F4, "M", "g"), + (0x1D5F5, "M", "h"), + (0x1D5F6, "M", "i"), + (0x1D5F7, "M", "j"), + (0x1D5F8, "M", "k"), + (0x1D5F9, "M", "l"), + (0x1D5FA, "M", "m"), + (0x1D5FB, "M", "n"), + (0x1D5FC, "M", "o"), + (0x1D5FD, "M", "p"), + (0x1D5FE, "M", "q"), + (0x1D5FF, "M", "r"), + (0x1D600, "M", "s"), + (0x1D601, "M", "t"), + (0x1D602, "M", "u"), + (0x1D603, "M", "v"), + (0x1D604, "M", "w"), + (0x1D605, "M", "x"), + (0x1D606, "M", "y"), + (0x1D607, "M", "z"), + (0x1D608, "M", "a"), + (0x1D609, "M", "b"), + (0x1D60A, "M", "c"), + (0x1D60B, "M", "d"), + (0x1D60C, "M", "e"), + (0x1D60D, "M", "f"), + (0x1D60E, "M", "g"), + (0x1D60F, "M", "h"), + (0x1D610, "M", "i"), + (0x1D611, "M", "j"), + (0x1D612, "M", "k"), + (0x1D613, "M", "l"), + (0x1D614, "M", "m"), + (0x1D615, "M", "n"), + (0x1D616, "M", "o"), + (0x1D617, "M", "p"), + (0x1D618, "M", "q"), + (0x1D619, "M", "r"), + (0x1D61A, "M", "s"), + (0x1D61B, "M", "t"), + (0x1D61C, "M", "u"), + (0x1D61D, "M", "v"), + (0x1D61E, "M", "w"), + ] + + +def _seg_66() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D61F, "M", "x"), + (0x1D620, "M", "y"), + (0x1D621, "M", "z"), + (0x1D622, "M", "a"), + (0x1D623, "M", "b"), + (0x1D624, "M", "c"), + (0x1D625, "M", "d"), + (0x1D626, "M", "e"), + (0x1D627, "M", "f"), + (0x1D628, "M", "g"), + (0x1D629, "M", "h"), + (0x1D62A, "M", "i"), + (0x1D62B, "M", "j"), + (0x1D62C, "M", "k"), + (0x1D62D, "M", "l"), + (0x1D62E, "M", "m"), + (0x1D62F, "M", "n"), + (0x1D630, "M", "o"), + (0x1D631, "M", "p"), + (0x1D632, "M", "q"), + (0x1D633, "M", "r"), + (0x1D634, "M", "s"), + (0x1D635, "M", "t"), + (0x1D636, "M", "u"), + (0x1D637, "M", "v"), + (0x1D638, "M", "w"), + (0x1D639, "M", "x"), + (0x1D63A, "M", "y"), + (0x1D63B, "M", "z"), + (0x1D63C, "M", "a"), + (0x1D63D, "M", "b"), + (0x1D63E, "M", "c"), + (0x1D63F, "M", "d"), + (0x1D640, "M", "e"), + (0x1D641, "M", "f"), + (0x1D642, "M", "g"), + (0x1D643, "M", "h"), + (0x1D644, "M", "i"), + (0x1D645, "M", "j"), + (0x1D646, "M", "k"), + (0x1D647, "M", "l"), + (0x1D648, "M", "m"), + (0x1D649, "M", "n"), + (0x1D64A, "M", "o"), + (0x1D64B, "M", "p"), + (0x1D64C, "M", "q"), + (0x1D64D, "M", "r"), + (0x1D64E, "M", "s"), + (0x1D64F, "M", "t"), + (0x1D650, "M", "u"), + (0x1D651, "M", "v"), + (0x1D652, "M", "w"), + (0x1D653, "M", "x"), + (0x1D654, "M", "y"), + (0x1D655, "M", "z"), + (0x1D656, "M", "a"), + (0x1D657, "M", "b"), + (0x1D658, "M", "c"), + (0x1D659, "M", "d"), + (0x1D65A, "M", "e"), + (0x1D65B, "M", "f"), + (0x1D65C, "M", "g"), + (0x1D65D, "M", "h"), + (0x1D65E, "M", "i"), + (0x1D65F, "M", "j"), + (0x1D660, "M", "k"), + (0x1D661, "M", "l"), + (0x1D662, "M", "m"), + (0x1D663, "M", "n"), + (0x1D664, "M", "o"), + (0x1D665, "M", "p"), + (0x1D666, "M", "q"), + (0x1D667, "M", "r"), + (0x1D668, "M", "s"), + (0x1D669, "M", "t"), + (0x1D66A, "M", "u"), + (0x1D66B, "M", "v"), + (0x1D66C, "M", "w"), + (0x1D66D, "M", "x"), + (0x1D66E, "M", "y"), + (0x1D66F, "M", "z"), + (0x1D670, "M", "a"), + (0x1D671, "M", "b"), + (0x1D672, "M", "c"), + (0x1D673, "M", "d"), + (0x1D674, "M", "e"), + (0x1D675, "M", "f"), + (0x1D676, "M", "g"), + (0x1D677, "M", "h"), + (0x1D678, "M", "i"), + (0x1D679, "M", "j"), + (0x1D67A, "M", "k"), + (0x1D67B, "M", "l"), + (0x1D67C, "M", "m"), + (0x1D67D, "M", "n"), + (0x1D67E, "M", "o"), + (0x1D67F, "M", "p"), + (0x1D680, "M", "q"), + (0x1D681, "M", "r"), + (0x1D682, "M", "s"), + ] + + +def _seg_67() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D683, "M", "t"), + (0x1D684, "M", "u"), + (0x1D685, "M", "v"), + (0x1D686, "M", "w"), + (0x1D687, "M", "x"), + (0x1D688, "M", "y"), + (0x1D689, "M", "z"), + (0x1D68A, "M", "a"), + (0x1D68B, "M", "b"), + (0x1D68C, "M", "c"), + (0x1D68D, "M", "d"), + (0x1D68E, "M", "e"), + (0x1D68F, "M", "f"), + (0x1D690, "M", "g"), + (0x1D691, "M", "h"), + (0x1D692, "M", "i"), + (0x1D693, "M", "j"), + (0x1D694, "M", "k"), + (0x1D695, "M", "l"), + (0x1D696, "M", "m"), + (0x1D697, "M", "n"), + (0x1D698, "M", "o"), + (0x1D699, "M", "p"), + (0x1D69A, "M", "q"), + (0x1D69B, "M", "r"), + (0x1D69C, "M", "s"), + (0x1D69D, "M", "t"), + (0x1D69E, "M", "u"), + (0x1D69F, "M", "v"), + (0x1D6A0, "M", "w"), + (0x1D6A1, "M", "x"), + (0x1D6A2, "M", "y"), + (0x1D6A3, "M", "z"), + (0x1D6A4, "M", "ı"), + (0x1D6A5, "M", "ȷ"), + (0x1D6A6, "X"), + (0x1D6A8, "M", "α"), + (0x1D6A9, "M", "β"), + (0x1D6AA, "M", "γ"), + (0x1D6AB, "M", "δ"), + (0x1D6AC, "M", "ε"), + (0x1D6AD, "M", "ζ"), + (0x1D6AE, "M", "η"), + (0x1D6AF, "M", "θ"), + (0x1D6B0, "M", "ι"), + (0x1D6B1, "M", "κ"), + (0x1D6B2, "M", "λ"), + (0x1D6B3, "M", "μ"), + (0x1D6B4, "M", "ν"), + (0x1D6B5, "M", "ξ"), + (0x1D6B6, "M", "ο"), + (0x1D6B7, "M", "π"), + (0x1D6B8, "M", "ρ"), + (0x1D6B9, "M", "θ"), + (0x1D6BA, "M", "σ"), + (0x1D6BB, "M", "τ"), + (0x1D6BC, "M", "υ"), + (0x1D6BD, "M", "φ"), + (0x1D6BE, "M", "χ"), + (0x1D6BF, "M", "ψ"), + (0x1D6C0, "M", "ω"), + (0x1D6C1, "M", "∇"), + (0x1D6C2, "M", "α"), + (0x1D6C3, "M", "β"), + (0x1D6C4, "M", "γ"), + (0x1D6C5, "M", "δ"), + (0x1D6C6, "M", "ε"), + (0x1D6C7, "M", "ζ"), + (0x1D6C8, "M", "η"), + (0x1D6C9, "M", "θ"), + (0x1D6CA, "M", "ι"), + (0x1D6CB, "M", "κ"), + (0x1D6CC, "M", "λ"), + (0x1D6CD, "M", "μ"), + (0x1D6CE, "M", "ν"), + (0x1D6CF, "M", "ξ"), + (0x1D6D0, "M", "ο"), + (0x1D6D1, "M", "π"), + (0x1D6D2, "M", "ρ"), + (0x1D6D3, "M", "σ"), + (0x1D6D5, "M", "τ"), + (0x1D6D6, "M", "υ"), + (0x1D6D7, "M", "φ"), + (0x1D6D8, "M", "χ"), + (0x1D6D9, "M", "ψ"), + (0x1D6DA, "M", "ω"), + (0x1D6DB, "M", "∂"), + (0x1D6DC, "M", "ε"), + (0x1D6DD, "M", "θ"), + (0x1D6DE, "M", "κ"), + (0x1D6DF, "M", "φ"), + (0x1D6E0, "M", "ρ"), + (0x1D6E1, "M", "π"), + (0x1D6E2, "M", "α"), + (0x1D6E3, "M", "β"), + (0x1D6E4, "M", "γ"), + (0x1D6E5, "M", "δ"), + (0x1D6E6, "M", "ε"), + (0x1D6E7, "M", "ζ"), + (0x1D6E8, "M", "η"), + ] + + +def _seg_68() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D6E9, "M", "θ"), + (0x1D6EA, "M", "ι"), + (0x1D6EB, "M", "κ"), + (0x1D6EC, "M", "λ"), + (0x1D6ED, "M", "μ"), + (0x1D6EE, "M", "ν"), + (0x1D6EF, "M", "ξ"), + (0x1D6F0, "M", "ο"), + (0x1D6F1, "M", "π"), + (0x1D6F2, "M", "ρ"), + (0x1D6F3, "M", "θ"), + (0x1D6F4, "M", "σ"), + (0x1D6F5, "M", "τ"), + (0x1D6F6, "M", "υ"), + (0x1D6F7, "M", "φ"), + (0x1D6F8, "M", "χ"), + (0x1D6F9, "M", "ψ"), + (0x1D6FA, "M", "ω"), + (0x1D6FB, "M", "∇"), + (0x1D6FC, "M", "α"), + (0x1D6FD, "M", "β"), + (0x1D6FE, "M", "γ"), + (0x1D6FF, "M", "δ"), + (0x1D700, "M", "ε"), + (0x1D701, "M", "ζ"), + (0x1D702, "M", "η"), + (0x1D703, "M", "θ"), + (0x1D704, "M", "ι"), + (0x1D705, "M", "κ"), + (0x1D706, "M", "λ"), + (0x1D707, "M", "μ"), + (0x1D708, "M", "ν"), + (0x1D709, "M", "ξ"), + (0x1D70A, "M", "ο"), + (0x1D70B, "M", "π"), + (0x1D70C, "M", "ρ"), + (0x1D70D, "M", "σ"), + (0x1D70F, "M", "τ"), + (0x1D710, "M", "υ"), + (0x1D711, "M", "φ"), + (0x1D712, "M", "χ"), + (0x1D713, "M", "ψ"), + (0x1D714, "M", "ω"), + (0x1D715, "M", "∂"), + (0x1D716, "M", "ε"), + (0x1D717, "M", "θ"), + (0x1D718, "M", "κ"), + (0x1D719, "M", "φ"), + (0x1D71A, "M", "ρ"), + (0x1D71B, "M", "π"), + (0x1D71C, "M", "α"), + (0x1D71D, "M", "β"), + (0x1D71E, "M", "γ"), + (0x1D71F, "M", "δ"), + (0x1D720, "M", "ε"), + (0x1D721, "M", "ζ"), + (0x1D722, "M", "η"), + (0x1D723, "M", "θ"), + (0x1D724, "M", "ι"), + (0x1D725, "M", "κ"), + (0x1D726, "M", "λ"), + (0x1D727, "M", "μ"), + (0x1D728, "M", "ν"), + (0x1D729, "M", "ξ"), + (0x1D72A, "M", "ο"), + (0x1D72B, "M", "π"), + (0x1D72C, "M", "ρ"), + (0x1D72D, "M", "θ"), + (0x1D72E, "M", "σ"), + (0x1D72F, "M", "τ"), + (0x1D730, "M", "υ"), + (0x1D731, "M", "φ"), + (0x1D732, "M", "χ"), + (0x1D733, "M", "ψ"), + (0x1D734, "M", "ω"), + (0x1D735, "M", "∇"), + (0x1D736, "M", "α"), + (0x1D737, "M", "β"), + (0x1D738, "M", "γ"), + (0x1D739, "M", "δ"), + (0x1D73A, "M", "ε"), + (0x1D73B, "M", "ζ"), + (0x1D73C, "M", "η"), + (0x1D73D, "M", "θ"), + (0x1D73E, "M", "ι"), + (0x1D73F, "M", "κ"), + (0x1D740, "M", "λ"), + (0x1D741, "M", "μ"), + (0x1D742, "M", "ν"), + (0x1D743, "M", "ξ"), + (0x1D744, "M", "ο"), + (0x1D745, "M", "π"), + (0x1D746, "M", "ρ"), + (0x1D747, "M", "σ"), + (0x1D749, "M", "τ"), + (0x1D74A, "M", "υ"), + (0x1D74B, "M", "φ"), + (0x1D74C, "M", "χ"), + (0x1D74D, "M", "ψ"), + (0x1D74E, "M", "ω"), + ] + + +def _seg_69() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D74F, "M", "∂"), + (0x1D750, "M", "ε"), + (0x1D751, "M", "θ"), + (0x1D752, "M", "κ"), + (0x1D753, "M", "φ"), + (0x1D754, "M", "ρ"), + (0x1D755, "M", "π"), + (0x1D756, "M", "α"), + (0x1D757, "M", "β"), + (0x1D758, "M", "γ"), + (0x1D759, "M", "δ"), + (0x1D75A, "M", "ε"), + (0x1D75B, "M", "ζ"), + (0x1D75C, "M", "η"), + (0x1D75D, "M", "θ"), + (0x1D75E, "M", "ι"), + (0x1D75F, "M", "κ"), + (0x1D760, "M", "λ"), + (0x1D761, "M", "μ"), + (0x1D762, "M", "ν"), + (0x1D763, "M", "ξ"), + (0x1D764, "M", "ο"), + (0x1D765, "M", "π"), + (0x1D766, "M", "ρ"), + (0x1D767, "M", "θ"), + (0x1D768, "M", "σ"), + (0x1D769, "M", "τ"), + (0x1D76A, "M", "υ"), + (0x1D76B, "M", "φ"), + (0x1D76C, "M", "χ"), + (0x1D76D, "M", "ψ"), + (0x1D76E, "M", "ω"), + (0x1D76F, "M", "∇"), + (0x1D770, "M", "α"), + (0x1D771, "M", "β"), + (0x1D772, "M", "γ"), + (0x1D773, "M", "δ"), + (0x1D774, "M", "ε"), + (0x1D775, "M", "ζ"), + (0x1D776, "M", "η"), + (0x1D777, "M", "θ"), + (0x1D778, "M", "ι"), + (0x1D779, "M", "κ"), + (0x1D77A, "M", "λ"), + (0x1D77B, "M", "μ"), + (0x1D77C, "M", "ν"), + (0x1D77D, "M", "ξ"), + (0x1D77E, "M", "ο"), + (0x1D77F, "M", "π"), + (0x1D780, "M", "ρ"), + (0x1D781, "M", "σ"), + (0x1D783, "M", "τ"), + (0x1D784, "M", "υ"), + (0x1D785, "M", "φ"), + (0x1D786, "M", "χ"), + (0x1D787, "M", "ψ"), + (0x1D788, "M", "ω"), + (0x1D789, "M", "∂"), + (0x1D78A, "M", "ε"), + (0x1D78B, "M", "θ"), + (0x1D78C, "M", "κ"), + (0x1D78D, "M", "φ"), + (0x1D78E, "M", "ρ"), + (0x1D78F, "M", "π"), + (0x1D790, "M", "α"), + (0x1D791, "M", "β"), + (0x1D792, "M", "γ"), + (0x1D793, "M", "δ"), + (0x1D794, "M", "ε"), + (0x1D795, "M", "ζ"), + (0x1D796, "M", "η"), + (0x1D797, "M", "θ"), + (0x1D798, "M", "ι"), + (0x1D799, "M", "κ"), + (0x1D79A, "M", "λ"), + (0x1D79B, "M", "μ"), + (0x1D79C, "M", "ν"), + (0x1D79D, "M", "ξ"), + (0x1D79E, "M", "ο"), + (0x1D79F, "M", "π"), + (0x1D7A0, "M", "ρ"), + (0x1D7A1, "M", "θ"), + (0x1D7A2, "M", "σ"), + (0x1D7A3, "M", "τ"), + (0x1D7A4, "M", "υ"), + (0x1D7A5, "M", "φ"), + (0x1D7A6, "M", "χ"), + (0x1D7A7, "M", "ψ"), + (0x1D7A8, "M", "ω"), + (0x1D7A9, "M", "∇"), + (0x1D7AA, "M", "α"), + (0x1D7AB, "M", "β"), + (0x1D7AC, "M", "γ"), + (0x1D7AD, "M", "δ"), + (0x1D7AE, "M", "ε"), + (0x1D7AF, "M", "ζ"), + (0x1D7B0, "M", "η"), + (0x1D7B1, "M", "θ"), + (0x1D7B2, "M", "ι"), + (0x1D7B3, "M", "κ"), + ] + + +def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1D7B4, "M", "λ"), + (0x1D7B5, "M", "μ"), + (0x1D7B6, "M", "ν"), + (0x1D7B7, "M", "ξ"), + (0x1D7B8, "M", "ο"), + (0x1D7B9, "M", "π"), + (0x1D7BA, "M", "ρ"), + (0x1D7BB, "M", "σ"), + (0x1D7BD, "M", "τ"), + (0x1D7BE, "M", "υ"), + (0x1D7BF, "M", "φ"), + (0x1D7C0, "M", "χ"), + (0x1D7C1, "M", "ψ"), + (0x1D7C2, "M", "ω"), + (0x1D7C3, "M", "∂"), + (0x1D7C4, "M", "ε"), + (0x1D7C5, "M", "θ"), + (0x1D7C6, "M", "κ"), + (0x1D7C7, "M", "φ"), + (0x1D7C8, "M", "ρ"), + (0x1D7C9, "M", "π"), + (0x1D7CA, "M", "ϝ"), + (0x1D7CC, "X"), + (0x1D7CE, "M", "0"), + (0x1D7CF, "M", "1"), + (0x1D7D0, "M", "2"), + (0x1D7D1, "M", "3"), + (0x1D7D2, "M", "4"), + (0x1D7D3, "M", "5"), + (0x1D7D4, "M", "6"), + (0x1D7D5, "M", "7"), + (0x1D7D6, "M", "8"), + (0x1D7D7, "M", "9"), + (0x1D7D8, "M", "0"), + (0x1D7D9, "M", "1"), + (0x1D7DA, "M", "2"), + (0x1D7DB, "M", "3"), + (0x1D7DC, "M", "4"), + (0x1D7DD, "M", "5"), + (0x1D7DE, "M", "6"), + (0x1D7DF, "M", "7"), + (0x1D7E0, "M", "8"), + (0x1D7E1, "M", "9"), + (0x1D7E2, "M", "0"), + (0x1D7E3, "M", "1"), + (0x1D7E4, "M", "2"), + (0x1D7E5, "M", "3"), + (0x1D7E6, "M", "4"), + (0x1D7E7, "M", "5"), + (0x1D7E8, "M", "6"), + (0x1D7E9, "M", "7"), + (0x1D7EA, "M", "8"), + (0x1D7EB, "M", "9"), + (0x1D7EC, "M", "0"), + (0x1D7ED, "M", "1"), + (0x1D7EE, "M", "2"), + (0x1D7EF, "M", "3"), + (0x1D7F0, "M", "4"), + (0x1D7F1, "M", "5"), + (0x1D7F2, "M", "6"), + (0x1D7F3, "M", "7"), + (0x1D7F4, "M", "8"), + (0x1D7F5, "M", "9"), + (0x1D7F6, "M", "0"), + (0x1D7F7, "M", "1"), + (0x1D7F8, "M", "2"), + (0x1D7F9, "M", "3"), + (0x1D7FA, "M", "4"), + (0x1D7FB, "M", "5"), + (0x1D7FC, "M", "6"), + (0x1D7FD, "M", "7"), + (0x1D7FE, "M", "8"), + (0x1D7FF, "M", "9"), + (0x1D800, "V"), + (0x1DA8C, "X"), + (0x1DA9B, "V"), + (0x1DAA0, "X"), + (0x1DAA1, "V"), + (0x1DAB0, "X"), + (0x1DF00, "V"), + (0x1DF1F, "X"), + (0x1DF25, "V"), + (0x1DF2B, "X"), + (0x1E000, "V"), + (0x1E007, "X"), + (0x1E008, "V"), + (0x1E019, "X"), + (0x1E01B, "V"), + (0x1E022, "X"), + (0x1E023, "V"), + (0x1E025, "X"), + (0x1E026, "V"), + (0x1E02B, "X"), + (0x1E030, "M", "а"), + (0x1E031, "M", "б"), + (0x1E032, "M", "в"), + (0x1E033, "M", "г"), + (0x1E034, "M", "д"), + (0x1E035, "M", "е"), + (0x1E036, "M", "ж"), + ] + + +def _seg_71() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1E037, "M", "з"), + (0x1E038, "M", "и"), + (0x1E039, "M", "к"), + (0x1E03A, "M", "л"), + (0x1E03B, "M", "м"), + (0x1E03C, "M", "о"), + (0x1E03D, "M", "п"), + (0x1E03E, "M", "р"), + (0x1E03F, "M", "с"), + (0x1E040, "M", "т"), + (0x1E041, "M", "у"), + (0x1E042, "M", "ф"), + (0x1E043, "M", "х"), + (0x1E044, "M", "ц"), + (0x1E045, "M", "ч"), + (0x1E046, "M", "ш"), + (0x1E047, "M", "ы"), + (0x1E048, "M", "э"), + (0x1E049, "M", "ю"), + (0x1E04A, "M", "ꚉ"), + (0x1E04B, "M", "ә"), + (0x1E04C, "M", "і"), + (0x1E04D, "M", "ј"), + (0x1E04E, "M", "ө"), + (0x1E04F, "M", "ү"), + (0x1E050, "M", "ӏ"), + (0x1E051, "M", "а"), + (0x1E052, "M", "б"), + (0x1E053, "M", "в"), + (0x1E054, "M", "г"), + (0x1E055, "M", "д"), + (0x1E056, "M", "е"), + (0x1E057, "M", "ж"), + (0x1E058, "M", "з"), + (0x1E059, "M", "и"), + (0x1E05A, "M", "к"), + (0x1E05B, "M", "л"), + (0x1E05C, "M", "о"), + (0x1E05D, "M", "п"), + (0x1E05E, "M", "с"), + (0x1E05F, "M", "у"), + (0x1E060, "M", "ф"), + (0x1E061, "M", "х"), + (0x1E062, "M", "ц"), + (0x1E063, "M", "ч"), + (0x1E064, "M", "ш"), + (0x1E065, "M", "ъ"), + (0x1E066, "M", "ы"), + (0x1E067, "M", "ґ"), + (0x1E068, "M", "і"), + (0x1E069, "M", "ѕ"), + (0x1E06A, "M", "џ"), + (0x1E06B, "M", "ҫ"), + (0x1E06C, "M", "ꙑ"), + (0x1E06D, "M", "ұ"), + (0x1E06E, "X"), + (0x1E08F, "V"), + (0x1E090, "X"), + (0x1E100, "V"), + (0x1E12D, "X"), + (0x1E130, "V"), + (0x1E13E, "X"), + (0x1E140, "V"), + (0x1E14A, "X"), + (0x1E14E, "V"), + (0x1E150, "X"), + (0x1E290, "V"), + (0x1E2AF, "X"), + (0x1E2C0, "V"), + (0x1E2FA, "X"), + (0x1E2FF, "V"), + (0x1E300, "X"), + (0x1E4D0, "V"), + (0x1E4FA, "X"), + (0x1E7E0, "V"), + (0x1E7E7, "X"), + (0x1E7E8, "V"), + (0x1E7EC, "X"), + (0x1E7ED, "V"), + (0x1E7EF, "X"), + (0x1E7F0, "V"), + (0x1E7FF, "X"), + (0x1E800, "V"), + (0x1E8C5, "X"), + (0x1E8C7, "V"), + (0x1E8D7, "X"), + (0x1E900, "M", "𞤢"), + (0x1E901, "M", "𞤣"), + (0x1E902, "M", "𞤤"), + (0x1E903, "M", "𞤥"), + (0x1E904, "M", "𞤦"), + (0x1E905, "M", "𞤧"), + (0x1E906, "M", "𞤨"), + (0x1E907, "M", "𞤩"), + (0x1E908, "M", "𞤪"), + (0x1E909, "M", "𞤫"), + (0x1E90A, "M", "𞤬"), + (0x1E90B, "M", "𞤭"), + (0x1E90C, "M", "𞤮"), + (0x1E90D, "M", "𞤯"), + ] + + +def _seg_72() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1E90E, "M", "𞤰"), + (0x1E90F, "M", "𞤱"), + (0x1E910, "M", "𞤲"), + (0x1E911, "M", "𞤳"), + (0x1E912, "M", "𞤴"), + (0x1E913, "M", "𞤵"), + (0x1E914, "M", "𞤶"), + (0x1E915, "M", "𞤷"), + (0x1E916, "M", "𞤸"), + (0x1E917, "M", "𞤹"), + (0x1E918, "M", "𞤺"), + (0x1E919, "M", "𞤻"), + (0x1E91A, "M", "𞤼"), + (0x1E91B, "M", "𞤽"), + (0x1E91C, "M", "𞤾"), + (0x1E91D, "M", "𞤿"), + (0x1E91E, "M", "𞥀"), + (0x1E91F, "M", "𞥁"), + (0x1E920, "M", "𞥂"), + (0x1E921, "M", "𞥃"), + (0x1E922, "V"), + (0x1E94C, "X"), + (0x1E950, "V"), + (0x1E95A, "X"), + (0x1E95E, "V"), + (0x1E960, "X"), + (0x1EC71, "V"), + (0x1ECB5, "X"), + (0x1ED01, "V"), + (0x1ED3E, "X"), + (0x1EE00, "M", "ا"), + (0x1EE01, "M", "ب"), + (0x1EE02, "M", "ج"), + (0x1EE03, "M", "د"), + (0x1EE04, "X"), + (0x1EE05, "M", "و"), + (0x1EE06, "M", "ز"), + (0x1EE07, "M", "ح"), + (0x1EE08, "M", "ط"), + (0x1EE09, "M", "ي"), + (0x1EE0A, "M", "ك"), + (0x1EE0B, "M", "ل"), + (0x1EE0C, "M", "م"), + (0x1EE0D, "M", "ن"), + (0x1EE0E, "M", "س"), + (0x1EE0F, "M", "ع"), + (0x1EE10, "M", "ف"), + (0x1EE11, "M", "ص"), + (0x1EE12, "M", "ق"), + (0x1EE13, "M", "ر"), + (0x1EE14, "M", "ش"), + (0x1EE15, "M", "ت"), + (0x1EE16, "M", "ث"), + (0x1EE17, "M", "خ"), + (0x1EE18, "M", "ذ"), + (0x1EE19, "M", "ض"), + (0x1EE1A, "M", "ظ"), + (0x1EE1B, "M", "غ"), + (0x1EE1C, "M", "ٮ"), + (0x1EE1D, "M", "ں"), + (0x1EE1E, "M", "ڡ"), + (0x1EE1F, "M", "ٯ"), + (0x1EE20, "X"), + (0x1EE21, "M", "ب"), + (0x1EE22, "M", "ج"), + (0x1EE23, "X"), + (0x1EE24, "M", "ه"), + (0x1EE25, "X"), + (0x1EE27, "M", "ح"), + (0x1EE28, "X"), + (0x1EE29, "M", "ي"), + (0x1EE2A, "M", "ك"), + (0x1EE2B, "M", "ل"), + (0x1EE2C, "M", "م"), + (0x1EE2D, "M", "ن"), + (0x1EE2E, "M", "س"), + (0x1EE2F, "M", "ع"), + (0x1EE30, "M", "ف"), + (0x1EE31, "M", "ص"), + (0x1EE32, "M", "ق"), + (0x1EE33, "X"), + (0x1EE34, "M", "ش"), + (0x1EE35, "M", "ت"), + (0x1EE36, "M", "ث"), + (0x1EE37, "M", "خ"), + (0x1EE38, "X"), + (0x1EE39, "M", "ض"), + (0x1EE3A, "X"), + (0x1EE3B, "M", "غ"), + (0x1EE3C, "X"), + (0x1EE42, "M", "ج"), + (0x1EE43, "X"), + (0x1EE47, "M", "ح"), + (0x1EE48, "X"), + (0x1EE49, "M", "ي"), + (0x1EE4A, "X"), + (0x1EE4B, "M", "ل"), + (0x1EE4C, "X"), + (0x1EE4D, "M", "ن"), + (0x1EE4E, "M", "س"), + ] + + +def _seg_73() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1EE4F, "M", "ع"), + (0x1EE50, "X"), + (0x1EE51, "M", "ص"), + (0x1EE52, "M", "ق"), + (0x1EE53, "X"), + (0x1EE54, "M", "ش"), + (0x1EE55, "X"), + (0x1EE57, "M", "خ"), + (0x1EE58, "X"), + (0x1EE59, "M", "ض"), + (0x1EE5A, "X"), + (0x1EE5B, "M", "غ"), + (0x1EE5C, "X"), + (0x1EE5D, "M", "ں"), + (0x1EE5E, "X"), + (0x1EE5F, "M", "ٯ"), + (0x1EE60, "X"), + (0x1EE61, "M", "ب"), + (0x1EE62, "M", "ج"), + (0x1EE63, "X"), + (0x1EE64, "M", "ه"), + (0x1EE65, "X"), + (0x1EE67, "M", "ح"), + (0x1EE68, "M", "ط"), + (0x1EE69, "M", "ي"), + (0x1EE6A, "M", "ك"), + (0x1EE6B, "X"), + (0x1EE6C, "M", "م"), + (0x1EE6D, "M", "ن"), + (0x1EE6E, "M", "س"), + (0x1EE6F, "M", "ع"), + (0x1EE70, "M", "ف"), + (0x1EE71, "M", "ص"), + (0x1EE72, "M", "ق"), + (0x1EE73, "X"), + (0x1EE74, "M", "ش"), + (0x1EE75, "M", "ت"), + (0x1EE76, "M", "ث"), + (0x1EE77, "M", "خ"), + (0x1EE78, "X"), + (0x1EE79, "M", "ض"), + (0x1EE7A, "M", "ظ"), + (0x1EE7B, "M", "غ"), + (0x1EE7C, "M", "ٮ"), + (0x1EE7D, "X"), + (0x1EE7E, "M", "ڡ"), + (0x1EE7F, "X"), + (0x1EE80, "M", "ا"), + (0x1EE81, "M", "ب"), + (0x1EE82, "M", "ج"), + (0x1EE83, "M", "د"), + (0x1EE84, "M", "ه"), + (0x1EE85, "M", "و"), + (0x1EE86, "M", "ز"), + (0x1EE87, "M", "ح"), + (0x1EE88, "M", "ط"), + (0x1EE89, "M", "ي"), + (0x1EE8A, "X"), + (0x1EE8B, "M", "ل"), + (0x1EE8C, "M", "م"), + (0x1EE8D, "M", "ن"), + (0x1EE8E, "M", "س"), + (0x1EE8F, "M", "ع"), + (0x1EE90, "M", "ف"), + (0x1EE91, "M", "ص"), + (0x1EE92, "M", "ق"), + (0x1EE93, "M", "ر"), + (0x1EE94, "M", "ش"), + (0x1EE95, "M", "ت"), + (0x1EE96, "M", "ث"), + (0x1EE97, "M", "خ"), + (0x1EE98, "M", "ذ"), + (0x1EE99, "M", "ض"), + (0x1EE9A, "M", "ظ"), + (0x1EE9B, "M", "غ"), + (0x1EE9C, "X"), + (0x1EEA1, "M", "ب"), + (0x1EEA2, "M", "ج"), + (0x1EEA3, "M", "د"), + (0x1EEA4, "X"), + (0x1EEA5, "M", "و"), + (0x1EEA6, "M", "ز"), + (0x1EEA7, "M", "ح"), + (0x1EEA8, "M", "ط"), + (0x1EEA9, "M", "ي"), + (0x1EEAA, "X"), + (0x1EEAB, "M", "ل"), + (0x1EEAC, "M", "م"), + (0x1EEAD, "M", "ن"), + (0x1EEAE, "M", "س"), + (0x1EEAF, "M", "ع"), + (0x1EEB0, "M", "ف"), + (0x1EEB1, "M", "ص"), + (0x1EEB2, "M", "ق"), + (0x1EEB3, "M", "ر"), + (0x1EEB4, "M", "ش"), + (0x1EEB5, "M", "ت"), + (0x1EEB6, "M", "ث"), + (0x1EEB7, "M", "خ"), + (0x1EEB8, "M", "ذ"), + ] + + +def _seg_74() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1EEB9, "M", "ض"), + (0x1EEBA, "M", "ظ"), + (0x1EEBB, "M", "غ"), + (0x1EEBC, "X"), + (0x1EEF0, "V"), + (0x1EEF2, "X"), + (0x1F000, "V"), + (0x1F02C, "X"), + (0x1F030, "V"), + (0x1F094, "X"), + (0x1F0A0, "V"), + (0x1F0AF, "X"), + (0x1F0B1, "V"), + (0x1F0C0, "X"), + (0x1F0C1, "V"), + (0x1F0D0, "X"), + (0x1F0D1, "V"), + (0x1F0F6, "X"), + (0x1F101, "3", "0,"), + (0x1F102, "3", "1,"), + (0x1F103, "3", "2,"), + (0x1F104, "3", "3,"), + (0x1F105, "3", "4,"), + (0x1F106, "3", "5,"), + (0x1F107, "3", "6,"), + (0x1F108, "3", "7,"), + (0x1F109, "3", "8,"), + (0x1F10A, "3", "9,"), + (0x1F10B, "V"), + (0x1F110, "3", "(a)"), + (0x1F111, "3", "(b)"), + (0x1F112, "3", "(c)"), + (0x1F113, "3", "(d)"), + (0x1F114, "3", "(e)"), + (0x1F115, "3", "(f)"), + (0x1F116, "3", "(g)"), + (0x1F117, "3", "(h)"), + (0x1F118, "3", "(i)"), + (0x1F119, "3", "(j)"), + (0x1F11A, "3", "(k)"), + (0x1F11B, "3", "(l)"), + (0x1F11C, "3", "(m)"), + (0x1F11D, "3", "(n)"), + (0x1F11E, "3", "(o)"), + (0x1F11F, "3", "(p)"), + (0x1F120, "3", "(q)"), + (0x1F121, "3", "(r)"), + (0x1F122, "3", "(s)"), + (0x1F123, "3", "(t)"), + (0x1F124, "3", "(u)"), + (0x1F125, "3", "(v)"), + (0x1F126, "3", "(w)"), + (0x1F127, "3", "(x)"), + (0x1F128, "3", "(y)"), + (0x1F129, "3", "(z)"), + (0x1F12A, "M", "〔s〕"), + (0x1F12B, "M", "c"), + (0x1F12C, "M", "r"), + (0x1F12D, "M", "cd"), + (0x1F12E, "M", "wz"), + (0x1F12F, "V"), + (0x1F130, "M", "a"), + (0x1F131, "M", "b"), + (0x1F132, "M", "c"), + (0x1F133, "M", "d"), + (0x1F134, "M", "e"), + (0x1F135, "M", "f"), + (0x1F136, "M", "g"), + (0x1F137, "M", "h"), + (0x1F138, "M", "i"), + (0x1F139, "M", "j"), + (0x1F13A, "M", "k"), + (0x1F13B, "M", "l"), + (0x1F13C, "M", "m"), + (0x1F13D, "M", "n"), + (0x1F13E, "M", "o"), + (0x1F13F, "M", "p"), + (0x1F140, "M", "q"), + (0x1F141, "M", "r"), + (0x1F142, "M", "s"), + (0x1F143, "M", "t"), + (0x1F144, "M", "u"), + (0x1F145, "M", "v"), + (0x1F146, "M", "w"), + (0x1F147, "M", "x"), + (0x1F148, "M", "y"), + (0x1F149, "M", "z"), + (0x1F14A, "M", "hv"), + (0x1F14B, "M", "mv"), + (0x1F14C, "M", "sd"), + (0x1F14D, "M", "ss"), + (0x1F14E, "M", "ppv"), + (0x1F14F, "M", "wc"), + (0x1F150, "V"), + (0x1F16A, "M", "mc"), + (0x1F16B, "M", "md"), + (0x1F16C, "M", "mr"), + (0x1F16D, "V"), + (0x1F190, "M", "dj"), + (0x1F191, "V"), + ] + + +def _seg_75() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1F1AE, "X"), + (0x1F1E6, "V"), + (0x1F200, "M", "ほか"), + (0x1F201, "M", "ココ"), + (0x1F202, "M", "サ"), + (0x1F203, "X"), + (0x1F210, "M", "手"), + (0x1F211, "M", "字"), + (0x1F212, "M", "双"), + (0x1F213, "M", "デ"), + (0x1F214, "M", "二"), + (0x1F215, "M", "多"), + (0x1F216, "M", "解"), + (0x1F217, "M", "天"), + (0x1F218, "M", "交"), + (0x1F219, "M", "映"), + (0x1F21A, "M", "無"), + (0x1F21B, "M", "料"), + (0x1F21C, "M", "前"), + (0x1F21D, "M", "後"), + (0x1F21E, "M", "再"), + (0x1F21F, "M", "新"), + (0x1F220, "M", "初"), + (0x1F221, "M", "終"), + (0x1F222, "M", "生"), + (0x1F223, "M", "販"), + (0x1F224, "M", "声"), + (0x1F225, "M", "吹"), + (0x1F226, "M", "演"), + (0x1F227, "M", "投"), + (0x1F228, "M", "捕"), + (0x1F229, "M", "一"), + (0x1F22A, "M", "三"), + (0x1F22B, "M", "遊"), + (0x1F22C, "M", "左"), + (0x1F22D, "M", "中"), + (0x1F22E, "M", "右"), + (0x1F22F, "M", "指"), + (0x1F230, "M", "走"), + (0x1F231, "M", "打"), + (0x1F232, "M", "禁"), + (0x1F233, "M", "空"), + (0x1F234, "M", "合"), + (0x1F235, "M", "満"), + (0x1F236, "M", "有"), + (0x1F237, "M", "月"), + (0x1F238, "M", "申"), + (0x1F239, "M", "割"), + (0x1F23A, "M", "営"), + (0x1F23B, "M", "配"), + (0x1F23C, "X"), + (0x1F240, "M", "〔本〕"), + (0x1F241, "M", "〔三〕"), + (0x1F242, "M", "〔二〕"), + (0x1F243, "M", "〔安〕"), + (0x1F244, "M", "〔点〕"), + (0x1F245, "M", "〔打〕"), + (0x1F246, "M", "〔盗〕"), + (0x1F247, "M", "〔勝〕"), + (0x1F248, "M", "〔敗〕"), + (0x1F249, "X"), + (0x1F250, "M", "得"), + (0x1F251, "M", "可"), + (0x1F252, "X"), + (0x1F260, "V"), + (0x1F266, "X"), + (0x1F300, "V"), + (0x1F6D8, "X"), + (0x1F6DC, "V"), + (0x1F6ED, "X"), + (0x1F6F0, "V"), + (0x1F6FD, "X"), + (0x1F700, "V"), + (0x1F777, "X"), + (0x1F77B, "V"), + (0x1F7DA, "X"), + (0x1F7E0, "V"), + (0x1F7EC, "X"), + (0x1F7F0, "V"), + (0x1F7F1, "X"), + (0x1F800, "V"), + (0x1F80C, "X"), + (0x1F810, "V"), + (0x1F848, "X"), + (0x1F850, "V"), + (0x1F85A, "X"), + (0x1F860, "V"), + (0x1F888, "X"), + (0x1F890, "V"), + (0x1F8AE, "X"), + (0x1F8B0, "V"), + (0x1F8B2, "X"), + (0x1F900, "V"), + (0x1FA54, "X"), + (0x1FA60, "V"), + (0x1FA6E, "X"), + (0x1FA70, "V"), + (0x1FA7D, "X"), + (0x1FA80, "V"), + (0x1FA89, "X"), + ] + + +def _seg_76() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x1FA90, "V"), + (0x1FABE, "X"), + (0x1FABF, "V"), + (0x1FAC6, "X"), + (0x1FACE, "V"), + (0x1FADC, "X"), + (0x1FAE0, "V"), + (0x1FAE9, "X"), + (0x1FAF0, "V"), + (0x1FAF9, "X"), + (0x1FB00, "V"), + (0x1FB93, "X"), + (0x1FB94, "V"), + (0x1FBCB, "X"), + (0x1FBF0, "M", "0"), + (0x1FBF1, "M", "1"), + (0x1FBF2, "M", "2"), + (0x1FBF3, "M", "3"), + (0x1FBF4, "M", "4"), + (0x1FBF5, "M", "5"), + (0x1FBF6, "M", "6"), + (0x1FBF7, "M", "7"), + (0x1FBF8, "M", "8"), + (0x1FBF9, "M", "9"), + (0x1FBFA, "X"), + (0x20000, "V"), + (0x2A6E0, "X"), + (0x2A700, "V"), + (0x2B73A, "X"), + (0x2B740, "V"), + (0x2B81E, "X"), + (0x2B820, "V"), + (0x2CEA2, "X"), + (0x2CEB0, "V"), + (0x2EBE1, "X"), + (0x2EBF0, "V"), + (0x2EE5E, "X"), + (0x2F800, "M", "丽"), + (0x2F801, "M", "丸"), + (0x2F802, "M", "乁"), + (0x2F803, "M", "𠄢"), + (0x2F804, "M", "你"), + (0x2F805, "M", "侮"), + (0x2F806, "M", "侻"), + (0x2F807, "M", "倂"), + (0x2F808, "M", "偺"), + (0x2F809, "M", "備"), + (0x2F80A, "M", "僧"), + (0x2F80B, "M", "像"), + (0x2F80C, "M", "㒞"), + (0x2F80D, "M", "𠘺"), + (0x2F80E, "M", "免"), + (0x2F80F, "M", "兔"), + (0x2F810, "M", "兤"), + (0x2F811, "M", "具"), + (0x2F812, "M", "𠔜"), + (0x2F813, "M", "㒹"), + (0x2F814, "M", "內"), + (0x2F815, "M", "再"), + (0x2F816, "M", "𠕋"), + (0x2F817, "M", "冗"), + (0x2F818, "M", "冤"), + (0x2F819, "M", "仌"), + (0x2F81A, "M", "冬"), + (0x2F81B, "M", "况"), + (0x2F81C, "M", "𩇟"), + (0x2F81D, "M", "凵"), + (0x2F81E, "M", "刃"), + (0x2F81F, "M", "㓟"), + (0x2F820, "M", "刻"), + (0x2F821, "M", "剆"), + (0x2F822, "M", "割"), + (0x2F823, "M", "剷"), + (0x2F824, "M", "㔕"), + (0x2F825, "M", "勇"), + (0x2F826, "M", "勉"), + (0x2F827, "M", "勤"), + (0x2F828, "M", "勺"), + (0x2F829, "M", "包"), + (0x2F82A, "M", "匆"), + (0x2F82B, "M", "北"), + (0x2F82C, "M", "卉"), + (0x2F82D, "M", "卑"), + (0x2F82E, "M", "博"), + (0x2F82F, "M", "即"), + (0x2F830, "M", "卽"), + (0x2F831, "M", "卿"), + (0x2F834, "M", "𠨬"), + (0x2F835, "M", "灰"), + (0x2F836, "M", "及"), + (0x2F837, "M", "叟"), + (0x2F838, "M", "𠭣"), + (0x2F839, "M", "叫"), + (0x2F83A, "M", "叱"), + (0x2F83B, "M", "吆"), + (0x2F83C, "M", "咞"), + (0x2F83D, "M", "吸"), + (0x2F83E, "M", "呈"), + (0x2F83F, "M", "周"), + (0x2F840, "M", "咢"), + ] + + +def _seg_77() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2F841, "M", "哶"), + (0x2F842, "M", "唐"), + (0x2F843, "M", "啓"), + (0x2F844, "M", "啣"), + (0x2F845, "M", "善"), + (0x2F847, "M", "喙"), + (0x2F848, "M", "喫"), + (0x2F849, "M", "喳"), + (0x2F84A, "M", "嗂"), + (0x2F84B, "M", "圖"), + (0x2F84C, "M", "嘆"), + (0x2F84D, "M", "圗"), + (0x2F84E, "M", "噑"), + (0x2F84F, "M", "噴"), + (0x2F850, "M", "切"), + (0x2F851, "M", "壮"), + (0x2F852, "M", "城"), + (0x2F853, "M", "埴"), + (0x2F854, "M", "堍"), + (0x2F855, "M", "型"), + (0x2F856, "M", "堲"), + (0x2F857, "M", "報"), + (0x2F858, "M", "墬"), + (0x2F859, "M", "𡓤"), + (0x2F85A, "M", "売"), + (0x2F85B, "M", "壷"), + (0x2F85C, "M", "夆"), + (0x2F85D, "M", "多"), + (0x2F85E, "M", "夢"), + (0x2F85F, "M", "奢"), + (0x2F860, "M", "𡚨"), + (0x2F861, "M", "𡛪"), + (0x2F862, "M", "姬"), + (0x2F863, "M", "娛"), + (0x2F864, "M", "娧"), + (0x2F865, "M", "姘"), + (0x2F866, "M", "婦"), + (0x2F867, "M", "㛮"), + (0x2F868, "X"), + (0x2F869, "M", "嬈"), + (0x2F86A, "M", "嬾"), + (0x2F86C, "M", "𡧈"), + (0x2F86D, "M", "寃"), + (0x2F86E, "M", "寘"), + (0x2F86F, "M", "寧"), + (0x2F870, "M", "寳"), + (0x2F871, "M", "𡬘"), + (0x2F872, "M", "寿"), + (0x2F873, "M", "将"), + (0x2F874, "X"), + (0x2F875, "M", "尢"), + (0x2F876, "M", "㞁"), + (0x2F877, "M", "屠"), + (0x2F878, "M", "屮"), + (0x2F879, "M", "峀"), + (0x2F87A, "M", "岍"), + (0x2F87B, "M", "𡷤"), + (0x2F87C, "M", "嵃"), + (0x2F87D, "M", "𡷦"), + (0x2F87E, "M", "嵮"), + (0x2F87F, "M", "嵫"), + (0x2F880, "M", "嵼"), + (0x2F881, "M", "巡"), + (0x2F882, "M", "巢"), + (0x2F883, "M", "㠯"), + (0x2F884, "M", "巽"), + (0x2F885, "M", "帨"), + (0x2F886, "M", "帽"), + (0x2F887, "M", "幩"), + (0x2F888, "M", "㡢"), + (0x2F889, "M", "𢆃"), + (0x2F88A, "M", "㡼"), + (0x2F88B, "M", "庰"), + (0x2F88C, "M", "庳"), + (0x2F88D, "M", "庶"), + (0x2F88E, "M", "廊"), + (0x2F88F, "M", "𪎒"), + (0x2F890, "M", "廾"), + (0x2F891, "M", "𢌱"), + (0x2F893, "M", "舁"), + (0x2F894, "M", "弢"), + (0x2F896, "M", "㣇"), + (0x2F897, "M", "𣊸"), + (0x2F898, "M", "𦇚"), + (0x2F899, "M", "形"), + (0x2F89A, "M", "彫"), + (0x2F89B, "M", "㣣"), + (0x2F89C, "M", "徚"), + (0x2F89D, "M", "忍"), + (0x2F89E, "M", "志"), + (0x2F89F, "M", "忹"), + (0x2F8A0, "M", "悁"), + (0x2F8A1, "M", "㤺"), + (0x2F8A2, "M", "㤜"), + (0x2F8A3, "M", "悔"), + (0x2F8A4, "M", "𢛔"), + (0x2F8A5, "M", "惇"), + (0x2F8A6, "M", "慈"), + (0x2F8A7, "M", "慌"), + (0x2F8A8, "M", "慎"), + ] + + +def _seg_78() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2F8A9, "M", "慌"), + (0x2F8AA, "M", "慺"), + (0x2F8AB, "M", "憎"), + (0x2F8AC, "M", "憲"), + (0x2F8AD, "M", "憤"), + (0x2F8AE, "M", "憯"), + (0x2F8AF, "M", "懞"), + (0x2F8B0, "M", "懲"), + (0x2F8B1, "M", "懶"), + (0x2F8B2, "M", "成"), + (0x2F8B3, "M", "戛"), + (0x2F8B4, "M", "扝"), + (0x2F8B5, "M", "抱"), + (0x2F8B6, "M", "拔"), + (0x2F8B7, "M", "捐"), + (0x2F8B8, "M", "𢬌"), + (0x2F8B9, "M", "挽"), + (0x2F8BA, "M", "拼"), + (0x2F8BB, "M", "捨"), + (0x2F8BC, "M", "掃"), + (0x2F8BD, "M", "揤"), + (0x2F8BE, "M", "𢯱"), + (0x2F8BF, "M", "搢"), + (0x2F8C0, "M", "揅"), + (0x2F8C1, "M", "掩"), + (0x2F8C2, "M", "㨮"), + (0x2F8C3, "M", "摩"), + (0x2F8C4, "M", "摾"), + (0x2F8C5, "M", "撝"), + (0x2F8C6, "M", "摷"), + (0x2F8C7, "M", "㩬"), + (0x2F8C8, "M", "敏"), + (0x2F8C9, "M", "敬"), + (0x2F8CA, "M", "𣀊"), + (0x2F8CB, "M", "旣"), + (0x2F8CC, "M", "書"), + (0x2F8CD, "M", "晉"), + (0x2F8CE, "M", "㬙"), + (0x2F8CF, "M", "暑"), + (0x2F8D0, "M", "㬈"), + (0x2F8D1, "M", "㫤"), + (0x2F8D2, "M", "冒"), + (0x2F8D3, "M", "冕"), + (0x2F8D4, "M", "最"), + (0x2F8D5, "M", "暜"), + (0x2F8D6, "M", "肭"), + (0x2F8D7, "M", "䏙"), + (0x2F8D8, "M", "朗"), + (0x2F8D9, "M", "望"), + (0x2F8DA, "M", "朡"), + (0x2F8DB, "M", "杞"), + (0x2F8DC, "M", "杓"), + (0x2F8DD, "M", "𣏃"), + (0x2F8DE, "M", "㭉"), + (0x2F8DF, "M", "柺"), + (0x2F8E0, "M", "枅"), + (0x2F8E1, "M", "桒"), + (0x2F8E2, "M", "梅"), + (0x2F8E3, "M", "𣑭"), + (0x2F8E4, "M", "梎"), + (0x2F8E5, "M", "栟"), + (0x2F8E6, "M", "椔"), + (0x2F8E7, "M", "㮝"), + (0x2F8E8, "M", "楂"), + (0x2F8E9, "M", "榣"), + (0x2F8EA, "M", "槪"), + (0x2F8EB, "M", "檨"), + (0x2F8EC, "M", "𣚣"), + (0x2F8ED, "M", "櫛"), + (0x2F8EE, "M", "㰘"), + (0x2F8EF, "M", "次"), + (0x2F8F0, "M", "𣢧"), + (0x2F8F1, "M", "歔"), + (0x2F8F2, "M", "㱎"), + (0x2F8F3, "M", "歲"), + (0x2F8F4, "M", "殟"), + (0x2F8F5, "M", "殺"), + (0x2F8F6, "M", "殻"), + (0x2F8F7, "M", "𣪍"), + (0x2F8F8, "M", "𡴋"), + (0x2F8F9, "M", "𣫺"), + (0x2F8FA, "M", "汎"), + (0x2F8FB, "M", "𣲼"), + (0x2F8FC, "M", "沿"), + (0x2F8FD, "M", "泍"), + (0x2F8FE, "M", "汧"), + (0x2F8FF, "M", "洖"), + (0x2F900, "M", "派"), + (0x2F901, "M", "海"), + (0x2F902, "M", "流"), + (0x2F903, "M", "浩"), + (0x2F904, "M", "浸"), + (0x2F905, "M", "涅"), + (0x2F906, "M", "𣴞"), + (0x2F907, "M", "洴"), + (0x2F908, "M", "港"), + (0x2F909, "M", "湮"), + (0x2F90A, "M", "㴳"), + (0x2F90B, "M", "滋"), + (0x2F90C, "M", "滇"), + ] + + +def _seg_79() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2F90D, "M", "𣻑"), + (0x2F90E, "M", "淹"), + (0x2F90F, "M", "潮"), + (0x2F910, "M", "𣽞"), + (0x2F911, "M", "𣾎"), + (0x2F912, "M", "濆"), + (0x2F913, "M", "瀹"), + (0x2F914, "M", "瀞"), + (0x2F915, "M", "瀛"), + (0x2F916, "M", "㶖"), + (0x2F917, "M", "灊"), + (0x2F918, "M", "災"), + (0x2F919, "M", "灷"), + (0x2F91A, "M", "炭"), + (0x2F91B, "M", "𠔥"), + (0x2F91C, "M", "煅"), + (0x2F91D, "M", "𤉣"), + (0x2F91E, "M", "熜"), + (0x2F91F, "X"), + (0x2F920, "M", "爨"), + (0x2F921, "M", "爵"), + (0x2F922, "M", "牐"), + (0x2F923, "M", "𤘈"), + (0x2F924, "M", "犀"), + (0x2F925, "M", "犕"), + (0x2F926, "M", "𤜵"), + (0x2F927, "M", "𤠔"), + (0x2F928, "M", "獺"), + (0x2F929, "M", "王"), + (0x2F92A, "M", "㺬"), + (0x2F92B, "M", "玥"), + (0x2F92C, "M", "㺸"), + (0x2F92E, "M", "瑇"), + (0x2F92F, "M", "瑜"), + (0x2F930, "M", "瑱"), + (0x2F931, "M", "璅"), + (0x2F932, "M", "瓊"), + (0x2F933, "M", "㼛"), + (0x2F934, "M", "甤"), + (0x2F935, "M", "𤰶"), + (0x2F936, "M", "甾"), + (0x2F937, "M", "𤲒"), + (0x2F938, "M", "異"), + (0x2F939, "M", "𢆟"), + (0x2F93A, "M", "瘐"), + (0x2F93B, "M", "𤾡"), + (0x2F93C, "M", "𤾸"), + (0x2F93D, "M", "𥁄"), + (0x2F93E, "M", "㿼"), + (0x2F93F, "M", "䀈"), + (0x2F940, "M", "直"), + (0x2F941, "M", "𥃳"), + (0x2F942, "M", "𥃲"), + (0x2F943, "M", "𥄙"), + (0x2F944, "M", "𥄳"), + (0x2F945, "M", "眞"), + (0x2F946, "M", "真"), + (0x2F948, "M", "睊"), + (0x2F949, "M", "䀹"), + (0x2F94A, "M", "瞋"), + (0x2F94B, "M", "䁆"), + (0x2F94C, "M", "䂖"), + (0x2F94D, "M", "𥐝"), + (0x2F94E, "M", "硎"), + (0x2F94F, "M", "碌"), + (0x2F950, "M", "磌"), + (0x2F951, "M", "䃣"), + (0x2F952, "M", "𥘦"), + (0x2F953, "M", "祖"), + (0x2F954, "M", "𥚚"), + (0x2F955, "M", "𥛅"), + (0x2F956, "M", "福"), + (0x2F957, "M", "秫"), + (0x2F958, "M", "䄯"), + (0x2F959, "M", "穀"), + (0x2F95A, "M", "穊"), + (0x2F95B, "M", "穏"), + (0x2F95C, "M", "𥥼"), + (0x2F95D, "M", "𥪧"), + (0x2F95F, "X"), + (0x2F960, "M", "䈂"), + (0x2F961, "M", "𥮫"), + (0x2F962, "M", "篆"), + (0x2F963, "M", "築"), + (0x2F964, "M", "䈧"), + (0x2F965, "M", "𥲀"), + (0x2F966, "M", "糒"), + (0x2F967, "M", "䊠"), + (0x2F968, "M", "糨"), + (0x2F969, "M", "糣"), + (0x2F96A, "M", "紀"), + (0x2F96B, "M", "𥾆"), + (0x2F96C, "M", "絣"), + (0x2F96D, "M", "䌁"), + (0x2F96E, "M", "緇"), + (0x2F96F, "M", "縂"), + (0x2F970, "M", "繅"), + (0x2F971, "M", "䌴"), + (0x2F972, "M", "𦈨"), + (0x2F973, "M", "𦉇"), + ] + + +def _seg_80() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2F974, "M", "䍙"), + (0x2F975, "M", "𦋙"), + (0x2F976, "M", "罺"), + (0x2F977, "M", "𦌾"), + (0x2F978, "M", "羕"), + (0x2F979, "M", "翺"), + (0x2F97A, "M", "者"), + (0x2F97B, "M", "𦓚"), + (0x2F97C, "M", "𦔣"), + (0x2F97D, "M", "聠"), + (0x2F97E, "M", "𦖨"), + (0x2F97F, "M", "聰"), + (0x2F980, "M", "𣍟"), + (0x2F981, "M", "䏕"), + (0x2F982, "M", "育"), + (0x2F983, "M", "脃"), + (0x2F984, "M", "䐋"), + (0x2F985, "M", "脾"), + (0x2F986, "M", "媵"), + (0x2F987, "M", "𦞧"), + (0x2F988, "M", "𦞵"), + (0x2F989, "M", "𣎓"), + (0x2F98A, "M", "𣎜"), + (0x2F98B, "M", "舁"), + (0x2F98C, "M", "舄"), + (0x2F98D, "M", "辞"), + (0x2F98E, "M", "䑫"), + (0x2F98F, "M", "芑"), + (0x2F990, "M", "芋"), + (0x2F991, "M", "芝"), + (0x2F992, "M", "劳"), + (0x2F993, "M", "花"), + (0x2F994, "M", "芳"), + (0x2F995, "M", "芽"), + (0x2F996, "M", "苦"), + (0x2F997, "M", "𦬼"), + (0x2F998, "M", "若"), + (0x2F999, "M", "茝"), + (0x2F99A, "M", "荣"), + (0x2F99B, "M", "莭"), + (0x2F99C, "M", "茣"), + (0x2F99D, "M", "莽"), + (0x2F99E, "M", "菧"), + (0x2F99F, "M", "著"), + (0x2F9A0, "M", "荓"), + (0x2F9A1, "M", "菊"), + (0x2F9A2, "M", "菌"), + (0x2F9A3, "M", "菜"), + (0x2F9A4, "M", "𦰶"), + (0x2F9A5, "M", "𦵫"), + (0x2F9A6, "M", "𦳕"), + (0x2F9A7, "M", "䔫"), + (0x2F9A8, "M", "蓱"), + (0x2F9A9, "M", "蓳"), + (0x2F9AA, "M", "蔖"), + (0x2F9AB, "M", "𧏊"), + (0x2F9AC, "M", "蕤"), + (0x2F9AD, "M", "𦼬"), + (0x2F9AE, "M", "䕝"), + (0x2F9AF, "M", "䕡"), + (0x2F9B0, "M", "𦾱"), + (0x2F9B1, "M", "𧃒"), + (0x2F9B2, "M", "䕫"), + (0x2F9B3, "M", "虐"), + (0x2F9B4, "M", "虜"), + (0x2F9B5, "M", "虧"), + (0x2F9B6, "M", "虩"), + (0x2F9B7, "M", "蚩"), + (0x2F9B8, "M", "蚈"), + (0x2F9B9, "M", "蜎"), + (0x2F9BA, "M", "蛢"), + (0x2F9BB, "M", "蝹"), + (0x2F9BC, "M", "蜨"), + (0x2F9BD, "M", "蝫"), + (0x2F9BE, "M", "螆"), + (0x2F9BF, "X"), + (0x2F9C0, "M", "蟡"), + (0x2F9C1, "M", "蠁"), + (0x2F9C2, "M", "䗹"), + (0x2F9C3, "M", "衠"), + (0x2F9C4, "M", "衣"), + (0x2F9C5, "M", "𧙧"), + (0x2F9C6, "M", "裗"), + (0x2F9C7, "M", "裞"), + (0x2F9C8, "M", "䘵"), + (0x2F9C9, "M", "裺"), + (0x2F9CA, "M", "㒻"), + (0x2F9CB, "M", "𧢮"), + (0x2F9CC, "M", "𧥦"), + (0x2F9CD, "M", "䚾"), + (0x2F9CE, "M", "䛇"), + (0x2F9CF, "M", "誠"), + (0x2F9D0, "M", "諭"), + (0x2F9D1, "M", "變"), + (0x2F9D2, "M", "豕"), + (0x2F9D3, "M", "𧲨"), + (0x2F9D4, "M", "貫"), + (0x2F9D5, "M", "賁"), + (0x2F9D6, "M", "贛"), + (0x2F9D7, "M", "起"), + ] + + +def _seg_81() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]: + return [ + (0x2F9D8, "M", "𧼯"), + (0x2F9D9, "M", "𠠄"), + (0x2F9DA, "M", "跋"), + (0x2F9DB, "M", "趼"), + (0x2F9DC, "M", "跰"), + (0x2F9DD, "M", "𠣞"), + (0x2F9DE, "M", "軔"), + (0x2F9DF, "M", "輸"), + (0x2F9E0, "M", "𨗒"), + (0x2F9E1, "M", "𨗭"), + (0x2F9E2, "M", "邔"), + (0x2F9E3, "M", "郱"), + (0x2F9E4, "M", "鄑"), + (0x2F9E5, "M", "𨜮"), + (0x2F9E6, "M", "鄛"), + (0x2F9E7, "M", "鈸"), + (0x2F9E8, "M", "鋗"), + (0x2F9E9, "M", "鋘"), + (0x2F9EA, "M", "鉼"), + (0x2F9EB, "M", "鏹"), + (0x2F9EC, "M", "鐕"), + (0x2F9ED, "M", "𨯺"), + (0x2F9EE, "M", "開"), + (0x2F9EF, "M", "䦕"), + (0x2F9F0, "M", "閷"), + (0x2F9F1, "M", "𨵷"), + (0x2F9F2, "M", "䧦"), + (0x2F9F3, "M", "雃"), + (0x2F9F4, "M", "嶲"), + (0x2F9F5, "M", "霣"), + (0x2F9F6, "M", "𩅅"), + (0x2F9F7, "M", "𩈚"), + (0x2F9F8, "M", "䩮"), + (0x2F9F9, "M", "䩶"), + (0x2F9FA, "M", "韠"), + (0x2F9FB, "M", "𩐊"), + (0x2F9FC, "M", "䪲"), + (0x2F9FD, "M", "𩒖"), + (0x2F9FE, "M", "頋"), + (0x2FA00, "M", "頩"), + (0x2FA01, "M", "𩖶"), + (0x2FA02, "M", "飢"), + (0x2FA03, "M", "䬳"), + (0x2FA04, "M", "餩"), + (0x2FA05, "M", "馧"), + (0x2FA06, "M", "駂"), + (0x2FA07, "M", "駾"), + (0x2FA08, "M", "䯎"), + (0x2FA09, "M", "𩬰"), + (0x2FA0A, "M", "鬒"), + (0x2FA0B, "M", "鱀"), + (0x2FA0C, "M", "鳽"), + (0x2FA0D, "M", "䳎"), + (0x2FA0E, "M", "䳭"), + (0x2FA0F, "M", "鵧"), + (0x2FA10, "M", "𪃎"), + (0x2FA11, "M", "䳸"), + (0x2FA12, "M", "𪄅"), + (0x2FA13, "M", "𪈎"), + (0x2FA14, "M", "𪊑"), + (0x2FA15, "M", "麻"), + (0x2FA16, "M", "䵖"), + (0x2FA17, "M", "黹"), + (0x2FA18, "M", "黾"), + (0x2FA19, "M", "鼅"), + (0x2FA1A, "M", "鼏"), + (0x2FA1B, "M", "鼖"), + (0x2FA1C, "M", "鼻"), + (0x2FA1D, "M", "𪘀"), + (0x2FA1E, "X"), + (0x30000, "V"), + (0x3134B, "X"), + (0x31350, "V"), + (0x323B0, "X"), + (0xE0100, "I"), + (0xE01F0, "X"), + ] + + +uts46data = tuple( + _seg_0() + + _seg_1() + + _seg_2() + + _seg_3() + + _seg_4() + + _seg_5() + + _seg_6() + + _seg_7() + + _seg_8() + + _seg_9() + + _seg_10() + + _seg_11() + + _seg_12() + + _seg_13() + + _seg_14() + + _seg_15() + + _seg_16() + + _seg_17() + + _seg_18() + + _seg_19() + + _seg_20() + + _seg_21() + + _seg_22() + + _seg_23() + + _seg_24() + + _seg_25() + + _seg_26() + + _seg_27() + + _seg_28() + + _seg_29() + + _seg_30() + + _seg_31() + + _seg_32() + + _seg_33() + + _seg_34() + + _seg_35() + + _seg_36() + + _seg_37() + + _seg_38() + + _seg_39() + + _seg_40() + + _seg_41() + + _seg_42() + + _seg_43() + + _seg_44() + + _seg_45() + + _seg_46() + + _seg_47() + + _seg_48() + + _seg_49() + + _seg_50() + + _seg_51() + + _seg_52() + + _seg_53() + + _seg_54() + + _seg_55() + + _seg_56() + + _seg_57() + + _seg_58() + + _seg_59() + + _seg_60() + + _seg_61() + + _seg_62() + + _seg_63() + + _seg_64() + + _seg_65() + + _seg_66() + + _seg_67() + + _seg_68() + + _seg_69() + + _seg_70() + + _seg_71() + + _seg_72() + + _seg_73() + + _seg_74() + + _seg_75() + + _seg_76() + + _seg_77() + + _seg_78() + + _seg_79() + + _seg_80() + + _seg_81() +) # type: Tuple[Union[Tuple[int, str], Tuple[int, str, str]], ...] diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata-6.7.0.dist-info/INSTALLER b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata-6.7.0.dist-info/INSTALLER new file mode 100755 index 00000000..a1b589e3 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata-6.7.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata-6.7.0.dist-info/LICENSE b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata-6.7.0.dist-info/LICENSE new file mode 100755 index 00000000..d6456956 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata-6.7.0.dist-info/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata-6.7.0.dist-info/METADATA b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata-6.7.0.dist-info/METADATA new file mode 100755 index 00000000..62725033 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata-6.7.0.dist-info/METADATA @@ -0,0 +1,134 @@ +Metadata-Version: 2.1 +Name: importlib-metadata +Version: 6.7.0 +Summary: Read metadata from Python packages +Home-page: https://github.com/python/importlib_metadata +Author: Jason R. Coombs +Author-email: jaraco@jaraco.com +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: Apache Software License +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Requires-Python: >=3.7 +License-File: LICENSE +Requires-Dist: zipp (>=0.5) +Requires-Dist: typing-extensions (>=3.6.4) ; python_version < "3.8" +Provides-Extra: docs +Requires-Dist: sphinx (>=3.5) ; extra == 'docs' +Requires-Dist: jaraco.packaging (>=9) ; extra == 'docs' +Requires-Dist: rst.linker (>=1.9) ; extra == 'docs' +Requires-Dist: furo ; extra == 'docs' +Requires-Dist: sphinx-lint ; extra == 'docs' +Requires-Dist: jaraco.tidelift (>=1.4) ; extra == 'docs' +Provides-Extra: perf +Requires-Dist: ipython ; extra == 'perf' +Provides-Extra: testing +Requires-Dist: pytest (>=6) ; extra == 'testing' +Requires-Dist: pytest-checkdocs (>=2.4) ; extra == 'testing' +Requires-Dist: pytest-cov ; extra == 'testing' +Requires-Dist: pytest-enabler (>=1.3) ; extra == 'testing' +Requires-Dist: pytest-ruff ; extra == 'testing' +Requires-Dist: packaging ; extra == 'testing' +Requires-Dist: pyfakefs ; extra == 'testing' +Requires-Dist: flufl.flake8 ; extra == 'testing' +Requires-Dist: pytest-perf (>=0.9.2) ; extra == 'testing' +Requires-Dist: pytest-black (>=0.3.7) ; (platform_python_implementation != "PyPy") and extra == 'testing' +Requires-Dist: pytest-mypy (>=0.9.1) ; (platform_python_implementation != "PyPy") and extra == 'testing' +Requires-Dist: importlib-resources (>=1.3) ; (python_version < "3.9") and extra == 'testing' + +.. image:: https://img.shields.io/pypi/v/importlib_metadata.svg + :target: https://pypi.org/project/importlib_metadata + +.. image:: https://img.shields.io/pypi/pyversions/importlib_metadata.svg + +.. image:: https://github.com/python/importlib_metadata/workflows/tests/badge.svg + :target: https://github.com/python/importlib_metadata/actions?query=workflow%3A%22tests%22 + :alt: tests + +.. image:: https://img.shields.io/badge/code%20style-black-000000.svg + :target: https://github.com/psf/black + :alt: Code style: Black + +.. image:: https://readthedocs.org/projects/importlib-metadata/badge/?version=latest + :target: https://importlib-metadata.readthedocs.io/en/latest/?badge=latest + +.. image:: https://img.shields.io/badge/skeleton-2023-informational + :target: https://blog.jaraco.com/skeleton + +.. image:: https://tidelift.com/badges/package/pypi/importlib-metadata + :target: https://tidelift.com/subscription/pkg/pypi-importlib-metadata?utm_source=pypi-importlib-metadata&utm_medium=readme + +Library to access the metadata for a Python package. + +This package supplies third-party access to the functionality of +`importlib.metadata `_ +including improvements added to subsequent Python versions. + + +Compatibility +============= + +New features are introduced in this third-party library and later merged +into CPython. The following table indicates which versions of this library +were contributed to different versions in the standard library: + +.. list-table:: + :header-rows: 1 + + * - importlib_metadata + - stdlib + * - 6.5 + - 3.12 + * - 4.13 + - 3.11 + * - 4.6 + - 3.10 + * - 1.4 + - 3.8 + + +Usage +===== + +See the `online documentation `_ +for usage details. + +`Finder authors +`_ can +also add support for custom package installers. See the above documentation +for details. + + +Caveats +======= + +This project primarily supports third-party packages installed by PyPA +tools (or other conforming packages). It does not support: + +- Packages in the stdlib. +- Packages installed without metadata. + +Project details +=============== + + * Project home: https://github.com/python/importlib_metadata + * Report bugs at: https://github.com/python/importlib_metadata/issues + * Code hosting: https://github.com/python/importlib_metadata + * Documentation: https://importlib-metadata.readthedocs.io/ + +For Enterprise +============== + +Available as part of the Tidelift Subscription. + +This project and the maintainers of thousands of other packages are working with Tidelift to deliver one enterprise subscription that covers all of the open source you use. + +`Learn more `_. + +Security Contact +================ + +To report a security vulnerability, please use the +`Tidelift security contact `_. +Tidelift will coordinate the fix and disclosure. diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata-6.7.0.dist-info/RECORD b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata-6.7.0.dist-info/RECORD new file mode 100755 index 00000000..471778fc --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata-6.7.0.dist-info/RECORD @@ -0,0 +1,16 @@ +importlib_metadata-6.7.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +importlib_metadata-6.7.0.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358 +importlib_metadata-6.7.0.dist-info/METADATA,sha256=JDrzuuLRE3CxIRXLeXdZGGFDrVlEXUvt-chm0-s-TtI,4878 +importlib_metadata-6.7.0.dist-info/RECORD,, +importlib_metadata-6.7.0.dist-info/WHEEL,sha256=pkctZYzUS4AYVn6dJ-7367OJZivF2e8RA9b_ZBjif18,92 +importlib_metadata-6.7.0.dist-info/top_level.txt,sha256=CO3fD9yylANiXkrMo4qHLV_mqXL2sC5JFKgt1yWAT-A,19 +importlib_metadata/__init__.py,sha256=MQx_tU_lZg-7U91wdrlrsDt0MGPXkpraLevB8LO1NNc,30724 +importlib_metadata/_adapters.py,sha256=i8S6Ib1OQjcILA-l4gkzktMZe18TaeUNI49PLRp6OBU,2454 +importlib_metadata/_collections.py,sha256=CJ0OTCHIjWA0ZIVS4voORAsn2R4R2cQBEtPsZEJpASY,743 +importlib_metadata/_compat.py,sha256=xaiD8pwYYPCWkVgR30411iT4OmLbSbSAigzhp0nTROw,1735 +importlib_metadata/_functools.py,sha256=PsY2-4rrKX4RVeRC1oGp1lB1pmC9eKN88_f-bD9uOoA,2895 +importlib_metadata/_itertools.py,sha256=cvr_2v8BRbxcIl5x5ldfqdHjhI8Yi8s8yk50G_nm6jQ,2068 +importlib_metadata/_meta.py,sha256=I2AuaUMr5a6cTdZleV9WpyqUCSooqqV-zSzr1qn7FMw,1615 +importlib_metadata/_py39compat.py,sha256=2Tk5twb_VgLCY-1NEAQjdZp_S9OFMC-pUzP2isuaPsQ,1098 +importlib_metadata/_text.py,sha256=HCsFksZpJLeTP3NEk_ngrAeXVRRtTrtyh9eOABoRP4A,2166 +importlib_metadata/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata-6.7.0.dist-info/WHEEL b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata-6.7.0.dist-info/WHEEL new file mode 100755 index 00000000..1f37c02f --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata-6.7.0.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.40.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata/__init__.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata/__init__.py new file mode 100755 index 00000000..8147d2f0 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata/__init__.py @@ -0,0 +1,1015 @@ +import os +import re +import abc +import csv +import sys +import zipp +import email +import inspect +import pathlib +import operator +import textwrap +import warnings +import functools +import itertools +import posixpath +import collections + +from . import _adapters, _meta, _py39compat +from ._collections import FreezableDefaultDict, Pair +from ._compat import ( + NullFinder, + StrPath, + install, + pypy_partial, +) +from ._functools import method_cache, pass_none +from ._itertools import always_iterable, unique_everseen +from ._meta import PackageMetadata, SimplePath + +from contextlib import suppress +from importlib import import_module +from importlib.abc import MetaPathFinder +from itertools import starmap +from typing import Iterable, List, Mapping, Optional, Set, cast + +__all__ = [ + 'Distribution', + 'DistributionFinder', + 'PackageMetadata', + 'PackageNotFoundError', + 'distribution', + 'distributions', + 'entry_points', + 'files', + 'metadata', + 'packages_distributions', + 'requires', + 'version', +] + + +class PackageNotFoundError(ModuleNotFoundError): + """The package was not found.""" + + def __str__(self) -> str: + return f"No package metadata was found for {self.name}" + + @property + def name(self) -> str: # type: ignore[override] + (name,) = self.args + return name + + +class Sectioned: + """ + A simple entry point config parser for performance + + >>> for item in Sectioned.read(Sectioned._sample): + ... print(item) + Pair(name='sec1', value='# comments ignored') + Pair(name='sec1', value='a = 1') + Pair(name='sec1', value='b = 2') + Pair(name='sec2', value='a = 2') + + >>> res = Sectioned.section_pairs(Sectioned._sample) + >>> item = next(res) + >>> item.name + 'sec1' + >>> item.value + Pair(name='a', value='1') + >>> item = next(res) + >>> item.value + Pair(name='b', value='2') + >>> item = next(res) + >>> item.name + 'sec2' + >>> item.value + Pair(name='a', value='2') + >>> list(res) + [] + """ + + _sample = textwrap.dedent( + """ + [sec1] + # comments ignored + a = 1 + b = 2 + + [sec2] + a = 2 + """ + ).lstrip() + + @classmethod + def section_pairs(cls, text): + return ( + section._replace(value=Pair.parse(section.value)) + for section in cls.read(text, filter_=cls.valid) + if section.name is not None + ) + + @staticmethod + def read(text, filter_=None): + lines = filter(filter_, map(str.strip, text.splitlines())) + name = None + for value in lines: + section_match = value.startswith('[') and value.endswith(']') + if section_match: + name = value.strip('[]') + continue + yield Pair(name, value) + + @staticmethod + def valid(line: str): + return line and not line.startswith('#') + + +class DeprecatedTuple: + """ + Provide subscript item access for backward compatibility. + + >>> recwarn = getfixture('recwarn') + >>> ep = EntryPoint(name='name', value='value', group='group') + >>> ep[:] + ('name', 'value', 'group') + >>> ep[0] + 'name' + >>> len(recwarn) + 1 + """ + + # Do not remove prior to 2023-05-01 or Python 3.13 + _warn = functools.partial( + warnings.warn, + "EntryPoint tuple interface is deprecated. Access members by name.", + DeprecationWarning, + stacklevel=pypy_partial(2), + ) + + def __getitem__(self, item): + self._warn() + return self._key()[item] + + +class EntryPoint(DeprecatedTuple): + """An entry point as defined by Python packaging conventions. + + See `the packaging docs on entry points + `_ + for more information. + + >>> ep = EntryPoint( + ... name=None, group=None, value='package.module:attr [extra1, extra2]') + >>> ep.module + 'package.module' + >>> ep.attr + 'attr' + >>> ep.extras + ['extra1', 'extra2'] + """ + + pattern = re.compile( + r'(?P[\w.]+)\s*' + r'(:\s*(?P[\w.]+)\s*)?' + r'((?P\[.*\])\s*)?$' + ) + """ + A regular expression describing the syntax for an entry point, + which might look like: + + - module + - package.module + - package.module:attribute + - package.module:object.attribute + - package.module:attr [extra1, extra2] + + Other combinations are possible as well. + + The expression is lenient about whitespace around the ':', + following the attr, and following any extras. + """ + + name: str + value: str + group: str + + dist: Optional['Distribution'] = None + + def __init__(self, name: str, value: str, group: str) -> None: + vars(self).update(name=name, value=value, group=group) + + def load(self): + """Load the entry point from its definition. If only a module + is indicated by the value, return that module. Otherwise, + return the named object. + """ + match = self.pattern.match(self.value) + module = import_module(match.group('module')) + attrs = filter(None, (match.group('attr') or '').split('.')) + return functools.reduce(getattr, attrs, module) + + @property + def module(self) -> str: + match = self.pattern.match(self.value) + assert match is not None + return match.group('module') + + @property + def attr(self) -> str: + match = self.pattern.match(self.value) + assert match is not None + return match.group('attr') + + @property + def extras(self) -> List[str]: + match = self.pattern.match(self.value) + assert match is not None + return re.findall(r'\w+', match.group('extras') or '') + + def _for(self, dist): + vars(self).update(dist=dist) + return self + + def matches(self, **params): + """ + EntryPoint matches the given parameters. + + >>> ep = EntryPoint(group='foo', name='bar', value='bing:bong [extra1, extra2]') + >>> ep.matches(group='foo') + True + >>> ep.matches(name='bar', value='bing:bong [extra1, extra2]') + True + >>> ep.matches(group='foo', name='other') + False + >>> ep.matches() + True + >>> ep.matches(extras=['extra1', 'extra2']) + True + >>> ep.matches(module='bing') + True + >>> ep.matches(attr='bong') + True + """ + attrs = (getattr(self, param) for param in params) + return all(map(operator.eq, params.values(), attrs)) + + def _key(self): + return self.name, self.value, self.group + + def __lt__(self, other): + return self._key() < other._key() + + def __eq__(self, other): + return self._key() == other._key() + + def __setattr__(self, name, value): + raise AttributeError("EntryPoint objects are immutable.") + + def __repr__(self): + return ( + f'EntryPoint(name={self.name!r}, value={self.value!r}, ' + f'group={self.group!r})' + ) + + def __hash__(self) -> int: + return hash(self._key()) + + +class EntryPoints(tuple): + """ + An immutable collection of selectable EntryPoint objects. + """ + + __slots__ = () + + def __getitem__(self, name: str) -> EntryPoint: # type: ignore[override] + """ + Get the EntryPoint in self matching name. + """ + try: + return next(iter(self.select(name=name))) + except StopIteration: + raise KeyError(name) + + def select(self, **params): + """ + Select entry points from self that match the + given parameters (typically group and/or name). + """ + return EntryPoints(ep for ep in self if _py39compat.ep_matches(ep, **params)) + + @property + def names(self) -> Set[str]: + """ + Return the set of all names of all entry points. + """ + return {ep.name for ep in self} + + @property + def groups(self) -> Set[str]: + """ + Return the set of all groups of all entry points. + """ + return {ep.group for ep in self} + + @classmethod + def _from_text_for(cls, text, dist): + return cls(ep._for(dist) for ep in cls._from_text(text)) + + @staticmethod + def _from_text(text): + return ( + EntryPoint(name=item.value.name, value=item.value.value, group=item.name) + for item in Sectioned.section_pairs(text or '') + ) + + +class PackagePath(pathlib.PurePosixPath): + """A reference to a path in a package""" + + hash: Optional["FileHash"] + size: int + dist: "Distribution" + + def read_text(self, encoding: str = 'utf-8') -> str: # type: ignore[override] + with self.locate().open(encoding=encoding) as stream: + return stream.read() + + def read_binary(self) -> bytes: + with self.locate().open('rb') as stream: + return stream.read() + + def locate(self) -> pathlib.Path: + """Return a path-like object for this path""" + return self.dist.locate_file(self) + + +class FileHash: + def __init__(self, spec: str) -> None: + self.mode, _, self.value = spec.partition('=') + + def __repr__(self) -> str: + return f'' + + +class DeprecatedNonAbstract: + def __new__(cls, *args, **kwargs): + all_names = { + name for subclass in inspect.getmro(cls) for name in vars(subclass) + } + abstract = { + name + for name in all_names + if getattr(getattr(cls, name), '__isabstractmethod__', False) + } + if abstract: + warnings.warn( + f"Unimplemented abstract methods {abstract}", + DeprecationWarning, + stacklevel=2, + ) + return super().__new__(cls) + + +class Distribution(DeprecatedNonAbstract): + """A Python distribution package.""" + + @abc.abstractmethod + def read_text(self, filename) -> Optional[str]: + """Attempt to load metadata file given by the name. + + :param filename: The name of the file in the distribution info. + :return: The text if found, otherwise None. + """ + + @abc.abstractmethod + def locate_file(self, path: StrPath) -> pathlib.Path: + """ + Given a path to a file in this distribution, return a path + to it. + """ + + @classmethod + def from_name(cls, name: str) -> "Distribution": + """Return the Distribution for the given package name. + + :param name: The name of the distribution package to search for. + :return: The Distribution instance (or subclass thereof) for the named + package, if found. + :raises PackageNotFoundError: When the named package's distribution + metadata cannot be found. + :raises ValueError: When an invalid value is supplied for name. + """ + if not name: + raise ValueError("A distribution name is required.") + try: + return next(iter(cls.discover(name=name))) + except StopIteration: + raise PackageNotFoundError(name) + + @classmethod + def discover(cls, **kwargs) -> Iterable["Distribution"]: + """Return an iterable of Distribution objects for all packages. + + Pass a ``context`` or pass keyword arguments for constructing + a context. + + :context: A ``DistributionFinder.Context`` object. + :return: Iterable of Distribution objects for all packages. + """ + context = kwargs.pop('context', None) + if context and kwargs: + raise ValueError("cannot accept context and kwargs") + context = context or DistributionFinder.Context(**kwargs) + return itertools.chain.from_iterable( + resolver(context) for resolver in cls._discover_resolvers() + ) + + @staticmethod + def at(path: StrPath) -> "Distribution": + """Return a Distribution for the indicated metadata path + + :param path: a string or path-like object + :return: a concrete Distribution instance for the path + """ + return PathDistribution(pathlib.Path(path)) + + @staticmethod + def _discover_resolvers(): + """Search the meta_path for resolvers.""" + declared = ( + getattr(finder, 'find_distributions', None) for finder in sys.meta_path + ) + return filter(None, declared) + + @property + def metadata(self) -> _meta.PackageMetadata: + """Return the parsed metadata for this Distribution. + + The returned object will have keys that name the various bits of + metadata. See PEP 566 for details. + """ + opt_text = ( + self.read_text('METADATA') + or self.read_text('PKG-INFO') + # This last clause is here to support old egg-info files. Its + # effect is to just end up using the PathDistribution's self._path + # (which points to the egg-info file) attribute unchanged. + or self.read_text('') + ) + text = cast(str, opt_text) + return _adapters.Message(email.message_from_string(text)) + + @property + def name(self) -> str: + """Return the 'Name' metadata for the distribution package.""" + return self.metadata['Name'] + + @property + def _normalized_name(self): + """Return a normalized version of the name.""" + return Prepared.normalize(self.name) + + @property + def version(self) -> str: + """Return the 'Version' metadata for the distribution package.""" + return self.metadata['Version'] + + @property + def entry_points(self) -> EntryPoints: + return EntryPoints._from_text_for(self.read_text('entry_points.txt'), self) + + @property + def files(self) -> Optional[List[PackagePath]]: + """Files in this distribution. + + :return: List of PackagePath for this distribution or None + + Result is `None` if the metadata file that enumerates files + (i.e. RECORD for dist-info, or installed-files.txt or + SOURCES.txt for egg-info) is missing. + Result may be empty if the metadata exists but is empty. + """ + + def make_file(name, hash=None, size_str=None): + result = PackagePath(name) + result.hash = FileHash(hash) if hash else None + result.size = int(size_str) if size_str else None + result.dist = self + return result + + @pass_none + def make_files(lines): + return starmap(make_file, csv.reader(lines)) + + @pass_none + def skip_missing_files(package_paths): + return list(filter(lambda path: path.locate().exists(), package_paths)) + + return skip_missing_files( + make_files( + self._read_files_distinfo() + or self._read_files_egginfo_installed() + or self._read_files_egginfo_sources() + ) + ) + + def _read_files_distinfo(self): + """ + Read the lines of RECORD + """ + text = self.read_text('RECORD') + return text and text.splitlines() + + def _read_files_egginfo_installed(self): + """ + Read installed-files.txt and return lines in a similar + CSV-parsable format as RECORD: each file must be placed + relative to the site-packages directory and must also be + quoted (since file names can contain literal commas). + + This file is written when the package is installed by pip, + but it might not be written for other installation methods. + Assume the file is accurate if it exists. + """ + text = self.read_text('installed-files.txt') + # Prepend the .egg-info/ subdir to the lines in this file. + # But this subdir is only available from PathDistribution's + # self._path. + subdir = getattr(self, '_path', None) + if not text or not subdir: + return + + paths = ( + (subdir / name) + .resolve() + .relative_to(self.locate_file('').resolve()) + .as_posix() + for name in text.splitlines() + ) + return map('"{}"'.format, paths) + + def _read_files_egginfo_sources(self): + """ + Read SOURCES.txt and return lines in a similar CSV-parsable + format as RECORD: each file name must be quoted (since it + might contain literal commas). + + Note that SOURCES.txt is not a reliable source for what + files are installed by a package. This file is generated + for a source archive, and the files that are present + there (e.g. setup.py) may not correctly reflect the files + that are present after the package has been installed. + """ + text = self.read_text('SOURCES.txt') + return text and map('"{}"'.format, text.splitlines()) + + @property + def requires(self) -> Optional[List[str]]: + """Generated requirements specified for this Distribution""" + reqs = self._read_dist_info_reqs() or self._read_egg_info_reqs() + return reqs and list(reqs) + + def _read_dist_info_reqs(self): + return self.metadata.get_all('Requires-Dist') + + def _read_egg_info_reqs(self): + source = self.read_text('requires.txt') + return pass_none(self._deps_from_requires_text)(source) + + @classmethod + def _deps_from_requires_text(cls, source): + return cls._convert_egg_info_reqs_to_simple_reqs(Sectioned.read(source)) + + @staticmethod + def _convert_egg_info_reqs_to_simple_reqs(sections): + """ + Historically, setuptools would solicit and store 'extra' + requirements, including those with environment markers, + in separate sections. More modern tools expect each + dependency to be defined separately, with any relevant + extras and environment markers attached directly to that + requirement. This method converts the former to the + latter. See _test_deps_from_requires_text for an example. + """ + + def make_condition(name): + return name and f'extra == "{name}"' + + def quoted_marker(section): + section = section or '' + extra, sep, markers = section.partition(':') + if extra and markers: + markers = f'({markers})' + conditions = list(filter(None, [markers, make_condition(extra)])) + return '; ' + ' and '.join(conditions) if conditions else '' + + def url_req_space(req): + """ + PEP 508 requires a space between the url_spec and the quoted_marker. + Ref python/importlib_metadata#357. + """ + # '@' is uniquely indicative of a url_req. + return ' ' * ('@' in req) + + for section in sections: + space = url_req_space(section.value) + yield section.value + space + quoted_marker(section.name) + + +class DistributionFinder(MetaPathFinder): + """ + A MetaPathFinder capable of discovering installed distributions. + """ + + class Context: + """ + Keyword arguments presented by the caller to + ``distributions()`` or ``Distribution.discover()`` + to narrow the scope of a search for distributions + in all DistributionFinders. + + Each DistributionFinder may expect any parameters + and should attempt to honor the canonical + parameters defined below when appropriate. + """ + + name = None + """ + Specific name for which a distribution finder should match. + A name of ``None`` matches all distributions. + """ + + def __init__(self, **kwargs): + vars(self).update(kwargs) + + @property + def path(self) -> List[str]: + """ + The sequence of directory path that a distribution finder + should search. + + Typically refers to Python installed package paths such as + "site-packages" directories and defaults to ``sys.path``. + """ + return vars(self).get('path', sys.path) + + @abc.abstractmethod + def find_distributions(self, context=Context()) -> Iterable[Distribution]: + """ + Find distributions. + + Return an iterable of all Distribution instances capable of + loading the metadata for packages matching the ``context``, + a DistributionFinder.Context instance. + """ + + +class FastPath: + """ + Micro-optimized class for searching a path for + children. + + >>> FastPath('').children() + ['...'] + """ + + @functools.lru_cache() # type: ignore + def __new__(cls, root): + return super().__new__(cls) + + def __init__(self, root): + self.root = root + + def joinpath(self, child): + return pathlib.Path(self.root, child) + + def children(self): + with suppress(Exception): + return os.listdir(self.root or '.') + with suppress(Exception): + return self.zip_children() + return [] + + def zip_children(self): + zip_path = zipp.Path(self.root) + names = zip_path.root.namelist() + self.joinpath = zip_path.joinpath + + return dict.fromkeys(child.split(posixpath.sep, 1)[0] for child in names) + + def search(self, name): + return self.lookup(self.mtime).search(name) + + @property + def mtime(self): + with suppress(OSError): + return os.stat(self.root).st_mtime + self.lookup.cache_clear() + + @method_cache + def lookup(self, mtime): + return Lookup(self) + + +class Lookup: + def __init__(self, path: FastPath): + base = os.path.basename(path.root).lower() + base_is_egg = base.endswith(".egg") + self.infos = FreezableDefaultDict(list) + self.eggs = FreezableDefaultDict(list) + + for child in path.children(): + low = child.lower() + if low.endswith((".dist-info", ".egg-info")): + # rpartition is faster than splitext and suitable for this purpose. + name = low.rpartition(".")[0].partition("-")[0] + normalized = Prepared.normalize(name) + self.infos[normalized].append(path.joinpath(child)) + elif base_is_egg and low == "egg-info": + name = base.rpartition(".")[0].partition("-")[0] + legacy_normalized = Prepared.legacy_normalize(name) + self.eggs[legacy_normalized].append(path.joinpath(child)) + + self.infos.freeze() + self.eggs.freeze() + + def search(self, prepared): + infos = ( + self.infos[prepared.normalized] + if prepared + else itertools.chain.from_iterable(self.infos.values()) + ) + eggs = ( + self.eggs[prepared.legacy_normalized] + if prepared + else itertools.chain.from_iterable(self.eggs.values()) + ) + return itertools.chain(infos, eggs) + + +class Prepared: + """ + A prepared search for metadata on a possibly-named package. + """ + + normalized = None + legacy_normalized = None + + def __init__(self, name): + self.name = name + if name is None: + return + self.normalized = self.normalize(name) + self.legacy_normalized = self.legacy_normalize(name) + + @staticmethod + def normalize(name): + """ + PEP 503 normalization plus dashes as underscores. + """ + return re.sub(r"[-_.]+", "-", name).lower().replace('-', '_') + + @staticmethod + def legacy_normalize(name): + """ + Normalize the package name as found in the convention in + older packaging tools versions and specs. + """ + return name.lower().replace('-', '_') + + def __bool__(self): + return bool(self.name) + + +@install +class MetadataPathFinder(NullFinder, DistributionFinder): + """A degenerate finder for distribution packages on the file system. + + This finder supplies only a find_distributions() method for versions + of Python that do not have a PathFinder find_distributions(). + """ + + def find_distributions( + self, context=DistributionFinder.Context() + ) -> Iterable["PathDistribution"]: + """ + Find distributions. + + Return an iterable of all Distribution instances capable of + loading the metadata for packages matching ``context.name`` + (or all names if ``None`` indicated) along the paths in the list + of directories ``context.path``. + """ + found = self._search_paths(context.name, context.path) + return map(PathDistribution, found) + + @classmethod + def _search_paths(cls, name, paths): + """Find metadata directories in paths heuristically.""" + prepared = Prepared(name) + return itertools.chain.from_iterable( + path.search(prepared) for path in map(FastPath, paths) + ) + + def invalidate_caches(cls) -> None: + FastPath.__new__.cache_clear() + + +class PathDistribution(Distribution): + def __init__(self, path: SimplePath) -> None: + """Construct a distribution. + + :param path: SimplePath indicating the metadata directory. + """ + self._path = path + + def read_text(self, filename: StrPath) -> Optional[str]: + with suppress( + FileNotFoundError, + IsADirectoryError, + KeyError, + NotADirectoryError, + PermissionError, + ): + return self._path.joinpath(filename).read_text(encoding='utf-8') + + return None + + read_text.__doc__ = Distribution.read_text.__doc__ + + def locate_file(self, path: StrPath) -> pathlib.Path: + return self._path.parent / path + + @property + def _normalized_name(self): + """ + Performance optimization: where possible, resolve the + normalized name from the file system path. + """ + stem = os.path.basename(str(self._path)) + return ( + pass_none(Prepared.normalize)(self._name_from_stem(stem)) + or super()._normalized_name + ) + + @staticmethod + def _name_from_stem(stem): + """ + >>> PathDistribution._name_from_stem('foo-3.0.egg-info') + 'foo' + >>> PathDistribution._name_from_stem('CherryPy-3.0.dist-info') + 'CherryPy' + >>> PathDistribution._name_from_stem('face.egg-info') + 'face' + >>> PathDistribution._name_from_stem('foo.bar') + """ + filename, ext = os.path.splitext(stem) + if ext not in ('.dist-info', '.egg-info'): + return + name, sep, rest = filename.partition('-') + return name + + +def distribution(distribution_name) -> Distribution: + """Get the ``Distribution`` instance for the named package. + + :param distribution_name: The name of the distribution package as a string. + :return: A ``Distribution`` instance (or subclass thereof). + """ + return Distribution.from_name(distribution_name) + + +def distributions(**kwargs) -> Iterable[Distribution]: + """Get all ``Distribution`` instances in the current environment. + + :return: An iterable of ``Distribution`` instances. + """ + return Distribution.discover(**kwargs) + + +def metadata(distribution_name) -> _meta.PackageMetadata: + """Get the metadata for the named package. + + :param distribution_name: The name of the distribution package to query. + :return: A PackageMetadata containing the parsed metadata. + """ + return Distribution.from_name(distribution_name).metadata + + +def version(distribution_name) -> str: + """Get the version string for the named package. + + :param distribution_name: The name of the distribution package to query. + :return: The version string for the package as defined in the package's + "Version" metadata key. + """ + return distribution(distribution_name).version + + +_unique = functools.partial( + unique_everseen, + key=_py39compat.normalized_name, +) +""" +Wrapper for ``distributions`` to return unique distributions by name. +""" + + +def entry_points(**params) -> EntryPoints: + """Return EntryPoint objects for all installed packages. + + Pass selection parameters (group or name) to filter the + result to entry points matching those properties (see + EntryPoints.select()). + + :return: EntryPoints for all installed packages. + """ + eps = itertools.chain.from_iterable( + dist.entry_points for dist in _unique(distributions()) + ) + return EntryPoints(eps).select(**params) + + +def files(distribution_name) -> Optional[List[PackagePath]]: + """Return a list of files for the named package. + + :param distribution_name: The name of the distribution package to query. + :return: List of files composing the distribution. + """ + return distribution(distribution_name).files + + +def requires(distribution_name) -> Optional[List[str]]: + """ + Return a list of requirements for the named package. + + :return: An iterable of requirements, suitable for + packaging.requirement.Requirement. + """ + return distribution(distribution_name).requires + + +def packages_distributions() -> Mapping[str, List[str]]: + """ + Return a mapping of top-level packages to their + distributions. + + >>> import collections.abc + >>> pkgs = packages_distributions() + >>> all(isinstance(dist, collections.abc.Sequence) for dist in pkgs.values()) + True + """ + pkg_to_dist = collections.defaultdict(list) + for dist in distributions(): + for pkg in _top_level_declared(dist) or _top_level_inferred(dist): + pkg_to_dist[pkg].append(dist.metadata['Name']) + return dict(pkg_to_dist) + + +def _top_level_declared(dist): + return (dist.read_text('top_level.txt') or '').split() + + +def _topmost(name: PackagePath) -> Optional[str]: + """ + Return the top-most parent as long as there is a parent. + """ + top, *rest = name.parts + return top if rest else None + + +def _get_toplevel_name(name: PackagePath) -> str: + """ + Infer a possibly importable module name from a name presumed on + sys.path. + + >>> _get_toplevel_name(PackagePath('foo.py')) + 'foo' + >>> _get_toplevel_name(PackagePath('foo')) + 'foo' + >>> _get_toplevel_name(PackagePath('foo.pyc')) + 'foo' + >>> _get_toplevel_name(PackagePath('foo/__init__.py')) + 'foo' + >>> _get_toplevel_name(PackagePath('foo.pth')) + 'foo.pth' + >>> _get_toplevel_name(PackagePath('foo.dist-info')) + 'foo.dist-info' + """ + return _topmost(name) or ( + # python/typeshed#10328 + inspect.getmodulename(name) # type: ignore + or str(name) + ) + + +def _top_level_inferred(dist): + opt_names = set(map(_get_toplevel_name, always_iterable(dist.files))) + + def importable_name(name): + return '.' not in name + + return filter(importable_name, opt_names) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata/_adapters.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata/_adapters.py new file mode 100755 index 00000000..e33cba5e --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata/_adapters.py @@ -0,0 +1,90 @@ +import functools +import warnings +import re +import textwrap +import email.message + +from ._text import FoldedCase +from ._compat import pypy_partial + + +# Do not remove prior to 2024-01-01 or Python 3.14 +_warn = functools.partial( + warnings.warn, + "Implicit None on return values is deprecated and will raise KeyErrors.", + DeprecationWarning, + stacklevel=pypy_partial(2), +) + + +class Message(email.message.Message): + multiple_use_keys = set( + map( + FoldedCase, + [ + 'Classifier', + 'Obsoletes-Dist', + 'Platform', + 'Project-URL', + 'Provides-Dist', + 'Provides-Extra', + 'Requires-Dist', + 'Requires-External', + 'Supported-Platform', + 'Dynamic', + ], + ) + ) + """ + Keys that may be indicated multiple times per PEP 566. + """ + + def __new__(cls, orig: email.message.Message): + res = super().__new__(cls) + vars(res).update(vars(orig)) + return res + + def __init__(self, *args, **kwargs): + self._headers = self._repair_headers() + + # suppress spurious error from mypy + def __iter__(self): + return super().__iter__() + + def __getitem__(self, item): + """ + Warn users that a ``KeyError`` can be expected when a + mising key is supplied. Ref python/importlib_metadata#371. + """ + res = super().__getitem__(item) + if res is None: + _warn() + return res + + def _repair_headers(self): + def redent(value): + "Correct for RFC822 indentation" + if not value or '\n' not in value: + return value + return textwrap.dedent(' ' * 8 + value) + + headers = [(key, redent(value)) for key, value in vars(self)['_headers']] + if self._payload: + headers.append(('Description', self.get_payload())) + return headers + + @property + def json(self): + """ + Convert PackageMetadata to a JSON-compatible format + per PEP 0566. + """ + + def transform(key): + value = self.get_all(key) if key in self.multiple_use_keys else self[key] + if key == 'Keywords': + value = re.split(r'\s+', value) + tk = key.lower().replace('-', '_') + return tk, value + + return dict(map(transform, map(FoldedCase, self))) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata/_collections.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata/_collections.py new file mode 100755 index 00000000..cf0954e1 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata/_collections.py @@ -0,0 +1,30 @@ +import collections + + +# from jaraco.collections 3.3 +class FreezableDefaultDict(collections.defaultdict): + """ + Often it is desirable to prevent the mutation of + a default dict after its initial construction, such + as to prevent mutation during iteration. + + >>> dd = FreezableDefaultDict(list) + >>> dd[0].append('1') + >>> dd.freeze() + >>> dd[1] + [] + >>> len(dd) + 1 + """ + + def __missing__(self, key): + return getattr(self, '_frozen', super().__missing__)(key) + + def freeze(self): + self._frozen = lambda key: self.default_factory() + + +class Pair(collections.namedtuple('Pair', 'name value')): + @classmethod + def parse(cls, text): + return cls(*map(str.strip, text.split("=", 1))) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata/_compat.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata/_compat.py new file mode 100755 index 00000000..b7abd09b --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata/_compat.py @@ -0,0 +1,74 @@ +import os +import sys +import platform + +from typing import Union + + +__all__ = ['install', 'NullFinder', 'Protocol'] + + +try: + from typing import Protocol +except ImportError: # pragma: no cover + # Python 3.7 compatibility + from typing_extensions import Protocol # type: ignore + + +def install(cls): + """ + Class decorator for installation on sys.meta_path. + + Adds the backport DistributionFinder to sys.meta_path and + attempts to disable the finder functionality of the stdlib + DistributionFinder. + """ + sys.meta_path.append(cls()) + disable_stdlib_finder() + return cls + + +def disable_stdlib_finder(): + """ + Give the backport primacy for discovering path-based distributions + by monkey-patching the stdlib O_O. + + See #91 for more background for rationale on this sketchy + behavior. + """ + + def matches(finder): + return getattr( + finder, '__module__', None + ) == '_frozen_importlib_external' and hasattr(finder, 'find_distributions') + + for finder in filter(matches, sys.meta_path): # pragma: nocover + del finder.find_distributions + + +class NullFinder: + """ + A "Finder" (aka "MetaClassFinder") that never finds any modules, + but may find distributions. + """ + + @staticmethod + def find_spec(*args, **kwargs): + return None + + +def pypy_partial(val): + """ + Adjust for variable stacklevel on partial under PyPy. + + Workaround for #327. + """ + is_pypy = platform.python_implementation() == 'PyPy' + return val + is_pypy + + +if sys.version_info >= (3, 9): + StrPath = Union[str, os.PathLike[str]] +else: + # PathLike is only subscriptable at runtime in 3.9+ + StrPath = Union[str, "os.PathLike[str]"] # pragma: no cover diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata/_functools.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata/_functools.py new file mode 100755 index 00000000..71f66bd0 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata/_functools.py @@ -0,0 +1,104 @@ +import types +import functools + + +# from jaraco.functools 3.3 +def method_cache(method, cache_wrapper=None): + """ + Wrap lru_cache to support storing the cache data in the object instances. + + Abstracts the common paradigm where the method explicitly saves an + underscore-prefixed protected property on first call and returns that + subsequently. + + >>> class MyClass: + ... calls = 0 + ... + ... @method_cache + ... def method(self, value): + ... self.calls += 1 + ... return value + + >>> a = MyClass() + >>> a.method(3) + 3 + >>> for x in range(75): + ... res = a.method(x) + >>> a.calls + 75 + + Note that the apparent behavior will be exactly like that of lru_cache + except that the cache is stored on each instance, so values in one + instance will not flush values from another, and when an instance is + deleted, so are the cached values for that instance. + + >>> b = MyClass() + >>> for x in range(35): + ... res = b.method(x) + >>> b.calls + 35 + >>> a.method(0) + 0 + >>> a.calls + 75 + + Note that if method had been decorated with ``functools.lru_cache()``, + a.calls would have been 76 (due to the cached value of 0 having been + flushed by the 'b' instance). + + Clear the cache with ``.cache_clear()`` + + >>> a.method.cache_clear() + + Same for a method that hasn't yet been called. + + >>> c = MyClass() + >>> c.method.cache_clear() + + Another cache wrapper may be supplied: + + >>> cache = functools.lru_cache(maxsize=2) + >>> MyClass.method2 = method_cache(lambda self: 3, cache_wrapper=cache) + >>> a = MyClass() + >>> a.method2() + 3 + + Caution - do not subsequently wrap the method with another decorator, such + as ``@property``, which changes the semantics of the function. + + See also + http://code.activestate.com/recipes/577452-a-memoize-decorator-for-instance-methods/ + for another implementation and additional justification. + """ + cache_wrapper = cache_wrapper or functools.lru_cache() + + def wrapper(self, *args, **kwargs): + # it's the first call, replace the method with a cached, bound method + bound_method = types.MethodType(method, self) + cached_method = cache_wrapper(bound_method) + setattr(self, method.__name__, cached_method) + return cached_method(*args, **kwargs) + + # Support cache clear even before cache has been created. + wrapper.cache_clear = lambda: None + + return wrapper + + +# From jaraco.functools 3.3 +def pass_none(func): + """ + Wrap func so it's not called if its first param is None + + >>> print_text = pass_none(print) + >>> print_text('text') + text + >>> print_text(None) + """ + + @functools.wraps(func) + def wrapper(param, *args, **kwargs): + if param is not None: + return func(param, *args, **kwargs) + + return wrapper diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata/_itertools.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata/_itertools.py new file mode 100755 index 00000000..d4ca9b91 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata/_itertools.py @@ -0,0 +1,73 @@ +from itertools import filterfalse + + +def unique_everseen(iterable, key=None): + "List unique elements, preserving order. Remember all elements ever seen." + # unique_everseen('AAAABBBCCDAABBB') --> A B C D + # unique_everseen('ABBCcAD', str.lower) --> A B C D + seen = set() + seen_add = seen.add + if key is None: + for element in filterfalse(seen.__contains__, iterable): + seen_add(element) + yield element + else: + for element in iterable: + k = key(element) + if k not in seen: + seen_add(k) + yield element + + +# copied from more_itertools 8.8 +def always_iterable(obj, base_type=(str, bytes)): + """If *obj* is iterable, return an iterator over its items:: + + >>> obj = (1, 2, 3) + >>> list(always_iterable(obj)) + [1, 2, 3] + + If *obj* is not iterable, return a one-item iterable containing *obj*:: + + >>> obj = 1 + >>> list(always_iterable(obj)) + [1] + + If *obj* is ``None``, return an empty iterable: + + >>> obj = None + >>> list(always_iterable(None)) + [] + + By default, binary and text strings are not considered iterable:: + + >>> obj = 'foo' + >>> list(always_iterable(obj)) + ['foo'] + + If *base_type* is set, objects for which ``isinstance(obj, base_type)`` + returns ``True`` won't be considered iterable. + + >>> obj = {'a': 1} + >>> list(always_iterable(obj)) # Iterate over the dict's keys + ['a'] + >>> list(always_iterable(obj, base_type=dict)) # Treat dicts as a unit + [{'a': 1}] + + Set *base_type* to ``None`` to avoid any special handling and treat objects + Python considers iterable as iterable: + + >>> obj = 'foo' + >>> list(always_iterable(obj, base_type=None)) + ['f', 'o', 'o'] + """ + if obj is None: + return iter(()) + + if (base_type is not None) and isinstance(obj, base_type): + return iter((obj,)) + + try: + return iter(obj) + except TypeError: + return iter((obj,)) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata/_meta.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata/_meta.py new file mode 100755 index 00000000..0c7e8791 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata/_meta.py @@ -0,0 +1,63 @@ +from ._compat import Protocol +from typing import Any, Dict, Iterator, List, Optional, TypeVar, Union, overload + + +_T = TypeVar("_T") + + +class PackageMetadata(Protocol): + def __len__(self) -> int: + ... # pragma: no cover + + def __contains__(self, item: str) -> bool: + ... # pragma: no cover + + def __getitem__(self, key: str) -> str: + ... # pragma: no cover + + def __iter__(self) -> Iterator[str]: + ... # pragma: no cover + + @overload + def get(self, name: str, failobj: None = None) -> Optional[str]: + ... # pragma: no cover + + @overload + def get(self, name: str, failobj: _T) -> Union[str, _T]: + ... # pragma: no cover + + # overload per python/importlib_metadata#435 + @overload + def get_all(self, name: str, failobj: None = None) -> Optional[List[Any]]: + ... # pragma: no cover + + @overload + def get_all(self, name: str, failobj: _T) -> Union[List[Any], _T]: + """ + Return all values associated with a possibly multi-valued key. + """ + + @property + def json(self) -> Dict[str, Union[str, List[str]]]: + """ + A JSON-compatible form of the metadata. + """ + + +class SimplePath(Protocol[_T]): + """ + A minimal subset of pathlib.Path required by PathDistribution. + """ + + def joinpath(self, other: Union[str, _T]) -> _T: + ... # pragma: no cover + + def __truediv__(self, other: Union[str, _T]) -> _T: + ... # pragma: no cover + + @property + def parent(self) -> _T: + ... # pragma: no cover + + def read_text(self) -> str: + ... # pragma: no cover diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata/_py39compat.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata/_py39compat.py new file mode 100755 index 00000000..cde4558f --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata/_py39compat.py @@ -0,0 +1,35 @@ +""" +Compatibility layer with Python 3.8/3.9 +""" +from typing import TYPE_CHECKING, Any, Optional + +if TYPE_CHECKING: # pragma: no cover + # Prevent circular imports on runtime. + from . import Distribution, EntryPoint +else: + Distribution = EntryPoint = Any + + +def normalized_name(dist: Distribution) -> Optional[str]: + """ + Honor name normalization for distributions that don't provide ``_normalized_name``. + """ + try: + return dist._normalized_name + except AttributeError: + from . import Prepared # -> delay to prevent circular imports. + + return Prepared.normalize(getattr(dist, "name", None) or dist.metadata['Name']) + + +def ep_matches(ep: EntryPoint, **params) -> bool: + """ + Workaround for ``EntryPoint`` objects without the ``matches`` method. + """ + try: + return ep.matches(**params) + except AttributeError: + from . import EntryPoint # -> delay to prevent circular imports. + + # Reconstruct the EntryPoint object to make sure it is compatible. + return EntryPoint(ep.name, ep.value, ep.group).matches(**params) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata/_text.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata/_text.py new file mode 100755 index 00000000..c88cfbb2 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata/_text.py @@ -0,0 +1,99 @@ +import re + +from ._functools import method_cache + + +# from jaraco.text 3.5 +class FoldedCase(str): + """ + A case insensitive string class; behaves just like str + except compares equal when the only variation is case. + + >>> s = FoldedCase('hello world') + + >>> s == 'Hello World' + True + + >>> 'Hello World' == s + True + + >>> s != 'Hello World' + False + + >>> s.index('O') + 4 + + >>> s.split('O') + ['hell', ' w', 'rld'] + + >>> sorted(map(FoldedCase, ['GAMMA', 'alpha', 'Beta'])) + ['alpha', 'Beta', 'GAMMA'] + + Sequence membership is straightforward. + + >>> "Hello World" in [s] + True + >>> s in ["Hello World"] + True + + You may test for set inclusion, but candidate and elements + must both be folded. + + >>> FoldedCase("Hello World") in {s} + True + >>> s in {FoldedCase("Hello World")} + True + + String inclusion works as long as the FoldedCase object + is on the right. + + >>> "hello" in FoldedCase("Hello World") + True + + But not if the FoldedCase object is on the left: + + >>> FoldedCase('hello') in 'Hello World' + False + + In that case, use in_: + + >>> FoldedCase('hello').in_('Hello World') + True + + >>> FoldedCase('hello') > FoldedCase('Hello') + False + """ + + def __lt__(self, other): + return self.lower() < other.lower() + + def __gt__(self, other): + return self.lower() > other.lower() + + def __eq__(self, other): + return self.lower() == other.lower() + + def __ne__(self, other): + return self.lower() != other.lower() + + def __hash__(self): + return hash(self.lower()) + + def __contains__(self, other): + return super().lower().__contains__(other.lower()) + + def in_(self, other): + "Does self appear in other?" + return self in FoldedCase(other) + + # cache lower since it's likely to be called frequently. + @method_cache + def lower(self): + return super().lower() + + def index(self, sub): + return self.lower().index(sub.lower()) + + def split(self, splitter=' ', maxsplit=0): + pattern = re.compile(re.escape(splitter), re.I) + return pattern.split(self, maxsplit) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata/py.typed b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_metadata/py.typed new file mode 100755 index 00000000..e69de29b diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources-5.12.0.dist-info/INSTALLER b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources-5.12.0.dist-info/INSTALLER new file mode 100755 index 00000000..a1b589e3 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources-5.12.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources-5.12.0.dist-info/LICENSE b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources-5.12.0.dist-info/LICENSE new file mode 100755 index 00000000..d6456956 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources-5.12.0.dist-info/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources-5.12.0.dist-info/METADATA b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources-5.12.0.dist-info/METADATA new file mode 100755 index 00000000..038059d3 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources-5.12.0.dist-info/METADATA @@ -0,0 +1,104 @@ +Metadata-Version: 2.1 +Name: importlib-resources +Version: 5.12.0 +Summary: Read resources from Python packages +Home-page: https://github.com/python/importlib_resources +Author: Barry Warsaw +Author-email: barry@python.org +Project-URL: Documentation, https://importlib-resources.readthedocs.io/ +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: Apache Software License +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Requires-Python: >=3.7 +License-File: LICENSE +Requires-Dist: zipp (>=3.1.0) ; python_version < "3.10" +Provides-Extra: docs +Requires-Dist: sphinx (>=3.5) ; extra == 'docs' +Requires-Dist: jaraco.packaging (>=9) ; extra == 'docs' +Requires-Dist: rst.linker (>=1.9) ; extra == 'docs' +Requires-Dist: furo ; extra == 'docs' +Requires-Dist: sphinx-lint ; extra == 'docs' +Requires-Dist: jaraco.tidelift (>=1.4) ; extra == 'docs' +Provides-Extra: testing +Requires-Dist: pytest (>=6) ; extra == 'testing' +Requires-Dist: pytest-checkdocs (>=2.4) ; extra == 'testing' +Requires-Dist: flake8 (<5) ; extra == 'testing' +Requires-Dist: pytest-cov ; extra == 'testing' +Requires-Dist: pytest-enabler (>=1.3) ; extra == 'testing' +Requires-Dist: pytest-black (>=0.3.7) ; (platform_python_implementation != "PyPy") and extra == 'testing' +Requires-Dist: pytest-mypy (>=0.9.1) ; (platform_python_implementation != "PyPy") and extra == 'testing' +Requires-Dist: pytest-flake8 ; (python_version < "3.12") and extra == 'testing' + +.. image:: https://img.shields.io/pypi/v/importlib_resources.svg + :target: https://pypi.org/project/importlib_resources + +.. image:: https://img.shields.io/pypi/pyversions/importlib_resources.svg + +.. image:: https://github.com/python/importlib_resources/workflows/tests/badge.svg + :target: https://github.com/python/importlib_resources/actions?query=workflow%3A%22tests%22 + :alt: tests + +.. image:: https://img.shields.io/badge/code%20style-black-000000.svg + :target: https://github.com/psf/black + :alt: Code style: Black + +.. image:: https://readthedocs.org/projects/importlib-resources/badge/?version=latest + :target: https://importlib-resources.readthedocs.io/en/latest/?badge=latest + +.. image:: https://img.shields.io/badge/skeleton-2023-informational + :target: https://blog.jaraco.com/skeleton + +.. image:: https://tidelift.com/badges/package/pypi/importlib-resources + :target: https://tidelift.com/subscription/pkg/pypi-importlib-resources?utm_source=pypi-importlib-resources&utm_medium=readme + +``importlib_resources`` is a backport of Python standard library +`importlib.resources +`_ +module for older Pythons. + +The key goal of this module is to replace parts of `pkg_resources +`_ with a +solution in Python's stdlib that relies on well-defined APIs. This makes +reading resources included in packages easier, with more stable and consistent +semantics. + +Compatibility +============= + +New features are introduced in this third-party library and later merged +into CPython. The following table indicates which versions of this library +were contributed to different versions in the standard library: + +.. list-table:: + :header-rows: 1 + + * - importlib_resources + - stdlib + * - 5.9 + - 3.12 + * - 5.7 + - 3.11 + * - 5.0 + - 3.10 + * - 1.3 + - 3.9 + * - 0.5 (?) + - 3.7 + +For Enterprise +============== + +Available as part of the Tidelift Subscription. + +This project and the maintainers of thousands of other packages are working with Tidelift to deliver one enterprise subscription that covers all of the open source you use. + +`Learn more `_. + +Security Contact +================ + +To report a security vulnerability, please use the +`Tidelift security contact `_. +Tidelift will coordinate the fix and disclosure. diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources-5.12.0.dist-info/RECORD b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources-5.12.0.dist-info/RECORD new file mode 100755 index 00000000..065a3e47 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources-5.12.0.dist-info/RECORD @@ -0,0 +1,49 @@ +importlib_resources-5.12.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +importlib_resources-5.12.0.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358 +importlib_resources-5.12.0.dist-info/METADATA,sha256=uEY10nhKI-5nXImnXgsNt7BDYf7u2Qw8-BO2K2hmlJA,4111 +importlib_resources-5.12.0.dist-info/RECORD,, +importlib_resources-5.12.0.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92 +importlib_resources-5.12.0.dist-info/top_level.txt,sha256=fHIjHU1GZwAjvcydpmUnUrTnbvdiWjG4OEVZK8by0TQ,20 +importlib_resources/__init__.py,sha256=evPm12kLgYqTm-pbzm60bOuumumT8IpBNWFp0uMyrzE,506 +importlib_resources/_adapters.py,sha256=vprJGbUeHbajX6XCuMP6J3lMrqCi-P_MTlziJUR7jfk,4482 +importlib_resources/_common.py,sha256=jSC4xfLdcMNbtbWHtpzbFkNa0W7kvf__nsYn14C_AEU,5457 +importlib_resources/_compat.py,sha256=4oDJPpo63eH_3l5BkBHmkjAQW4HGs5qvYd2-ziLA_ck,2935 +importlib_resources/_itertools.py,sha256=eDisV6RqiNZOogLSXf6LOGHOYc79FGgPrKNLzFLmCrU,1277 +importlib_resources/_legacy.py,sha256=0TKdZixxLWA-xwtAZw4HcpqJmj4Xprx1Zkcty0gTRZY,3481 +importlib_resources/abc.py,sha256=Icr2IJ2QtH7vvAB9vC5WRJ9KBoaDyJa7KUs8McuROzo,5140 +importlib_resources/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +importlib_resources/readers.py,sha256=i80n49L2rBAtlB9bU0zAeQHiEXxcdP99-pWR6ED-ypY,4312 +importlib_resources/simple.py,sha256=0__2TQBTQoqkajYmNPt1HxERcReAT6boVKJA328pr04,2576 +importlib_resources/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +importlib_resources/tests/_compat.py,sha256=YTSB0U1R9oADnh6GrQcOCgojxcF_N6H1LklymEWf9SQ,708 +importlib_resources/tests/_path.py,sha256=nkv3ek7D1U898v921rYbldDCtKri2oyYOi3EJqGjEGU,1289 +importlib_resources/tests/data01/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +importlib_resources/tests/data01/binary.file,sha256=BU7ewdAhH2JP7Qy8qdT5QAsOSRxDdCryxbCr6_DJkNg,4 +importlib_resources/tests/data01/subdirectory/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +importlib_resources/tests/data01/subdirectory/binary.file,sha256=BU7ewdAhH2JP7Qy8qdT5QAsOSRxDdCryxbCr6_DJkNg,4 +importlib_resources/tests/data01/utf-16.file,sha256=t5q9qhxX0rYqItBOM8D3ylwG-RHrnOYteTLtQr6sF7g,44 +importlib_resources/tests/data01/utf-8.file,sha256=kwWgYG4yQ-ZF2X_WA66EjYPmxJRn-w8aSOiS9e8tKYY,20 +importlib_resources/tests/data02/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +importlib_resources/tests/data02/one/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +importlib_resources/tests/data02/one/resource1.txt,sha256=10flKac7c-XXFzJ3t-AB5MJjlBy__dSZvPE_dOm2q6U,13 +importlib_resources/tests/data02/subdirectory/subsubdir/resource.txt,sha256=jnrBBztxYrtQck7cmVnc4xQVO4-agzAZDGSFkAWtlFw,10 +importlib_resources/tests/data02/two/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +importlib_resources/tests/data02/two/resource2.txt,sha256=lt2jbN3TMn9QiFKM832X39bU_62UptDdUkoYzkvEbl0,13 +importlib_resources/tests/namespacedata01/binary.file,sha256=BU7ewdAhH2JP7Qy8qdT5QAsOSRxDdCryxbCr6_DJkNg,4 +importlib_resources/tests/namespacedata01/utf-16.file,sha256=t5q9qhxX0rYqItBOM8D3ylwG-RHrnOYteTLtQr6sF7g,44 +importlib_resources/tests/namespacedata01/utf-8.file,sha256=kwWgYG4yQ-ZF2X_WA66EjYPmxJRn-w8aSOiS9e8tKYY,20 +importlib_resources/tests/test_compatibilty_files.py,sha256=95N_R7aik8cvnE6sBJpsxmP0K5plOWRIJDgbalD-Hpw,3314 +importlib_resources/tests/test_contents.py,sha256=V1Xfk3lqTDdvUsZuV18Kndf0CT_tkM2oEIwk9Vv0rhg,968 +importlib_resources/tests/test_custom.py,sha256=jVYg9idEVdUN6idHUfDDlZ-zDWl56qYNbj5QrcZO76Y,1124 +importlib_resources/tests/test_files.py,sha256=W5XoBWSTr84Ke15UtjqWLet2iUDUyJfQxbST4PDlj2w,3283 +importlib_resources/tests/test_open.py,sha256=9qvdC6Eu2Kn3mh3xDR5HUEQoePSKIecTxU4vnH9veO8,2671 +importlib_resources/tests/test_path.py,sha256=XR5RI7_zndI_Nqw9eHU1tDmSGIo29N1GP8INodPc584,2142 +importlib_resources/tests/test_read.py,sha256=BYdRqZEEJE17NHPArpZW9VsIwMlna1BpHyWkgCvEKWk,2512 +importlib_resources/tests/test_reader.py,sha256=YS1RHDzSIo7Dy3AhoK7sY-cFWIFnfkMNfQR3xlXsgio,4990 +importlib_resources/tests/test_resource.py,sha256=cPHz7VLwq6bFznZ-JDYE3f_4VJthQztRHKhiA9SriT0,8270 +importlib_resources/tests/update-zips.py,sha256=x-SrO5v87iLLUMXyefxDwAd3imAs_slI94sLWvJ6N40,1417 +importlib_resources/tests/util.py,sha256=TQz12vSkHNjGlF3hB0OR4kx2sCR-xcj0wI2esDyHR9I,5001 +importlib_resources/tests/zipdata01/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +importlib_resources/tests/zipdata01/ziptestdata.zip,sha256=z5Of4dsv3T0t-46B0MsVhxlhsPGMz28aUhJDWpj3_oY,876 +importlib_resources/tests/zipdata02/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +importlib_resources/tests/zipdata02/ziptestdata.zip,sha256=ydI-_j-xgQ7tDxqBp9cjOqXBGxUp6ZBbwVJu6Xj-nrY,698 diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources-5.12.0.dist-info/WHEEL b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources-5.12.0.dist-info/WHEEL new file mode 100755 index 00000000..57e3d840 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources-5.12.0.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.38.4) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/__init__.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/__init__.py new file mode 100755 index 00000000..34e3a995 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/__init__.py @@ -0,0 +1,36 @@ +"""Read resources contained within a package.""" + +from ._common import ( + as_file, + files, + Package, +) + +from ._legacy import ( + contents, + open_binary, + read_binary, + open_text, + read_text, + is_resource, + path, + Resource, +) + +from .abc import ResourceReader + + +__all__ = [ + 'Package', + 'Resource', + 'ResourceReader', + 'as_file', + 'contents', + 'files', + 'is_resource', + 'open_binary', + 'open_text', + 'path', + 'read_binary', + 'read_text', +] diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/_adapters.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/_adapters.py new file mode 100755 index 00000000..50688fbb --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/_adapters.py @@ -0,0 +1,168 @@ +from contextlib import suppress +from io import TextIOWrapper + +from . import abc + + +class SpecLoaderAdapter: + """ + Adapt a package spec to adapt the underlying loader. + """ + + def __init__(self, spec, adapter=lambda spec: spec.loader): + self.spec = spec + self.loader = adapter(spec) + + def __getattr__(self, name): + return getattr(self.spec, name) + + +class TraversableResourcesLoader: + """ + Adapt a loader to provide TraversableResources. + """ + + def __init__(self, spec): + self.spec = spec + + def get_resource_reader(self, name): + return CompatibilityFiles(self.spec)._native() + + +def _io_wrapper(file, mode='r', *args, **kwargs): + if mode == 'r': + return TextIOWrapper(file, *args, **kwargs) + elif mode == 'rb': + return file + raise ValueError(f"Invalid mode value '{mode}', only 'r' and 'rb' are supported") + + +class CompatibilityFiles: + """ + Adapter for an existing or non-existent resource reader + to provide a compatibility .files(). + """ + + class SpecPath(abc.Traversable): + """ + Path tied to a module spec. + Can be read and exposes the resource reader children. + """ + + def __init__(self, spec, reader): + self._spec = spec + self._reader = reader + + def iterdir(self): + if not self._reader: + return iter(()) + return iter( + CompatibilityFiles.ChildPath(self._reader, path) + for path in self._reader.contents() + ) + + def is_file(self): + return False + + is_dir = is_file + + def joinpath(self, other): + if not self._reader: + return CompatibilityFiles.OrphanPath(other) + return CompatibilityFiles.ChildPath(self._reader, other) + + @property + def name(self): + return self._spec.name + + def open(self, mode='r', *args, **kwargs): + return _io_wrapper(self._reader.open_resource(None), mode, *args, **kwargs) + + class ChildPath(abc.Traversable): + """ + Path tied to a resource reader child. + Can be read but doesn't expose any meaningful children. + """ + + def __init__(self, reader, name): + self._reader = reader + self._name = name + + def iterdir(self): + return iter(()) + + def is_file(self): + return self._reader.is_resource(self.name) + + def is_dir(self): + return not self.is_file() + + def joinpath(self, other): + return CompatibilityFiles.OrphanPath(self.name, other) + + @property + def name(self): + return self._name + + def open(self, mode='r', *args, **kwargs): + return _io_wrapper( + self._reader.open_resource(self.name), mode, *args, **kwargs + ) + + class OrphanPath(abc.Traversable): + """ + Orphan path, not tied to a module spec or resource reader. + Can't be read and doesn't expose any meaningful children. + """ + + def __init__(self, *path_parts): + if len(path_parts) < 1: + raise ValueError('Need at least one path part to construct a path') + self._path = path_parts + + def iterdir(self): + return iter(()) + + def is_file(self): + return False + + is_dir = is_file + + def joinpath(self, other): + return CompatibilityFiles.OrphanPath(*self._path, other) + + @property + def name(self): + return self._path[-1] + + def open(self, mode='r', *args, **kwargs): + raise FileNotFoundError("Can't open orphan path") + + def __init__(self, spec): + self.spec = spec + + @property + def _reader(self): + with suppress(AttributeError): + return self.spec.loader.get_resource_reader(self.spec.name) + + def _native(self): + """ + Return the native reader if it supports files(). + """ + reader = self._reader + return reader if hasattr(reader, 'files') else self + + def __getattr__(self, attr): + return getattr(self._reader, attr) + + def files(self): + return CompatibilityFiles.SpecPath(self.spec, self._reader) + + +def wrap_spec(package): + """ + Construct a package spec with traversable compatibility + on the spec/loader/reader. + """ + return SpecLoaderAdapter(package.__spec__, TraversableResourcesLoader) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/_common.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/_common.py new file mode 100755 index 00000000..3c6de1cf --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/_common.py @@ -0,0 +1,207 @@ +import os +import pathlib +import tempfile +import functools +import contextlib +import types +import importlib +import inspect +import warnings +import itertools + +from typing import Union, Optional, cast +from .abc import ResourceReader, Traversable + +from ._compat import wrap_spec + +Package = Union[types.ModuleType, str] +Anchor = Package + + +def package_to_anchor(func): + """ + Replace 'package' parameter as 'anchor' and warn about the change. + + Other errors should fall through. + + >>> files('a', 'b') + Traceback (most recent call last): + TypeError: files() takes from 0 to 1 positional arguments but 2 were given + """ + undefined = object() + + @functools.wraps(func) + def wrapper(anchor=undefined, package=undefined): + if package is not undefined: + if anchor is not undefined: + return func(anchor, package) + warnings.warn( + "First parameter to files is renamed to 'anchor'", + DeprecationWarning, + stacklevel=2, + ) + return func(package) + elif anchor is undefined: + return func() + return func(anchor) + + return wrapper + + +@package_to_anchor +def files(anchor: Optional[Anchor] = None) -> Traversable: + """ + Get a Traversable resource for an anchor. + """ + return from_package(resolve(anchor)) + + +def get_resource_reader(package: types.ModuleType) -> Optional[ResourceReader]: + """ + Return the package's loader if it's a ResourceReader. + """ + # We can't use + # a issubclass() check here because apparently abc.'s __subclasscheck__() + # hook wants to create a weak reference to the object, but + # zipimport.zipimporter does not support weak references, resulting in a + # TypeError. That seems terrible. + spec = package.__spec__ + reader = getattr(spec.loader, 'get_resource_reader', None) # type: ignore + if reader is None: + return None + return reader(spec.name) # type: ignore + + +@functools.singledispatch +def resolve(cand: Optional[Anchor]) -> types.ModuleType: + return cast(types.ModuleType, cand) + + +@resolve.register +def _(cand: str) -> types.ModuleType: + return importlib.import_module(cand) + + +@resolve.register +def _(cand: None) -> types.ModuleType: + return resolve(_infer_caller().f_globals['__name__']) + + +def _infer_caller(): + """ + Walk the stack and find the frame of the first caller not in this module. + """ + + def is_this_file(frame_info): + return frame_info.filename == __file__ + + def is_wrapper(frame_info): + return frame_info.function == 'wrapper' + + not_this_file = itertools.filterfalse(is_this_file, inspect.stack()) + # also exclude 'wrapper' due to singledispatch in the call stack + callers = itertools.filterfalse(is_wrapper, not_this_file) + return next(callers).frame + + +def from_package(package: types.ModuleType): + """ + Return a Traversable object for the given package. + + """ + spec = wrap_spec(package) + reader = spec.loader.get_resource_reader(spec.name) + return reader.files() + + +@contextlib.contextmanager +def _tempfile( + reader, + suffix='', + # gh-93353: Keep a reference to call os.remove() in late Python + # finalization. + *, + _os_remove=os.remove, +): + # Not using tempfile.NamedTemporaryFile as it leads to deeper 'try' + # blocks due to the need to close the temporary file to work on Windows + # properly. + fd, raw_path = tempfile.mkstemp(suffix=suffix) + try: + try: + os.write(fd, reader()) + finally: + os.close(fd) + del reader + yield pathlib.Path(raw_path) + finally: + try: + _os_remove(raw_path) + except FileNotFoundError: + pass + + +def _temp_file(path): + return _tempfile(path.read_bytes, suffix=path.name) + + +def _is_present_dir(path: Traversable) -> bool: + """ + Some Traversables implement ``is_dir()`` to raise an + exception (i.e. ``FileNotFoundError``) when the + directory doesn't exist. This function wraps that call + to always return a boolean and only return True + if there's a dir and it exists. + """ + with contextlib.suppress(FileNotFoundError): + return path.is_dir() + return False + + +@functools.singledispatch +def as_file(path): + """ + Given a Traversable object, return that object as a + path on the local file system in a context manager. + """ + return _temp_dir(path) if _is_present_dir(path) else _temp_file(path) + + +@as_file.register(pathlib.Path) +@contextlib.contextmanager +def _(path): + """ + Degenerate behavior for pathlib.Path objects. + """ + yield path + + +@contextlib.contextmanager +def _temp_path(dir: tempfile.TemporaryDirectory): + """ + Wrap tempfile.TemporyDirectory to return a pathlib object. + """ + with dir as result: + yield pathlib.Path(result) + + +@contextlib.contextmanager +def _temp_dir(path): + """ + Given a traversable dir, recursively replicate the whole tree + to the file system in a context manager. + """ + assert path.is_dir() + with _temp_path(tempfile.TemporaryDirectory()) as temp_dir: + yield _write_contents(temp_dir, path) + + +def _write_contents(target, source): + child = target.joinpath(source.name) + if source.is_dir(): + child.mkdir() + for item in source.iterdir(): + _write_contents(child, item) + else: + child.write_bytes(source.read_bytes()) + return child diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/_compat.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/_compat.py new file mode 100755 index 00000000..a93a8826 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/_compat.py @@ -0,0 +1,109 @@ +# flake8: noqa + +import abc +import os +import sys +import pathlib +from contextlib import suppress +from typing import Union + + +if sys.version_info >= (3, 10): + from zipfile import Path as ZipPath # type: ignore +else: + from zipp import Path as ZipPath # type: ignore + + +try: + from typing import runtime_checkable # type: ignore +except ImportError: + + def runtime_checkable(cls): # type: ignore + return cls + + +try: + from typing import Protocol # type: ignore +except ImportError: + Protocol = abc.ABC # type: ignore + + +class TraversableResourcesLoader: + """ + Adapt loaders to provide TraversableResources and other + compatibility. + + Used primarily for Python 3.9 and earlier where the native + loaders do not yet implement TraversableResources. + """ + + def __init__(self, spec): + self.spec = spec + + @property + def path(self): + return self.spec.origin + + def get_resource_reader(self, name): + from . import readers, _adapters + + def _zip_reader(spec): + with suppress(AttributeError): + return readers.ZipReader(spec.loader, spec.name) + + def _namespace_reader(spec): + with suppress(AttributeError, ValueError): + return readers.NamespaceReader(spec.submodule_search_locations) + + def _available_reader(spec): + with suppress(AttributeError): + return spec.loader.get_resource_reader(spec.name) + + def _native_reader(spec): + reader = _available_reader(spec) + return reader if hasattr(reader, 'files') else None + + def _file_reader(spec): + try: + path = pathlib.Path(self.path) + except TypeError: + return None + if path.exists(): + return readers.FileReader(self) + + return ( + # local ZipReader if a zip module + _zip_reader(self.spec) + or + # local NamespaceReader if a namespace module + _namespace_reader(self.spec) + or + # local FileReader + _file_reader(self.spec) + or + # native reader if it supplies 'files' + _native_reader(self.spec) + or + # fallback - adapt the spec ResourceReader to TraversableReader + _adapters.CompatibilityFiles(self.spec) + ) + + +def wrap_spec(package): + """ + Construct a package spec with traversable compatibility + on the spec/loader/reader. + + Supersedes _adapters.wrap_spec to use TraversableResourcesLoader + from above for older Python compatibility (<3.10). + """ + from . import _adapters + + return _adapters.SpecLoaderAdapter(package.__spec__, TraversableResourcesLoader) + + +if sys.version_info >= (3, 9): + StrPath = Union[str, os.PathLike[str]] +else: + # PathLike is only subscriptable at runtime in 3.9+ + StrPath = Union[str, "os.PathLike[str]"] diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/_itertools.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/_itertools.py new file mode 100755 index 00000000..7b775ef5 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/_itertools.py @@ -0,0 +1,38 @@ +# from more_itertools 9.0 +def only(iterable, default=None, too_long=None): + """If *iterable* has only one item, return it. + If it has zero items, return *default*. + If it has more than one item, raise the exception given by *too_long*, + which is ``ValueError`` by default. + >>> only([], default='missing') + 'missing' + >>> only([1]) + 1 + >>> only([1, 2]) # doctest: +IGNORE_EXCEPTION_DETAIL + Traceback (most recent call last): + ... + ValueError: Expected exactly one item in iterable, but got 1, 2, + and perhaps more.' + >>> only([1, 2], too_long=TypeError) # doctest: +IGNORE_EXCEPTION_DETAIL + Traceback (most recent call last): + ... + TypeError + Note that :func:`only` attempts to advance *iterable* twice to ensure there + is only one item. See :func:`spy` or :func:`peekable` to check + iterable contents less destructively. + """ + it = iter(iterable) + first_value = next(it, default) + + try: + second_value = next(it) + except StopIteration: + pass + else: + msg = ( + 'Expected exactly one item in iterable, but got {!r}, {!r}, ' + 'and perhaps more.'.format(first_value, second_value) + ) + raise too_long or ValueError(msg) + + return first_value diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/_legacy.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/_legacy.py new file mode 100755 index 00000000..b1ea8105 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/_legacy.py @@ -0,0 +1,120 @@ +import functools +import os +import pathlib +import types +import warnings + +from typing import Union, Iterable, ContextManager, BinaryIO, TextIO, Any + +from . import _common + +Package = Union[types.ModuleType, str] +Resource = str + + +def deprecated(func): + @functools.wraps(func) + def wrapper(*args, **kwargs): + warnings.warn( + f"{func.__name__} is deprecated. Use files() instead. " + "Refer to https://importlib-resources.readthedocs.io" + "/en/latest/using.html#migrating-from-legacy for migration advice.", + DeprecationWarning, + stacklevel=2, + ) + return func(*args, **kwargs) + + return wrapper + + +def normalize_path(path: Any) -> str: + """Normalize a path by ensuring it is a string. + + If the resulting string contains path separators, an exception is raised. + """ + str_path = str(path) + parent, file_name = os.path.split(str_path) + if parent: + raise ValueError(f'{path!r} must be only a file name') + return file_name + + +@deprecated +def open_binary(package: Package, resource: Resource) -> BinaryIO: + """Return a file-like object opened for binary reading of the resource.""" + return (_common.files(package) / normalize_path(resource)).open('rb') + + +@deprecated +def read_binary(package: Package, resource: Resource) -> bytes: + """Return the binary contents of the resource.""" + return (_common.files(package) / normalize_path(resource)).read_bytes() + + +@deprecated +def open_text( + package: Package, + resource: Resource, + encoding: str = 'utf-8', + errors: str = 'strict', +) -> TextIO: + """Return a file-like object opened for text reading of the resource.""" + return (_common.files(package) / normalize_path(resource)).open( + 'r', encoding=encoding, errors=errors + ) + + +@deprecated +def read_text( + package: Package, + resource: Resource, + encoding: str = 'utf-8', + errors: str = 'strict', +) -> str: + """Return the decoded string of the resource. + + The decoding-related arguments have the same semantics as those of + bytes.decode(). + """ + with open_text(package, resource, encoding, errors) as fp: + return fp.read() + + +@deprecated +def contents(package: Package) -> Iterable[str]: + """Return an iterable of entries in `package`. + + Note that not all entries are resources. Specifically, directories are + not considered resources. Use `is_resource()` on each entry returned here + to check if it is a resource or not. + """ + return [path.name for path in _common.files(package).iterdir()] + + +@deprecated +def is_resource(package: Package, name: str) -> bool: + """True if `name` is a resource inside `package`. + + Directories are *not* resources. + """ + resource = normalize_path(name) + return any( + traversable.name == resource and traversable.is_file() + for traversable in _common.files(package).iterdir() + ) + + +@deprecated +def path( + package: Package, + resource: Resource, +) -> ContextManager[pathlib.Path]: + """A context manager providing a file path object to the resource. + + If the resource does not already exist on its own on the file system, + a temporary file will be created. If the file was created, the file + will be deleted upon exiting the context manager (no exception is + raised if the file was deleted prior to the context manager + exiting). + """ + return _common.as_file(_common.files(package) / normalize_path(resource)) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/abc.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/abc.py new file mode 100755 index 00000000..23b6aeaf --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/abc.py @@ -0,0 +1,170 @@ +import abc +import io +import itertools +import pathlib +from typing import Any, BinaryIO, Iterable, Iterator, NoReturn, Text, Optional + +from ._compat import runtime_checkable, Protocol, StrPath + + +__all__ = ["ResourceReader", "Traversable", "TraversableResources"] + + +class ResourceReader(metaclass=abc.ABCMeta): + """Abstract base class for loaders to provide resource reading support.""" + + @abc.abstractmethod + def open_resource(self, resource: Text) -> BinaryIO: + """Return an opened, file-like object for binary reading. + + The 'resource' argument is expected to represent only a file name. + If the resource cannot be found, FileNotFoundError is raised. + """ + # This deliberately raises FileNotFoundError instead of + # NotImplementedError so that if this method is accidentally called, + # it'll still do the right thing. + raise FileNotFoundError + + @abc.abstractmethod + def resource_path(self, resource: Text) -> Text: + """Return the file system path to the specified resource. + + The 'resource' argument is expected to represent only a file name. + If the resource does not exist on the file system, raise + FileNotFoundError. + """ + # This deliberately raises FileNotFoundError instead of + # NotImplementedError so that if this method is accidentally called, + # it'll still do the right thing. + raise FileNotFoundError + + @abc.abstractmethod + def is_resource(self, path: Text) -> bool: + """Return True if the named 'path' is a resource. + + Files are resources, directories are not. + """ + raise FileNotFoundError + + @abc.abstractmethod + def contents(self) -> Iterable[str]: + """Return an iterable of entries in `package`.""" + raise FileNotFoundError + + +class TraversalError(Exception): + pass + + +@runtime_checkable +class Traversable(Protocol): + """ + An object with a subset of pathlib.Path methods suitable for + traversing directories and opening files. + + Any exceptions that occur when accessing the backing resource + may propagate unaltered. + """ + + @abc.abstractmethod + def iterdir(self) -> Iterator["Traversable"]: + """ + Yield Traversable objects in self + """ + + def read_bytes(self) -> bytes: + """ + Read contents of self as bytes + """ + with self.open('rb') as strm: + return strm.read() + + def read_text(self, encoding: Optional[str] = None) -> str: + """ + Read contents of self as text + """ + with self.open(encoding=encoding) as strm: + return strm.read() + + @abc.abstractmethod + def is_dir(self) -> bool: + """ + Return True if self is a directory + """ + + @abc.abstractmethod + def is_file(self) -> bool: + """ + Return True if self is a file + """ + + def joinpath(self, *descendants: StrPath) -> "Traversable": + """ + Return Traversable resolved with any descendants applied. + + Each descendant should be a path segment relative to self + and each may contain multiple levels separated by + ``posixpath.sep`` (``/``). + """ + if not descendants: + return self + names = itertools.chain.from_iterable( + path.parts for path in map(pathlib.PurePosixPath, descendants) + ) + target = next(names) + matches = ( + traversable for traversable in self.iterdir() if traversable.name == target + ) + try: + match = next(matches) + except StopIteration: + raise TraversalError( + "Target not found during traversal.", target, list(names) + ) + return match.joinpath(*names) + + def __truediv__(self, child: StrPath) -> "Traversable": + """ + Return Traversable child in self + """ + return self.joinpath(child) + + @abc.abstractmethod + def open(self, mode='r', *args, **kwargs): + """ + mode may be 'r' or 'rb' to open as text or binary. Return a handle + suitable for reading (same as pathlib.Path.open). + + When opening as text, accepts encoding parameters such as those + accepted by io.TextIOWrapper. + """ + + @property + @abc.abstractmethod + def name(self) -> str: + """ + The base name of this object without any parent references. + """ + + +class TraversableResources(ResourceReader): + """ + The required interface for providing traversable + resources. + """ + + @abc.abstractmethod + def files(self) -> "Traversable": + """Return a Traversable object for the loaded package.""" + + def open_resource(self, resource: StrPath) -> io.BufferedReader: + return self.files().joinpath(resource).open('rb') + + def resource_path(self, resource: Any) -> NoReturn: + raise FileNotFoundError(resource) + + def is_resource(self, path: StrPath) -> bool: + return self.files().joinpath(path).is_file() + + def contents(self) -> Iterator[str]: + return (item.name for item in self.files().iterdir()) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/py.typed b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/py.typed new file mode 100755 index 00000000..e69de29b diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/readers.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/readers.py new file mode 100755 index 00000000..51d030a6 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/readers.py @@ -0,0 +1,144 @@ +import collections +import itertools +import pathlib +import operator + +from . import abc + +from ._itertools import only +from ._compat import ZipPath + + +def remove_duplicates(items): + return iter(collections.OrderedDict.fromkeys(items)) + + +class FileReader(abc.TraversableResources): + def __init__(self, loader): + self.path = pathlib.Path(loader.path).parent + + def resource_path(self, resource): + """ + Return the file system path to prevent + `resources.path()` from creating a temporary + copy. + """ + return str(self.path.joinpath(resource)) + + def files(self): + return self.path + + +class ZipReader(abc.TraversableResources): + def __init__(self, loader, module): + _, _, name = module.rpartition('.') + self.prefix = loader.prefix.replace('\\', '/') + name + '/' + self.archive = loader.archive + + def open_resource(self, resource): + try: + return super().open_resource(resource) + except KeyError as exc: + raise FileNotFoundError(exc.args[0]) + + def is_resource(self, path): + """ + Workaround for `zipfile.Path.is_file` returning true + for non-existent paths. + """ + target = self.files().joinpath(path) + return target.is_file() and target.exists() + + def files(self): + return ZipPath(self.archive, self.prefix) + + +class MultiplexedPath(abc.Traversable): + """ + Given a series of Traversable objects, implement a merged + version of the interface across all objects. Useful for + namespace packages which may be multihomed at a single + name. + """ + + def __init__(self, *paths): + self._paths = list(map(pathlib.Path, remove_duplicates(paths))) + if not self._paths: + message = 'MultiplexedPath must contain at least one path' + raise FileNotFoundError(message) + if not all(path.is_dir() for path in self._paths): + raise NotADirectoryError('MultiplexedPath only supports directories') + + def iterdir(self): + children = (child for path in self._paths for child in path.iterdir()) + by_name = operator.attrgetter('name') + groups = itertools.groupby(sorted(children, key=by_name), key=by_name) + return map(self._follow, (locs for name, locs in groups)) + + def read_bytes(self): + raise FileNotFoundError(f'{self} is not a file') + + def read_text(self, *args, **kwargs): + raise FileNotFoundError(f'{self} is not a file') + + def is_dir(self): + return True + + def is_file(self): + return False + + def joinpath(self, *descendants): + try: + return super().joinpath(*descendants) + except abc.TraversalError: + # One of the paths did not resolve (a directory does not exist). + # Just return something that will not exist. + return self._paths[0].joinpath(*descendants) + + @classmethod + def _follow(cls, children): + """ + Construct a MultiplexedPath if needed. + + If children contains a sole element, return it. + Otherwise, return a MultiplexedPath of the items. + Unless one of the items is not a Directory, then return the first. + """ + subdirs, one_dir, one_file = itertools.tee(children, 3) + + try: + return only(one_dir) + except ValueError: + try: + return cls(*subdirs) + except NotADirectoryError: + return next(one_file) + + def open(self, *args, **kwargs): + raise FileNotFoundError(f'{self} is not a file') + + @property + def name(self): + return self._paths[0].name + + def __repr__(self): + paths = ', '.join(f"'{path}'" for path in self._paths) + return f'MultiplexedPath({paths})' + + +class NamespaceReader(abc.TraversableResources): + def __init__(self, namespace_path): + if 'NamespacePath' not in str(namespace_path): + raise ValueError('Invalid path') + self.path = MultiplexedPath(*list(namespace_path)) + + def resource_path(self, resource): + """ + Return the file system path to prevent + `resources.path()` from creating a temporary + copy. + """ + return str(self.path.joinpath(resource)) + + def files(self): + return self.path diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/simple.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/simple.py new file mode 100755 index 00000000..7770c922 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/simple.py @@ -0,0 +1,106 @@ +""" +Interface adapters for low-level readers. +""" + +import abc +import io +import itertools +from typing import BinaryIO, List + +from .abc import Traversable, TraversableResources + + +class SimpleReader(abc.ABC): + """ + The minimum, low-level interface required from a resource + provider. + """ + + @property + @abc.abstractmethod + def package(self) -> str: + """ + The name of the package for which this reader loads resources. + """ + + @abc.abstractmethod + def children(self) -> List['SimpleReader']: + """ + Obtain an iterable of SimpleReader for available + child containers (e.g. directories). + """ + + @abc.abstractmethod + def resources(self) -> List[str]: + """ + Obtain available named resources for this virtual package. + """ + + @abc.abstractmethod + def open_binary(self, resource: str) -> BinaryIO: + """ + Obtain a File-like for a named resource. + """ + + @property + def name(self): + return self.package.split('.')[-1] + + +class ResourceContainer(Traversable): + """ + Traversable container for a package's resources via its reader. + """ + + def __init__(self, reader: SimpleReader): + self.reader = reader + + def is_dir(self): + return True + + def is_file(self): + return False + + def iterdir(self): + files = (ResourceHandle(self, name) for name in self.reader.resources) + dirs = map(ResourceContainer, self.reader.children()) + return itertools.chain(files, dirs) + + def open(self, *args, **kwargs): + raise IsADirectoryError() + + +class ResourceHandle(Traversable): + """ + Handle to a named resource in a ResourceReader. + """ + + def __init__(self, parent: ResourceContainer, name: str): + self.parent = parent + self.name = name # type: ignore + + def is_file(self): + return True + + def is_dir(self): + return False + + def open(self, mode='r', *args, **kwargs): + stream = self.parent.reader.open_binary(self.name) + if 'b' not in mode: + stream = io.TextIOWrapper(*args, **kwargs) + return stream + + def joinpath(self, name): + raise RuntimeError("Cannot traverse into a resource") + + +class TraversableReader(TraversableResources, SimpleReader): + """ + A TraversableResources based on SimpleReader. Resource providers + may derive from this class to provide the TraversableResources + interface by supplying the SimpleReader interface. + """ + + def files(self): + return ResourceContainer(self) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/__init__.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/__init__.py new file mode 100755 index 00000000..e69de29b diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/_compat.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/_compat.py new file mode 100755 index 00000000..e7bf06dd --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/_compat.py @@ -0,0 +1,32 @@ +import os + + +try: + from test.support import import_helper # type: ignore +except ImportError: + # Python 3.9 and earlier + class import_helper: # type: ignore + from test.support import ( + modules_setup, + modules_cleanup, + DirsOnSysPath, + CleanImport, + ) + + +try: + from test.support import os_helper # type: ignore +except ImportError: + # Python 3.9 compat + class os_helper: # type:ignore + from test.support import temp_dir + + +try: + # Python 3.10 + from test.support.os_helper import unlink +except ImportError: + from test.support import unlink as _unlink + + def unlink(target): + return _unlink(os.fspath(target)) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/_path.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/_path.py new file mode 100755 index 00000000..1f97c961 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/_path.py @@ -0,0 +1,56 @@ +import pathlib +import functools + +from typing import Dict, Union + + +#### +# from jaraco.path 3.4.1 + +FilesSpec = Dict[str, Union[str, bytes, 'FilesSpec']] # type: ignore + + +def build(spec: FilesSpec, prefix=pathlib.Path()): + """ + Build a set of files/directories, as described by the spec. + + Each key represents a pathname, and the value represents + the content. Content may be a nested directory. + + >>> spec = { + ... 'README.txt': "A README file", + ... "foo": { + ... "__init__.py": "", + ... "bar": { + ... "__init__.py": "", + ... }, + ... "baz.py": "# Some code", + ... } + ... } + >>> target = getfixture('tmp_path') + >>> build(spec, target) + >>> target.joinpath('foo/baz.py').read_text(encoding='utf-8') + '# Some code' + """ + for name, contents in spec.items(): + create(contents, pathlib.Path(prefix) / name) + + +@functools.singledispatch +def create(content: Union[str, bytes, FilesSpec], path): + path.mkdir(exist_ok=True) + build(content, prefix=path) # type: ignore + + +@create.register +def _(content: bytes, path): + path.write_bytes(content) + + +@create.register +def _(content: str, path): + path.write_text(content, encoding='utf-8') + + +# end from jaraco.path +#### diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/data01/__init__.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/data01/__init__.py new file mode 100755 index 00000000..e69de29b diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/data01/binary.file b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/data01/binary.file new file mode 100755 index 0000000000000000000000000000000000000000..eaf36c1daccfdf325514461cd1a2ffbc139b5464 GIT binary patch literal 4 LcmZQzWMT#Y01f~L literal 0 HcmV?d00001 diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/data01/subdirectory/__init__.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/data01/subdirectory/__init__.py new file mode 100755 index 00000000..e69de29b diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/data01/subdirectory/binary.file b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/data01/subdirectory/binary.file new file mode 100755 index 0000000000000000000000000000000000000000..eaf36c1daccfdf325514461cd1a2ffbc139b5464 GIT binary patch literal 4 LcmZQzWMT#Y01f~L literal 0 HcmV?d00001 diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/data01/utf-16.file b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/data01/utf-16.file new file mode 100755 index 0000000000000000000000000000000000000000..2cb772295ef4b480a8d83725bd5006a0236d8f68 GIT binary patch literal 44 ucmezW&x0YAAqNQa8FUyF7(y9B7~B|i84MZBfV^^`Xc15@g+Y;liva-T)Ce>H literal 0 HcmV?d00001 diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/data01/utf-8.file b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/data01/utf-8.file new file mode 100755 index 00000000..1c0132ad --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/data01/utf-8.file @@ -0,0 +1 @@ +Hello, UTF-8 world! diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/data02/__init__.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/data02/__init__.py new file mode 100755 index 00000000..e69de29b diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/data02/one/__init__.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/data02/one/__init__.py new file mode 100755 index 00000000..e69de29b diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/data02/two/__init__.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/data02/two/__init__.py new file mode 100755 index 00000000..e69de29b diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/namespacedata01/binary.file b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/namespacedata01/binary.file new file mode 100755 index 0000000000000000000000000000000000000000..eaf36c1daccfdf325514461cd1a2ffbc139b5464 GIT binary patch literal 4 LcmZQzWMT#Y01f~L literal 0 HcmV?d00001 diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/namespacedata01/utf-16.file b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/namespacedata01/utf-16.file new file mode 100755 index 0000000000000000000000000000000000000000..2cb772295ef4b480a8d83725bd5006a0236d8f68 GIT binary patch literal 44 ucmezW&x0YAAqNQa8FUyF7(y9B7~B|i84MZBfV^^`Xc15@g+Y;liva-T)Ce>H literal 0 HcmV?d00001 diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/namespacedata01/utf-8.file b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/namespacedata01/utf-8.file new file mode 100755 index 00000000..1c0132ad --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/namespacedata01/utf-8.file @@ -0,0 +1 @@ +Hello, UTF-8 world! diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/test_compatibilty_files.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/test_compatibilty_files.py new file mode 100755 index 00000000..13ad0dfb --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/test_compatibilty_files.py @@ -0,0 +1,104 @@ +import io +import unittest + +import importlib_resources as resources + +from importlib_resources._adapters import ( + CompatibilityFiles, + wrap_spec, +) + +from . import util + + +class CompatibilityFilesTests(unittest.TestCase): + @property + def package(self): + bytes_data = io.BytesIO(b'Hello, world!') + return util.create_package( + file=bytes_data, + path='some_path', + contents=('a', 'b', 'c'), + ) + + @property + def files(self): + return resources.files(self.package) + + def test_spec_path_iter(self): + self.assertEqual( + sorted(path.name for path in self.files.iterdir()), + ['a', 'b', 'c'], + ) + + def test_child_path_iter(self): + self.assertEqual(list((self.files / 'a').iterdir()), []) + + def test_orphan_path_iter(self): + self.assertEqual(list((self.files / 'a' / 'a').iterdir()), []) + self.assertEqual(list((self.files / 'a' / 'a' / 'a').iterdir()), []) + + def test_spec_path_is(self): + self.assertFalse(self.files.is_file()) + self.assertFalse(self.files.is_dir()) + + def test_child_path_is(self): + self.assertTrue((self.files / 'a').is_file()) + self.assertFalse((self.files / 'a').is_dir()) + + def test_orphan_path_is(self): + self.assertFalse((self.files / 'a' / 'a').is_file()) + self.assertFalse((self.files / 'a' / 'a').is_dir()) + self.assertFalse((self.files / 'a' / 'a' / 'a').is_file()) + self.assertFalse((self.files / 'a' / 'a' / 'a').is_dir()) + + def test_spec_path_name(self): + self.assertEqual(self.files.name, 'testingpackage') + + def test_child_path_name(self): + self.assertEqual((self.files / 'a').name, 'a') + + def test_orphan_path_name(self): + self.assertEqual((self.files / 'a' / 'b').name, 'b') + self.assertEqual((self.files / 'a' / 'b' / 'c').name, 'c') + + def test_spec_path_open(self): + self.assertEqual(self.files.read_bytes(), b'Hello, world!') + self.assertEqual(self.files.read_text(encoding='utf-8'), 'Hello, world!') + + def test_child_path_open(self): + self.assertEqual((self.files / 'a').read_bytes(), b'Hello, world!') + self.assertEqual( + (self.files / 'a').read_text(encoding='utf-8'), 'Hello, world!' + ) + + def test_orphan_path_open(self): + with self.assertRaises(FileNotFoundError): + (self.files / 'a' / 'b').read_bytes() + with self.assertRaises(FileNotFoundError): + (self.files / 'a' / 'b' / 'c').read_bytes() + + def test_open_invalid_mode(self): + with self.assertRaises(ValueError): + self.files.open('0') + + def test_orphan_path_invalid(self): + with self.assertRaises(ValueError): + CompatibilityFiles.OrphanPath() + + def test_wrap_spec(self): + spec = wrap_spec(self.package) + self.assertIsInstance(spec.loader.get_resource_reader(None), CompatibilityFiles) + + +class CompatibilityFilesNoReaderTests(unittest.TestCase): + @property + def package(self): + return util.create_package_from_loader(None) + + @property + def files(self): + return resources.files(self.package) + + def test_spec_path_joinpath(self): + self.assertIsInstance(self.files / 'a', CompatibilityFiles.OrphanPath) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/test_contents.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/test_contents.py new file mode 100755 index 00000000..525568e8 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/test_contents.py @@ -0,0 +1,43 @@ +import unittest +import importlib_resources as resources + +from . import data01 +from . import util + + +class ContentsTests: + expected = { + '__init__.py', + 'binary.file', + 'subdirectory', + 'utf-16.file', + 'utf-8.file', + } + + def test_contents(self): + contents = {path.name for path in resources.files(self.data).iterdir()} + assert self.expected <= contents + + +class ContentsDiskTests(ContentsTests, unittest.TestCase): + def setUp(self): + self.data = data01 + + +class ContentsZipTests(ContentsTests, util.ZipSetup, unittest.TestCase): + pass + + +class ContentsNamespaceTests(ContentsTests, unittest.TestCase): + expected = { + # no __init__ because of namespace design + # no subdirectory as incidental difference in fixture + 'binary.file', + 'utf-16.file', + 'utf-8.file', + } + + def setUp(self): + from . import namespacedata01 + + self.data = namespacedata01 diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/test_custom.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/test_custom.py new file mode 100755 index 00000000..e85ddd65 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/test_custom.py @@ -0,0 +1,45 @@ +import unittest +import contextlib +import pathlib + +import importlib_resources as resources +from ..abc import TraversableResources, ResourceReader +from . import util +from ._compat import os_helper + + +class SimpleLoader: + """ + A simple loader that only implements a resource reader. + """ + + def __init__(self, reader: ResourceReader): + self.reader = reader + + def get_resource_reader(self, package): + return self.reader + + +class MagicResources(TraversableResources): + """ + Magically returns the resources at path. + """ + + def __init__(self, path: pathlib.Path): + self.path = path + + def files(self): + return self.path + + +class CustomTraversableResourcesTests(unittest.TestCase): + def setUp(self): + self.fixtures = contextlib.ExitStack() + self.addCleanup(self.fixtures.close) + + def test_custom_loader(self): + temp_dir = self.fixtures.enter_context(os_helper.temp_dir()) + loader = SimpleLoader(MagicResources(temp_dir)) + pkg = util.create_package_from_loader(loader) + files = resources.files(pkg) + assert files is temp_dir diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/test_files.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/test_files.py new file mode 100755 index 00000000..197a063b --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/test_files.py @@ -0,0 +1,112 @@ +import typing +import textwrap +import unittest +import warnings +import importlib +import contextlib + +import importlib_resources as resources +from ..abc import Traversable +from . import data01 +from . import util +from . import _path +from ._compat import os_helper, import_helper + + +@contextlib.contextmanager +def suppress_known_deprecation(): + with warnings.catch_warnings(record=True) as ctx: + warnings.simplefilter('default', category=DeprecationWarning) + yield ctx + + +class FilesTests: + def test_read_bytes(self): + files = resources.files(self.data) + actual = files.joinpath('utf-8.file').read_bytes() + assert actual == b'Hello, UTF-8 world!\n' + + def test_read_text(self): + files = resources.files(self.data) + actual = files.joinpath('utf-8.file').read_text(encoding='utf-8') + assert actual == 'Hello, UTF-8 world!\n' + + @unittest.skipUnless( + hasattr(typing, 'runtime_checkable'), + "Only suitable when typing supports runtime_checkable", + ) + def test_traversable(self): + assert isinstance(resources.files(self.data), Traversable) + + def test_old_parameter(self): + """ + Files used to take a 'package' parameter. Make sure anyone + passing by name is still supported. + """ + with suppress_known_deprecation(): + resources.files(package=self.data) + + +class OpenDiskTests(FilesTests, unittest.TestCase): + def setUp(self): + self.data = data01 + + +class OpenZipTests(FilesTests, util.ZipSetup, unittest.TestCase): + pass + + +class OpenNamespaceTests(FilesTests, unittest.TestCase): + def setUp(self): + from . import namespacedata01 + + self.data = namespacedata01 + + +class SiteDir: + def setUp(self): + self.fixtures = contextlib.ExitStack() + self.addCleanup(self.fixtures.close) + self.site_dir = self.fixtures.enter_context(os_helper.temp_dir()) + self.fixtures.enter_context(import_helper.DirsOnSysPath(self.site_dir)) + self.fixtures.enter_context(import_helper.CleanImport()) + + +class ModulesFilesTests(SiteDir, unittest.TestCase): + def test_module_resources(self): + """ + A module can have resources found adjacent to the module. + """ + spec = { + 'mod.py': '', + 'res.txt': 'resources are the best', + } + _path.build(spec, self.site_dir) + import mod + + actual = resources.files(mod).joinpath('res.txt').read_text(encoding='utf-8') + assert actual == spec['res.txt'] + + +class ImplicitContextFilesTests(SiteDir, unittest.TestCase): + def test_implicit_files(self): + """ + Without any parameter, files() will infer the location as the caller. + """ + spec = { + 'somepkg': { + '__init__.py': textwrap.dedent( + """ + import importlib_resources as res + val = res.files().joinpath('res.txt').read_text(encoding='utf-8') + """ + ), + 'res.txt': 'resources are the best', + }, + } + _path.build(spec, self.site_dir) + assert importlib.import_module('somepkg').val == 'resources are the best' + + +if __name__ == '__main__': + unittest.main() diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/test_open.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/test_open.py new file mode 100755 index 00000000..83b737dc --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/test_open.py @@ -0,0 +1,85 @@ +import unittest + +import importlib_resources as resources +from . import data01 +from . import util + + +class CommonBinaryTests(util.CommonTests, unittest.TestCase): + def execute(self, package, path): + target = resources.files(package).joinpath(path) + with target.open('rb'): + pass + + +class CommonTextTests(util.CommonTests, unittest.TestCase): + def execute(self, package, path): + target = resources.files(package).joinpath(path) + with target.open(encoding='utf-8'): + pass + + +class OpenTests: + def test_open_binary(self): + target = resources.files(self.data) / 'binary.file' + with target.open('rb') as fp: + result = fp.read() + self.assertEqual(result, b'\x00\x01\x02\x03') + + def test_open_text_default_encoding(self): + target = resources.files(self.data) / 'utf-8.file' + with target.open(encoding='utf-8') as fp: + result = fp.read() + self.assertEqual(result, 'Hello, UTF-8 world!\n') + + def test_open_text_given_encoding(self): + target = resources.files(self.data) / 'utf-16.file' + with target.open(encoding='utf-16', errors='strict') as fp: + result = fp.read() + self.assertEqual(result, 'Hello, UTF-16 world!\n') + + def test_open_text_with_errors(self): + """ + Raises UnicodeError without the 'errors' argument. + """ + target = resources.files(self.data) / 'utf-16.file' + with target.open(encoding='utf-8', errors='strict') as fp: + self.assertRaises(UnicodeError, fp.read) + with target.open(encoding='utf-8', errors='ignore') as fp: + result = fp.read() + self.assertEqual( + result, + 'H\x00e\x00l\x00l\x00o\x00,\x00 ' + '\x00U\x00T\x00F\x00-\x001\x006\x00 ' + '\x00w\x00o\x00r\x00l\x00d\x00!\x00\n\x00', + ) + + def test_open_binary_FileNotFoundError(self): + target = resources.files(self.data) / 'does-not-exist' + with self.assertRaises(FileNotFoundError): + target.open('rb') + + def test_open_text_FileNotFoundError(self): + target = resources.files(self.data) / 'does-not-exist' + with self.assertRaises(FileNotFoundError): + target.open(encoding='utf-8') + + +class OpenDiskTests(OpenTests, unittest.TestCase): + def setUp(self): + self.data = data01 + + +class OpenDiskNamespaceTests(OpenTests, unittest.TestCase): + def setUp(self): + from . import namespacedata01 + + self.data = namespacedata01 + + +class OpenZipTests(OpenTests, util.ZipSetup, unittest.TestCase): + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/test_path.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/test_path.py new file mode 100755 index 00000000..7cb20003 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/test_path.py @@ -0,0 +1,69 @@ +import io +import unittest + +import importlib_resources as resources +from . import data01 +from . import util + + +class CommonTests(util.CommonTests, unittest.TestCase): + def execute(self, package, path): + with resources.as_file(resources.files(package).joinpath(path)): + pass + + +class PathTests: + def test_reading(self): + """ + Path should be readable. + + Test also implicitly verifies the returned object is a pathlib.Path + instance. + """ + target = resources.files(self.data) / 'utf-8.file' + with resources.as_file(target) as path: + self.assertTrue(path.name.endswith("utf-8.file"), repr(path)) + # pathlib.Path.read_text() was introduced in Python 3.5. + with path.open('r', encoding='utf-8') as file: + text = file.read() + self.assertEqual('Hello, UTF-8 world!\n', text) + + +class PathDiskTests(PathTests, unittest.TestCase): + data = data01 + + def test_natural_path(self): + """ + Guarantee the internal implementation detail that + file-system-backed resources do not get the tempdir + treatment. + """ + target = resources.files(self.data) / 'utf-8.file' + with resources.as_file(target) as path: + assert 'data' in str(path) + + +class PathMemoryTests(PathTests, unittest.TestCase): + def setUp(self): + file = io.BytesIO(b'Hello, UTF-8 world!\n') + self.addCleanup(file.close) + self.data = util.create_package( + file=file, path=FileNotFoundError("package exists only in memory") + ) + self.data.__spec__.origin = None + self.data.__spec__.has_location = False + + +class PathZipTests(PathTests, util.ZipSetup, unittest.TestCase): + def test_remove_in_context_manager(self): + """ + It is not an error if the file that was temporarily stashed on the + file system is removed inside the `with` stanza. + """ + target = resources.files(self.data) / 'utf-8.file' + with resources.as_file(target) as path: + path.unlink() + + +if __name__ == '__main__': + unittest.main() diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/test_read.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/test_read.py new file mode 100755 index 00000000..b5aaec45 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/test_read.py @@ -0,0 +1,82 @@ +import unittest +import importlib_resources as resources + +from . import data01 +from . import util +from importlib import import_module + + +class CommonBinaryTests(util.CommonTests, unittest.TestCase): + def execute(self, package, path): + resources.files(package).joinpath(path).read_bytes() + + +class CommonTextTests(util.CommonTests, unittest.TestCase): + def execute(self, package, path): + resources.files(package).joinpath(path).read_text(encoding='utf-8') + + +class ReadTests: + def test_read_bytes(self): + result = resources.files(self.data).joinpath('binary.file').read_bytes() + self.assertEqual(result, b'\0\1\2\3') + + def test_read_text_default_encoding(self): + result = ( + resources.files(self.data) + .joinpath('utf-8.file') + .read_text(encoding='utf-8') + ) + self.assertEqual(result, 'Hello, UTF-8 world!\n') + + def test_read_text_given_encoding(self): + result = ( + resources.files(self.data) + .joinpath('utf-16.file') + .read_text(encoding='utf-16') + ) + self.assertEqual(result, 'Hello, UTF-16 world!\n') + + def test_read_text_with_errors(self): + """ + Raises UnicodeError without the 'errors' argument. + """ + target = resources.files(self.data) / 'utf-16.file' + self.assertRaises(UnicodeError, target.read_text, encoding='utf-8') + result = target.read_text(encoding='utf-8', errors='ignore') + self.assertEqual( + result, + 'H\x00e\x00l\x00l\x00o\x00,\x00 ' + '\x00U\x00T\x00F\x00-\x001\x006\x00 ' + '\x00w\x00o\x00r\x00l\x00d\x00!\x00\n\x00', + ) + + +class ReadDiskTests(ReadTests, unittest.TestCase): + data = data01 + + +class ReadZipTests(ReadTests, util.ZipSetup, unittest.TestCase): + def test_read_submodule_resource(self): + submodule = import_module('ziptestdata.subdirectory') + result = resources.files(submodule).joinpath('binary.file').read_bytes() + self.assertEqual(result, b'\0\1\2\3') + + def test_read_submodule_resource_by_name(self): + result = ( + resources.files('ziptestdata.subdirectory') + .joinpath('binary.file') + .read_bytes() + ) + self.assertEqual(result, b'\0\1\2\3') + + +class ReadNamespaceTests(ReadTests, unittest.TestCase): + def setUp(self): + from . import namespacedata01 + + self.data = namespacedata01 + + +if __name__ == '__main__': + unittest.main() diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/test_reader.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/test_reader.py new file mode 100755 index 00000000..e2bdf19c --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/test_reader.py @@ -0,0 +1,144 @@ +import os.path +import sys +import pathlib +import unittest + +from importlib import import_module +from importlib_resources.readers import MultiplexedPath, NamespaceReader + + +class MultiplexedPathTest(unittest.TestCase): + @classmethod + def setUpClass(cls): + path = pathlib.Path(__file__).parent / 'namespacedata01' + cls.folder = str(path) + + def test_init_no_paths(self): + with self.assertRaises(FileNotFoundError): + MultiplexedPath() + + def test_init_file(self): + with self.assertRaises(NotADirectoryError): + MultiplexedPath(os.path.join(self.folder, 'binary.file')) + + def test_iterdir(self): + contents = {path.name for path in MultiplexedPath(self.folder).iterdir()} + try: + contents.remove('__pycache__') + except (KeyError, ValueError): + pass + self.assertEqual(contents, {'binary.file', 'utf-16.file', 'utf-8.file'}) + + def test_iterdir_duplicate(self): + data01 = os.path.abspath(os.path.join(__file__, '..', 'data01')) + contents = { + path.name for path in MultiplexedPath(self.folder, data01).iterdir() + } + for remove in ('__pycache__', '__init__.pyc'): + try: + contents.remove(remove) + except (KeyError, ValueError): + pass + self.assertEqual( + contents, + {'__init__.py', 'binary.file', 'subdirectory', 'utf-16.file', 'utf-8.file'}, + ) + + def test_is_dir(self): + self.assertEqual(MultiplexedPath(self.folder).is_dir(), True) + + def test_is_file(self): + self.assertEqual(MultiplexedPath(self.folder).is_file(), False) + + def test_open_file(self): + path = MultiplexedPath(self.folder) + with self.assertRaises(FileNotFoundError): + path.read_bytes() + with self.assertRaises(FileNotFoundError): + path.read_text() + with self.assertRaises(FileNotFoundError): + path.open() + + def test_join_path(self): + prefix = os.path.abspath(os.path.join(__file__, '..')) + data01 = os.path.join(prefix, 'data01') + path = MultiplexedPath(self.folder, data01) + self.assertEqual( + str(path.joinpath('binary.file'))[len(prefix) + 1 :], + os.path.join('namespacedata01', 'binary.file'), + ) + self.assertEqual( + str(path.joinpath('subdirectory'))[len(prefix) + 1 :], + os.path.join('data01', 'subdirectory'), + ) + self.assertEqual( + str(path.joinpath('imaginary'))[len(prefix) + 1 :], + os.path.join('namespacedata01', 'imaginary'), + ) + self.assertEqual(path.joinpath(), path) + + def test_join_path_compound(self): + path = MultiplexedPath(self.folder) + assert not path.joinpath('imaginary/foo.py').exists() + + def test_join_path_common_subdir(self): + prefix = os.path.abspath(os.path.join(__file__, '..')) + data01 = os.path.join(prefix, 'data01') + data02 = os.path.join(prefix, 'data02') + path = MultiplexedPath(data01, data02) + self.assertIsInstance(path.joinpath('subdirectory'), MultiplexedPath) + self.assertEqual( + str(path.joinpath('subdirectory', 'subsubdir'))[len(prefix) + 1 :], + os.path.join('data02', 'subdirectory', 'subsubdir'), + ) + + def test_repr(self): + self.assertEqual( + repr(MultiplexedPath(self.folder)), + f"MultiplexedPath('{self.folder}')", + ) + + def test_name(self): + self.assertEqual( + MultiplexedPath(self.folder).name, + os.path.basename(self.folder), + ) + + +class NamespaceReaderTest(unittest.TestCase): + site_dir = str(pathlib.Path(__file__).parent) + + @classmethod + def setUpClass(cls): + sys.path.append(cls.site_dir) + + @classmethod + def tearDownClass(cls): + sys.path.remove(cls.site_dir) + + def test_init_error(self): + with self.assertRaises(ValueError): + NamespaceReader(['path1', 'path2']) + + def test_resource_path(self): + namespacedata01 = import_module('namespacedata01') + reader = NamespaceReader(namespacedata01.__spec__.submodule_search_locations) + + root = os.path.abspath(os.path.join(__file__, '..', 'namespacedata01')) + self.assertEqual( + reader.resource_path('binary.file'), os.path.join(root, 'binary.file') + ) + self.assertEqual( + reader.resource_path('imaginary'), os.path.join(root, 'imaginary') + ) + + def test_files(self): + namespacedata01 = import_module('namespacedata01') + reader = NamespaceReader(namespacedata01.__spec__.submodule_search_locations) + root = os.path.abspath(os.path.join(__file__, '..', 'namespacedata01')) + self.assertIsInstance(reader.files(), MultiplexedPath) + self.assertEqual(repr(reader.files()), f"MultiplexedPath('{root}')") + + +if __name__ == '__main__': + unittest.main() diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/test_resource.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/test_resource.py new file mode 100755 index 00000000..677110cd --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/test_resource.py @@ -0,0 +1,252 @@ +import contextlib +import sys +import unittest +import importlib_resources as resources +import uuid +import pathlib + +from . import data01 +from . import zipdata01, zipdata02 +from . import util +from importlib import import_module +from ._compat import import_helper, os_helper, unlink + + +class ResourceTests: + # Subclasses are expected to set the `data` attribute. + + def test_is_file_exists(self): + target = resources.files(self.data) / 'binary.file' + self.assertTrue(target.is_file()) + + def test_is_file_missing(self): + target = resources.files(self.data) / 'not-a-file' + self.assertFalse(target.is_file()) + + def test_is_dir(self): + target = resources.files(self.data) / 'subdirectory' + self.assertFalse(target.is_file()) + self.assertTrue(target.is_dir()) + + +class ResourceDiskTests(ResourceTests, unittest.TestCase): + def setUp(self): + self.data = data01 + + +class ResourceZipTests(ResourceTests, util.ZipSetup, unittest.TestCase): + pass + + +def names(traversable): + return {item.name for item in traversable.iterdir()} + + +class ResourceLoaderTests(unittest.TestCase): + def test_resource_contents(self): + package = util.create_package( + file=data01, path=data01.__file__, contents=['A', 'B', 'C'] + ) + self.assertEqual(names(resources.files(package)), {'A', 'B', 'C'}) + + def test_is_file(self): + package = util.create_package( + file=data01, path=data01.__file__, contents=['A', 'B', 'C', 'D/E', 'D/F'] + ) + self.assertTrue(resources.files(package).joinpath('B').is_file()) + + def test_is_dir(self): + package = util.create_package( + file=data01, path=data01.__file__, contents=['A', 'B', 'C', 'D/E', 'D/F'] + ) + self.assertTrue(resources.files(package).joinpath('D').is_dir()) + + def test_resource_missing(self): + package = util.create_package( + file=data01, path=data01.__file__, contents=['A', 'B', 'C', 'D/E', 'D/F'] + ) + self.assertFalse(resources.files(package).joinpath('Z').is_file()) + + +class ResourceCornerCaseTests(unittest.TestCase): + def test_package_has_no_reader_fallback(self): + """ + Test odd ball packages which: + # 1. Do not have a ResourceReader as a loader + # 2. Are not on the file system + # 3. Are not in a zip file + """ + module = util.create_package( + file=data01, path=data01.__file__, contents=['A', 'B', 'C'] + ) + # Give the module a dummy loader. + module.__loader__ = object() + # Give the module a dummy origin. + module.__file__ = '/path/which/shall/not/be/named' + module.__spec__.loader = module.__loader__ + module.__spec__.origin = module.__file__ + self.assertFalse(resources.files(module).joinpath('A').is_file()) + + +class ResourceFromZipsTest01(util.ZipSetupBase, unittest.TestCase): + ZIP_MODULE = zipdata01 # type: ignore + + def test_is_submodule_resource(self): + submodule = import_module('ziptestdata.subdirectory') + self.assertTrue(resources.files(submodule).joinpath('binary.file').is_file()) + + def test_read_submodule_resource_by_name(self): + self.assertTrue( + resources.files('ziptestdata.subdirectory') + .joinpath('binary.file') + .is_file() + ) + + def test_submodule_contents(self): + submodule = import_module('ziptestdata.subdirectory') + self.assertEqual( + names(resources.files(submodule)), {'__init__.py', 'binary.file'} + ) + + def test_submodule_contents_by_name(self): + self.assertEqual( + names(resources.files('ziptestdata.subdirectory')), + {'__init__.py', 'binary.file'}, + ) + + def test_as_file_directory(self): + with resources.as_file(resources.files('ziptestdata')) as data: + assert data.name == 'ziptestdata' + assert data.is_dir() + assert data.joinpath('subdirectory').is_dir() + assert len(list(data.iterdir())) + assert not data.parent.exists() + + +class ResourceFromZipsTest02(util.ZipSetupBase, unittest.TestCase): + ZIP_MODULE = zipdata02 # type: ignore + + def test_unrelated_contents(self): + """ + Test thata zip with two unrelated subpackages return + distinct resources. Ref python/importlib_resources#44. + """ + self.assertEqual( + names(resources.files('ziptestdata.one')), + {'__init__.py', 'resource1.txt'}, + ) + self.assertEqual( + names(resources.files('ziptestdata.two')), + {'__init__.py', 'resource2.txt'}, + ) + + +@contextlib.contextmanager +def zip_on_path(dir): + data_path = pathlib.Path(zipdata01.__file__) + source_zip_path = data_path.parent.joinpath('ziptestdata.zip') + zip_path = pathlib.Path(dir) / f'{uuid.uuid4()}.zip' + zip_path.write_bytes(source_zip_path.read_bytes()) + sys.path.append(str(zip_path)) + import_module('ziptestdata') + + try: + yield + finally: + with contextlib.suppress(ValueError): + sys.path.remove(str(zip_path)) + + with contextlib.suppress(KeyError): + del sys.path_importer_cache[str(zip_path)] + del sys.modules['ziptestdata'] + + with contextlib.suppress(OSError): + unlink(zip_path) + + +class DeletingZipsTest(unittest.TestCase): + """Having accessed resources in a zip file should not keep an open + reference to the zip. + """ + + def setUp(self): + self.fixtures = contextlib.ExitStack() + self.addCleanup(self.fixtures.close) + + modules = import_helper.modules_setup() + self.addCleanup(import_helper.modules_cleanup, *modules) + + temp_dir = self.fixtures.enter_context(os_helper.temp_dir()) + self.fixtures.enter_context(zip_on_path(temp_dir)) + + def test_iterdir_does_not_keep_open(self): + [item.name for item in resources.files('ziptestdata').iterdir()] + + def test_is_file_does_not_keep_open(self): + resources.files('ziptestdata').joinpath('binary.file').is_file() + + def test_is_file_failure_does_not_keep_open(self): + resources.files('ziptestdata').joinpath('not-present').is_file() + + @unittest.skip("Desired but not supported.") + def test_as_file_does_not_keep_open(self): # pragma: no cover + resources.as_file(resources.files('ziptestdata') / 'binary.file') + + def test_entered_path_does_not_keep_open(self): + """ + Mimic what certifi does on import to make its bundle + available for the process duration. + """ + resources.as_file(resources.files('ziptestdata') / 'binary.file').__enter__() + + def test_read_binary_does_not_keep_open(self): + resources.files('ziptestdata').joinpath('binary.file').read_bytes() + + def test_read_text_does_not_keep_open(self): + resources.files('ziptestdata').joinpath('utf-8.file').read_text( + encoding='utf-8' + ) + + +class ResourceFromNamespaceTest01(unittest.TestCase): + site_dir = str(pathlib.Path(__file__).parent) + + @classmethod + def setUpClass(cls): + sys.path.append(cls.site_dir) + + @classmethod + def tearDownClass(cls): + sys.path.remove(cls.site_dir) + + def test_is_submodule_resource(self): + self.assertTrue( + resources.files(import_module('namespacedata01')) + .joinpath('binary.file') + .is_file() + ) + + def test_read_submodule_resource_by_name(self): + self.assertTrue( + resources.files('namespacedata01').joinpath('binary.file').is_file() + ) + + def test_submodule_contents(self): + contents = names(resources.files(import_module('namespacedata01'))) + try: + contents.remove('__pycache__') + except KeyError: + pass + self.assertEqual(contents, {'binary.file', 'utf-8.file', 'utf-16.file'}) + + def test_submodule_contents_by_name(self): + contents = names(resources.files('namespacedata01')) + try: + contents.remove('__pycache__') + except KeyError: + pass + self.assertEqual(contents, {'binary.file', 'utf-8.file', 'utf-16.file'}) + + +if __name__ == '__main__': + unittest.main() diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/update-zips.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/update-zips.py new file mode 100755 index 00000000..231334aa --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/update-zips.py @@ -0,0 +1,53 @@ +""" +Generate the zip test data files. + +Run to build the tests/zipdataNN/ziptestdata.zip files from +files in tests/dataNN. + +Replaces the file with the working copy, but does commit anything +to the source repo. +""" + +import contextlib +import os +import pathlib +import zipfile + + +def main(): + """ + >>> from unittest import mock + >>> monkeypatch = getfixture('monkeypatch') + >>> monkeypatch.setattr(zipfile, 'ZipFile', mock.MagicMock()) + >>> print(); main() # print workaround for bpo-32509 + + ...data01... -> ziptestdata/... + ... + ...data02... -> ziptestdata/... + ... + """ + suffixes = '01', '02' + tuple(map(generate, suffixes)) + + +def generate(suffix): + root = pathlib.Path(__file__).parent.relative_to(os.getcwd()) + zfpath = root / f'zipdata{suffix}/ziptestdata.zip' + with zipfile.ZipFile(zfpath, 'w') as zf: + for src, rel in walk(root / f'data{suffix}'): + dst = 'ziptestdata' / pathlib.PurePosixPath(rel.as_posix()) + print(src, '->', dst) + zf.write(src, dst) + + +def walk(datapath): + for dirpath, dirnames, filenames in os.walk(datapath): + with contextlib.suppress(ValueError): + dirnames.remove('__pycache__') + for filename in filenames: + res = pathlib.Path(dirpath) / filename + rel = res.relative_to(datapath) + yield res, rel + + +__name__ == '__main__' and main() diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/util.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/util.py new file mode 100755 index 00000000..ce0e6fad --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/util.py @@ -0,0 +1,179 @@ +import abc +import importlib +import io +import sys +import types +import pathlib + +from . import data01 +from . import zipdata01 +from ..abc import ResourceReader +from ._compat import import_helper + + +from importlib.machinery import ModuleSpec + + +class Reader(ResourceReader): + def __init__(self, **kwargs): + vars(self).update(kwargs) + + def get_resource_reader(self, package): + return self + + def open_resource(self, path): + self._path = path + if isinstance(self.file, Exception): + raise self.file + return self.file + + def resource_path(self, path_): + self._path = path_ + if isinstance(self.path, Exception): + raise self.path + return self.path + + def is_resource(self, path_): + self._path = path_ + if isinstance(self.path, Exception): + raise self.path + + def part(entry): + return entry.split('/') + + return any( + len(parts) == 1 and parts[0] == path_ for parts in map(part, self._contents) + ) + + def contents(self): + if isinstance(self.path, Exception): + raise self.path + yield from self._contents + + +def create_package_from_loader(loader, is_package=True): + name = 'testingpackage' + module = types.ModuleType(name) + spec = ModuleSpec(name, loader, origin='does-not-exist', is_package=is_package) + module.__spec__ = spec + module.__loader__ = loader + return module + + +def create_package(file=None, path=None, is_package=True, contents=()): + return create_package_from_loader( + Reader(file=file, path=path, _contents=contents), + is_package, + ) + + +class CommonTests(metaclass=abc.ABCMeta): + """ + Tests shared by test_open, test_path, and test_read. + """ + + @abc.abstractmethod + def execute(self, package, path): + """ + Call the pertinent legacy API function (e.g. open_text, path) + on package and path. + """ + + def test_package_name(self): + """ + Passing in the package name should succeed. + """ + self.execute(data01.__name__, 'utf-8.file') + + def test_package_object(self): + """ + Passing in the package itself should succeed. + """ + self.execute(data01, 'utf-8.file') + + def test_string_path(self): + """ + Passing in a string for the path should succeed. + """ + path = 'utf-8.file' + self.execute(data01, path) + + def test_pathlib_path(self): + """ + Passing in a pathlib.PurePath object for the path should succeed. + """ + path = pathlib.PurePath('utf-8.file') + self.execute(data01, path) + + def test_importing_module_as_side_effect(self): + """ + The anchor package can already be imported. + """ + del sys.modules[data01.__name__] + self.execute(data01.__name__, 'utf-8.file') + + def test_missing_path(self): + """ + Attempting to open or read or request the path for a + non-existent path should succeed if open_resource + can return a viable data stream. + """ + bytes_data = io.BytesIO(b'Hello, world!') + package = create_package(file=bytes_data, path=FileNotFoundError()) + self.execute(package, 'utf-8.file') + self.assertEqual(package.__loader__._path, 'utf-8.file') + + def test_extant_path(self): + # Attempting to open or read or request the path when the + # path does exist should still succeed. Does not assert + # anything about the result. + bytes_data = io.BytesIO(b'Hello, world!') + # any path that exists + path = __file__ + package = create_package(file=bytes_data, path=path) + self.execute(package, 'utf-8.file') + self.assertEqual(package.__loader__._path, 'utf-8.file') + + def test_useless_loader(self): + package = create_package(file=FileNotFoundError(), path=FileNotFoundError()) + with self.assertRaises(FileNotFoundError): + self.execute(package, 'utf-8.file') + + +class ZipSetupBase: + ZIP_MODULE = None + + @classmethod + def setUpClass(cls): + data_path = pathlib.Path(cls.ZIP_MODULE.__file__) + data_dir = data_path.parent + cls._zip_path = str(data_dir / 'ziptestdata.zip') + sys.path.append(cls._zip_path) + cls.data = importlib.import_module('ziptestdata') + + @classmethod + def tearDownClass(cls): + try: + sys.path.remove(cls._zip_path) + except ValueError: + pass + + try: + del sys.path_importer_cache[cls._zip_path] + del sys.modules[cls.data.__name__] + except KeyError: + pass + + try: + del cls.data + del cls._zip_path + except AttributeError: + pass + + def setUp(self): + modules = import_helper.modules_setup() + self.addCleanup(import_helper.modules_cleanup, *modules) + + +class ZipSetup(ZipSetupBase): + ZIP_MODULE = zipdata01 # type: ignore diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/zipdata01/__init__.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/zipdata01/__init__.py new file mode 100755 index 00000000..e69de29b diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/zipdata01/ziptestdata.zip b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/zipdata01/ziptestdata.zip new file mode 100755 index 0000000000000000000000000000000000000000..9a3bb0739f87e97c1084b94d7d153680f6727738 GIT binary patch literal 876 zcmWIWW@Zs#00HOCX@Q%&m27l?Y!DU);;PJolGNgol*E!m{nC;&T|+ayw9K5;|NlG~ zQWMD z9;rDw`8o=rA#S=B3g!7lIVp-}COK17UPc zNtt;*xhM-3R!jMEPhCreO-3*u>5Df}T7+BJ{639e$2uhfsIs`pJ5Qf}C xGXyDE@VNvOv@o!wQJfLgCAgysx3f@9jKpUmiW^zkK<;1z!tFpk^MROw0RS~O%0&PG literal 0 HcmV?d00001 diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/zipdata02/__init__.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/zipdata02/__init__.py new file mode 100755 index 00000000..e69de29b diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/zipdata02/ziptestdata.zip b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/importlib_resources/tests/zipdata02/ziptestdata.zip new file mode 100755 index 0000000000000000000000000000000000000000..d63ff512d2807ef2fd259455283b81b02e0e45fb GIT binary patch literal 698 zcmWIWW@Zs#00HOCX@Ot{ln@8fRhb1Psl_EJi6x2p@$s2?nI-Y@dIgmMI5kP5Y0A$_ z#jWw|&p#`9ff_(q7K_HB)Z+ZoqU2OVy^@L&ph*fa0WRVlP*R?c+X1opI-R&20MZDv z&j{oIpa8N17@0(vaR(gGH(;=&5k%n(M%;#g0ulz6G@1gL$cA79E2=^00gEsw4~s!C zUxI@ZWaIMqz|BszK;s4KsL2<9jRy!Q2E6`2cTLHjr{wAk1ZCU@!+_ G1_l6Bc%f?m literal 0 HcmV?d00001 diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2-3.1.6.dist-info/INSTALLER b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2-3.1.6.dist-info/INSTALLER new file mode 100755 index 00000000..a1b589e3 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2-3.1.6.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2-3.1.6.dist-info/METADATA b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2-3.1.6.dist-info/METADATA new file mode 100755 index 00000000..ffef2ff3 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2-3.1.6.dist-info/METADATA @@ -0,0 +1,84 @@ +Metadata-Version: 2.4 +Name: Jinja2 +Version: 3.1.6 +Summary: A very fast and expressive template engine. +Maintainer-email: Pallets +Requires-Python: >=3.7 +Description-Content-Type: text/markdown +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Text Processing :: Markup :: HTML +Classifier: Typing :: Typed +License-File: LICENSE.txt +Requires-Dist: MarkupSafe>=2.0 +Requires-Dist: Babel>=2.7 ; extra == "i18n" +Project-URL: Changes, https://jinja.palletsprojects.com/changes/ +Project-URL: Chat, https://discord.gg/pallets +Project-URL: Documentation, https://jinja.palletsprojects.com/ +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Source, https://github.com/pallets/jinja/ +Provides-Extra: i18n + +# Jinja + +Jinja is a fast, expressive, extensible templating engine. Special +placeholders in the template allow writing code similar to Python +syntax. Then the template is passed data to render the final document. + +It includes: + +- Template inheritance and inclusion. +- Define and import macros within templates. +- HTML templates can use autoescaping to prevent XSS from untrusted + user input. +- A sandboxed environment can safely render untrusted templates. +- AsyncIO support for generating templates and calling async + functions. +- I18N support with Babel. +- Templates are compiled to optimized Python code just-in-time and + cached, or can be compiled ahead-of-time. +- Exceptions point to the correct line in templates to make debugging + easier. +- Extensible filters, tests, functions, and even syntax. + +Jinja's philosophy is that while application logic belongs in Python if +possible, it shouldn't make the template designer's job difficult by +restricting functionality too much. + + +## In A Nutshell + +```jinja +{% extends "base.html" %} +{% block title %}Members{% endblock %} +{% block content %} +

+{% endblock %} +``` + +## Donate + +The Pallets organization develops and supports Jinja and other popular +packages. In order to grow the community of contributors and users, and +allow the maintainers to devote more time to the projects, [please +donate today][]. + +[please donate today]: https://palletsprojects.com/donate + +## Contributing + +See our [detailed contributing documentation][contrib] for many ways to +contribute, including reporting issues, requesting features, asking or answering +questions, and making PRs. + +[contrib]: https://palletsprojects.com/contributing/ + diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2-3.1.6.dist-info/RECORD b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2-3.1.6.dist-info/RECORD new file mode 100755 index 00000000..3daafc1a --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2-3.1.6.dist-info/RECORD @@ -0,0 +1,33 @@ +jinja2-3.1.6.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +jinja2-3.1.6.dist-info/METADATA,sha256=aMVUj7Z8QTKhOJjZsx7FDGvqKr3ZFdkh8hQ1XDpkmcg,2871 +jinja2-3.1.6.dist-info/RECORD,, +jinja2-3.1.6.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +jinja2-3.1.6.dist-info/WHEEL,sha256=_2ozNFCLWc93bK4WKHCO-eDUENDlo-dgc9cU3qokYO4,82 +jinja2-3.1.6.dist-info/entry_points.txt,sha256=OL85gYU1eD8cuPlikifFngXpeBjaxl6rIJ8KkC_3r-I,58 +jinja2-3.1.6.dist-info/licenses/LICENSE.txt,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475 +jinja2/__init__.py,sha256=xxepO9i7DHsqkQrgBEduLtfoz2QCuT6_gbL4XSN1hbU,1928 +jinja2/_identifier.py,sha256=_zYctNKzRqlk_murTNlzrju1FFJL7Va_Ijqqd7ii2lU,1958 +jinja2/async_utils.py,sha256=vK-PdsuorOMnWSnEkT3iUJRIkTnYgO2T6MnGxDgHI5o,2834 +jinja2/bccache.py,sha256=gh0qs9rulnXo0PhX5jTJy2UHzI8wFnQ63o_vw7nhzRg,14061 +jinja2/compiler.py,sha256=9RpCQl5X88BHllJiPsHPh295Hh0uApvwFJNQuutULeM,74131 +jinja2/constants.py,sha256=GMoFydBF_kdpaRKPoM5cl5MviquVRLVyZtfp5-16jg0,1433 +jinja2/debug.py,sha256=CnHqCDHd-BVGvti_8ZsTolnXNhA3ECsY-6n_2pwU8Hw,6297 +jinja2/defaults.py,sha256=boBcSw78h-lp20YbaXSJsqkAI2uN_mD_TtCydpeq5wU,1267 +jinja2/environment.py,sha256=9nhrP7Ch-NbGX00wvyr4yy-uhNHq2OCc60ggGrni_fk,61513 +jinja2/exceptions.py,sha256=ioHeHrWwCWNaXX1inHmHVblvc4haO7AXsjCp3GfWvx0,5071 +jinja2/ext.py,sha256=5PF5eHfh8mXAIxXHHRB2xXbXohi8pE3nHSOxa66uS7E,31875 +jinja2/filters.py,sha256=PQ_Egd9n9jSgtnGQYyF4K5j2nYwhUIulhPnyimkdr-k,55212 +jinja2/idtracking.py,sha256=-ll5lIp73pML3ErUYiIJj7tdmWxcH_IlDv3yA_hiZYo,10555 +jinja2/lexer.py,sha256=LYiYio6br-Tep9nPcupWXsPEtjluw3p1mU-lNBVRUfk,29786 +jinja2/loaders.py,sha256=wIrnxjvcbqh5VwW28NSkfotiDq8qNCxIOSFbGUiSLB4,24055 +jinja2/meta.py,sha256=OTDPkaFvU2Hgvx-6akz7154F8BIWaRmvJcBFvwopHww,4397 +jinja2/nativetypes.py,sha256=7GIGALVJgdyL80oZJdQUaUfwSt5q2lSSZbXt0dNf_M4,4210 +jinja2/nodes.py,sha256=m1Duzcr6qhZI8JQ6VyJgUNinjAf5bQzijSmDnMsvUx8,34579 +jinja2/optimizer.py,sha256=rJnCRlQ7pZsEEmMhsQDgC_pKyDHxP5TPS6zVPGsgcu8,1651 +jinja2/parser.py,sha256=lLOFy3sEmHc5IaEHRiH1sQVnId2moUQzhyeJZTtdY30,40383 +jinja2/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +jinja2/runtime.py,sha256=gDk-GvdriJXqgsGbHgrcKTP0Yp6zPXzhzrIpCFH3jAU,34249 +jinja2/sandbox.py,sha256=Mw2aitlY2I8la7FYhcX2YG9BtUYcLnD0Gh3d29cDWrY,15009 +jinja2/tests.py,sha256=VLsBhVFnWg-PxSBz1MhRnNWgP1ovXk3neO1FLQMeC9Q,5926 +jinja2/utils.py,sha256=rRp3o9e7ZKS4fyrWRbELyLcpuGVTFcnooaOa1qx_FIk,24129 +jinja2/visitor.py,sha256=EcnL1PIwf_4RVCOMxsRNuR8AXHbS1qfAdMOE2ngKJz4,3557 diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2-3.1.6.dist-info/REQUESTED b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2-3.1.6.dist-info/REQUESTED new file mode 100755 index 00000000..e69de29b diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2-3.1.6.dist-info/WHEEL b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2-3.1.6.dist-info/WHEEL new file mode 100755 index 00000000..23d2d7e9 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2-3.1.6.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: flit 3.11.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/__init__.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/__init__.py new file mode 100755 index 00000000..1a423a3e --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/__init__.py @@ -0,0 +1,38 @@ +"""Jinja is a template engine written in pure Python. It provides a +non-XML syntax that supports inline expressions and an optional +sandboxed environment. +""" + +from .bccache import BytecodeCache as BytecodeCache +from .bccache import FileSystemBytecodeCache as FileSystemBytecodeCache +from .bccache import MemcachedBytecodeCache as MemcachedBytecodeCache +from .environment import Environment as Environment +from .environment import Template as Template +from .exceptions import TemplateAssertionError as TemplateAssertionError +from .exceptions import TemplateError as TemplateError +from .exceptions import TemplateNotFound as TemplateNotFound +from .exceptions import TemplateRuntimeError as TemplateRuntimeError +from .exceptions import TemplatesNotFound as TemplatesNotFound +from .exceptions import TemplateSyntaxError as TemplateSyntaxError +from .exceptions import UndefinedError as UndefinedError +from .loaders import BaseLoader as BaseLoader +from .loaders import ChoiceLoader as ChoiceLoader +from .loaders import DictLoader as DictLoader +from .loaders import FileSystemLoader as FileSystemLoader +from .loaders import FunctionLoader as FunctionLoader +from .loaders import ModuleLoader as ModuleLoader +from .loaders import PackageLoader as PackageLoader +from .loaders import PrefixLoader as PrefixLoader +from .runtime import ChainableUndefined as ChainableUndefined +from .runtime import DebugUndefined as DebugUndefined +from .runtime import make_logging_undefined as make_logging_undefined +from .runtime import StrictUndefined as StrictUndefined +from .runtime import Undefined as Undefined +from .utils import clear_caches as clear_caches +from .utils import is_undefined as is_undefined +from .utils import pass_context as pass_context +from .utils import pass_environment as pass_environment +from .utils import pass_eval_context as pass_eval_context +from .utils import select_autoescape as select_autoescape + +__version__ = "3.1.6" diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/_identifier.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/_identifier.py new file mode 100755 index 00000000..928c1503 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/_identifier.py @@ -0,0 +1,6 @@ +import re + +# generated by scripts/generate_identifier_pattern.py +pattern = re.compile( + r"[\w·̀-ͯ·҃-֑҇-ׇֽֿׁׂׅׄؐ-ًؚ-ٰٟۖ-ۜ۟-۪ۤۧۨ-ܑۭܰ-݊ަ-ް߫-߽߳ࠖ-࠙ࠛ-ࠣࠥ-ࠧࠩ-࡙࠭-࡛࣓-ࣣ࣡-ःऺ-़ा-ॏ॑-ॗॢॣঁ-ঃ়া-ৄেৈো-্ৗৢৣ৾ਁ-ਃ਼ਾ-ੂੇੈੋ-੍ੑੰੱੵઁ-ઃ઼ા-ૅે-ૉો-્ૢૣૺ-૿ଁ-ଃ଼ା-ୄେୈୋ-୍ୖୗୢୣஂா-ூெ-ைொ-்ௗఀ-ఄా-ౄె-ైొ-్ౕౖౢౣಁ-ಃ಼ಾ-ೄೆ-ೈೊ-್ೕೖೢೣഀ-ഃ഻഼ാ-ൄെ-ൈൊ-്ൗൢൣංඃ්ා-ුූෘ-ෟෲෳัิ-ฺ็-๎ັິ-ູົຼ່-ໍ༹༘༙༵༷༾༿ཱ-྄྆྇ྍ-ྗྙ-ྼ࿆ါ-ှၖ-ၙၞ-ၠၢ-ၤၧ-ၭၱ-ၴႂ-ႍႏႚ-ႝ፝-፟ᜒ-᜔ᜲ-᜴ᝒᝓᝲᝳ឴-៓៝᠋-᠍ᢅᢆᢩᤠ-ᤫᤰ-᤻ᨗ-ᨛᩕ-ᩞ᩠-᩿᩼᪰-᪽ᬀ-ᬄ᬴-᭄᭫-᭳ᮀ-ᮂᮡ-ᮭ᯦-᯳ᰤ-᰷᳐-᳔᳒-᳨᳭ᳲ-᳴᳷-᳹᷀-᷹᷻-᷿‿⁀⁔⃐-⃥⃜⃡-⃰℘℮⳯-⵿⳱ⷠ-〪ⷿ-゙゚〯꙯ꙴ-꙽ꚞꚟ꛰꛱ꠂ꠆ꠋꠣ-ꠧꢀꢁꢴ-ꣅ꣠-꣱ꣿꤦ-꤭ꥇ-꥓ꦀ-ꦃ꦳-꧀ꧥꨩ-ꨶꩃꩌꩍꩻ-ꩽꪰꪲ-ꪴꪷꪸꪾ꪿꫁ꫫ-ꫯꫵ꫶ꯣ-ꯪ꯬꯭ﬞ︀-️︠-︯︳︴﹍-﹏_𐇽𐋠𐍶-𐍺𐨁-𐨃𐨅𐨆𐨌-𐨏𐨸-𐨿𐨺𐫦𐫥𐴤-𐽆𐴧-𐽐𑀀-𑀂𑀸-𑁆𑁿-𑂂𑂰-𑂺𑄀-𑄂𑄧-𑄴𑅅𑅆𑅳𑆀-𑆂𑆳-𑇀𑇉-𑇌𑈬-𑈷𑈾𑋟-𑋪𑌀-𑌃𑌻𑌼𑌾-𑍄𑍇𑍈𑍋-𑍍𑍗𑍢𑍣𑍦-𑍬𑍰-𑍴𑐵-𑑆𑑞𑒰-𑓃𑖯-𑖵𑖸-𑗀𑗜𑗝𑘰-𑙀𑚫-𑚷𑜝-𑜫𑠬-𑠺𑨁-𑨊𑨳-𑨹𑨻-𑨾𑩇𑩑-𑩛𑪊-𑪙𑰯-𑰶𑰸-𑰿𑲒-𑲧𑲩-𑲶𑴱-𑴶𑴺𑴼𑴽𑴿-𑵅𑵇𑶊-𑶎𑶐𑶑𑶓-𑶗𑻳-𑻶𖫰-𖫴𖬰-𖬶𖽑-𖽾𖾏-𖾒𛲝𛲞𝅥-𝅩𝅭-𝅲𝅻-𝆂𝆅-𝆋𝆪-𝆭𝉂-𝉄𝨀-𝨶𝨻-𝩬𝩵𝪄𝪛-𝪟𝪡-𝪯𞀀-𞀆𞀈-𞀘𞀛-𞀡𞀣𞀤𞀦-𞣐𞀪-𞣖𞥄-𞥊󠄀-󠇯]+" # noqa: B950 +) diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/async_utils.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/async_utils.py new file mode 100755 index 00000000..f0c14020 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/async_utils.py @@ -0,0 +1,99 @@ +import inspect +import typing as t +from functools import WRAPPER_ASSIGNMENTS +from functools import wraps + +from .utils import _PassArg +from .utils import pass_eval_context + +if t.TYPE_CHECKING: + import typing_extensions as te + +V = t.TypeVar("V") + + +def async_variant(normal_func): # type: ignore + def decorator(async_func): # type: ignore + pass_arg = _PassArg.from_obj(normal_func) + need_eval_context = pass_arg is None + + if pass_arg is _PassArg.environment: + + def is_async(args: t.Any) -> bool: + return t.cast(bool, args[0].is_async) + + else: + + def is_async(args: t.Any) -> bool: + return t.cast(bool, args[0].environment.is_async) + + # Take the doc and annotations from the sync function, but the + # name from the async function. Pallets-Sphinx-Themes + # build_function_directive expects __wrapped__ to point to the + # sync function. + async_func_attrs = ("__module__", "__name__", "__qualname__") + normal_func_attrs = tuple(set(WRAPPER_ASSIGNMENTS).difference(async_func_attrs)) + + @wraps(normal_func, assigned=normal_func_attrs) + @wraps(async_func, assigned=async_func_attrs, updated=()) + def wrapper(*args, **kwargs): # type: ignore + b = is_async(args) + + if need_eval_context: + args = args[1:] + + if b: + return async_func(*args, **kwargs) + + return normal_func(*args, **kwargs) + + if need_eval_context: + wrapper = pass_eval_context(wrapper) + + wrapper.jinja_async_variant = True # type: ignore[attr-defined] + return wrapper + + return decorator + + +_common_primitives = {int, float, bool, str, list, dict, tuple, type(None)} + + +async def auto_await(value: t.Union[t.Awaitable["V"], "V"]) -> "V": + # Avoid a costly call to isawaitable + if type(value) in _common_primitives: + return t.cast("V", value) + + if inspect.isawaitable(value): + return await t.cast("t.Awaitable[V]", value) + + return value + + +class _IteratorToAsyncIterator(t.Generic[V]): + def __init__(self, iterator: "t.Iterator[V]"): + self._iterator = iterator + + def __aiter__(self) -> "te.Self": + return self + + async def __anext__(self) -> V: + try: + return next(self._iterator) + except StopIteration as e: + raise StopAsyncIteration(e.value) from e + + +def auto_aiter( + iterable: "t.Union[t.AsyncIterable[V], t.Iterable[V]]", +) -> "t.AsyncIterator[V]": + if hasattr(iterable, "__aiter__"): + return iterable.__aiter__() + else: + return _IteratorToAsyncIterator(iter(iterable)) + + +async def auto_to_list( + value: "t.Union[t.AsyncIterable[V], t.Iterable[V]]", +) -> t.List["V"]: + return [x async for x in auto_aiter(value)] diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/bccache.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/bccache.py new file mode 100755 index 00000000..ada8b099 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/bccache.py @@ -0,0 +1,408 @@ +"""The optional bytecode cache system. This is useful if you have very +complex template situations and the compilation of all those templates +slows down your application too much. + +Situations where this is useful are often forking web applications that +are initialized on the first request. +""" + +import errno +import fnmatch +import marshal +import os +import pickle +import stat +import sys +import tempfile +import typing as t +from hashlib import sha1 +from io import BytesIO +from types import CodeType + +if t.TYPE_CHECKING: + import typing_extensions as te + + from .environment import Environment + + class _MemcachedClient(te.Protocol): + def get(self, key: str) -> bytes: ... + + def set( + self, key: str, value: bytes, timeout: t.Optional[int] = None + ) -> None: ... + + +bc_version = 5 +# Magic bytes to identify Jinja bytecode cache files. Contains the +# Python major and minor version to avoid loading incompatible bytecode +# if a project upgrades its Python version. +bc_magic = ( + b"j2" + + pickle.dumps(bc_version, 2) + + pickle.dumps((sys.version_info[0] << 24) | sys.version_info[1], 2) +) + + +class Bucket: + """Buckets are used to store the bytecode for one template. It's created + and initialized by the bytecode cache and passed to the loading functions. + + The buckets get an internal checksum from the cache assigned and use this + to automatically reject outdated cache material. Individual bytecode + cache subclasses don't have to care about cache invalidation. + """ + + def __init__(self, environment: "Environment", key: str, checksum: str) -> None: + self.environment = environment + self.key = key + self.checksum = checksum + self.reset() + + def reset(self) -> None: + """Resets the bucket (unloads the bytecode).""" + self.code: t.Optional[CodeType] = None + + def load_bytecode(self, f: t.BinaryIO) -> None: + """Loads bytecode from a file or file like object.""" + # make sure the magic header is correct + magic = f.read(len(bc_magic)) + if magic != bc_magic: + self.reset() + return + # the source code of the file changed, we need to reload + checksum = pickle.load(f) + if self.checksum != checksum: + self.reset() + return + # if marshal_load fails then we need to reload + try: + self.code = marshal.load(f) + except (EOFError, ValueError, TypeError): + self.reset() + return + + def write_bytecode(self, f: t.IO[bytes]) -> None: + """Dump the bytecode into the file or file like object passed.""" + if self.code is None: + raise TypeError("can't write empty bucket") + f.write(bc_magic) + pickle.dump(self.checksum, f, 2) + marshal.dump(self.code, f) + + def bytecode_from_string(self, string: bytes) -> None: + """Load bytecode from bytes.""" + self.load_bytecode(BytesIO(string)) + + def bytecode_to_string(self) -> bytes: + """Return the bytecode as bytes.""" + out = BytesIO() + self.write_bytecode(out) + return out.getvalue() + + +class BytecodeCache: + """To implement your own bytecode cache you have to subclass this class + and override :meth:`load_bytecode` and :meth:`dump_bytecode`. Both of + these methods are passed a :class:`~jinja2.bccache.Bucket`. + + A very basic bytecode cache that saves the bytecode on the file system:: + + from os import path + + class MyCache(BytecodeCache): + + def __init__(self, directory): + self.directory = directory + + def load_bytecode(self, bucket): + filename = path.join(self.directory, bucket.key) + if path.exists(filename): + with open(filename, 'rb') as f: + bucket.load_bytecode(f) + + def dump_bytecode(self, bucket): + filename = path.join(self.directory, bucket.key) + with open(filename, 'wb') as f: + bucket.write_bytecode(f) + + A more advanced version of a filesystem based bytecode cache is part of + Jinja. + """ + + def load_bytecode(self, bucket: Bucket) -> None: + """Subclasses have to override this method to load bytecode into a + bucket. If they are not able to find code in the cache for the + bucket, it must not do anything. + """ + raise NotImplementedError() + + def dump_bytecode(self, bucket: Bucket) -> None: + """Subclasses have to override this method to write the bytecode + from a bucket back to the cache. If it unable to do so it must not + fail silently but raise an exception. + """ + raise NotImplementedError() + + def clear(self) -> None: + """Clears the cache. This method is not used by Jinja but should be + implemented to allow applications to clear the bytecode cache used + by a particular environment. + """ + + def get_cache_key( + self, name: str, filename: t.Optional[t.Union[str]] = None + ) -> str: + """Returns the unique hash key for this template name.""" + hash = sha1(name.encode("utf-8")) + + if filename is not None: + hash.update(f"|{filename}".encode()) + + return hash.hexdigest() + + def get_source_checksum(self, source: str) -> str: + """Returns a checksum for the source.""" + return sha1(source.encode("utf-8")).hexdigest() + + def get_bucket( + self, + environment: "Environment", + name: str, + filename: t.Optional[str], + source: str, + ) -> Bucket: + """Return a cache bucket for the given template. All arguments are + mandatory but filename may be `None`. + """ + key = self.get_cache_key(name, filename) + checksum = self.get_source_checksum(source) + bucket = Bucket(environment, key, checksum) + self.load_bytecode(bucket) + return bucket + + def set_bucket(self, bucket: Bucket) -> None: + """Put the bucket into the cache.""" + self.dump_bytecode(bucket) + + +class FileSystemBytecodeCache(BytecodeCache): + """A bytecode cache that stores bytecode on the filesystem. It accepts + two arguments: The directory where the cache items are stored and a + pattern string that is used to build the filename. + + If no directory is specified a default cache directory is selected. On + Windows the user's temp directory is used, on UNIX systems a directory + is created for the user in the system temp directory. + + The pattern can be used to have multiple separate caches operate on the + same directory. The default pattern is ``'__jinja2_%s.cache'``. ``%s`` + is replaced with the cache key. + + >>> bcc = FileSystemBytecodeCache('/tmp/jinja_cache', '%s.cache') + + This bytecode cache supports clearing of the cache using the clear method. + """ + + def __init__( + self, directory: t.Optional[str] = None, pattern: str = "__jinja2_%s.cache" + ) -> None: + if directory is None: + directory = self._get_default_cache_dir() + self.directory = directory + self.pattern = pattern + + def _get_default_cache_dir(self) -> str: + def _unsafe_dir() -> "te.NoReturn": + raise RuntimeError( + "Cannot determine safe temp directory. You " + "need to explicitly provide one." + ) + + tmpdir = tempfile.gettempdir() + + # On windows the temporary directory is used specific unless + # explicitly forced otherwise. We can just use that. + if os.name == "nt": + return tmpdir + if not hasattr(os, "getuid"): + _unsafe_dir() + + dirname = f"_jinja2-cache-{os.getuid()}" + actual_dir = os.path.join(tmpdir, dirname) + + try: + os.mkdir(actual_dir, stat.S_IRWXU) + except OSError as e: + if e.errno != errno.EEXIST: + raise + try: + os.chmod(actual_dir, stat.S_IRWXU) + actual_dir_stat = os.lstat(actual_dir) + if ( + actual_dir_stat.st_uid != os.getuid() + or not stat.S_ISDIR(actual_dir_stat.st_mode) + or stat.S_IMODE(actual_dir_stat.st_mode) != stat.S_IRWXU + ): + _unsafe_dir() + except OSError as e: + if e.errno != errno.EEXIST: + raise + + actual_dir_stat = os.lstat(actual_dir) + if ( + actual_dir_stat.st_uid != os.getuid() + or not stat.S_ISDIR(actual_dir_stat.st_mode) + or stat.S_IMODE(actual_dir_stat.st_mode) != stat.S_IRWXU + ): + _unsafe_dir() + + return actual_dir + + def _get_cache_filename(self, bucket: Bucket) -> str: + return os.path.join(self.directory, self.pattern % (bucket.key,)) + + def load_bytecode(self, bucket: Bucket) -> None: + filename = self._get_cache_filename(bucket) + + # Don't test for existence before opening the file, since the + # file could disappear after the test before the open. + try: + f = open(filename, "rb") + except (FileNotFoundError, IsADirectoryError, PermissionError): + # PermissionError can occur on Windows when an operation is + # in progress, such as calling clear(). + return + + with f: + bucket.load_bytecode(f) + + def dump_bytecode(self, bucket: Bucket) -> None: + # Write to a temporary file, then rename to the real name after + # writing. This avoids another process reading the file before + # it is fully written. + name = self._get_cache_filename(bucket) + f = tempfile.NamedTemporaryFile( + mode="wb", + dir=os.path.dirname(name), + prefix=os.path.basename(name), + suffix=".tmp", + delete=False, + ) + + def remove_silent() -> None: + try: + os.remove(f.name) + except OSError: + # Another process may have called clear(). On Windows, + # another program may be holding the file open. + pass + + try: + with f: + bucket.write_bytecode(f) + except BaseException: + remove_silent() + raise + + try: + os.replace(f.name, name) + except OSError: + # Another process may have called clear(). On Windows, + # another program may be holding the file open. + remove_silent() + except BaseException: + remove_silent() + raise + + def clear(self) -> None: + # imported lazily here because google app-engine doesn't support + # write access on the file system and the function does not exist + # normally. + from os import remove + + files = fnmatch.filter(os.listdir(self.directory), self.pattern % ("*",)) + for filename in files: + try: + remove(os.path.join(self.directory, filename)) + except OSError: + pass + + +class MemcachedBytecodeCache(BytecodeCache): + """This class implements a bytecode cache that uses a memcache cache for + storing the information. It does not enforce a specific memcache library + (tummy's memcache or cmemcache) but will accept any class that provides + the minimal interface required. + + Libraries compatible with this class: + + - `cachelib `_ + - `python-memcached `_ + + (Unfortunately the django cache interface is not compatible because it + does not support storing binary data, only text. You can however pass + the underlying cache client to the bytecode cache which is available + as `django.core.cache.cache._client`.) + + The minimal interface for the client passed to the constructor is this: + + .. class:: MinimalClientInterface + + .. method:: set(key, value[, timeout]) + + Stores the bytecode in the cache. `value` is a string and + `timeout` the timeout of the key. If timeout is not provided + a default timeout or no timeout should be assumed, if it's + provided it's an integer with the number of seconds the cache + item should exist. + + .. method:: get(key) + + Returns the value for the cache key. If the item does not + exist in the cache the return value must be `None`. + + The other arguments to the constructor are the prefix for all keys that + is added before the actual cache key and the timeout for the bytecode in + the cache system. We recommend a high (or no) timeout. + + This bytecode cache does not support clearing of used items in the cache. + The clear method is a no-operation function. + + .. versionadded:: 2.7 + Added support for ignoring memcache errors through the + `ignore_memcache_errors` parameter. + """ + + def __init__( + self, + client: "_MemcachedClient", + prefix: str = "jinja2/bytecode/", + timeout: t.Optional[int] = None, + ignore_memcache_errors: bool = True, + ): + self.client = client + self.prefix = prefix + self.timeout = timeout + self.ignore_memcache_errors = ignore_memcache_errors + + def load_bytecode(self, bucket: Bucket) -> None: + try: + code = self.client.get(self.prefix + bucket.key) + except Exception: + if not self.ignore_memcache_errors: + raise + else: + bucket.bytecode_from_string(code) + + def dump_bytecode(self, bucket: Bucket) -> None: + key = self.prefix + bucket.key + value = bucket.bytecode_to_string() + + try: + if self.timeout is not None: + self.client.set(key, value, self.timeout) + else: + self.client.set(key, value) + except Exception: + if not self.ignore_memcache_errors: + raise diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/compiler.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/compiler.py new file mode 100755 index 00000000..a4ff6a1b --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/compiler.py @@ -0,0 +1,1998 @@ +"""Compiles nodes from the parser into Python code.""" + +import typing as t +from contextlib import contextmanager +from functools import update_wrapper +from io import StringIO +from itertools import chain +from keyword import iskeyword as is_python_keyword + +from markupsafe import escape +from markupsafe import Markup + +from . import nodes +from .exceptions import TemplateAssertionError +from .idtracking import Symbols +from .idtracking import VAR_LOAD_ALIAS +from .idtracking import VAR_LOAD_PARAMETER +from .idtracking import VAR_LOAD_RESOLVE +from .idtracking import VAR_LOAD_UNDEFINED +from .nodes import EvalContext +from .optimizer import Optimizer +from .utils import _PassArg +from .utils import concat +from .visitor import NodeVisitor + +if t.TYPE_CHECKING: + import typing_extensions as te + + from .environment import Environment + +F = t.TypeVar("F", bound=t.Callable[..., t.Any]) + +operators = { + "eq": "==", + "ne": "!=", + "gt": ">", + "gteq": ">=", + "lt": "<", + "lteq": "<=", + "in": "in", + "notin": "not in", +} + + +def optimizeconst(f: F) -> F: + def new_func( + self: "CodeGenerator", node: nodes.Expr, frame: "Frame", **kwargs: t.Any + ) -> t.Any: + # Only optimize if the frame is not volatile + if self.optimizer is not None and not frame.eval_ctx.volatile: + new_node = self.optimizer.visit(node, frame.eval_ctx) + + if new_node != node: + return self.visit(new_node, frame) + + return f(self, node, frame, **kwargs) + + return update_wrapper(new_func, f) # type: ignore[return-value] + + +def _make_binop(op: str) -> t.Callable[["CodeGenerator", nodes.BinExpr, "Frame"], None]: + @optimizeconst + def visitor(self: "CodeGenerator", node: nodes.BinExpr, frame: Frame) -> None: + if ( + self.environment.sandboxed and op in self.environment.intercepted_binops # type: ignore + ): + self.write(f"environment.call_binop(context, {op!r}, ") + self.visit(node.left, frame) + self.write(", ") + self.visit(node.right, frame) + else: + self.write("(") + self.visit(node.left, frame) + self.write(f" {op} ") + self.visit(node.right, frame) + + self.write(")") + + return visitor + + +def _make_unop( + op: str, +) -> t.Callable[["CodeGenerator", nodes.UnaryExpr, "Frame"], None]: + @optimizeconst + def visitor(self: "CodeGenerator", node: nodes.UnaryExpr, frame: Frame) -> None: + if ( + self.environment.sandboxed and op in self.environment.intercepted_unops # type: ignore + ): + self.write(f"environment.call_unop(context, {op!r}, ") + self.visit(node.node, frame) + else: + self.write("(" + op) + self.visit(node.node, frame) + + self.write(")") + + return visitor + + +def generate( + node: nodes.Template, + environment: "Environment", + name: t.Optional[str], + filename: t.Optional[str], + stream: t.Optional[t.TextIO] = None, + defer_init: bool = False, + optimized: bool = True, +) -> t.Optional[str]: + """Generate the python source for a node tree.""" + if not isinstance(node, nodes.Template): + raise TypeError("Can't compile non template nodes") + + generator = environment.code_generator_class( + environment, name, filename, stream, defer_init, optimized + ) + generator.visit(node) + + if stream is None: + return generator.stream.getvalue() # type: ignore + + return None + + +def has_safe_repr(value: t.Any) -> bool: + """Does the node have a safe representation?""" + if value is None or value is NotImplemented or value is Ellipsis: + return True + + if type(value) in {bool, int, float, complex, range, str, Markup}: + return True + + if type(value) in {tuple, list, set, frozenset}: + return all(has_safe_repr(v) for v in value) + + if type(value) is dict: # noqa E721 + return all(has_safe_repr(k) and has_safe_repr(v) for k, v in value.items()) + + return False + + +def find_undeclared( + nodes: t.Iterable[nodes.Node], names: t.Iterable[str] +) -> t.Set[str]: + """Check if the names passed are accessed undeclared. The return value + is a set of all the undeclared names from the sequence of names found. + """ + visitor = UndeclaredNameVisitor(names) + try: + for node in nodes: + visitor.visit(node) + except VisitorExit: + pass + return visitor.undeclared + + +class MacroRef: + def __init__(self, node: t.Union[nodes.Macro, nodes.CallBlock]) -> None: + self.node = node + self.accesses_caller = False + self.accesses_kwargs = False + self.accesses_varargs = False + + +class Frame: + """Holds compile time information for us.""" + + def __init__( + self, + eval_ctx: EvalContext, + parent: t.Optional["Frame"] = None, + level: t.Optional[int] = None, + ) -> None: + self.eval_ctx = eval_ctx + + # the parent of this frame + self.parent = parent + + if parent is None: + self.symbols = Symbols(level=level) + + # in some dynamic inheritance situations the compiler needs to add + # write tests around output statements. + self.require_output_check = False + + # inside some tags we are using a buffer rather than yield statements. + # this for example affects {% filter %} or {% macro %}. If a frame + # is buffered this variable points to the name of the list used as + # buffer. + self.buffer: t.Optional[str] = None + + # the name of the block we're in, otherwise None. + self.block: t.Optional[str] = None + + else: + self.symbols = Symbols(parent.symbols, level=level) + self.require_output_check = parent.require_output_check + self.buffer = parent.buffer + self.block = parent.block + + # a toplevel frame is the root + soft frames such as if conditions. + self.toplevel = False + + # the root frame is basically just the outermost frame, so no if + # conditions. This information is used to optimize inheritance + # situations. + self.rootlevel = False + + # variables set inside of loops and blocks should not affect outer frames, + # but they still needs to be kept track of as part of the active context. + self.loop_frame = False + self.block_frame = False + + # track whether the frame is being used in an if-statement or conditional + # expression as it determines which errors should be raised during runtime + # or compile time. + self.soft_frame = False + + def copy(self) -> "te.Self": + """Create a copy of the current one.""" + rv = object.__new__(self.__class__) + rv.__dict__.update(self.__dict__) + rv.symbols = self.symbols.copy() + return rv + + def inner(self, isolated: bool = False) -> "Frame": + """Return an inner frame.""" + if isolated: + return Frame(self.eval_ctx, level=self.symbols.level + 1) + return Frame(self.eval_ctx, self) + + def soft(self) -> "te.Self": + """Return a soft frame. A soft frame may not be modified as + standalone thing as it shares the resources with the frame it + was created of, but it's not a rootlevel frame any longer. + + This is only used to implement if-statements and conditional + expressions. + """ + rv = self.copy() + rv.rootlevel = False + rv.soft_frame = True + return rv + + __copy__ = copy + + +class VisitorExit(RuntimeError): + """Exception used by the `UndeclaredNameVisitor` to signal a stop.""" + + +class DependencyFinderVisitor(NodeVisitor): + """A visitor that collects filter and test calls.""" + + def __init__(self) -> None: + self.filters: t.Set[str] = set() + self.tests: t.Set[str] = set() + + def visit_Filter(self, node: nodes.Filter) -> None: + self.generic_visit(node) + self.filters.add(node.name) + + def visit_Test(self, node: nodes.Test) -> None: + self.generic_visit(node) + self.tests.add(node.name) + + def visit_Block(self, node: nodes.Block) -> None: + """Stop visiting at blocks.""" + + +class UndeclaredNameVisitor(NodeVisitor): + """A visitor that checks if a name is accessed without being + declared. This is different from the frame visitor as it will + not stop at closure frames. + """ + + def __init__(self, names: t.Iterable[str]) -> None: + self.names = set(names) + self.undeclared: t.Set[str] = set() + + def visit_Name(self, node: nodes.Name) -> None: + if node.ctx == "load" and node.name in self.names: + self.undeclared.add(node.name) + if self.undeclared == self.names: + raise VisitorExit() + else: + self.names.discard(node.name) + + def visit_Block(self, node: nodes.Block) -> None: + """Stop visiting a blocks.""" + + +class CompilerExit(Exception): + """Raised if the compiler encountered a situation where it just + doesn't make sense to further process the code. Any block that + raises such an exception is not further processed. + """ + + +class CodeGenerator(NodeVisitor): + def __init__( + self, + environment: "Environment", + name: t.Optional[str], + filename: t.Optional[str], + stream: t.Optional[t.TextIO] = None, + defer_init: bool = False, + optimized: bool = True, + ) -> None: + if stream is None: + stream = StringIO() + self.environment = environment + self.name = name + self.filename = filename + self.stream = stream + self.created_block_context = False + self.defer_init = defer_init + self.optimizer: t.Optional[Optimizer] = None + + if optimized: + self.optimizer = Optimizer(environment) + + # aliases for imports + self.import_aliases: t.Dict[str, str] = {} + + # a registry for all blocks. Because blocks are moved out + # into the global python scope they are registered here + self.blocks: t.Dict[str, nodes.Block] = {} + + # the number of extends statements so far + self.extends_so_far = 0 + + # some templates have a rootlevel extends. In this case we + # can safely assume that we're a child template and do some + # more optimizations. + self.has_known_extends = False + + # the current line number + self.code_lineno = 1 + + # registry of all filters and tests (global, not block local) + self.tests: t.Dict[str, str] = {} + self.filters: t.Dict[str, str] = {} + + # the debug information + self.debug_info: t.List[t.Tuple[int, int]] = [] + self._write_debug_info: t.Optional[int] = None + + # the number of new lines before the next write() + self._new_lines = 0 + + # the line number of the last written statement + self._last_line = 0 + + # true if nothing was written so far. + self._first_write = True + + # used by the `temporary_identifier` method to get new + # unique, temporary identifier + self._last_identifier = 0 + + # the current indentation + self._indentation = 0 + + # Tracks toplevel assignments + self._assign_stack: t.List[t.Set[str]] = [] + + # Tracks parameter definition blocks + self._param_def_block: t.List[t.Set[str]] = [] + + # Tracks the current context. + self._context_reference_stack = ["context"] + + @property + def optimized(self) -> bool: + return self.optimizer is not None + + # -- Various compilation helpers + + def fail(self, msg: str, lineno: int) -> "te.NoReturn": + """Fail with a :exc:`TemplateAssertionError`.""" + raise TemplateAssertionError(msg, lineno, self.name, self.filename) + + def temporary_identifier(self) -> str: + """Get a new unique identifier.""" + self._last_identifier += 1 + return f"t_{self._last_identifier}" + + def buffer(self, frame: Frame) -> None: + """Enable buffering for the frame from that point onwards.""" + frame.buffer = self.temporary_identifier() + self.writeline(f"{frame.buffer} = []") + + def return_buffer_contents( + self, frame: Frame, force_unescaped: bool = False + ) -> None: + """Return the buffer contents of the frame.""" + if not force_unescaped: + if frame.eval_ctx.volatile: + self.writeline("if context.eval_ctx.autoescape:") + self.indent() + self.writeline(f"return Markup(concat({frame.buffer}))") + self.outdent() + self.writeline("else:") + self.indent() + self.writeline(f"return concat({frame.buffer})") + self.outdent() + return + elif frame.eval_ctx.autoescape: + self.writeline(f"return Markup(concat({frame.buffer}))") + return + self.writeline(f"return concat({frame.buffer})") + + def indent(self) -> None: + """Indent by one.""" + self._indentation += 1 + + def outdent(self, step: int = 1) -> None: + """Outdent by step.""" + self._indentation -= step + + def start_write(self, frame: Frame, node: t.Optional[nodes.Node] = None) -> None: + """Yield or write into the frame buffer.""" + if frame.buffer is None: + self.writeline("yield ", node) + else: + self.writeline(f"{frame.buffer}.append(", node) + + def end_write(self, frame: Frame) -> None: + """End the writing process started by `start_write`.""" + if frame.buffer is not None: + self.write(")") + + def simple_write( + self, s: str, frame: Frame, node: t.Optional[nodes.Node] = None + ) -> None: + """Simple shortcut for start_write + write + end_write.""" + self.start_write(frame, node) + self.write(s) + self.end_write(frame) + + def blockvisit(self, nodes: t.Iterable[nodes.Node], frame: Frame) -> None: + """Visit a list of nodes as block in a frame. If the current frame + is no buffer a dummy ``if 0: yield None`` is written automatically. + """ + try: + self.writeline("pass") + for node in nodes: + self.visit(node, frame) + except CompilerExit: + pass + + def write(self, x: str) -> None: + """Write a string into the output stream.""" + if self._new_lines: + if not self._first_write: + self.stream.write("\n" * self._new_lines) + self.code_lineno += self._new_lines + if self._write_debug_info is not None: + self.debug_info.append((self._write_debug_info, self.code_lineno)) + self._write_debug_info = None + self._first_write = False + self.stream.write(" " * self._indentation) + self._new_lines = 0 + self.stream.write(x) + + def writeline( + self, x: str, node: t.Optional[nodes.Node] = None, extra: int = 0 + ) -> None: + """Combination of newline and write.""" + self.newline(node, extra) + self.write(x) + + def newline(self, node: t.Optional[nodes.Node] = None, extra: int = 0) -> None: + """Add one or more newlines before the next write.""" + self._new_lines = max(self._new_lines, 1 + extra) + if node is not None and node.lineno != self._last_line: + self._write_debug_info = node.lineno + self._last_line = node.lineno + + def signature( + self, + node: t.Union[nodes.Call, nodes.Filter, nodes.Test], + frame: Frame, + extra_kwargs: t.Optional[t.Mapping[str, t.Any]] = None, + ) -> None: + """Writes a function call to the stream for the current node. + A leading comma is added automatically. The extra keyword + arguments may not include python keywords otherwise a syntax + error could occur. The extra keyword arguments should be given + as python dict. + """ + # if any of the given keyword arguments is a python keyword + # we have to make sure that no invalid call is created. + kwarg_workaround = any( + is_python_keyword(t.cast(str, k)) + for k in chain((x.key for x in node.kwargs), extra_kwargs or ()) + ) + + for arg in node.args: + self.write(", ") + self.visit(arg, frame) + + if not kwarg_workaround: + for kwarg in node.kwargs: + self.write(", ") + self.visit(kwarg, frame) + if extra_kwargs is not None: + for key, value in extra_kwargs.items(): + self.write(f", {key}={value}") + if node.dyn_args: + self.write(", *") + self.visit(node.dyn_args, frame) + + if kwarg_workaround: + if node.dyn_kwargs is not None: + self.write(", **dict({") + else: + self.write(", **{") + for kwarg in node.kwargs: + self.write(f"{kwarg.key!r}: ") + self.visit(kwarg.value, frame) + self.write(", ") + if extra_kwargs is not None: + for key, value in extra_kwargs.items(): + self.write(f"{key!r}: {value}, ") + if node.dyn_kwargs is not None: + self.write("}, **") + self.visit(node.dyn_kwargs, frame) + self.write(")") + else: + self.write("}") + + elif node.dyn_kwargs is not None: + self.write(", **") + self.visit(node.dyn_kwargs, frame) + + def pull_dependencies(self, nodes: t.Iterable[nodes.Node]) -> None: + """Find all filter and test names used in the template and + assign them to variables in the compiled namespace. Checking + that the names are registered with the environment is done when + compiling the Filter and Test nodes. If the node is in an If or + CondExpr node, the check is done at runtime instead. + + .. versionchanged:: 3.0 + Filters and tests in If and CondExpr nodes are checked at + runtime instead of compile time. + """ + visitor = DependencyFinderVisitor() + + for node in nodes: + visitor.visit(node) + + for id_map, names, dependency in ( + (self.filters, visitor.filters, "filters"), + ( + self.tests, + visitor.tests, + "tests", + ), + ): + for name in sorted(names): + if name not in id_map: + id_map[name] = self.temporary_identifier() + + # add check during runtime that dependencies used inside of executed + # blocks are defined, as this step may be skipped during compile time + self.writeline("try:") + self.indent() + self.writeline(f"{id_map[name]} = environment.{dependency}[{name!r}]") + self.outdent() + self.writeline("except KeyError:") + self.indent() + self.writeline("@internalcode") + self.writeline(f"def {id_map[name]}(*unused):") + self.indent() + self.writeline( + f'raise TemplateRuntimeError("No {dependency[:-1]}' + f' named {name!r} found.")' + ) + self.outdent() + self.outdent() + + def enter_frame(self, frame: Frame) -> None: + undefs = [] + for target, (action, param) in frame.symbols.loads.items(): + if action == VAR_LOAD_PARAMETER: + pass + elif action == VAR_LOAD_RESOLVE: + self.writeline(f"{target} = {self.get_resolve_func()}({param!r})") + elif action == VAR_LOAD_ALIAS: + self.writeline(f"{target} = {param}") + elif action == VAR_LOAD_UNDEFINED: + undefs.append(target) + else: + raise NotImplementedError("unknown load instruction") + if undefs: + self.writeline(f"{' = '.join(undefs)} = missing") + + def leave_frame(self, frame: Frame, with_python_scope: bool = False) -> None: + if not with_python_scope: + undefs = [] + for target in frame.symbols.loads: + undefs.append(target) + if undefs: + self.writeline(f"{' = '.join(undefs)} = missing") + + def choose_async(self, async_value: str = "async ", sync_value: str = "") -> str: + return async_value if self.environment.is_async else sync_value + + def func(self, name: str) -> str: + return f"{self.choose_async()}def {name}" + + def macro_body( + self, node: t.Union[nodes.Macro, nodes.CallBlock], frame: Frame + ) -> t.Tuple[Frame, MacroRef]: + """Dump the function def of a macro or call block.""" + frame = frame.inner() + frame.symbols.analyze_node(node) + macro_ref = MacroRef(node) + + explicit_caller = None + skip_special_params = set() + args = [] + + for idx, arg in enumerate(node.args): + if arg.name == "caller": + explicit_caller = idx + if arg.name in ("kwargs", "varargs"): + skip_special_params.add(arg.name) + args.append(frame.symbols.ref(arg.name)) + + undeclared = find_undeclared(node.body, ("caller", "kwargs", "varargs")) + + if "caller" in undeclared: + # In older Jinja versions there was a bug that allowed caller + # to retain the special behavior even if it was mentioned in + # the argument list. However thankfully this was only really + # working if it was the last argument. So we are explicitly + # checking this now and error out if it is anywhere else in + # the argument list. + if explicit_caller is not None: + try: + node.defaults[explicit_caller - len(node.args)] + except IndexError: + self.fail( + "When defining macros or call blocks the " + 'special "caller" argument must be omitted ' + "or be given a default.", + node.lineno, + ) + else: + args.append(frame.symbols.declare_parameter("caller")) + macro_ref.accesses_caller = True + if "kwargs" in undeclared and "kwargs" not in skip_special_params: + args.append(frame.symbols.declare_parameter("kwargs")) + macro_ref.accesses_kwargs = True + if "varargs" in undeclared and "varargs" not in skip_special_params: + args.append(frame.symbols.declare_parameter("varargs")) + macro_ref.accesses_varargs = True + + # macros are delayed, they never require output checks + frame.require_output_check = False + frame.symbols.analyze_node(node) + self.writeline(f"{self.func('macro')}({', '.join(args)}):", node) + self.indent() + + self.buffer(frame) + self.enter_frame(frame) + + self.push_parameter_definitions(frame) + for idx, arg in enumerate(node.args): + ref = frame.symbols.ref(arg.name) + self.writeline(f"if {ref} is missing:") + self.indent() + try: + default = node.defaults[idx - len(node.args)] + except IndexError: + self.writeline( + f'{ref} = undefined("parameter {arg.name!r} was not provided",' + f" name={arg.name!r})" + ) + else: + self.writeline(f"{ref} = ") + self.visit(default, frame) + self.mark_parameter_stored(ref) + self.outdent() + self.pop_parameter_definitions() + + self.blockvisit(node.body, frame) + self.return_buffer_contents(frame, force_unescaped=True) + self.leave_frame(frame, with_python_scope=True) + self.outdent() + + return frame, macro_ref + + def macro_def(self, macro_ref: MacroRef, frame: Frame) -> None: + """Dump the macro definition for the def created by macro_body.""" + arg_tuple = ", ".join(repr(x.name) for x in macro_ref.node.args) + name = getattr(macro_ref.node, "name", None) + if len(macro_ref.node.args) == 1: + arg_tuple += "," + self.write( + f"Macro(environment, macro, {name!r}, ({arg_tuple})," + f" {macro_ref.accesses_kwargs!r}, {macro_ref.accesses_varargs!r}," + f" {macro_ref.accesses_caller!r}, context.eval_ctx.autoescape)" + ) + + def position(self, node: nodes.Node) -> str: + """Return a human readable position for the node.""" + rv = f"line {node.lineno}" + if self.name is not None: + rv = f"{rv} in {self.name!r}" + return rv + + def dump_local_context(self, frame: Frame) -> str: + items_kv = ", ".join( + f"{name!r}: {target}" + for name, target in frame.symbols.dump_stores().items() + ) + return f"{{{items_kv}}}" + + def write_commons(self) -> None: + """Writes a common preamble that is used by root and block functions. + Primarily this sets up common local helpers and enforces a generator + through a dead branch. + """ + self.writeline("resolve = context.resolve_or_missing") + self.writeline("undefined = environment.undefined") + self.writeline("concat = environment.concat") + # always use the standard Undefined class for the implicit else of + # conditional expressions + self.writeline("cond_expr_undefined = Undefined") + self.writeline("if 0: yield None") + + def push_parameter_definitions(self, frame: Frame) -> None: + """Pushes all parameter targets from the given frame into a local + stack that permits tracking of yet to be assigned parameters. In + particular this enables the optimization from `visit_Name` to skip + undefined expressions for parameters in macros as macros can reference + otherwise unbound parameters. + """ + self._param_def_block.append(frame.symbols.dump_param_targets()) + + def pop_parameter_definitions(self) -> None: + """Pops the current parameter definitions set.""" + self._param_def_block.pop() + + def mark_parameter_stored(self, target: str) -> None: + """Marks a parameter in the current parameter definitions as stored. + This will skip the enforced undefined checks. + """ + if self._param_def_block: + self._param_def_block[-1].discard(target) + + def push_context_reference(self, target: str) -> None: + self._context_reference_stack.append(target) + + def pop_context_reference(self) -> None: + self._context_reference_stack.pop() + + def get_context_ref(self) -> str: + return self._context_reference_stack[-1] + + def get_resolve_func(self) -> str: + target = self._context_reference_stack[-1] + if target == "context": + return "resolve" + return f"{target}.resolve" + + def derive_context(self, frame: Frame) -> str: + return f"{self.get_context_ref()}.derived({self.dump_local_context(frame)})" + + def parameter_is_undeclared(self, target: str) -> bool: + """Checks if a given target is an undeclared parameter.""" + if not self._param_def_block: + return False + return target in self._param_def_block[-1] + + def push_assign_tracking(self) -> None: + """Pushes a new layer for assignment tracking.""" + self._assign_stack.append(set()) + + def pop_assign_tracking(self, frame: Frame) -> None: + """Pops the topmost level for assignment tracking and updates the + context variables if necessary. + """ + vars = self._assign_stack.pop() + if ( + not frame.block_frame + and not frame.loop_frame + and not frame.toplevel + or not vars + ): + return + public_names = [x for x in vars if x[:1] != "_"] + if len(vars) == 1: + name = next(iter(vars)) + ref = frame.symbols.ref(name) + if frame.loop_frame: + self.writeline(f"_loop_vars[{name!r}] = {ref}") + return + if frame.block_frame: + self.writeline(f"_block_vars[{name!r}] = {ref}") + return + self.writeline(f"context.vars[{name!r}] = {ref}") + else: + if frame.loop_frame: + self.writeline("_loop_vars.update({") + elif frame.block_frame: + self.writeline("_block_vars.update({") + else: + self.writeline("context.vars.update({") + for idx, name in enumerate(sorted(vars)): + if idx: + self.write(", ") + ref = frame.symbols.ref(name) + self.write(f"{name!r}: {ref}") + self.write("})") + if not frame.block_frame and not frame.loop_frame and public_names: + if len(public_names) == 1: + self.writeline(f"context.exported_vars.add({public_names[0]!r})") + else: + names_str = ", ".join(map(repr, sorted(public_names))) + self.writeline(f"context.exported_vars.update(({names_str}))") + + # -- Statement Visitors + + def visit_Template( + self, node: nodes.Template, frame: t.Optional[Frame] = None + ) -> None: + assert frame is None, "no root frame allowed" + eval_ctx = EvalContext(self.environment, self.name) + + from .runtime import async_exported + from .runtime import exported + + if self.environment.is_async: + exported_names = sorted(exported + async_exported) + else: + exported_names = sorted(exported) + + self.writeline("from jinja2.runtime import " + ", ".join(exported_names)) + + # if we want a deferred initialization we cannot move the + # environment into a local name + envenv = "" if self.defer_init else ", environment=environment" + + # do we have an extends tag at all? If not, we can save some + # overhead by just not processing any inheritance code. + have_extends = node.find(nodes.Extends) is not None + + # find all blocks + for block in node.find_all(nodes.Block): + if block.name in self.blocks: + self.fail(f"block {block.name!r} defined twice", block.lineno) + self.blocks[block.name] = block + + # find all imports and import them + for import_ in node.find_all(nodes.ImportedName): + if import_.importname not in self.import_aliases: + imp = import_.importname + self.import_aliases[imp] = alias = self.temporary_identifier() + if "." in imp: + module, obj = imp.rsplit(".", 1) + self.writeline(f"from {module} import {obj} as {alias}") + else: + self.writeline(f"import {imp} as {alias}") + + # add the load name + self.writeline(f"name = {self.name!r}") + + # generate the root render function. + self.writeline( + f"{self.func('root')}(context, missing=missing{envenv}):", extra=1 + ) + self.indent() + self.write_commons() + + # process the root + frame = Frame(eval_ctx) + if "self" in find_undeclared(node.body, ("self",)): + ref = frame.symbols.declare_parameter("self") + self.writeline(f"{ref} = TemplateReference(context)") + frame.symbols.analyze_node(node) + frame.toplevel = frame.rootlevel = True + frame.require_output_check = have_extends and not self.has_known_extends + if have_extends: + self.writeline("parent_template = None") + self.enter_frame(frame) + self.pull_dependencies(node.body) + self.blockvisit(node.body, frame) + self.leave_frame(frame, with_python_scope=True) + self.outdent() + + # make sure that the parent root is called. + if have_extends: + if not self.has_known_extends: + self.indent() + self.writeline("if parent_template is not None:") + self.indent() + if not self.environment.is_async: + self.writeline("yield from parent_template.root_render_func(context)") + else: + self.writeline("agen = parent_template.root_render_func(context)") + self.writeline("try:") + self.indent() + self.writeline("async for event in agen:") + self.indent() + self.writeline("yield event") + self.outdent() + self.outdent() + self.writeline("finally: await agen.aclose()") + self.outdent(1 + (not self.has_known_extends)) + + # at this point we now have the blocks collected and can visit them too. + for name, block in self.blocks.items(): + self.writeline( + f"{self.func('block_' + name)}(context, missing=missing{envenv}):", + block, + 1, + ) + self.indent() + self.write_commons() + # It's important that we do not make this frame a child of the + # toplevel template. This would cause a variety of + # interesting issues with identifier tracking. + block_frame = Frame(eval_ctx) + block_frame.block_frame = True + undeclared = find_undeclared(block.body, ("self", "super")) + if "self" in undeclared: + ref = block_frame.symbols.declare_parameter("self") + self.writeline(f"{ref} = TemplateReference(context)") + if "super" in undeclared: + ref = block_frame.symbols.declare_parameter("super") + self.writeline(f"{ref} = context.super({name!r}, block_{name})") + block_frame.symbols.analyze_node(block) + block_frame.block = name + self.writeline("_block_vars = {}") + self.enter_frame(block_frame) + self.pull_dependencies(block.body) + self.blockvisit(block.body, block_frame) + self.leave_frame(block_frame, with_python_scope=True) + self.outdent() + + blocks_kv_str = ", ".join(f"{x!r}: block_{x}" for x in self.blocks) + self.writeline(f"blocks = {{{blocks_kv_str}}}", extra=1) + debug_kv_str = "&".join(f"{k}={v}" for k, v in self.debug_info) + self.writeline(f"debug_info = {debug_kv_str!r}") + + def visit_Block(self, node: nodes.Block, frame: Frame) -> None: + """Call a block and register it for the template.""" + level = 0 + if frame.toplevel: + # if we know that we are a child template, there is no need to + # check if we are one + if self.has_known_extends: + return + if self.extends_so_far > 0: + self.writeline("if parent_template is None:") + self.indent() + level += 1 + + if node.scoped: + context = self.derive_context(frame) + else: + context = self.get_context_ref() + + if node.required: + self.writeline(f"if len(context.blocks[{node.name!r}]) <= 1:", node) + self.indent() + self.writeline( + f'raise TemplateRuntimeError("Required block {node.name!r} not found")', + node, + ) + self.outdent() + + if not self.environment.is_async and frame.buffer is None: + self.writeline( + f"yield from context.blocks[{node.name!r}][0]({context})", node + ) + else: + self.writeline(f"gen = context.blocks[{node.name!r}][0]({context})") + self.writeline("try:") + self.indent() + self.writeline( + f"{self.choose_async()}for event in gen:", + node, + ) + self.indent() + self.simple_write("event", frame) + self.outdent() + self.outdent() + self.writeline( + f"finally: {self.choose_async('await gen.aclose()', 'gen.close()')}" + ) + + self.outdent(level) + + def visit_Extends(self, node: nodes.Extends, frame: Frame) -> None: + """Calls the extender.""" + if not frame.toplevel: + self.fail("cannot use extend from a non top-level scope", node.lineno) + + # if the number of extends statements in general is zero so + # far, we don't have to add a check if something extended + # the template before this one. + if self.extends_so_far > 0: + # if we have a known extends we just add a template runtime + # error into the generated code. We could catch that at compile + # time too, but i welcome it not to confuse users by throwing the + # same error at different times just "because we can". + if not self.has_known_extends: + self.writeline("if parent_template is not None:") + self.indent() + self.writeline('raise TemplateRuntimeError("extended multiple times")') + + # if we have a known extends already we don't need that code here + # as we know that the template execution will end here. + if self.has_known_extends: + raise CompilerExit() + else: + self.outdent() + + self.writeline("parent_template = environment.get_template(", node) + self.visit(node.template, frame) + self.write(f", {self.name!r})") + self.writeline("for name, parent_block in parent_template.blocks.items():") + self.indent() + self.writeline("context.blocks.setdefault(name, []).append(parent_block)") + self.outdent() + + # if this extends statement was in the root level we can take + # advantage of that information and simplify the generated code + # in the top level from this point onwards + if frame.rootlevel: + self.has_known_extends = True + + # and now we have one more + self.extends_so_far += 1 + + def visit_Include(self, node: nodes.Include, frame: Frame) -> None: + """Handles includes.""" + if node.ignore_missing: + self.writeline("try:") + self.indent() + + func_name = "get_or_select_template" + if isinstance(node.template, nodes.Const): + if isinstance(node.template.value, str): + func_name = "get_template" + elif isinstance(node.template.value, (tuple, list)): + func_name = "select_template" + elif isinstance(node.template, (nodes.Tuple, nodes.List)): + func_name = "select_template" + + self.writeline(f"template = environment.{func_name}(", node) + self.visit(node.template, frame) + self.write(f", {self.name!r})") + if node.ignore_missing: + self.outdent() + self.writeline("except TemplateNotFound:") + self.indent() + self.writeline("pass") + self.outdent() + self.writeline("else:") + self.indent() + + def loop_body() -> None: + self.indent() + self.simple_write("event", frame) + self.outdent() + + if node.with_context: + self.writeline( + f"gen = template.root_render_func(" + "template.new_context(context.get_all(), True," + f" {self.dump_local_context(frame)}))" + ) + self.writeline("try:") + self.indent() + self.writeline(f"{self.choose_async()}for event in gen:") + loop_body() + self.outdent() + self.writeline( + f"finally: {self.choose_async('await gen.aclose()', 'gen.close()')}" + ) + elif self.environment.is_async: + self.writeline( + "for event in (await template._get_default_module_async())" + "._body_stream:" + ) + loop_body() + else: + self.writeline("yield from template._get_default_module()._body_stream") + + if node.ignore_missing: + self.outdent() + + def _import_common( + self, node: t.Union[nodes.Import, nodes.FromImport], frame: Frame + ) -> None: + self.write(f"{self.choose_async('await ')}environment.get_template(") + self.visit(node.template, frame) + self.write(f", {self.name!r}).") + + if node.with_context: + f_name = f"make_module{self.choose_async('_async')}" + self.write( + f"{f_name}(context.get_all(), True, {self.dump_local_context(frame)})" + ) + else: + self.write(f"_get_default_module{self.choose_async('_async')}(context)") + + def visit_Import(self, node: nodes.Import, frame: Frame) -> None: + """Visit regular imports.""" + self.writeline(f"{frame.symbols.ref(node.target)} = ", node) + if frame.toplevel: + self.write(f"context.vars[{node.target!r}] = ") + + self._import_common(node, frame) + + if frame.toplevel and not node.target.startswith("_"): + self.writeline(f"context.exported_vars.discard({node.target!r})") + + def visit_FromImport(self, node: nodes.FromImport, frame: Frame) -> None: + """Visit named imports.""" + self.newline(node) + self.write("included_template = ") + self._import_common(node, frame) + var_names = [] + discarded_names = [] + for name in node.names: + if isinstance(name, tuple): + name, alias = name + else: + alias = name + self.writeline( + f"{frame.symbols.ref(alias)} =" + f" getattr(included_template, {name!r}, missing)" + ) + self.writeline(f"if {frame.symbols.ref(alias)} is missing:") + self.indent() + # The position will contain the template name, and will be formatted + # into a string that will be compiled into an f-string. Curly braces + # in the name must be replaced with escapes so that they will not be + # executed as part of the f-string. + position = self.position(node).replace("{", "{{").replace("}", "}}") + message = ( + "the template {included_template.__name__!r}" + f" (imported on {position})" + f" does not export the requested name {name!r}" + ) + self.writeline( + f"{frame.symbols.ref(alias)} = undefined(f{message!r}, name={name!r})" + ) + self.outdent() + if frame.toplevel: + var_names.append(alias) + if not alias.startswith("_"): + discarded_names.append(alias) + + if var_names: + if len(var_names) == 1: + name = var_names[0] + self.writeline(f"context.vars[{name!r}] = {frame.symbols.ref(name)}") + else: + names_kv = ", ".join( + f"{name!r}: {frame.symbols.ref(name)}" for name in var_names + ) + self.writeline(f"context.vars.update({{{names_kv}}})") + if discarded_names: + if len(discarded_names) == 1: + self.writeline(f"context.exported_vars.discard({discarded_names[0]!r})") + else: + names_str = ", ".join(map(repr, discarded_names)) + self.writeline( + f"context.exported_vars.difference_update(({names_str}))" + ) + + def visit_For(self, node: nodes.For, frame: Frame) -> None: + loop_frame = frame.inner() + loop_frame.loop_frame = True + test_frame = frame.inner() + else_frame = frame.inner() + + # try to figure out if we have an extended loop. An extended loop + # is necessary if the loop is in recursive mode if the special loop + # variable is accessed in the body if the body is a scoped block. + extended_loop = ( + node.recursive + or "loop" + in find_undeclared(node.iter_child_nodes(only=("body",)), ("loop",)) + or any(block.scoped for block in node.find_all(nodes.Block)) + ) + + loop_ref = None + if extended_loop: + loop_ref = loop_frame.symbols.declare_parameter("loop") + + loop_frame.symbols.analyze_node(node, for_branch="body") + if node.else_: + else_frame.symbols.analyze_node(node, for_branch="else") + + if node.test: + loop_filter_func = self.temporary_identifier() + test_frame.symbols.analyze_node(node, for_branch="test") + self.writeline(f"{self.func(loop_filter_func)}(fiter):", node.test) + self.indent() + self.enter_frame(test_frame) + self.writeline(self.choose_async("async for ", "for ")) + self.visit(node.target, loop_frame) + self.write(" in ") + self.write(self.choose_async("auto_aiter(fiter)", "fiter")) + self.write(":") + self.indent() + self.writeline("if ", node.test) + self.visit(node.test, test_frame) + self.write(":") + self.indent() + self.writeline("yield ") + self.visit(node.target, loop_frame) + self.outdent(3) + self.leave_frame(test_frame, with_python_scope=True) + + # if we don't have an recursive loop we have to find the shadowed + # variables at that point. Because loops can be nested but the loop + # variable is a special one we have to enforce aliasing for it. + if node.recursive: + self.writeline( + f"{self.func('loop')}(reciter, loop_render_func, depth=0):", node + ) + self.indent() + self.buffer(loop_frame) + + # Use the same buffer for the else frame + else_frame.buffer = loop_frame.buffer + + # make sure the loop variable is a special one and raise a template + # assertion error if a loop tries to write to loop + if extended_loop: + self.writeline(f"{loop_ref} = missing") + + for name in node.find_all(nodes.Name): + if name.ctx == "store" and name.name == "loop": + self.fail( + "Can't assign to special loop variable in for-loop target", + name.lineno, + ) + + if node.else_: + iteration_indicator = self.temporary_identifier() + self.writeline(f"{iteration_indicator} = 1") + + self.writeline(self.choose_async("async for ", "for "), node) + self.visit(node.target, loop_frame) + if extended_loop: + self.write(f", {loop_ref} in {self.choose_async('Async')}LoopContext(") + else: + self.write(" in ") + + if node.test: + self.write(f"{loop_filter_func}(") + if node.recursive: + self.write("reciter") + else: + if self.environment.is_async and not extended_loop: + self.write("auto_aiter(") + self.visit(node.iter, frame) + if self.environment.is_async and not extended_loop: + self.write(")") + if node.test: + self.write(")") + + if node.recursive: + self.write(", undefined, loop_render_func, depth):") + else: + self.write(", undefined):" if extended_loop else ":") + + self.indent() + self.enter_frame(loop_frame) + + self.writeline("_loop_vars = {}") + self.blockvisit(node.body, loop_frame) + if node.else_: + self.writeline(f"{iteration_indicator} = 0") + self.outdent() + self.leave_frame( + loop_frame, with_python_scope=node.recursive and not node.else_ + ) + + if node.else_: + self.writeline(f"if {iteration_indicator}:") + self.indent() + self.enter_frame(else_frame) + self.blockvisit(node.else_, else_frame) + self.leave_frame(else_frame) + self.outdent() + + # if the node was recursive we have to return the buffer contents + # and start the iteration code + if node.recursive: + self.return_buffer_contents(loop_frame) + self.outdent() + self.start_write(frame, node) + self.write(f"{self.choose_async('await ')}loop(") + if self.environment.is_async: + self.write("auto_aiter(") + self.visit(node.iter, frame) + if self.environment.is_async: + self.write(")") + self.write(", loop)") + self.end_write(frame) + + # at the end of the iteration, clear any assignments made in the + # loop from the top level + if self._assign_stack: + self._assign_stack[-1].difference_update(loop_frame.symbols.stores) + + def visit_If(self, node: nodes.If, frame: Frame) -> None: + if_frame = frame.soft() + self.writeline("if ", node) + self.visit(node.test, if_frame) + self.write(":") + self.indent() + self.blockvisit(node.body, if_frame) + self.outdent() + for elif_ in node.elif_: + self.writeline("elif ", elif_) + self.visit(elif_.test, if_frame) + self.write(":") + self.indent() + self.blockvisit(elif_.body, if_frame) + self.outdent() + if node.else_: + self.writeline("else:") + self.indent() + self.blockvisit(node.else_, if_frame) + self.outdent() + + def visit_Macro(self, node: nodes.Macro, frame: Frame) -> None: + macro_frame, macro_ref = self.macro_body(node, frame) + self.newline() + if frame.toplevel: + if not node.name.startswith("_"): + self.write(f"context.exported_vars.add({node.name!r})") + self.writeline(f"context.vars[{node.name!r}] = ") + self.write(f"{frame.symbols.ref(node.name)} = ") + self.macro_def(macro_ref, macro_frame) + + def visit_CallBlock(self, node: nodes.CallBlock, frame: Frame) -> None: + call_frame, macro_ref = self.macro_body(node, frame) + self.writeline("caller = ") + self.macro_def(macro_ref, call_frame) + self.start_write(frame, node) + self.visit_Call(node.call, frame, forward_caller=True) + self.end_write(frame) + + def visit_FilterBlock(self, node: nodes.FilterBlock, frame: Frame) -> None: + filter_frame = frame.inner() + filter_frame.symbols.analyze_node(node) + self.enter_frame(filter_frame) + self.buffer(filter_frame) + self.blockvisit(node.body, filter_frame) + self.start_write(frame, node) + self.visit_Filter(node.filter, filter_frame) + self.end_write(frame) + self.leave_frame(filter_frame) + + def visit_With(self, node: nodes.With, frame: Frame) -> None: + with_frame = frame.inner() + with_frame.symbols.analyze_node(node) + self.enter_frame(with_frame) + for target, expr in zip(node.targets, node.values): + self.newline() + self.visit(target, with_frame) + self.write(" = ") + self.visit(expr, frame) + self.blockvisit(node.body, with_frame) + self.leave_frame(with_frame) + + def visit_ExprStmt(self, node: nodes.ExprStmt, frame: Frame) -> None: + self.newline(node) + self.visit(node.node, frame) + + class _FinalizeInfo(t.NamedTuple): + const: t.Optional[t.Callable[..., str]] + src: t.Optional[str] + + @staticmethod + def _default_finalize(value: t.Any) -> t.Any: + """The default finalize function if the environment isn't + configured with one. Or, if the environment has one, this is + called on that function's output for constants. + """ + return str(value) + + _finalize: t.Optional[_FinalizeInfo] = None + + def _make_finalize(self) -> _FinalizeInfo: + """Build the finalize function to be used on constants and at + runtime. Cached so it's only created once for all output nodes. + + Returns a ``namedtuple`` with the following attributes: + + ``const`` + A function to finalize constant data at compile time. + + ``src`` + Source code to output around nodes to be evaluated at + runtime. + """ + if self._finalize is not None: + return self._finalize + + finalize: t.Optional[t.Callable[..., t.Any]] + finalize = default = self._default_finalize + src = None + + if self.environment.finalize: + src = "environment.finalize(" + env_finalize = self.environment.finalize + pass_arg = { + _PassArg.context: "context", + _PassArg.eval_context: "context.eval_ctx", + _PassArg.environment: "environment", + }.get( + _PassArg.from_obj(env_finalize) # type: ignore + ) + finalize = None + + if pass_arg is None: + + def finalize(value: t.Any) -> t.Any: # noqa: F811 + return default(env_finalize(value)) + + else: + src = f"{src}{pass_arg}, " + + if pass_arg == "environment": + + def finalize(value: t.Any) -> t.Any: # noqa: F811 + return default(env_finalize(self.environment, value)) + + self._finalize = self._FinalizeInfo(finalize, src) + return self._finalize + + def _output_const_repr(self, group: t.Iterable[t.Any]) -> str: + """Given a group of constant values converted from ``Output`` + child nodes, produce a string to write to the template module + source. + """ + return repr(concat(group)) + + def _output_child_to_const( + self, node: nodes.Expr, frame: Frame, finalize: _FinalizeInfo + ) -> str: + """Try to optimize a child of an ``Output`` node by trying to + convert it to constant, finalized data at compile time. + + If :exc:`Impossible` is raised, the node is not constant and + will be evaluated at runtime. Any other exception will also be + evaluated at runtime for easier debugging. + """ + const = node.as_const(frame.eval_ctx) + + if frame.eval_ctx.autoescape: + const = escape(const) + + # Template data doesn't go through finalize. + if isinstance(node, nodes.TemplateData): + return str(const) + + return finalize.const(const) # type: ignore + + def _output_child_pre( + self, node: nodes.Expr, frame: Frame, finalize: _FinalizeInfo + ) -> None: + """Output extra source code before visiting a child of an + ``Output`` node. + """ + if frame.eval_ctx.volatile: + self.write("(escape if context.eval_ctx.autoescape else str)(") + elif frame.eval_ctx.autoescape: + self.write("escape(") + else: + self.write("str(") + + if finalize.src is not None: + self.write(finalize.src) + + def _output_child_post( + self, node: nodes.Expr, frame: Frame, finalize: _FinalizeInfo + ) -> None: + """Output extra source code after visiting a child of an + ``Output`` node. + """ + self.write(")") + + if finalize.src is not None: + self.write(")") + + def visit_Output(self, node: nodes.Output, frame: Frame) -> None: + # If an extends is active, don't render outside a block. + if frame.require_output_check: + # A top-level extends is known to exist at compile time. + if self.has_known_extends: + return + + self.writeline("if parent_template is None:") + self.indent() + + finalize = self._make_finalize() + body: t.List[t.Union[t.List[t.Any], nodes.Expr]] = [] + + # Evaluate constants at compile time if possible. Each item in + # body will be either a list of static data or a node to be + # evaluated at runtime. + for child in node.nodes: + try: + if not ( + # If the finalize function requires runtime context, + # constants can't be evaluated at compile time. + finalize.const + # Unless it's basic template data that won't be + # finalized anyway. + or isinstance(child, nodes.TemplateData) + ): + raise nodes.Impossible() + + const = self._output_child_to_const(child, frame, finalize) + except (nodes.Impossible, Exception): + # The node was not constant and needs to be evaluated at + # runtime. Or another error was raised, which is easier + # to debug at runtime. + body.append(child) + continue + + if body and isinstance(body[-1], list): + body[-1].append(const) + else: + body.append([const]) + + if frame.buffer is not None: + if len(body) == 1: + self.writeline(f"{frame.buffer}.append(") + else: + self.writeline(f"{frame.buffer}.extend((") + + self.indent() + + for item in body: + if isinstance(item, list): + # A group of constant data to join and output. + val = self._output_const_repr(item) + + if frame.buffer is None: + self.writeline("yield " + val) + else: + self.writeline(val + ",") + else: + if frame.buffer is None: + self.writeline("yield ", item) + else: + self.newline(item) + + # A node to be evaluated at runtime. + self._output_child_pre(item, frame, finalize) + self.visit(item, frame) + self._output_child_post(item, frame, finalize) + + if frame.buffer is not None: + self.write(",") + + if frame.buffer is not None: + self.outdent() + self.writeline(")" if len(body) == 1 else "))") + + if frame.require_output_check: + self.outdent() + + def visit_Assign(self, node: nodes.Assign, frame: Frame) -> None: + self.push_assign_tracking() + + # ``a.b`` is allowed for assignment, and is parsed as an NSRef. However, + # it is only valid if it references a Namespace object. Emit a check for + # that for each ref here, before assignment code is emitted. This can't + # be done in visit_NSRef as the ref could be in the middle of a tuple. + seen_refs: t.Set[str] = set() + + for nsref in node.find_all(nodes.NSRef): + if nsref.name in seen_refs: + # Only emit the check for each reference once, in case the same + # ref is used multiple times in a tuple, `ns.a, ns.b = c, d`. + continue + + seen_refs.add(nsref.name) + ref = frame.symbols.ref(nsref.name) + self.writeline(f"if not isinstance({ref}, Namespace):") + self.indent() + self.writeline( + "raise TemplateRuntimeError" + '("cannot assign attribute on non-namespace object")' + ) + self.outdent() + + self.newline(node) + self.visit(node.target, frame) + self.write(" = ") + self.visit(node.node, frame) + self.pop_assign_tracking(frame) + + def visit_AssignBlock(self, node: nodes.AssignBlock, frame: Frame) -> None: + self.push_assign_tracking() + block_frame = frame.inner() + # This is a special case. Since a set block always captures we + # will disable output checks. This way one can use set blocks + # toplevel even in extended templates. + block_frame.require_output_check = False + block_frame.symbols.analyze_node(node) + self.enter_frame(block_frame) + self.buffer(block_frame) + self.blockvisit(node.body, block_frame) + self.newline(node) + self.visit(node.target, frame) + self.write(" = (Markup if context.eval_ctx.autoescape else identity)(") + if node.filter is not None: + self.visit_Filter(node.filter, block_frame) + else: + self.write(f"concat({block_frame.buffer})") + self.write(")") + self.pop_assign_tracking(frame) + self.leave_frame(block_frame) + + # -- Expression Visitors + + def visit_Name(self, node: nodes.Name, frame: Frame) -> None: + if node.ctx == "store" and ( + frame.toplevel or frame.loop_frame or frame.block_frame + ): + if self._assign_stack: + self._assign_stack[-1].add(node.name) + ref = frame.symbols.ref(node.name) + + # If we are looking up a variable we might have to deal with the + # case where it's undefined. We can skip that case if the load + # instruction indicates a parameter which are always defined. + if node.ctx == "load": + load = frame.symbols.find_load(ref) + if not ( + load is not None + and load[0] == VAR_LOAD_PARAMETER + and not self.parameter_is_undeclared(ref) + ): + self.write( + f"(undefined(name={node.name!r}) if {ref} is missing else {ref})" + ) + return + + self.write(ref) + + def visit_NSRef(self, node: nodes.NSRef, frame: Frame) -> None: + # NSRef is a dotted assignment target a.b=c, but uses a[b]=c internally. + # visit_Assign emits code to validate that each ref is to a Namespace + # object only. That can't be emitted here as the ref could be in the + # middle of a tuple assignment. + ref = frame.symbols.ref(node.name) + self.writeline(f"{ref}[{node.attr!r}]") + + def visit_Const(self, node: nodes.Const, frame: Frame) -> None: + val = node.as_const(frame.eval_ctx) + if isinstance(val, float): + self.write(str(val)) + else: + self.write(repr(val)) + + def visit_TemplateData(self, node: nodes.TemplateData, frame: Frame) -> None: + try: + self.write(repr(node.as_const(frame.eval_ctx))) + except nodes.Impossible: + self.write( + f"(Markup if context.eval_ctx.autoescape else identity)({node.data!r})" + ) + + def visit_Tuple(self, node: nodes.Tuple, frame: Frame) -> None: + self.write("(") + idx = -1 + for idx, item in enumerate(node.items): + if idx: + self.write(", ") + self.visit(item, frame) + self.write(",)" if idx == 0 else ")") + + def visit_List(self, node: nodes.List, frame: Frame) -> None: + self.write("[") + for idx, item in enumerate(node.items): + if idx: + self.write(", ") + self.visit(item, frame) + self.write("]") + + def visit_Dict(self, node: nodes.Dict, frame: Frame) -> None: + self.write("{") + for idx, item in enumerate(node.items): + if idx: + self.write(", ") + self.visit(item.key, frame) + self.write(": ") + self.visit(item.value, frame) + self.write("}") + + visit_Add = _make_binop("+") + visit_Sub = _make_binop("-") + visit_Mul = _make_binop("*") + visit_Div = _make_binop("/") + visit_FloorDiv = _make_binop("//") + visit_Pow = _make_binop("**") + visit_Mod = _make_binop("%") + visit_And = _make_binop("and") + visit_Or = _make_binop("or") + visit_Pos = _make_unop("+") + visit_Neg = _make_unop("-") + visit_Not = _make_unop("not ") + + @optimizeconst + def visit_Concat(self, node: nodes.Concat, frame: Frame) -> None: + if frame.eval_ctx.volatile: + func_name = "(markup_join if context.eval_ctx.volatile else str_join)" + elif frame.eval_ctx.autoescape: + func_name = "markup_join" + else: + func_name = "str_join" + self.write(f"{func_name}((") + for arg in node.nodes: + self.visit(arg, frame) + self.write(", ") + self.write("))") + + @optimizeconst + def visit_Compare(self, node: nodes.Compare, frame: Frame) -> None: + self.write("(") + self.visit(node.expr, frame) + for op in node.ops: + self.visit(op, frame) + self.write(")") + + def visit_Operand(self, node: nodes.Operand, frame: Frame) -> None: + self.write(f" {operators[node.op]} ") + self.visit(node.expr, frame) + + @optimizeconst + def visit_Getattr(self, node: nodes.Getattr, frame: Frame) -> None: + if self.environment.is_async: + self.write("(await auto_await(") + + self.write("environment.getattr(") + self.visit(node.node, frame) + self.write(f", {node.attr!r})") + + if self.environment.is_async: + self.write("))") + + @optimizeconst + def visit_Getitem(self, node: nodes.Getitem, frame: Frame) -> None: + # slices bypass the environment getitem method. + if isinstance(node.arg, nodes.Slice): + self.visit(node.node, frame) + self.write("[") + self.visit(node.arg, frame) + self.write("]") + else: + if self.environment.is_async: + self.write("(await auto_await(") + + self.write("environment.getitem(") + self.visit(node.node, frame) + self.write(", ") + self.visit(node.arg, frame) + self.write(")") + + if self.environment.is_async: + self.write("))") + + def visit_Slice(self, node: nodes.Slice, frame: Frame) -> None: + if node.start is not None: + self.visit(node.start, frame) + self.write(":") + if node.stop is not None: + self.visit(node.stop, frame) + if node.step is not None: + self.write(":") + self.visit(node.step, frame) + + @contextmanager + def _filter_test_common( + self, node: t.Union[nodes.Filter, nodes.Test], frame: Frame, is_filter: bool + ) -> t.Iterator[None]: + if self.environment.is_async: + self.write("(await auto_await(") + + if is_filter: + self.write(f"{self.filters[node.name]}(") + func = self.environment.filters.get(node.name) + else: + self.write(f"{self.tests[node.name]}(") + func = self.environment.tests.get(node.name) + + # When inside an If or CondExpr frame, allow the filter to be + # undefined at compile time and only raise an error if it's + # actually called at runtime. See pull_dependencies. + if func is None and not frame.soft_frame: + type_name = "filter" if is_filter else "test" + self.fail(f"No {type_name} named {node.name!r}.", node.lineno) + + pass_arg = { + _PassArg.context: "context", + _PassArg.eval_context: "context.eval_ctx", + _PassArg.environment: "environment", + }.get( + _PassArg.from_obj(func) # type: ignore + ) + + if pass_arg is not None: + self.write(f"{pass_arg}, ") + + # Back to the visitor function to handle visiting the target of + # the filter or test. + yield + + self.signature(node, frame) + self.write(")") + + if self.environment.is_async: + self.write("))") + + @optimizeconst + def visit_Filter(self, node: nodes.Filter, frame: Frame) -> None: + with self._filter_test_common(node, frame, True): + # if the filter node is None we are inside a filter block + # and want to write to the current buffer + if node.node is not None: + self.visit(node.node, frame) + elif frame.eval_ctx.volatile: + self.write( + f"(Markup(concat({frame.buffer}))" + f" if context.eval_ctx.autoescape else concat({frame.buffer}))" + ) + elif frame.eval_ctx.autoescape: + self.write(f"Markup(concat({frame.buffer}))") + else: + self.write(f"concat({frame.buffer})") + + @optimizeconst + def visit_Test(self, node: nodes.Test, frame: Frame) -> None: + with self._filter_test_common(node, frame, False): + self.visit(node.node, frame) + + @optimizeconst + def visit_CondExpr(self, node: nodes.CondExpr, frame: Frame) -> None: + frame = frame.soft() + + def write_expr2() -> None: + if node.expr2 is not None: + self.visit(node.expr2, frame) + return + + self.write( + f'cond_expr_undefined("the inline if-expression on' + f" {self.position(node)} evaluated to false and no else" + f' section was defined.")' + ) + + self.write("(") + self.visit(node.expr1, frame) + self.write(" if ") + self.visit(node.test, frame) + self.write(" else ") + write_expr2() + self.write(")") + + @optimizeconst + def visit_Call( + self, node: nodes.Call, frame: Frame, forward_caller: bool = False + ) -> None: + if self.environment.is_async: + self.write("(await auto_await(") + if self.environment.sandboxed: + self.write("environment.call(context, ") + else: + self.write("context.call(") + self.visit(node.node, frame) + extra_kwargs = {"caller": "caller"} if forward_caller else None + loop_kwargs = {"_loop_vars": "_loop_vars"} if frame.loop_frame else {} + block_kwargs = {"_block_vars": "_block_vars"} if frame.block_frame else {} + if extra_kwargs: + extra_kwargs.update(loop_kwargs, **block_kwargs) + elif loop_kwargs or block_kwargs: + extra_kwargs = dict(loop_kwargs, **block_kwargs) + self.signature(node, frame, extra_kwargs) + self.write(")") + if self.environment.is_async: + self.write("))") + + def visit_Keyword(self, node: nodes.Keyword, frame: Frame) -> None: + self.write(node.key + "=") + self.visit(node.value, frame) + + # -- Unused nodes for extensions + + def visit_MarkSafe(self, node: nodes.MarkSafe, frame: Frame) -> None: + self.write("Markup(") + self.visit(node.expr, frame) + self.write(")") + + def visit_MarkSafeIfAutoescape( + self, node: nodes.MarkSafeIfAutoescape, frame: Frame + ) -> None: + self.write("(Markup if context.eval_ctx.autoescape else identity)(") + self.visit(node.expr, frame) + self.write(")") + + def visit_EnvironmentAttribute( + self, node: nodes.EnvironmentAttribute, frame: Frame + ) -> None: + self.write("environment." + node.name) + + def visit_ExtensionAttribute( + self, node: nodes.ExtensionAttribute, frame: Frame + ) -> None: + self.write(f"environment.extensions[{node.identifier!r}].{node.name}") + + def visit_ImportedName(self, node: nodes.ImportedName, frame: Frame) -> None: + self.write(self.import_aliases[node.importname]) + + def visit_InternalName(self, node: nodes.InternalName, frame: Frame) -> None: + self.write(node.name) + + def visit_ContextReference( + self, node: nodes.ContextReference, frame: Frame + ) -> None: + self.write("context") + + def visit_DerivedContextReference( + self, node: nodes.DerivedContextReference, frame: Frame + ) -> None: + self.write(self.derive_context(frame)) + + def visit_Continue(self, node: nodes.Continue, frame: Frame) -> None: + self.writeline("continue", node) + + def visit_Break(self, node: nodes.Break, frame: Frame) -> None: + self.writeline("break", node) + + def visit_Scope(self, node: nodes.Scope, frame: Frame) -> None: + scope_frame = frame.inner() + scope_frame.symbols.analyze_node(node) + self.enter_frame(scope_frame) + self.blockvisit(node.body, scope_frame) + self.leave_frame(scope_frame) + + def visit_OverlayScope(self, node: nodes.OverlayScope, frame: Frame) -> None: + ctx = self.temporary_identifier() + self.writeline(f"{ctx} = {self.derive_context(frame)}") + self.writeline(f"{ctx}.vars = ") + self.visit(node.context, frame) + self.push_context_reference(ctx) + + scope_frame = frame.inner(isolated=True) + scope_frame.symbols.analyze_node(node) + self.enter_frame(scope_frame) + self.blockvisit(node.body, scope_frame) + self.leave_frame(scope_frame) + self.pop_context_reference() + + def visit_EvalContextModifier( + self, node: nodes.EvalContextModifier, frame: Frame + ) -> None: + for keyword in node.options: + self.writeline(f"context.eval_ctx.{keyword.key} = ") + self.visit(keyword.value, frame) + try: + val = keyword.value.as_const(frame.eval_ctx) + except nodes.Impossible: + frame.eval_ctx.volatile = True + else: + setattr(frame.eval_ctx, keyword.key, val) + + def visit_ScopedEvalContextModifier( + self, node: nodes.ScopedEvalContextModifier, frame: Frame + ) -> None: + old_ctx_name = self.temporary_identifier() + saved_ctx = frame.eval_ctx.save() + self.writeline(f"{old_ctx_name} = context.eval_ctx.save()") + self.visit_EvalContextModifier(node, frame) + for child in node.body: + self.visit(child, frame) + frame.eval_ctx.revert(saved_ctx) + self.writeline(f"context.eval_ctx.revert({old_ctx_name})") diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/constants.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/constants.py new file mode 100755 index 00000000..41a1c23b --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/constants.py @@ -0,0 +1,20 @@ +#: list of lorem ipsum words used by the lipsum() helper function +LOREM_IPSUM_WORDS = """\ +a ac accumsan ad adipiscing aenean aliquam aliquet amet ante aptent arcu at +auctor augue bibendum blandit class commodo condimentum congue consectetuer +consequat conubia convallis cras cubilia cum curabitur curae cursus dapibus +diam dictum dictumst dignissim dis dolor donec dui duis egestas eget eleifend +elementum elit enim erat eros est et etiam eu euismod facilisi facilisis fames +faucibus felis fermentum feugiat fringilla fusce gravida habitant habitasse hac +hendrerit hymenaeos iaculis id imperdiet in inceptos integer interdum ipsum +justo lacinia lacus laoreet lectus leo libero ligula litora lobortis lorem +luctus maecenas magna magnis malesuada massa mattis mauris metus mi molestie +mollis montes morbi mus nam nascetur natoque nec neque netus nibh nisi nisl non +nonummy nostra nulla nullam nunc odio orci ornare parturient pede pellentesque +penatibus per pharetra phasellus placerat platea porta porttitor posuere +potenti praesent pretium primis proin pulvinar purus quam quis quisque rhoncus +ridiculus risus rutrum sagittis sapien scelerisque sed sem semper senectus sit +sociis sociosqu sodales sollicitudin suscipit suspendisse taciti tellus tempor +tempus tincidunt torquent tortor tristique turpis ullamcorper ultrices +ultricies urna ut varius vehicula vel velit venenatis vestibulum vitae vivamus +viverra volutpat vulputate""" diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/debug.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/debug.py new file mode 100755 index 00000000..eeeeee78 --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/debug.py @@ -0,0 +1,191 @@ +import sys +import typing as t +from types import CodeType +from types import TracebackType + +from .exceptions import TemplateSyntaxError +from .utils import internal_code +from .utils import missing + +if t.TYPE_CHECKING: + from .runtime import Context + + +def rewrite_traceback_stack(source: t.Optional[str] = None) -> BaseException: + """Rewrite the current exception to replace any tracebacks from + within compiled template code with tracebacks that look like they + came from the template source. + + This must be called within an ``except`` block. + + :param source: For ``TemplateSyntaxError``, the original source if + known. + :return: The original exception with the rewritten traceback. + """ + _, exc_value, tb = sys.exc_info() + exc_value = t.cast(BaseException, exc_value) + tb = t.cast(TracebackType, tb) + + if isinstance(exc_value, TemplateSyntaxError) and not exc_value.translated: + exc_value.translated = True + exc_value.source = source + # Remove the old traceback, otherwise the frames from the + # compiler still show up. + exc_value.with_traceback(None) + # Outside of runtime, so the frame isn't executing template + # code, but it still needs to point at the template. + tb = fake_traceback( + exc_value, None, exc_value.filename or "", exc_value.lineno + ) + else: + # Skip the frame for the render function. + tb = tb.tb_next + + stack = [] + + # Build the stack of traceback object, replacing any in template + # code with the source file and line information. + while tb is not None: + # Skip frames decorated with @internalcode. These are internal + # calls that aren't useful in template debugging output. + if tb.tb_frame.f_code in internal_code: + tb = tb.tb_next + continue + + template = tb.tb_frame.f_globals.get("__jinja_template__") + + if template is not None: + lineno = template.get_corresponding_lineno(tb.tb_lineno) + fake_tb = fake_traceback(exc_value, tb, template.filename, lineno) + stack.append(fake_tb) + else: + stack.append(tb) + + tb = tb.tb_next + + tb_next = None + + # Assign tb_next in reverse to avoid circular references. + for tb in reversed(stack): + tb.tb_next = tb_next + tb_next = tb + + return exc_value.with_traceback(tb_next) + + +def fake_traceback( # type: ignore + exc_value: BaseException, tb: t.Optional[TracebackType], filename: str, lineno: int +) -> TracebackType: + """Produce a new traceback object that looks like it came from the + template source instead of the compiled code. The filename, line + number, and location name will point to the template, and the local + variables will be the current template context. + + :param exc_value: The original exception to be re-raised to create + the new traceback. + :param tb: The original traceback to get the local variables and + code info from. + :param filename: The template filename. + :param lineno: The line number in the template source. + """ + if tb is not None: + # Replace the real locals with the context that would be + # available at that point in the template. + locals = get_template_locals(tb.tb_frame.f_locals) + locals.pop("__jinja_exception__", None) + else: + locals = {} + + globals = { + "__name__": filename, + "__file__": filename, + "__jinja_exception__": exc_value, + } + # Raise an exception at the correct line number. + code: CodeType = compile( + "\n" * (lineno - 1) + "raise __jinja_exception__", filename, "exec" + ) + + # Build a new code object that points to the template file and + # replaces the location with a block name. + location = "template" + + if tb is not None: + function = tb.tb_frame.f_code.co_name + + if function == "root": + location = "top-level template code" + elif function.startswith("block_"): + location = f"block {function[6:]!r}" + + if sys.version_info >= (3, 8): + code = code.replace(co_name=location) + else: + code = CodeType( + code.co_argcount, + code.co_kwonlyargcount, + code.co_nlocals, + code.co_stacksize, + code.co_flags, + code.co_code, + code.co_consts, + code.co_names, + code.co_varnames, + code.co_filename, + location, + code.co_firstlineno, + code.co_lnotab, + code.co_freevars, + code.co_cellvars, + ) + + # Execute the new code, which is guaranteed to raise, and return + # the new traceback without this frame. + try: + exec(code, globals, locals) + except BaseException: + return sys.exc_info()[2].tb_next # type: ignore + + +def get_template_locals(real_locals: t.Mapping[str, t.Any]) -> t.Dict[str, t.Any]: + """Based on the runtime locals, get the context that would be + available at that point in the template. + """ + # Start with the current template context. + ctx: t.Optional[Context] = real_locals.get("context") + + if ctx is not None: + data: t.Dict[str, t.Any] = ctx.get_all().copy() + else: + data = {} + + # Might be in a derived context that only sets local variables + # rather than pushing a context. Local variables follow the scheme + # l_depth_name. Find the highest-depth local that has a value for + # each name. + local_overrides: t.Dict[str, t.Tuple[int, t.Any]] = {} + + for name, value in real_locals.items(): + if not name.startswith("l_") or value is missing: + # Not a template variable, or no longer relevant. + continue + + try: + _, depth_str, name = name.split("_", 2) + depth = int(depth_str) + except ValueError: + continue + + cur_depth = local_overrides.get(name, (-1,))[0] + + if cur_depth < depth: + local_overrides[name] = (depth, value) + + # Modify the context with any derived context. + for name, (_, value) in local_overrides.items(): + if value is missing: + data.pop(name, None) + else: + data[name] = value + + return data diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/defaults.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/defaults.py new file mode 100755 index 00000000..638cad3d --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/defaults.py @@ -0,0 +1,48 @@ +import typing as t + +from .filters import FILTERS as DEFAULT_FILTERS # noqa: F401 +from .tests import TESTS as DEFAULT_TESTS # noqa: F401 +from .utils import Cycler +from .utils import generate_lorem_ipsum +from .utils import Joiner +from .utils import Namespace + +if t.TYPE_CHECKING: + import typing_extensions as te + +# defaults for the parser / lexer +BLOCK_START_STRING = "{%" +BLOCK_END_STRING = "%}" +VARIABLE_START_STRING = "{{" +VARIABLE_END_STRING = "}}" +COMMENT_START_STRING = "{#" +COMMENT_END_STRING = "#}" +LINE_STATEMENT_PREFIX: t.Optional[str] = None +LINE_COMMENT_PREFIX: t.Optional[str] = None +TRIM_BLOCKS = False +LSTRIP_BLOCKS = False +NEWLINE_SEQUENCE: "te.Literal['\\n', '\\r\\n', '\\r']" = "\n" +KEEP_TRAILING_NEWLINE = False + +# default filters, tests and namespace + +DEFAULT_NAMESPACE = { + "range": range, + "dict": dict, + "lipsum": generate_lorem_ipsum, + "cycler": Cycler, + "joiner": Joiner, + "namespace": Namespace, +} + +# default policies +DEFAULT_POLICIES: t.Dict[str, t.Any] = { + "compiler.ascii_str": True, + "urlize.rel": "noopener", + "urlize.target": None, + "urlize.extra_schemes": None, + "truncate.leeway": 5, + "json.dumps_function": None, + "json.dumps_kwargs": {"sort_keys": True}, + "ext.i18n.trimmed": False, +} diff --git a/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/environment.py b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/environment.py new file mode 100755 index 00000000..0fc6e5be --- /dev/null +++ b/apps/TA-socradar-incidents/bin/ta_socradar_incidents/aob_py3/jinja2/environment.py @@ -0,0 +1,1672 @@ +"""Classes for managing templates and their runtime and compile time +options. +""" + +import os +import typing +import typing as t +import weakref +from collections import ChainMap +from functools import lru_cache +from functools import partial +from functools import reduce +from types import CodeType + +from markupsafe import Markup + +from . import nodes +from .compiler import CodeGenerator +from .compiler import generate +from .defaults import BLOCK_END_STRING +from .defaults import BLOCK_START_STRING +from .defaults import COMMENT_END_STRING +from .defaults import COMMENT_START_STRING +from .defaults import DEFAULT_FILTERS # type: ignore[attr-defined] +from .defaults import DEFAULT_NAMESPACE +from .defaults import DEFAULT_POLICIES +from .defaults import DEFAULT_TESTS # type: ignore[attr-defined] +from .defaults import KEEP_TRAILING_NEWLINE +from .defaults import LINE_COMMENT_PREFIX +from .defaults import LINE_STATEMENT_PREFIX +from .defaults import LSTRIP_BLOCKS +from .defaults import NEWLINE_SEQUENCE +from .defaults import TRIM_BLOCKS +from .defaults import VARIABLE_END_STRING +from .defaults import VARIABLE_START_STRING +from .exceptions import TemplateNotFound +from .exceptions import TemplateRuntimeError +from .exceptions import TemplatesNotFound +from .exceptions import TemplateSyntaxError +from .exceptions import UndefinedError +from .lexer import get_lexer +from .lexer import Lexer +from .lexer import TokenStream +from .nodes import EvalContext +from .parser import Parser +from .runtime import Context +from .runtime import new_context +from .runtime import Undefined +from .utils import _PassArg +from .utils import concat +from .utils import consume +from .utils import import_string +from .utils import internalcode +from .utils import LRUCache +from .utils import missing + +if t.TYPE_CHECKING: + import typing_extensions as te + + from .bccache import BytecodeCache + from .ext import Extension + from .loaders import BaseLoader + +_env_bound = t.TypeVar("_env_bound", bound="Environment") + + +# for direct template usage we have up to ten living environments +@lru_cache(maxsize=10) +def get_spontaneous_environment(cls: t.Type[_env_bound], *args: t.Any) -> _env_bound: + """Return a new spontaneous environment. A spontaneous environment + is used for templates created directly rather than through an + existing environment. + + :param cls: Environment class to create. + :param args: Positional arguments passed to environment. + """ + env = cls(*args) + env.shared = True + return env + + +def create_cache( + size: int, +) -> t.Optional[t.MutableMapping[t.Tuple["weakref.ref[t.Any]", str], "Template"]]: + """Return the cache class for the given size.""" + if size == 0: + return None + + if size < 0: + return {} + + return LRUCache(size) # type: ignore + + +def copy_cache( + cache: t.Optional[t.MutableMapping[t.Any, t.Any]], +) -> t.Optional[t.MutableMapping[t.Tuple["weakref.ref[t.Any]", str], "Template"]]: + """Create an empty copy of the given cache.""" + if cache is None: + return None + + if type(cache) is dict: # noqa E721 + return {} + + return LRUCache(cache.capacity) # type: ignore + + +def load_extensions( + environment: "Environment", + extensions: t.Sequence[t.Union[str, t.Type["Extension"]]], +) -> t.Dict[str, "Extension"]: + """Load the extensions from the list and bind it to the environment. + Returns a dict of instantiated extensions. + """ + result = {} + + for extension in extensions: + if isinstance(extension, str): + extension = t.cast(t.Type["Extension"], import_string(extension)) + + result[extension.identifier] = extension(environment) + + return result + + +def _environment_config_check(environment: _env_bound) -> _env_bound: + """Perform a sanity check on the environment.""" + assert issubclass( + environment.undefined, Undefined + ), "'undefined' must be a subclass of 'jinja2.Undefined'." + assert ( + environment.block_start_string + != environment.variable_start_string + != environment.comment_start_string + ), "block, variable and comment start strings must be different." + assert environment.newline_sequence in { + "\r", + "\r\n", + "\n", + }, "'newline_sequence' must be one of '\\n', '\\r\\n', or '\\r'." + return environment + + +class Environment: + r"""The core component of Jinja is the `Environment`. It contains + important shared variables like configuration, filters, tests, + globals and others. Instances of this class may be modified if + they are not shared and if no template was loaded so far. + Modifications on environments after the first template was loaded + will lead to surprising effects and undefined behavior. + + Here are the possible initialization parameters: + + `block_start_string` + The string marking the beginning of a block. Defaults to ``'{%'``. + + `block_end_string` + The string marking the end of a block. Defaults to ``'%}'``. + + `variable_start_string` + The string marking the beginning of a print statement. + Defaults to ``'{{'``. + + `variable_end_string` + The string marking the end of a print statement. Defaults to + ``'}}'``. + + `comment_start_string` + The string marking the beginning of a comment. Defaults to ``'{#'``. + + `comment_end_string` + The string marking the end of a comment. Defaults to ``'#}'``. + + `line_statement_prefix` + If given and a string, this will be used as prefix for line based + statements. See also :ref:`line-statements`. + + `line_comment_prefix` + If given and a string, this will be used as prefix for line based + comments. See also :ref:`line-statements`. + + .. versionadded:: 2.2 + + `trim_blocks` + If this is set to ``True`` the first newline after a block is + removed (block, not variable tag!). Defaults to `False`. + + `lstrip_blocks` + If this is set to ``True`` leading spaces and tabs are stripped + from the start of a line to a block. Defaults to `False`. + + `newline_sequence` + The sequence that starts a newline. Must be one of ``'\r'``, + ``'\n'`` or ``'\r\n'``. The default is ``'\n'`` which is a + useful default for Linux and OS X systems as well as web + applications. + + `keep_trailing_newline` + Preserve the trailing newline when rendering templates. + The default is ``False``, which causes a single newline, + if present, to be stripped from the end of the template. + + .. versionadded:: 2.7 + + `extensions` + List of Jinja extensions to use. This can either be import paths + as strings or extension classes. For more information have a + look at :ref:`the extensions documentation `. + + `optimized` + should the optimizer be enabled? Default is ``True``. + + `undefined` + :class:`Undefined` or a subclass of it that is used to represent + undefined values in the template. + + `finalize` + A callable that can be used to process the result of a variable + expression before it is output. For example one can convert + ``None`` implicitly into an empty string here. + + `autoescape` + If set to ``True`` the XML/HTML autoescaping feature is enabled by + default. For more details about autoescaping see + :class:`~markupsafe.Markup`. As of Jinja 2.4 this can also + be a callable that is passed the template name and has to + return ``True`` or ``False`` depending on autoescape should be + enabled by default. + + .. versionchanged:: 2.4 + `autoescape` can now be a function + + `loader` + The template loader for this environment. + + `cache_size` + The size of the cache. Per default this is ``400`` which means + that if more than 400 templates are loaded the loader will clean + out the least recently used template. If the cache size is set to + ``0`` templates are recompiled all the time, if the cache size is + ``-1`` the cache will not be cleaned. + + .. versionchanged:: 2.8 + The cache size was increased to 400 from a low 50. + + `auto_reload` + Some loaders load templates from locations where the template + sources may change (ie: file system or database). If + ``auto_reload`` is set to ``True`` (default) every time a template is + requested the loader checks if the source changed and if yes, it + will reload the template. For higher performance it's possible to + disable that. + + `bytecode_cache` + If set to a bytecode cache object, this object will provide a + cache for the internal Jinja bytecode so that templates don't + have to be parsed if they were not changed. + + See :ref:`bytecode-cache` for more information. + + `enable_async` + If set to true this enables async template execution which + allows using async functions and generators. + """ + + #: if this environment is sandboxed. Modifying this variable won't make + #: the environment sandboxed though. For a real sandboxed environment + #: have a look at jinja2.sandbox. This flag alone controls the code + #: generation by the compiler. + sandboxed = False + + #: True if the environment is just an overlay + overlayed = False + + #: the environment this environment is linked to if it is an overlay + linked_to: t.Optional["Environment"] = None + + #: shared environments have this set to `True`. A shared environment + #: must not be modified + shared = False + + #: the class that is used for code generation. See + #: :class:`~jinja2.compiler.CodeGenerator` for more information. + code_generator_class: t.Type["CodeGenerator"] = CodeGenerator + + concat = "".join + + #: the context class that is used for templates. See + #: :class:`~jinja2.runtime.Context` for more information. + context_class: t.Type[Context] = Context + + template_class: t.Type["Template"] + + def __init__( + self, + block_start_string: str = BLOCK_START_STRING, + block_end_string: str = BLOCK_END_STRING, + variable_start_string: str = VARIABLE_START_STRING, + variable_end_string: str = VARIABLE_END_STRING, + comment_start_string: str = COMMENT_START_STRING, + comment_end_string: str = COMMENT_END_STRING, + line_statement_prefix: t.Optional[str] = LINE_STATEMENT_PREFIX, + line_comment_prefix: t.Optional[str] = LINE_COMMENT_PREFIX, + trim_blocks: bool = TRIM_BLOCKS, + lstrip_blocks: bool = LSTRIP_BLOCKS, + newline_sequence: "te.Literal['\\n', '\\r\\n', '\\r']" = NEWLINE_SEQUENCE, + keep_trailing_newline: bool = KEEP_TRAILING_NEWLINE, + extensions: t.Sequence[t.Union[str, t.Type["Extension"]]] = (), + optimized: bool = True, + undefined: t.Type[Undefined] = Undefined, + finalize: t.Optional[t.Callable[..., t.Any]] = None, + autoescape: t.Union[bool, t.Callable[[t.Optional[str]], bool]] = False, + loader: t.Optional["BaseLoader"] = None, + cache_size: int = 400, + auto_reload: bool = True, + bytecode_cache: t.Optional["BytecodeCache"] = None, + enable_async: bool = False, + ): + # !!Important notice!! + # The constructor accepts quite a few arguments that should be + # passed by keyword rather than position. However it's important to + # not change the order of arguments because it's used at least + # internally in those cases: + # - spontaneous environments (i18n extension and Template) + # - unittests + # If parameter changes are required only add parameters at the end + # and don't change the arguments (or the defaults!) of the arguments + # existing already. + + # lexer / parser information + self.block_start_string = block_start_string + self.block_end_string = block_end_string + self.variable_start_string = variable_start_string + self.variable_end_string = variable_end_string + self.comment_start_string = comment_start_string + self.comment_end_string = comment_end_string + self.line_statement_prefix = line_statement_prefix + self.line_comment_prefix = line_comment_prefix + self.trim_blocks = trim_blocks + self.lstrip_blocks = lstrip_blocks + self.newline_sequence = newline_sequence + self.keep_trailing_newline = keep_trailing_newline + + # runtime information + self.undefined: t.Type[Undefined] = undefined + self.optimized = optimized + self.finalize = finalize + self.autoescape = autoescape + + # defaults + self.filters = DEFAULT_FILTERS.copy() + self.tests = DEFAULT_TESTS.copy() + self.globals = DEFAULT_NAMESPACE.copy() + + # set the loader provided + self.loader = loader + self.cache = create_cache(cache_size) + self.bytecode_cache = bytecode_cache + self.auto_reload = auto_reload + + # configurable policies + self.policies = DEFAULT_POLICIES.copy() + + # load extensions + self.extensions = load_extensions(self, extensions) + + self.is_async = enable_async + _environment_config_check(self) + + def add_extension(self, extension: t.Union[str, t.Type["Extension"]]) -> None: + """Adds an extension after the environment was created. + + .. versionadded:: 2.5 + """ + self.extensions.update(load_extensions(self, [extension])) + + def extend(self, **attributes: t.Any) -> None: + """Add the items to the instance of the environment if they do not exist + yet. This is used by :ref:`extensions ` to register + callbacks and configuration values without breaking inheritance. + """ + for key, value in attributes.items(): + if not hasattr(self, key): + setattr(self, key, value) + + def overlay( + self, + block_start_string: str = missing, + block_end_string: str = missing, + variable_start_string: str = missing, + variable_end_string: str = missing, + comment_start_string: str = missing, + comment_end_string: str = missing, + line_statement_prefix: t.Optional[str] = missing, + line_comment_prefix: t.Optional[str] = missing, + trim_blocks: bool = missing, + lstrip_blocks: bool = missing, + newline_sequence: "te.Literal['\\n', '\\r\\n', '\\r']" = missing, + keep_trailing_newline: bool = missing, + extensions: t.Sequence[t.Union[str, t.Type["Extension"]]] = missing, + optimized: bool = missing, + undefined: t.Type[Undefined] = missing, + finalize: t.Optional[t.Callable[..., t.Any]] = missing, + autoescape: t.Union[bool, t.Callable[[t.Optional[str]], bool]] = missing, + loader: t.Optional["BaseLoader"] = missing, + cache_size: int = missing, + auto_reload: bool = missing, + bytecode_cache: t.Optional["BytecodeCache"] = missing, + enable_async: bool = missing, + ) -> "te.Self": + """Create a new overlay environment that shares all the data with the + current environment except for cache and the overridden attributes. + Extensions cannot be removed for an overlayed environment. An overlayed + environment automatically gets all the extensions of the environment it + is linked to plus optional extra extensions. + + Creating overlays should happen after the initial environment was set + up completely. Not all attributes are truly linked, some are just + copied over so modifications on the original environment may not shine + through. + + .. versionchanged:: 3.1.5 + ``enable_async`` is applied correctly. + + .. versionchanged:: 3.1.2 + Added the ``newline_sequence``, ``keep_trailing_newline``, + and ``enable_async`` parameters to match ``__init__``. + """ + args = dict(locals()) + del args["self"], args["cache_size"], args["extensions"], args["enable_async"] + + rv = object.__new__(self.__class__) + rv.__dict__.update(self.__dict__) + rv.overlayed = True + rv.linked_to = self + + for key, value in args.items(): + if value is not missing: + setattr(rv, key, value) + + if cache_size is not missing: + rv.cache = create_cache(cache_size) + else: + rv.cache = copy_cache(self.cache) + + rv.extensions = {} + for key, value in self.extensions.items(): + rv.extensions[key] = value.bind(rv) + if extensions is not missing: + rv.extensions.update(load_extensions(rv, extensions)) + + if enable_async is not missing: + rv.is_async = enable_async + + return _environment_config_check(rv) + + @property + def lexer(self) -> Lexer: + """The lexer for this environment.""" + return get_lexer(self) + + def iter_extensions(self) -> t.Iterator["Extension"]: + """Iterates over the extensions by priority.""" + return iter(sorted(self.extensions.values(), key=lambda x: x.priority)) + + def getitem( + self, obj: t.Any, argument: t.Union[str, t.Any] + ) -> t.Union[t.Any, Undefined]: + """Get an item or attribute of an object but prefer the item.""" + try: + return obj[argument] + except (AttributeError, TypeError, LookupError): + if isinstance(argument, str): + try: + attr = str(argument) + except Exception: + pass + else: + try: + return getattr(obj, attr) + except AttributeError: + pass + return self.undefined(obj=obj, name=argument) + + def getattr(self, obj: t.Any, attribute: str) -> t.Any: + """Get an item or attribute of an object but prefer the attribute. + Unlike :meth:`getitem` the attribute *must* be a string. + """ + try: + return getattr(obj, attribute) + except AttributeError: + pass + try: + return obj[attribute] + except (TypeError, LookupError, AttributeError): + return self.undefined(obj=obj, name=attribute) + + def _filter_test_common( + self, + name: t.Union[str, Undefined], + value: t.Any, + args: t.Optional[t.Sequence[t.Any]], + kwargs: t.Optional[t.Mapping[str, t.Any]], + context: t.Optional[Context], + eval_ctx: t.Optional[EvalContext], + is_filter: bool, + ) -> t.Any: + if is_filter: + env_map = self.filters + type_name = "filter" + else: + env_map = self.tests + type_name = "test" + + func = env_map.get(name) # type: ignore + + if func is None: + msg = f"No {type_name} named {name!r}." + + if isinstance(name, Undefined): + try: + name._fail_with_undefined_error() + except Exception as e: + msg = f"{msg} ({e}; did you forget to quote the callable name?)" + + raise TemplateRuntimeError(msg) + + args = [value, *(args if args is not None else ())] + kwargs = kwargs if kwargs is not None else {} + pass_arg = _PassArg.from_obj(func) + + if pass_arg is _PassArg.context: + if context is None: + raise TemplateRuntimeError( + f"Attempted to invoke a context {type_name} without context." + ) + + args.insert(0, context) + elif pass_arg is _PassArg.eval_context: + if eval_ctx is None: + if context is not None: + eval_ctx = context.eval_ctx + else: + eval_ctx = EvalContext(self) + + args.insert(0, eval_ctx) + elif pass_arg is _PassArg.environment: + args.insert(0, self) + + return func(*args, **kwargs) + + def call_filter( + self, + name: str, + value: t.Any, + args: t.Optional[t.Sequence[t.Any]] = None, + kwargs: t.Optional[t.Mapping[str, t.Any]] = None, + context: t.Optional[Context] = None, + eval_ctx: t.Optional[EvalContext] = None, + ) -> t.Any: + """Invoke a filter on a value the same way the compiler does. + + This might return a coroutine if the filter is running from an + environment in async mode and the filter supports async + execution. It's your responsibility to await this if needed. + + .. versionadded:: 2.7 + """ + return self._filter_test_common( + name, value, args, kwargs, context, eval_ctx, True + ) + + def call_test( + self, + name: str, + value: t.Any, + args: t.Optional[t.Sequence[t.Any]] = None, + kwargs: t.Optional[t.Mapping[str, t.Any]] = None, + context: t.Optional[Context] = None, + eval_ctx: t.Optional[EvalContext] = None, + ) -> t.Any: + """Invoke a test on a value the same way the compiler does. + + This might return a coroutine if the test is running from an + environment in async mode and the test supports async execution. + It's your responsibility to await this if needed. + + .. versionchanged:: 3.0 + Tests support ``@pass_context``, etc. decorators. Added + the ``context`` and ``eval_ctx`` parameters. + + .. versionadded:: 2.7 + """ + return self._filter_test_common( + name, value, args, kwargs, context, eval_ctx, False + ) + + @internalcode + def parse( + self, + source: str, + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + ) -> nodes.Template: + """Parse the sourcecode and return the abstract syntax tree. This + tree of nodes is used by the compiler to convert the template into + executable source- or bytecode. This is useful for debugging or to + extract information from templates. + + If you are :ref:`developing Jinja extensions ` + this gives you a good overview of the node tree generated. + """ + try: + return self._parse(source, name, filename) + except TemplateSyntaxError: + self.handle_exception(source=source) + + def _parse( + self, source: str, name: t.Optional[str], filename: t.Optional[str] + ) -> nodes.Template: + """Internal parsing function used by `parse` and `compile`.""" + return Parser(self, source, name, filename).parse() + + def lex( + self, + source: str, + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + ) -> t.Iterator[t.Tuple[int, str, str]]: + """Lex the given sourcecode and return a generator that yields + tokens as tuples in the form ``(lineno, token_type, value)``. + This can be useful for :ref:`extension development ` + and debugging templates. + + This does not perform preprocessing. If you want the preprocessing + of the extensions to be applied you have to filter source through + the :meth:`preprocess` method. + """ + source = str(source) + try: + return self.lexer.tokeniter(source, name, filename) + except TemplateSyntaxError: + self.handle_exception(source=source) + + def preprocess( + self, + source: str, + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + ) -> str: + """Preprocesses the source with all extensions. This is automatically + called for all parsing and compiling methods but *not* for :meth:`lex` + because there you usually only want the actual source tokenized. + """ + return reduce( + lambda s, e: e.preprocess(s, name, filename), + self.iter_extensions(), + str(source), + ) + + def _tokenize( + self, + source: str, + name: t.Optional[str], + filename: t.Optional[str] = None, + state: t.Optional[str] = None, + ) -> TokenStream: + """Called by the parser to do the preprocessing and filtering + for all the extensions. Returns a :class:`~jinja2.lexer.TokenStream`. + """ + source = self.preprocess(source, name, filename) + stream = self.lexer.tokenize(source, name, filename, state) + + for ext in self.iter_extensions(): + stream = ext.filter_stream(stream) # type: ignore + + if not isinstance(stream, TokenStream): + stream = TokenStream(stream, name, filename) + + return stream + + def _generate( + self, + source: nodes.Template, + name: t.Optional[str], + filename: t.Optional[str], + defer_init: bool = False, + ) -> str: + """Internal hook that can be overridden to hook a different generate + method in. + + .. versionadded:: 2.5 + """ + return generate( # type: ignore + source, + self, + name, + filename, + defer_init=defer_init, + optimized=self.optimized, + ) + + def _compile(self, source: str, filename: str) -> CodeType: + """Internal hook that can be overridden to hook a different compile + method in. + + .. versionadded:: 2.5 + """ + return compile(source, filename, "exec") + + @typing.overload + def compile( + self, + source: t.Union[str, nodes.Template], + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + raw: "te.Literal[False]" = False, + defer_init: bool = False, + ) -> CodeType: ... + + @typing.overload + def compile( + self, + source: t.Union[str, nodes.Template], + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + raw: "te.Literal[True]" = ..., + defer_init: bool = False, + ) -> str: ... + + @internalcode + def compile( + self, + source: t.Union[str, nodes.Template], + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + raw: bool = False, + defer_init: bool = False, + ) -> t.Union[str, CodeType]: + """Compile a node or template source code. The `name` parameter is + the load name of the template after it was joined using + :meth:`join_path` if necessary, not the filename on the file system. + the `filename` parameter is the estimated filename of the template on + the file system. If the template came from a database or memory this + can be omitted. + + The return value of this method is a python code object. If the `raw` + parameter is `True` the return value will be a string with python + code equivalent to the bytecode returned otherwise. This method is + mainly used internally. + + `defer_init` is use internally to aid the module code generator. This + causes the generated code to be able to import without the global + environment variable to be set. + + .. versionadded:: 2.4 + `defer_init` parameter added. + """ + source_hint = None + try: + if isinstance(source, str): + source_hint = source + source = self._parse(source, name, filename) + source = self._generate(source, name, filename, defer_init=defer_init) + if raw: + return source + if filename is None: + filename = "