diff --git a/bbot/core/event/base.py b/bbot/core/event/base.py index 83331b94d2..00a03aeed7 100644 --- a/bbot/core/event/base.py +++ b/bbot/core/event/base.py @@ -1247,6 +1247,10 @@ def _words(self): return set() +class OPEN_UDP_PORT(OPEN_TCP_PORT): + pass + + class URL_UNVERIFIED(BaseEvent): _status_code_regex = re.compile(r"^status-(\d{1,3})$") diff --git a/bbot/modules/azure_tenant.py b/bbot/modules/azure_tenant.py index f17911c86a..4a323fece3 100644 --- a/bbot/modules/azure_tenant.py +++ b/bbot/modules/azure_tenant.py @@ -1,6 +1,3 @@ -import regex as re -from contextlib import suppress - from bbot.modules.base import BaseModule @@ -9,116 +6,90 @@ class azure_tenant(BaseModule): produced_events = ["DNS_NAME"] flags = ["affiliates", "subdomain-enum", "cloud-enum", "passive", "safe"] meta = { - "description": "Query Azure for tenant sister domains", + "description": "Query Azure via azmap.dev for tenant sister domains", "created_date": "2024-07-04", "author": "@TheTechromancer", } - base_url = "https://autodiscover-s.outlook.com" + base_url = "https://azmap.dev/api/tenant" in_scope_only = True per_domain_only = True async def setup(self): self.processed = set() - self.d_xml_regex = re.compile(r"([^<>/]*)", re.I) return True async def handle_event(self, event): _, query = self.helpers.split_domain(event.data) - domains, openid_config = await self.query(query) - - tenant_id = None - authorization_endpoint = openid_config.get("authorization_endpoint", "") - matches = await self.helpers.re.findall(self.helpers.regexes.uuid_regex, authorization_endpoint) - if matches: - tenant_id = matches[0] - - tenant_names = set() - if domains: - self.verbose(f'Found {len(domains):,} domains under tenant for "{query}": {", ".join(sorted(domains))}') - for domain in domains: + tenant_data = await self.query(query) + + if not tenant_data: + return + + tenant_id = tenant_data.get("tenant_id") + tenant_name = tenant_data.get("tenant_name") + email_domains = tenant_data.get("email_domains", []) + + if email_domains: + self.verbose( + f'Found {len(email_domains):,} domains under tenant for "{query}": {", ".join(sorted(email_domains))}' + ) + for domain in email_domains: if domain != query: await self.emit_event( domain, "DNS_NAME", parent=event, tags=["affiliate", "azure-tenant"], - context=f'{{module}} queried Outlook autodiscover for "{query}" and found {{event.type}}: {{event.data}}', + context=f'{{module}} queried azmap.dev for "{query}" and found {{event.type}}: {{event.data}}', ) - # tenant names - if domain.lower().endswith(".onmicrosoft.com"): - tenantname = domain.split(".")[0].lower() - if tenantname: - tenant_names.add(tenantname) - - tenant_names = sorted(tenant_names) - event_data = {"tenant-names": tenant_names, "domains": sorted(domains)} + + # Build tenant names list (include the tenant name from the API) + tenant_names = [] + if tenant_name: + tenant_names.append(tenant_name) + + # Also extract tenant names from .onmicrosoft.com domains + for domain in email_domains: + if domain.lower().endswith(".onmicrosoft.com"): + tenantname = domain.split(".")[0].lower() + if tenantname and tenantname not in tenant_names: + tenant_names.append(tenantname) + + event_data = {"tenant-names": tenant_names, "domains": sorted(email_domains)} tenant_names_str = ",".join(tenant_names) - if tenant_id is not None: + if tenant_id: event_data["tenant-id"] = tenant_id await self.emit_event( event_data, "AZURE_TENANT", parent=event, - context=f'{{module}} queried Outlook autodiscover for "{query}" and found {{event.type}}: {tenant_names_str}', + context=f'{{module}} queried azmap.dev for "{query}" and found {{event.type}}: {tenant_names_str}', ) async def query(self, domain): - url = f"{self.base_url}/autodiscover/autodiscover.svc" - data = f""" - - - http://schemas.microsoft.com/exchange/2010/Autodiscover/Autodiscover/GetFederationInformation - https://autodiscover-s.outlook.com/autodiscover/autodiscover.svc - - http://www.w3.org/2005/08/addressing/anonymous - - - - - - {domain} - - - -""" - - headers = { - "Content-Type": "text/xml; charset=utf-8", - "SOAPAction": '"http://schemas.microsoft.com/exchange/2010/Autodiscover/Autodiscover/GetFederationInformation"', - "User-Agent": "AutodiscoverClient", - "Accept-Encoding": "identity", - } + url = f"{self.base_url}?domain={domain}&extract=true" self.debug(f"Retrieving tenant domains at {url}") - autodiscover_task = self.helpers.create_task( - self.helpers.request(url, method="POST", headers=headers, content=data) - ) - openid_url = f"https://login.windows.net/{domain}/.well-known/openid-configuration" - openid_task = self.helpers.create_task(self.helpers.request(openid_url)) - - r = await autodiscover_task + r = await self.helpers.request(url) status_code = getattr(r, "status_code", 0) - if status_code not in (200, 421): + if status_code != 200: self.verbose(f'Error retrieving azure_tenant domains for "{domain}" (status code: {status_code})') - return set(), {} - found_domains = list(set(await self.helpers.re.findall(self.d_xml_regex, r.text))) - domains = set() + return {} - for d in found_domains: - # make sure we don't make any unnecessary api calls + try: + tenant_data = r.json() + except Exception as e: + self.warning(f'Error parsing JSON response for "{domain}": {e}') + return {} + + # Absorb domains into word cloud + email_domains = tenant_data.get("email_domains", []) + for d in email_domains: d = str(d).lower() _, query = self.helpers.split_domain(d) self.processed.add(hash(query)) - domains.add(d) - # absorb into word cloud self.scan.word_cloud.absorb_word(d) - r = await openid_task - openid_config = {} - with suppress(Exception): - openid_config = r.json() - - domains = sorted(domains) - return domains, openid_config + return tenant_data diff --git a/bbot/modules/censys_dns.py b/bbot/modules/censys_dns.py new file mode 100644 index 0000000000..f8b9c62753 --- /dev/null +++ b/bbot/modules/censys_dns.py @@ -0,0 +1,82 @@ +from bbot.modules.templates.censys import censys + + +class censys_dns(censys): + """ + Query the Censys certificates API for subdomains. + Thanks to https://github.com/owasp-amass/amass/blob/master/resources/scripts/cert/censys.ads + """ + + watched_events = ["DNS_NAME"] + produced_events = ["DNS_NAME"] + flags = ["subdomain-enum", "passive", "safe"] + meta = { + "description": "Query the Censys API for subdomains", + "created_date": "2022-08-04", + "author": "@TheTechromancer", + "auth_required": True, + } + options = {"api_key": "", "max_pages": 5} + options_desc = { + "api_key": "Censys.io API Key in the format of 'key:secret'", + "max_pages": "Maximum number of pages to fetch (100 results per page)", + } + + async def setup(self): + self.max_pages = self.config.get("max_pages", 5) + return await super().setup() + + async def query(self, query): + results = set() + cursor = "" + for i in range(self.max_pages): + url = f"{self.base_url}/v2/certificates/search" + json_data = { + "q": f"names: {query}", + "per_page": 100, + } + if cursor: + json_data.update({"cursor": cursor}) + resp = await self.api_request( + url, + method="POST", + json=json_data, + ) + + if resp is None: + break + + try: + d = resp.json() + except Exception as e: + self.warning(f"Failed to parse JSON from {url} (response: {resp}): {e}") + + if resp.status_code < 200 or resp.status_code >= 400: + if isinstance(d, dict): + error = d.get("error", "") + if error: + self.warning(error) + self.verbose(f'Non-200 Status code: {resp.status_code} for query "{query}", page #{i + 1}') + self.debug(f"Response: {resp.text}") + break + else: + if d is None: + break + elif not isinstance(d, dict): + break + status = d.get("status", "").lower() + result = d.get("result", {}) + hits = result.get("hits", []) + if status != "ok" or not hits: + break + + for h in hits: + names = h.get("names", []) + for n in names: + results.add(n.strip(".*").lower()) + + cursor = result.get("links", {}).get("next", "") + if not cursor: + break + + return results diff --git a/bbot/modules/censys_ip.py b/bbot/modules/censys_ip.py new file mode 100644 index 0000000000..fa82dc33c7 --- /dev/null +++ b/bbot/modules/censys_ip.py @@ -0,0 +1,177 @@ +from bbot.modules.templates.censys import censys + + +class censys_ip(censys): + """ + Query the Censys /v2/hosts/{ip} endpoint for associated hostnames, IPs, and URLs. + """ + + watched_events = ["IP_ADDRESS"] + produced_events = [ + "IP_ADDRESS", + "DNS_NAME", + "URL_UNVERIFIED", + "OPEN_TCP_PORT", + "OPEN_UDP_PORT", + "TECHNOLOGY", + "PROTOCOL", + ] + flags = ["passive", "safe"] + meta = { + "description": "Query the Censys API for hosts by IP address", + "created_date": "2026-01-26", + "author": "@TheTechromancer", + "auth_required": True, + } + options = {"api_key": "", "dns_names_limit": 100, "in_scope_only": True} + options_desc = { + "api_key": "Censys.io API Key in the format of 'key:secret'", + "dns_names_limit": "Maximum number of DNS names to extract from dns.names (default 100)", + "in_scope_only": "Only query in-scope IPs. If False, will query up to distance 1.", + } + scope_distance_modifier = 1 + + async def setup(self): + self.dns_names_limit = self.config.get("dns_names_limit", 100) + self.warning( + "This module may consume a lot of API queries. Unless you specifically want to query on each individual IP, we recommend using the censys_dns module instead." + ) + return await super().setup() + + async def filter_event(self, event): + in_scope_only = self.config.get("in_scope_only", True) + max_scope_distance = 0 if in_scope_only else (self.scan.scope_search_distance + 1) + if event.scope_distance > max_scope_distance: + return False, "event is not in scope" + return True + + async def handle_event(self, event): + ip = str(event.host) + url = f"{self.base_url}/v2/hosts/{ip}" + + resp = await self.api_request(url) + if resp is None: + self.debug(f"No response for {ip}") + return + + if resp.status_code == 404: + self.debug(f"No data found for {ip}") + return + + if resp.status_code != 200: + self.verbose(f"Non-200 status code ({resp.status_code}) for {ip}") + return + + try: + data = resp.json() + except Exception as e: + self.warning(f"Failed to parse JSON response for {ip}: {e}") + return + + result = data.get("result", {}) + if not result: + return + + # Track what we've already emitted to avoid duplicates + seen = set() + + # Extract data from services + for service in result.get("services", []): + port = service.get("port") + transport = service.get("transport_protocol", "TCP").upper() + + # Emit OPEN_TCP_PORT or OPEN_UDP_PORT for services with a port + # QUIC uses UDP as transport, so treat it as UDP + if port and (port, transport) not in seen: + seen.add((port, transport)) + if transport in ("UDP", "QUIC"): + event_type = "OPEN_UDP_PORT" + else: + event_type = "OPEN_TCP_PORT" + await self.emit_event( + self.helpers.make_netloc(ip, port), + event_type, + parent=event, + context="{module} found open port on {event.parent.data}", + ) + + # Emit PROTOCOL for non-HTTP services + # Use extended_service_name (more specific) falling back to service_name + # Also check transport_protocol for protocols like QUIC + service_name = service.get("extended_service_name") or service.get("service_name", "") + # If service_name is UNKNOWN but transport_protocol is meaningful, use that + if service_name.upper() == "UNKNOWN" and transport and transport not in ("TCP", "UDP"): + service_name = transport + if service_name and service_name.upper() not in ("HTTP", "HTTPS", "UNKNOWN"): + protocol_key = ("protocol", service_name.upper(), port) + if protocol_key not in seen: + seen.add(protocol_key) + protocol_data = {"host": str(event.host), "protocol": service_name} + if port: + protocol_data["port"] = port + await self.emit_event( + protocol_data, + "PROTOCOL", + parent=event, + context="{module} found {event.type}: {event.data[protocol]} on {event.parent.data}", + ) + + # Extract URLs from HTTP services + http_data = service.get("http", {}) + request = http_data.get("request", {}) + uri = request.get("uri") + if uri and uri not in seen: + seen.add(uri) + await self.emit_event( + uri, + "URL_UNVERIFIED", + parent=event, + context="{module} found {event.data} in HTTP service of {event.parent.data}", + ) + + # Extract TLS certificate data + tls_data = service.get("tls", {}) + certs = tls_data.get("certificates", {}) + leaf_data = certs.get("leaf_data", {}) + + # Extract names from leaf_data.names + for name in leaf_data.get("names", []): + await self._emit_host(name, event, seen, "TLS certificate") + + # Extract common_name from leaf_data.subject + subject = leaf_data.get("subject", {}) + for cn in subject.get("common_name", []): + await self._emit_host(cn, event, seen, "TLS certificate subject") + + # Extract software/technologies + for software in service.get("software", []): + product = software.get("uniform_resource_identifier", software.get("product", "")) + if product: + await self.emit_event( + {"technology": product, "host": str(event.host)}, + "TECHNOLOGY", + parent=event, + context="{module} found {event.type}: {event.data[technology]} on {event.parent.data}", + ) + + # Extract dns.names (limit to configured max) + dns_data = result.get("dns", {}) + dns_names = dns_data.get("names", []) + for name in dns_names[: self.dns_names_limit]: + await self._emit_host(name, event, seen, "reverse DNS") + + async def _emit_host(self, host, event, seen, source): + """Emit IP_ADDRESS or DNS_NAME for a host value.""" + # Validate and emit as DNS_NAME + try: + validated = self.helpers.validators.validate_host(host) + except ValueError as e: + self.debug(f"Error validating host {host} in {source}: {e}") + if validated and validated not in seen: + seen.add(validated) + await self.emit_event( + validated, + "DNS_NAME", + parent=event, + context=f"{{module}} found {{event.data}} in {source} of {{event.parent.data}}", + ) diff --git a/bbot/modules/internal/cloudcheck.py b/bbot/modules/internal/cloudcheck.py index 5167b2c3e2..e2fca8536f 100644 --- a/bbot/modules/internal/cloudcheck.py +++ b/bbot/modules/internal/cloudcheck.py @@ -19,6 +19,8 @@ class CloudCheck(BaseInterceptModule): async def setup(self): self._cloud_hostname_regexes = None self._cloud_hostname_regexes_lock = asyncio.Lock() + # perform a test lookup during setup to force signature update + await self.helpers.cloudcheck.lookup("8.8.8.8") return True async def filter_event(self, event): @@ -38,7 +40,7 @@ async def handle_event(self, event, **kwargs): try: cloudcheck_results = await self.helpers.cloudcheck.lookup(host) except Exception as e: - self.trace(f"Error running cloudcheck against {event} (host: {host}): {e}") + self.warning(f"Error running cloudcheck against {event} (host: {host}): {e}") continue for provider in cloudcheck_results: provider_name = provider["name"].lower() diff --git a/bbot/modules/templates/censys.py b/bbot/modules/templates/censys.py new file mode 100644 index 0000000000..5673dd6b5c --- /dev/null +++ b/bbot/modules/templates/censys.py @@ -0,0 +1,54 @@ +import traceback + +from bbot.modules.templates.subdomain_enum import subdomain_enum_apikey + + +class censys(subdomain_enum_apikey): + """ + Base template for Censys API modules. + Provides common authentication and API request handling. + """ + + options = {"api_key": ""} + options_desc = {"api_key": "Censys.io API Key in the format of 'key:secret'"} + + base_url = "https://search.censys.io/api" + + async def setup(self): + await super().setup() + api_keys = set() + for module_name in ("censys", "censys_dns", "censys_ip"): + module_config = self.scan.config.get("modules", {}).get(module_name, {}) + api_key = module_config.get("api_key", "") + if isinstance(api_key, str): + api_key = [api_key] + for key in api_key: + key = key.strip() + if key: + api_keys.add(key) + if not api_keys: + if self.auth_required: + return None, "No API key set" + self.api_key = api_keys.pop() if api_keys else "" + try: + await self.ping() + self.hugesuccess("API is ready") + return True + except Exception as e: + self.trace(traceback.format_exc()) + return None, f"Error with API ({str(e).strip()})" + + async def ping(self): + url = f"{self.base_url}/v1/account" + resp = await self.api_request(url, retry_on_http_429=False) + d = resp.json() + assert isinstance(d, dict), f"Invalid response from {url}: {resp}" + quota = d.get("quota", {}) + used = int(quota.get("used", 0)) + allowance = int(quota.get("allowance", 0)) + assert used < allowance, "No quota remaining" + + def prepare_api_request(self, url, kwargs): + api_id, api_secret = self.api_key.split(":", 1) + kwargs["auth"] = (api_id, api_secret) + return url, kwargs diff --git a/bbot/test/test_step_1/test_helpers.py b/bbot/test/test_step_1/test_helpers.py index 2c6488cb14..fa54bcbe7f 100644 --- a/bbot/test/test_step_1/test_helpers.py +++ b/bbot/test/test_step_1/test_helpers.py @@ -409,6 +409,7 @@ async def test_helpers_misc(helpers, scan, bbot_scanner, bbot_httpserver): assert helpers.validators.validate_host("LOCALHOST ") == "localhost" assert helpers.validators.validate_host(" 192.168.1.1") == "192.168.1.1" assert helpers.validators.validate_host(" Dead::c0dE ") == "dead::c0de" + assert helpers.validators.validate_host(".*.wildcard.evilcorp.com") == "wildcard.evilcorp.com" assert helpers.validators.soft_validate(" evilCorp.COM", "host") is True assert helpers.validators.soft_validate("!@#$", "host") is False with pytest.raises(ValueError): diff --git a/bbot/test/test_step_2/module_tests/test_module_azure_tenant.py b/bbot/test/test_step_2/module_tests/test_module_azure_tenant.py index b7986d3a11..ee15d1a6dd 100644 --- a/bbot/test/test_step_2/module_tests/test_module_azure_tenant.py +++ b/bbot/test/test_step_2/module_tests/test_module_azure_tenant.py @@ -2,93 +2,22 @@ class TestAzure_Tenant(ModuleTestBase): - tenant_response = """ - - - - http://schemas.microsoft.com/exchange/2010/Autodiscover/Autodiscover/GetFederationInformationResponse - - 15 - 20 - 6411 - 14 - Exchange2015 - - - - - - NoError - - outlook.com - - blacklanternsecurity.onmicrosoft.com - - - - https://login.microsoftonline.com/extSTS.srf - urn:federation:MicrosoftOnline - - - - - -""" - - openid_config_azure = { - "token_endpoint": "https://login.windows.net/cc74fc12-4142-400e-a653-f98bdeadbeef/oauth2/token", - "token_endpoint_auth_methods_supported": ["client_secret_post", "private_key_jwt", "client_secret_basic"], - "jwks_uri": "https://login.windows.net/common/discovery/keys", - "response_modes_supported": ["query", "fragment", "form_post"], - "subject_types_supported": ["pairwise"], - "id_token_signing_alg_values_supported": ["RS256"], - "response_types_supported": ["code", "id_token", "code id_token", "token id_token", "token"], - "scopes_supported": ["openid"], - "issuer": "https://sts.windows.net/cc74fc12-4142-400e-a653-f98bdeadbeef/", - "microsoft_multi_refresh_token": True, - "authorization_endpoint": "https://login.windows.net/cc74fc12-4142-400e-a653-f98bdeadbeef/oauth2/authorize", - "device_authorization_endpoint": "https://login.windows.net/cc74fc12-4142-400e-a653-f98bdeadbeef/oauth2/devicecode", - "http_logout_supported": True, - "frontchannel_logout_supported": True, - "end_session_endpoint": "https://login.windows.net/cc74fc12-4142-400e-a653-f98bdeadbeef/oauth2/logout", - "claims_supported": [ - "sub", - "iss", - "cloud_instance_name", - "cloud_instance_host_name", - "cloud_graph_host_name", - "msgraph_host", - "aud", - "exp", - "iat", - "auth_time", - "acr", - "amr", - "nonce", - "email", - "given_name", - "family_name", - "nickname", + tenant_response = { + "tenant_id": "cc74fc12-4142-400e-a653-f98bdeadbeef", + "tenant_name": "blacklanternsecurity", + "domain": "blacklanternsecurity.com", + "email_domains": [ + "blacklanternsecurity.com", + "blacklanternsecurity.onmicrosoft.com", + "blsgvt.com", + "o365.blacklanternsecurity.com", ], - "check_session_iframe": "https://login.windows.net/cc74fc12-4142-400e-a653-f98bdeadbeef/oauth2/checksession", - "userinfo_endpoint": "https://login.windows.net/cc74fc12-4142-400e-a653-f98bdeadbeef/openid/userinfo", - "kerberos_endpoint": "https://login.windows.net/cc74fc12-4142-400e-a653-f98bdeadbeef/kerberos", - "tenant_region_scope": "NA", - "cloud_instance_name": "microsoftonline.com", - "cloud_graph_host_name": "graph.windows.net", - "msgraph_host": "graph.microsoft.com", - "rbac_url": "https://pas.windows.net", } async def setup_after_prep(self, module_test): module_test.httpx_mock.add_response( - method="POST", - url="https://autodiscover-s.outlook.com/autodiscover/autodiscover.svc", - text=self.tenant_response, - ) - module_test.httpx_mock.add_response( - url="https://login.windows.net/blacklanternsecurity.com/.well-known/openid-configuration", - json=self.openid_config_azure, + url="https://azmap.dev/api/tenant?domain=blacklanternsecurity.com&extract=true", + json=self.tenant_response, ) def check(self, module_test, events): diff --git a/bbot/test/test_step_2/module_tests/test_module_censys_dns.py b/bbot/test/test_step_2/module_tests/test_module_censys_dns.py new file mode 100644 index 0000000000..bab6f0060a --- /dev/null +++ b/bbot/test/test_step_2/module_tests/test_module_censys_dns.py @@ -0,0 +1,83 @@ +from .base import ModuleTestBase + + +class TestCensys_DNS(ModuleTestBase): + config_overrides = {"modules": {"censys_dns": {"api_key": "api_id:api_secret"}}} + + async def setup_before_prep(self, module_test): + module_test.httpx_mock.add_response( + url="https://search.censys.io/api/v1/account", + match_headers={"Authorization": "Basic YXBpX2lkOmFwaV9zZWNyZXQ="}, + json={ + "email": "info@blacklanternsecurity.com", + "login": "nope", + "first_login": "1917-08-03 20:03:55", + "last_login": "1918-05-19 01:15:22", + "quota": {"used": 26, "allowance": 250, "resets_at": "1919-06-03 16:30:32"}, + }, + ) + module_test.httpx_mock.add_response( + url="https://search.censys.io/api/v2/certificates/search", + match_headers={"Authorization": "Basic YXBpX2lkOmFwaV9zZWNyZXQ="}, + method="POST", + match_json={"q": "names: blacklanternsecurity.com", "per_page": 100}, + json={ + "code": 200, + "status": "OK", + "result": { + "query": "names: blacklanternsecurity.com", + "total": 196, + "duration_ms": 1046, + "hits": [ + { + "parsed": { + "validity_period": { + "not_before": "2021-11-18T00:09:46Z", + "not_after": "2022-11-18T00:09:46Z", + }, + "issuer_dn": "C=US, ST=Arizona, L=Scottsdale, O=GoDaddy.com\\, Inc., OU=http://certs.godaddy.com/repository/, CN=Go Daddy Secure Certificate Authority - G2", + "subject_dn": "CN=asdf.blacklanternsecurity.com", + }, + "fingerprint_sha256": "590ad51b8db62925f0fd3f300264c6a36692e20ceec2b5a22e7e4b41c1575cdc", + "names": ["asdf.blacklanternsecurity.com", "asdf2.blacklanternsecurity.com"], + }, + ], + "links": {"next": "NextToken", "prev": ""}, + }, + }, + ) + module_test.httpx_mock.add_response( + url="https://search.censys.io/api/v2/certificates/search", + match_headers={"Authorization": "Basic YXBpX2lkOmFwaV9zZWNyZXQ="}, + method="POST", + match_json={"q": "names: blacklanternsecurity.com", "per_page": 100, "cursor": "NextToken"}, + json={ + "code": 200, + "status": "OK", + "result": { + "query": "names: blacklanternsecurity.com", + "total": 196, + "duration_ms": 1046, + "hits": [ + { + "parsed": { + "validity_period": { + "not_before": "2021-11-18T00:09:46Z", + "not_after": "2022-11-18T00:09:46Z", + }, + "issuer_dn": "C=US, ST=Arizona, L=Scottsdale, O=GoDaddy.com\\, Inc., OU=http://certs.godaddy.com/repository/, CN=Go Daddy Secure Certificate Authority - G2", + "subject_dn": "CN=zzzz.blacklanternsecurity.com", + }, + "fingerprint_sha256": "590ad51b8db62925f0fd3f300264c6a36692e20ceec2b5a22e7e4b41c1575cdc", + "names": ["zzzz.blacklanternsecurity.com"], + }, + ], + "links": {"next": "", "prev": ""}, + }, + }, + ) + + def check(self, module_test, events): + assert any(e.data == "asdf.blacklanternsecurity.com" for e in events), "Failed to detect asdf subdomain" + assert any(e.data == "asdf2.blacklanternsecurity.com" for e in events), "Failed to detect asdf2 subdomain" + assert any(e.data == "zzzz.blacklanternsecurity.com" for e in events), "Failed to detect zzzz subdomain" diff --git a/bbot/test/test_step_2/module_tests/test_module_censys_ip.py b/bbot/test/test_step_2/module_tests/test_module_censys_ip.py new file mode 100644 index 0000000000..4aff673486 --- /dev/null +++ b/bbot/test/test_step_2/module_tests/test_module_censys_ip.py @@ -0,0 +1,296 @@ +from .base import ModuleTestBase + + +class TestCensys_IP(ModuleTestBase): + targets = ["1.2.3.4"] + config_overrides = {"modules": {"censys_ip": {"api_key": "api_id:api_secret"}}} + + async def setup_before_prep(self, module_test): + await module_test.mock_dns( + { + "wildcard.evilcorp.com": { + "A": ["1.2.3.4"], + }, + "certname.evilcorp.com": { + "A": ["1.2.3.4"], + }, + "certsubject.evilcorp.com": { + "A": ["1.2.3.4"], + }, + "reversedns.evilcorp.com": { + "A": ["1.2.3.4"], + }, + "ptr.evilcorp.com": { + "A": ["1.2.3.4"], + }, + } + ) + module_test.httpx_mock.add_response( + url="https://search.censys.io/api/v1/account", + match_headers={"Authorization": "Basic YXBpX2lkOmFwaV9zZWNyZXQ="}, + json={ + "email": "info@blacklanternsecurity.com", + "login": "nope", + "first_login": "1917-08-03 20:03:55", + "last_login": "1918-05-19 01:15:22", + "quota": {"used": 26, "allowance": 250, "resets_at": "1919-06-03 16:30:32"}, + }, + ) + module_test.httpx_mock.add_response( + url="https://search.censys.io/api/v2/hosts/1.2.3.4", + match_headers={"Authorization": "Basic YXBpX2lkOmFwaV9zZWNyZXQ="}, + json={ + "code": 200, + "status": "OK", + "result": { + "ip": "1.2.3.4", + "services": [ + { + "port": 53, + "service_name": "DNS", + "transport_protocol": "UDP", + }, + { + "port": 80, + "service_name": "HTTP", + "extended_service_name": "HTTP", + "transport_protocol": "TCP", + "http": { + "request": { + "method": "GET", + "uri": "http://1.2.3.4/", + }, + }, + }, + { + "port": 443, + # Real API returns service_name: "HTTP" for HTTPS + "service_name": "HTTP", + "extended_service_name": "HTTPS", + "transport_protocol": "TCP", + "http": { + "request": { + "method": "GET", + "uri": "https://1.2.3.4/", + }, + }, + "tls": { + "certificates": { + "leaf_data": { + "names": [ + "*.wildcard.evilcorp.com", + "certname.evilcorp.com", + ], + "subject": { + "common_name": ["certsubject.evilcorp.com"], + }, + }, + }, + }, + }, + { + "port": 8443, + # Real API returns service_name: "HTTP" for HTTPS + "service_name": "HTTP", + "extended_service_name": "HTTPS", + "transport_protocol": "TCP", + "http": { + "request": { + "method": "GET", + "uri": "https://1.2.3.4:8443/admin", + }, + }, + "software": [ + { + "uniform_resource_identifier": "cpe:2.3:a:apache:tomcat:9.0.50:*:*:*:*:*:*:*", + "product": "Apache Tomcat", + "vendor": "Apache", + }, + { + "product": "Java", + }, + ], + }, + { + "port": 22, + "service_name": "SSH", + "extended_service_name": "SSH", + "transport_protocol": "TCP", + }, + { + "port": 443, + # Real API returns service_name: "UNKNOWN" and transport_protocol: "QUIC" + "service_name": "UNKNOWN", + "extended_service_name": "UNKNOWN", + "transport_protocol": "QUIC", + }, + ], + "dns": { + "names": [ + "reversedns.evilcorp.com", + "ptr.evilcorp.com", + ], + }, + }, + }, + ) + + def check(self, module_test, events): + # Check OPEN_UDP_PORT event for DNS + assert any(e.type == "OPEN_UDP_PORT" and e.data == "1.2.3.4:53" for e in events), ( + "Failed to detect UDP port 53" + ) + + # Check OPEN_TCP_PORT events + assert any(e.type == "OPEN_TCP_PORT" and e.data == "1.2.3.4:22" for e in events), ( + "Failed to detect TCP port 22 (SSH)" + ) + assert any(e.type == "OPEN_TCP_PORT" and e.data == "1.2.3.4:80" for e in events), ( + "Failed to detect TCP port 80" + ) + assert any(e.type == "OPEN_TCP_PORT" and e.data == "1.2.3.4:443" for e in events), ( + "Failed to detect TCP port 443" + ) + assert any(e.type == "OPEN_TCP_PORT" and e.data == "1.2.3.4:8443" for e in events), ( + "Failed to detect TCP port 8443" + ) + + # Check OPEN_UDP_PORT for QUIC + assert any(e.type == "OPEN_UDP_PORT" and e.data == "1.2.3.4:443" for e in events), ( + "Failed to detect UDP port 443 (QUIC)" + ) + + # Check URL_UNVERIFIED events + assert any(e.type == "URL_UNVERIFIED" and e.data == "http://1.2.3.4/" for e in events), ( + "Failed to detect HTTP URL" + ) + assert any(e.type == "URL_UNVERIFIED" and e.data == "https://1.2.3.4/" for e in events), ( + "Failed to detect HTTPS URL" + ) + assert any(e.type == "URL_UNVERIFIED" and e.data == "https://1.2.3.4:8443/admin" for e in events), ( + "Failed to detect HTTPS URL on port 8443" + ) + + # Check DNS_NAME events from TLS certificate names + assert any(e.type == "DNS_NAME" and e.data == "wildcard.evilcorp.com" for e in events), ( + "Failed to detect wildcard.evilcorp.com from TLS cert names (wildcard stripped)" + ) + assert any(e.type == "DNS_NAME" and e.data == "certname.evilcorp.com" for e in events), ( + "Failed to detect certname.evilcorp.com from TLS cert names" + ) + + # Check DNS_NAME events from TLS certificate subject common_name + assert any( + e.type == "DNS_NAME" and e.data == "certsubject.evilcorp.com" and e.scope_distance == 0 for e in events + ), "Failed to detect certsubject.evilcorp.com from TLS cert subject" + + # Check DNS_NAME events from dns.names (reverse DNS) + assert any(e.type == "DNS_NAME" and e.data == "reversedns.evilcorp.com" for e in events), ( + "Failed to detect reversedns.evilcorp.com from reverse DNS" + ) + assert any(e.type == "DNS_NAME" and e.data == "ptr.evilcorp.com" for e in events), ( + "Failed to detect ptr.evilcorp.com from reverse DNS" + ) + + # Check TECHNOLOGY events from software + assert any( + e.type == "TECHNOLOGY" and e.data["technology"] == "cpe:2.3:a:apache:tomcat:9.0.50:*:*:*:*:*:*:*" + for e in events + ), "Failed to detect Apache Tomcat technology with CPE" + assert any(e.type == "TECHNOLOGY" and e.data["technology"] == "Java" for e in events), ( + "Failed to detect Java technology without CPE" + ) + + # Check PROTOCOL events (non-HTTP/DNS services) + assert any( + e.type == "PROTOCOL" and e.data["protocol"] == "SSH" and e.data.get("port") == 22 for e in events + ), "Failed to detect SSH protocol" + assert any( + e.type == "PROTOCOL" and e.data["protocol"] == "QUIC" and e.data.get("port") == 443 for e in events + ), "Failed to detect QUIC protocol" + + # Ensure HTTP/HTTPS services don't emit PROTOCOL events (but DNS does) + assert not any(e.type == "PROTOCOL" and e.data["protocol"] in ("HTTP", "HTTPS") for e in events), ( + "Should not emit PROTOCOL for HTTP/HTTPS services" + ) + assert any(e.type == "PROTOCOL" and e.data["protocol"] == "DNS" for e in events), ( + "Should emit PROTOCOL for DNS services" + ) + + +class TestCensys_IP_InScopeOnly(ModuleTestBase): + """Test that in_scope_only=True (default) does NOT query out-of-scope IPs.""" + + targets = ["evilcorp.com"] + module_name = "censys_ip" + config_overrides = {"modules": {"censys_ip": {"api_key": "api_id:api_secret", "in_scope_only": True}}} + + async def setup_before_prep(self, module_test): + await module_test.mock_dns({"evilcorp.com": {"A": ["1.1.1.1"]}}) + module_test.httpx_mock.add_response( + url="https://search.censys.io/api/v1/account", + match_headers={"Authorization": "Basic YXBpX2lkOmFwaV9zZWNyZXQ="}, + json={ + "quota": {"used": 26, "allowance": 250, "resets_at": "1919-06-03 16:30:32"}, + }, + ) + # This should NOT be called because in_scope_only=True + module_test.httpx_mock.add_response( + url="https://search.censys.io/api/v2/hosts/1.1.1.1", + match_headers={"Authorization": "Basic YXBpX2lkOmFwaV9zZWNyZXQ="}, + json={ + "code": 200, + "status": "OK", + "result": { + "ip": "1.1.1.1", + "services": [{"port": 80, "service_name": "HTTP", "transport_protocol": "TCP"}], + }, + }, + ) + + def check(self, module_test, events): + # Should NOT have queried the IP since it's out of scope + assert not any(e.type == "OPEN_TCP_PORT" and "1.1.1.1" in e.data for e in events), ( + "Should not have queried out-of-scope IP with in_scope_only=True" + ) + + +class TestCensys_IP_OutOfScope(ModuleTestBase): + """Test that in_scope_only=False DOES query out-of-scope IPs (up to distance 1).""" + + targets = ["evilcorp.com"] + module_name = "censys_ip" + config_overrides = { + "modules": {"censys_ip": {"api_key": "api_id:api_secret", "in_scope_only": False}}, + "dns": {"minimal": False}, + "scope": {"report_distance": 1}, + } + + async def setup_before_prep(self, module_test): + await module_test.mock_dns({"evilcorp.com": {"A": ["1.1.1.1"]}}) + module_test.httpx_mock.add_response( + url="https://search.censys.io/api/v1/account", + match_headers={"Authorization": "Basic YXBpX2lkOmFwaV9zZWNyZXQ="}, + json={ + "quota": {"used": 26, "allowance": 250, "resets_at": "1919-06-03 16:30:32"}, + }, + ) + # This SHOULD be called because in_scope_only=False + module_test.httpx_mock.add_response( + url="https://search.censys.io/api/v2/hosts/1.1.1.1", + match_headers={"Authorization": "Basic YXBpX2lkOmFwaV9zZWNyZXQ="}, + json={ + "code": 200, + "status": "OK", + "result": { + "ip": "1.1.1.1", + "services": [{"port": 80, "service_name": "HTTP", "transport_protocol": "TCP"}], + }, + }, + ) + + def check(self, module_test, events): + # Should have queried the IP since in_scope_only=False + assert any(e.type == "OPEN_TCP_PORT" and e.data == "1.1.1.1:80" for e in events), ( + "Should have queried out-of-scope IP with in_scope_only=False" + ) diff --git a/poetry.lock b/poetry.lock index 36525a2d1f..4a8faa6f02 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.3.0 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand. [[package]] name = "annotated-doc" @@ -198,7 +198,7 @@ description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" groups = ["main"] -markers = "implementation_name == \"pypy\" or platform_python_implementation != \"PyPy\"" +markers = "platform_python_implementation != \"PyPy\" or implementation_name == \"pypy\"" files = [ {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, @@ -403,105 +403,105 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} [[package]] name = "cloudcheck" -version = "8.7.2" +version = "9.2.0" description = "Detailed database of cloud providers. Instantly look up a domain or IP address" optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "cloudcheck-8.7.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9c309ae532e9982e3f28b70a2e1ff14c75e32639c260ff2f978ab0575fa794f"}, - {file = "cloudcheck-8.7.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cf98383de6a53120e09fa9881aa17e5b6509d738e27e07cda50ffcf38876d1aa"}, - {file = "cloudcheck-8.7.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a2abeb44229d3bc799bd68ec2a151120f32868fff26def28abc5460b1a304b28"}, - {file = "cloudcheck-8.7.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f429531696e8262bf8b90150c5f49cc8826433ac425e4ebab9ca1937094606ef"}, - {file = "cloudcheck-8.7.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3bf247c6f2adaec2795032b4f98d0dbbabdc77e3300b2fe26b7a4a4d5f1d00b"}, - {file = "cloudcheck-8.7.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7189b3aee5aa7f2368e87be086577ea2fbb37231c2c9c720908d6c8a511db7fa"}, - {file = "cloudcheck-8.7.2-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:43922e525395923e784663ae38e3f867ea9aa972f84575421880220acc3145e2"}, - {file = "cloudcheck-8.7.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:38478c71cb8cc12b91eb605e713ec6f346deec9ea17ecadb91baf6fc824f85eb"}, - {file = "cloudcheck-8.7.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:757a45af73fa9b2b190adb015a7c0ce42363187b9a114437fd6ed0c8f13c5d98"}, - {file = "cloudcheck-8.7.2-cp310-cp310-win_amd64.whl", hash = "sha256:dfd4d7035018918a674be6667fb9aa7801f0ef4b6cad9b2415875de25f4ca0aa"}, - {file = "cloudcheck-8.7.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d3704ddc63fbef0bccc08b84c8f306148bf12b1aec198858390e2403a280fa8f"}, - {file = "cloudcheck-8.7.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3e2e503384ae8387ee846a8fe7603ef73b5d953137ca84a57eecfab849205eff"}, - {file = "cloudcheck-8.7.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e52f0496959b560904a748bb69f0f6d70d814bf2cf652f15fde53a5fd8bda2c"}, - {file = "cloudcheck-8.7.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2a715dda59306d361db59d53eb94f05edfa976332b0e538045c1d7920159f021"}, - {file = "cloudcheck-8.7.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bae402b6ce298a6c5b9abac39af0ae610c41a8903a1766afd1b09dbc863f4d8f"}, - {file = "cloudcheck-8.7.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:62090b71c13455988ae9d125f186afa91397defd58673328828ac0af6838a952"}, - {file = "cloudcheck-8.7.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16237ea4ed85a606237603fcabaf8d00f51f7dca5d0ce88b703bb6f24ba1039b"}, - {file = "cloudcheck-8.7.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e5b003e611f1a279b31d92afc31cbc470242468be31be707615a784c41bd432f"}, - {file = "cloudcheck-8.7.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:17f837b2f19ea16a8aa07316bdba3772f2758106651c40a906226e76ac756a66"}, - {file = "cloudcheck-8.7.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:14e8e9567557297b5c0945d9753fecabe8d04d515b5aa00db0a8890ccb1f9784"}, - {file = "cloudcheck-8.7.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:202173431bc105bec18666e80cf8278c9748862b1ae6a51d7e5219cbbaf79237"}, - {file = "cloudcheck-8.7.2-cp311-cp311-win_amd64.whl", hash = "sha256:4a1d4ce87411f6593389ab817d91d71ec6588255d7aedaf620fd2e1e65bf30e5"}, - {file = "cloudcheck-8.7.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:5471fce7d336d8b1ee8ac255f1d0f60f984f92563a187e00372d6e129e206907"}, - {file = "cloudcheck-8.7.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:492bf44c220454035292aea137c227778ab38241385ba97abfa50e0841aff3c5"}, - {file = "cloudcheck-8.7.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24925952ef06dab869091fa09eda66c5abd428b23fdcedb36365543d087a0663"}, - {file = "cloudcheck-8.7.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:866d88c44ae490115e8b55c018c8b36a954c97a91d36da8db381d097b08cc9bc"}, - {file = "cloudcheck-8.7.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5c79b111447a4b8518782e3ceb6606126fc90daa6522c23c3dc9180a84201bc"}, - {file = "cloudcheck-8.7.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8387e9a3e0e9e6fce97331236d8531c2814f38a3f14de59c197075c5cf3ee286"}, - {file = "cloudcheck-8.7.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d0065b602de8b6e7b2d135cbb60fd84d1148db70300d747a359b3ef3250e81b"}, - {file = "cloudcheck-8.7.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e639d905651c58077b53059f4cd1b5730bf24ac09fa5aae08b85bb52dc18bd59"}, - {file = "cloudcheck-8.7.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:9a68859bb08511c384312a3e00efd14411287e479b412825b2a5c73c905f7aef"}, - {file = "cloudcheck-8.7.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f1ead3e8a512181926133640581f106a4706800f29a048be9800ec9ddddbdf1a"}, - {file = "cloudcheck-8.7.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:08df79339a0da7bbe25b6b058a03941629fdf1ebe5b2d2fac4752313d8164b86"}, - {file = "cloudcheck-8.7.2-cp312-cp312-win_amd64.whl", hash = "sha256:b150561528499dcc4a42fbc99e059430b4d95b0ec3a523998498141caf8f46d5"}, - {file = "cloudcheck-8.7.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:10c32dd167f3969690acc933293ff54435d4ab9267a7882c965d2409ffa50e75"}, - {file = "cloudcheck-8.7.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9d5ae4080a4ef645906ac4cd1e0f92bc871c4bd3ffe12b69ce7209cdcb13e679"}, - {file = "cloudcheck-8.7.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:946e409be6b39e7c72becd72cb1ecce65ce5afe1d57bad5692506e6a2001cd0f"}, - {file = "cloudcheck-8.7.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ee24c1f05aa01b21637090852d2fecd5c42163a6f249ca49890dd3ce86a021d9"}, - {file = "cloudcheck-8.7.2-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:56a4ca67ab92b4303fdabd3b186ac14b648d80a3df7e3eaa4e55ed5690cb1b64"}, - {file = "cloudcheck-8.7.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cb7fd24f92d0a080fee83dfd4d81281c3dc2a07b4f459936522fa8616f77d143"}, - {file = "cloudcheck-8.7.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3d754b59900fe79794dabcd15a9ff771bac2df8f3ac4e755a9eed7136872b07"}, - {file = "cloudcheck-8.7.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8d1e6b559a238659542bfc08e5a3570c0f4916d914f9e496d5964c4e81ab2794"}, - {file = "cloudcheck-8.7.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:52e35b5ead4bf50f563ce24a7102b12ad5a9bd6aaf2d26c46d805d9ece024ef0"}, - {file = "cloudcheck-8.7.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5dba8d71b99247eab88db2d21ce6877741c1be372cb608f9eae0d4baff0eb604"}, - {file = "cloudcheck-8.7.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2b42207a0de4e7686f7d94b61ffb02433e4da124ddde7235ee9a9f84a4fffe38"}, - {file = "cloudcheck-8.7.2-cp313-cp313-win_amd64.whl", hash = "sha256:9e7a7a4bdae8b8264894aacd04cff83a3d418caf618e99a2cb0c36456b3a11f2"}, - {file = "cloudcheck-8.7.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35df9c1cade4b519943793258009af8c9db321baeec031537d900df1684ebbf5"}, - {file = "cloudcheck-8.7.2-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04d5ebbb3a665b1d0187e9b08c26865b8a66cf617122f3544be0f66c44d97a6e"}, - {file = "cloudcheck-8.7.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6d302e2c96055adf01b456471467139b9f305cef1c0b34a4d7381bb825aae135"}, - {file = "cloudcheck-8.7.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f82d2eedd762ba9656b957356e1c864d2ac92ed55b7e4820064417fab3d95e7b"}, - {file = "cloudcheck-8.7.2-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:5d5a1cd9e58fd98936ec56ca4fcd3f750fee72b17ffb8dee1679e5e40d3dcade"}, - {file = "cloudcheck-8.7.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:a40ccf33e79983b60b9830b6678d15d32d9faea5487f2dda5555cde61a0742a8"}, - {file = "cloudcheck-8.7.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ac999ba062eaa8d0e9ced19256d1b0a81262bb899161fc7323a462b5dd2513c5"}, - {file = "cloudcheck-8.7.2-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:2ad70470bc39a2681bcf06219139dec69614c60b47ea3cee9b61d0e86c5ddd89"}, - {file = "cloudcheck-8.7.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:b87d9efb760d532769d69a6bf065e803f35e61abb9cd8322d34df10830b71070"}, - {file = "cloudcheck-8.7.2-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02f9a56c39b7b32fa93b9d77f2bc9b472a575aa0bb9d7e9b8afc22efcde25627"}, - {file = "cloudcheck-8.7.2-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e65aaeb5d380a91377b05d8ccb8e3d2baa0900ae76b55623d30e52ce371e96b1"}, - {file = "cloudcheck-8.7.2-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c15ea565e3d59120c19a2ba7403d9d577ad5d9dc31e76f38db63ff4160c69845"}, - {file = "cloudcheck-8.7.2-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c3efeba372bcd9df8741cb41fb40f6817d1ead51ec82d2982c14d97b80d518db"}, - {file = "cloudcheck-8.7.2-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9551e25197d849e71917cc320928d7d68757d606c01d090fee80bdbe400a714"}, - {file = "cloudcheck-8.7.2-cp314-cp314-manylinux_2_38_x86_64.whl", hash = "sha256:12c13f06a54aeb67d4b4ff4e7127d478121890cbe82a1162c9defd7bd1a885c4"}, - {file = "cloudcheck-8.7.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:cf9343d07a84a34bf6634a4f5c5fc8818296b7eb46d650ddc1739b9cfb7083a2"}, - {file = "cloudcheck-8.7.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:e3392da5f36617b83fc7dc9498503194bee8390a755393bab7ea52402af4690f"}, - {file = "cloudcheck-8.7.2-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:d45cf7246ccef85202d4bab708a95216dc98e54f971b63c1b109ee50edac1165"}, - {file = "cloudcheck-8.7.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:53f95d5f503187583fad87ffce34063a61d4bcc8686954cc773dbca15667bdc5"}, - {file = "cloudcheck-8.7.2-cp314-cp314-win32.whl", hash = "sha256:3eba06eedb57ddc2b2e301d3cd7e494c4526ab3da1bb0a0dadf9bf568c2fb4d0"}, - {file = "cloudcheck-8.7.2-cp314-cp314-win_amd64.whl", hash = "sha256:0aac717836a5aeaf112a2a8dc3b35f9b6545f5384f6f213468fe0df35ba05fbb"}, - {file = "cloudcheck-8.7.2-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dee86cb7501013e5c716e5c2de9df25c0d49e9a26dea4b24f6e5d558ec22c475"}, - {file = "cloudcheck-8.7.2-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c01a582be600bf6bc8b2078f9154ea5caad471d4cdb79f040228d156c292b1e9"}, - {file = "cloudcheck-8.7.2-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:119c28eb43033c8742d1e8a38765ef32a3052ca39672af93d969ca0df62b0871"}, - {file = "cloudcheck-8.7.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f6c8775eff15bdbce0e10e688af51a3ead137a11d62caea0bca047f8fab8d69a"}, - {file = "cloudcheck-8.7.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:853155aa2ac3755f265f571fa795823373e67ed06a707e498296c139d25ade61"}, - {file = "cloudcheck-8.7.2-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:201296d6b818c09a39fe5cb5c1b1f83e8e6869ee5de2a314779e809a06439a1a"}, - {file = "cloudcheck-8.7.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:22db503b31ad5a669468185464c65290e0786932d5f97d021bb6ee03e6ae92ea"}, - {file = "cloudcheck-8.7.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:058fdc7909f7a15d30ee7cde5638d244bcd1965d64c089bfab0c4514ea0f4b54"}, - {file = "cloudcheck-8.7.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b4e2602349a62b392b2989f0456580a5c003c5c6fff8c241f8a1e20863bda301"}, - {file = "cloudcheck-8.7.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:702a7a3602a266c37965dbd4227ef578cee8543a158bd8aacebf9aef295e6db4"}, - {file = "cloudcheck-8.7.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:18b1b558bf738e666add1801a259c1bb3f3486783ab742e20312cec69ead09be"}, - {file = "cloudcheck-8.7.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7cf51d14d27902399c7d163fafa9d57f8603a7ee5d33396d19605240c3a39ef8"}, - {file = "cloudcheck-8.7.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f62578a3d7499a967e2792eb082d906d3658304fc0a3910c1d3248651203f926"}, - {file = "cloudcheck-8.7.2-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:d2f29823ab6bf37d8cd89c5fdcca73bcebd71a2ded7612caa9968e0cab00583a"}, - {file = "cloudcheck-8.7.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:c3d7d7ca458b81b643feaeacfd68ad5a6b5c2396d10a82101be461c49bbbde85"}, - {file = "cloudcheck-8.7.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2061abb052231bee431444174ab9e269812fa76f1e3f59d0c83f2837d0b5a48f"}, - {file = "cloudcheck-8.7.2-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa70386c95933e1e057be69ba883c3e012c29c45b587bfae9bd943eec212bc8c"}, - {file = "cloudcheck-8.7.2-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e9d7235a4ee29e3d9cd97d65beed5e4597a911ef3df0928fdfb4f585cc01d969"}, - {file = "cloudcheck-8.7.2-pp311-pypy311_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e6d87aa93a13c95794a6cec5835fe85b8c0ce8114282c3a2a2444043609f009f"}, - {file = "cloudcheck-8.7.2-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8f1a5bcfe83e1e8bd198153461e90042eae8268847cf807d55d1014af548407"}, - {file = "cloudcheck-8.7.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80dd6ce53e9df5f18c4f68a4e2737b885c777efcf7e429aa7cf715d3602b6af9"}, - {file = "cloudcheck-8.7.2-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1bfd5c265dcf76c755bef9480514aa8ae2f4acbf8130f5ffb272586195fa9d85"}, - {file = "cloudcheck-8.7.2-pp311-pypy311_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:ed2af7eea150b3e079588c90a2acc220d123711eec761e7fd10c7dc14965ea9e"}, - {file = "cloudcheck-8.7.2-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:e15628b711e38c96e57087cc8e97dfc0546ba5da8dac81b91616f98fb81dd9ec"}, - {file = "cloudcheck-8.7.2-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:291be061f18b4d04c38a301a6d9744320a615f591e9ca284faac9ca8227b36cd"}, - {file = "cloudcheck-8.7.2.tar.gz", hash = "sha256:dc4598e41919e79abffdab3a2763dc4f01fab06cdf6bae37b2332a85bc16c917"}, + {file = "cloudcheck-9.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f82f553f4a527bf834039738f411fbd7f32d2dacab251ae4191fc5c5b704fbc6"}, + {file = "cloudcheck-9.2.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4e908315efb9553a26ec13524915b5ddca5e883f2bedf52d08087cf9c6d6f756"}, + {file = "cloudcheck-9.2.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:72fba0ee7811b16b9692adfadd5604e28d658f8b9e66772eccefcabab6101a48"}, + {file = "cloudcheck-9.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dcfa8410b6b58af36655bea7f6e377411c462ceabd7d536274d286e01efa4df"}, + {file = "cloudcheck-9.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:909c4645588b1f92e4b23e606102bb61824598641843eb45b8b053936a1d86cd"}, + {file = "cloudcheck-9.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1e8351d57dd63fc510aab4915395d2e43ba534cc51b60ee85e85460ef76a19c5"}, + {file = "cloudcheck-9.2.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:06b804093eca2ed7e8c1ccbfb58f4ca508bc86dcef45a21ab1e63ba3f3a08cc2"}, + {file = "cloudcheck-9.2.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:439fda3bb8e1deb0cc3d73f9d217a8f52a93f22ff4c5969d1ad86e4f1530ab4c"}, + {file = "cloudcheck-9.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:30d5a09186dbc38b634291c319b47857e86b4d4b13124ae691ad4a75aadf2ccf"}, + {file = "cloudcheck-9.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:2796e65a34fa01373cdd278a069df7ad31bbd0d60404c2a39d2ff7d26721e159"}, + {file = "cloudcheck-9.2.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a5da1b55f4ac380e7b0e49d20e9f24455206489a1c9f7d34043f322052ca576d"}, + {file = "cloudcheck-9.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d7b5607314198f9cdf521b112b5a3a89700074334c08fa3793b14454f536f11b"}, + {file = "cloudcheck-9.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:773bb786a7a98c20a68fadd69b81ed27acfeccfcd2cb4a35edc6add505092d39"}, + {file = "cloudcheck-9.2.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:58fc0f7f3771aef5a358eb751b76ca5e4443ca497364593b711b4d86792ceef6"}, + {file = "cloudcheck-9.2.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:217a2a5aaad6376941629c146b3573d9abd1ea6107b3cef3bc294933c243634b"}, + {file = "cloudcheck-9.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f03a79da2ce1741c7748a1d2577b2f515728ae076bf1ac966546a83873027f0"}, + {file = "cloudcheck-9.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98fdf86b0ca01e76c237894f9b77560b9fb6793aa9b4f4b26612d86ccae08a9b"}, + {file = "cloudcheck-9.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e757fe6c7453d95d82980e12780a2f88d33d87dcf3826c0b3f3696fef4145587"}, + {file = "cloudcheck-9.2.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:450aab71bd8396d51688fd68fd31213b106cf406639700ac36c880464ecb4b17"}, + {file = "cloudcheck-9.2.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b9e706a036db2092b76ee76df0c89df8055e5282d091e43de386cce94f112b09"}, + {file = "cloudcheck-9.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4909f9c5a12eca8899991a5f168e9e86658f5743a95af443788ab4564912177d"}, + {file = "cloudcheck-9.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:6763d1aaeb72e4380b9da3159aacac66c0157cbcd333beb539900be711ce7c1d"}, + {file = "cloudcheck-9.2.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:446c093f5632e1513929ee451539f34031f33bbc00ac56a869e0339f0dad84db"}, + {file = "cloudcheck-9.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f40d309b3d9ffacbc6d8c99134cadfa63b1b122c0dcd9d58577851afec8ae767"}, + {file = "cloudcheck-9.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29923a38f54cfdff958d52bbf7f220cf1501ddd9257b26f78074a0d4e0e0d56d"}, + {file = "cloudcheck-9.2.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:577b44f60e4a3290acd095ede0cd714b251c63373d9659c0aeb881f7796bf279"}, + {file = "cloudcheck-9.2.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:85ff289b1c6b8c1d9083aa01a100c33ab65039cf8d87adaf33ed1c715f68e3ee"}, + {file = "cloudcheck-9.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5207e591f1158b5bb21a4d5af1cf74d2f7c6c86f014b4f85cd3899d7a6b52b2f"}, + {file = "cloudcheck-9.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fc6425be8aea470235361f69b8e296110841f934f47ca25747dc7d5f930c3a5"}, + {file = "cloudcheck-9.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d5cfaab5acf8b5167c7060d59645171b47cf26867c327b467a0fe0af6752808d"}, + {file = "cloudcheck-9.2.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:2338e95b961007bbbc09beb83991a66b3599b15c9604765ae42b40621690a11d"}, + {file = "cloudcheck-9.2.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:05bd52a20b2b281532c21b957489eb32118f75d7905d49480dcf8eb41367c849"}, + {file = "cloudcheck-9.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3e30a1fea7e7783487dcb3af661fda89d5e5ae94934074a50204d04edb837d54"}, + {file = "cloudcheck-9.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:b8497de8acccaa475c7848cd487416ea25417d5fd9e1b633bfc4a3ef24457646"}, + {file = "cloudcheck-9.2.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1891f6318e7a4d349d12b60ba3323d2063d83b8cb099e162989bb38edcbd82de"}, + {file = "cloudcheck-9.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:71ce9fdb6aaaa0c53889e0a9350d2ce8832fae1fa2b7fa33a9d74a7e88a077dd"}, + {file = "cloudcheck-9.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00dc50a8872add5a74efde46b4d888ead61fadbaa1b73e3a5b397cc0cd8b5574"}, + {file = "cloudcheck-9.2.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:96e0d85d6e8e8ed01b7dc592c7f6deec247757e3da2fb9e65c20f35b92a89954"}, + {file = "cloudcheck-9.2.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f770f6625914cf53e52ab8cd8fae2c1fe9a7755daae600673c6bf61d2cfaf9dc"}, + {file = "cloudcheck-9.2.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8dc2dffa187e5f2aca067955402dad4ad50b950b39c11a63f30528fb7a2d58d1"}, + {file = "cloudcheck-9.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa48504be5b6aef0707748ceee5d942dbd0602509e1d4f236e3d6b3878e489ea"}, + {file = "cloudcheck-9.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:272cd7e4122221d5e3dcc314635037f660b3113e59cd18426e82d4dd7d9f9217"}, + {file = "cloudcheck-9.2.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:aada539ac4ac68fe67fc2c9ce6482ebc3f8af845d7444c5f9081d74e449083b1"}, + {file = "cloudcheck-9.2.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6a08518b81b6f1df1a0864a8f7d935c25bc7728860cc5e0bf01587be1727b5fb"}, + {file = "cloudcheck-9.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bc6f6633b1ddf529c18117fc843769ea8d1e3926167a19cc3ecf669f47bdad68"}, + {file = "cloudcheck-9.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:bf9bd19c930018d163d59e315a72078ade0f704160fde312c9650857e03c5abe"}, + {file = "cloudcheck-9.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5d630c5848e5a5aa87581090cb5ef0eb97218788c053957dc6b8639b8b0bb69"}, + {file = "cloudcheck-9.2.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fc4e63bde44d8e7b7a597f18472716cf5fe09d6a920e6f8917a1ff92e0004da7"}, + {file = "cloudcheck-9.2.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92708469c621a50cd78b3f4b1b3b0883529f6ece029f5f71a6eda09b08913da6"}, + {file = "cloudcheck-9.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e30ea7db55e0d213ebd48985addb2cfbb6ac311c93da0b2c3fe19278aa95f88b"}, + {file = "cloudcheck-9.2.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:6dcfde62dd7f891203a15f8691a30de7125e7b5eb184d589ec0de4b87d1553a9"}, + {file = "cloudcheck-9.2.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:1525148ff0465438d1053a098b93e234c5102f057f9bc30653d2307d6bcfdeda"}, + {file = "cloudcheck-9.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f49951b74595e6262a252b72334c8a8eddf7ba3dc28c240c2aa3f989d5b1f2a0"}, + {file = "cloudcheck-9.2.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:08a3ae32874cca86b2032f5440715c8aa3d5b2afcb250233c3340f331aead556"}, + {file = "cloudcheck-9.2.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:298d29bf277611fbbb0fa0a93c2f8d22cfbc88c8f24e1c09e20a1e1e5ac50b70"}, + {file = "cloudcheck-9.2.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3796abd1093659f93f200b16a0abb2bb9d14a5207e91e45b2471838ac7ec879"}, + {file = "cloudcheck-9.2.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6b5e64bc3f983eaca02b5e244fcc1b30aa8e795fc9946a27505671d21ded8584"}, + {file = "cloudcheck-9.2.0-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fae264e5a2c4502badaa9f5958fa95b4612b376ab2d9d44114529a01fa556366"}, + {file = "cloudcheck-9.2.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f085d1d411bfda5e511bd12c7a3f0da41adfac810b8636b5619b85bd37f32c01"}, + {file = "cloudcheck-9.2.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce3f4c66e030e740184e0b86094b4e9754cebb8322ca62a5edc4a272a8c4dd43"}, + {file = "cloudcheck-9.2.0-cp314-cp314-manylinux_2_38_x86_64.whl", hash = "sha256:43a608d1b6a46d0819b3efb51472168efc72f5bf1c363f60b55cb92ae79b4c0f"}, + {file = "cloudcheck-9.2.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1476a9dc6d90487a2293d8aa736903e848ddfb93c766ae4f4da14a08f34f3c34"}, + {file = "cloudcheck-9.2.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:bb18fa35b969d0018c0ce5df49d276c9cd9f0556271418af8b6dd420b60ee16d"}, + {file = "cloudcheck-9.2.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:bfb6ecf5041ad02f2baecd39ddd4120a066ee2148e01b3eae0ef952d75d13057"}, + {file = "cloudcheck-9.2.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:07ff5480d8d341de44f22e551a7516a337b6b8c8348f88ce297bb96b13e32656"}, + {file = "cloudcheck-9.2.0-cp314-cp314-win32.whl", hash = "sha256:b1e80de04b79a8d93cc0de9b308817efbaad1c99fffc63224c4bd45649336880"}, + {file = "cloudcheck-9.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:20b0d2ee66a243f35f1dd12f644ca6100309282d99ec3048857a5663ba61bb2f"}, + {file = "cloudcheck-9.2.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96094524e590135315ae7e39b540cde1592b0769a6701074c3ca0d630c00e6e5"}, + {file = "cloudcheck-9.2.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:76d1f577d256ddd4dae2c9478d5248ea465f56aad0474c86b9ed737967474aff"}, + {file = "cloudcheck-9.2.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b51d96d03e1b9b62d293a5d23fccee8c5afaffe0017c67bc01d42f184f6ad79d"}, + {file = "cloudcheck-9.2.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9002e07ee923d943c243ab57263fb70c32bd53ae81c00c75ef2a7f6cbcec50c4"}, + {file = "cloudcheck-9.2.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:e6cdc0b9349ed05ba3dd4abeb4f1746c01674eeffd3a9949d9413d56a082c59a"}, + {file = "cloudcheck-9.2.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:8a20d4db17d2dfba703866b43fbd19fe9901229982472064af06d9c374362aad"}, + {file = "cloudcheck-9.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:19ed428b82367f501699479857c748fac083f8dcbe4708bc9507c16eb7081aab"}, + {file = "cloudcheck-9.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef100062c8e9cebca93bb19632a91c6972fe92a09cd5fe8ffcdda05fe3ecb4e3"}, + {file = "cloudcheck-9.2.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e75971eea64b2cc178279be12a08424178a0a902c9f410c638a8ec6d6831dbe3"}, + {file = "cloudcheck-9.2.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:511e4679385729a53b0aa48af8fbfb9bd7e03dd7a49e4630e1235584df302a92"}, + {file = "cloudcheck-9.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b5ed98d17cc35f0acb9ad29b535117b36b8a90c05aa3a759e0299b5f2c94d136"}, + {file = "cloudcheck-9.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7741addc9d07b7a51936be2074f8ac169b6dc270a93bafb4d45f752ae8c8a04"}, + {file = "cloudcheck-9.2.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c8401630c89227624ed8e8f154806a735957f2eeae99711f2b28cdffc7bfd2ce"}, + {file = "cloudcheck-9.2.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:011465559226b8306c484a5c9df7a782f3f1def84b176d7ed2189c7b9496d701"}, + {file = "cloudcheck-9.2.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:27cd2c1bd2feac0077d467fef4b661d56cd99a2d5d2b0c7888c63ce91f013c41"}, + {file = "cloudcheck-9.2.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:dbb7895f716c3ed079aa9a1cb28603ce01e39a1a0f7cca31fc1c841a404f4628"}, + {file = "cloudcheck-9.2.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecf8be754284074b48ead613908e2f9a4dac3dad32b8a8fc3ff5e8f530469bc6"}, + {file = "cloudcheck-9.2.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f2d50892daae3b7ad564e8d9f9d4070089b6ebfd4fcd1dc1e94c04248a16ccd3"}, + {file = "cloudcheck-9.2.0-pp311-pypy311_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e780df63753c621faf376dee513eaf8933c6a18507b8d7b8770a34b2059ede6"}, + {file = "cloudcheck-9.2.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71c5df0d0ba2305ccbc2fe892866b456a0d44cc746fbb0f0c7d38655c8d77042"}, + {file = "cloudcheck-9.2.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b70749be44991870d5355a06f629028d133efc64442557e6bd0349565bd9598"}, + {file = "cloudcheck-9.2.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:4927bc71562c9666e671932e32c0f1f97533b62c2828bfe3e1956291d1033217"}, + {file = "cloudcheck-9.2.0-pp311-pypy311_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:98d3bdec378073ceba3e4a3ef082084420102b9d6910e6d9423585246dbe0a8a"}, + {file = "cloudcheck-9.2.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:b054de2006d8281d2e2382aa9b5fbf7006a541dddf810e44bdf89afd8c5299a5"}, + {file = "cloudcheck-9.2.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:5e4647210fa8fec02b45ea302f067ff1d6dc27555d1a2d0978b7c1df6ce2fd55"}, + {file = "cloudcheck-9.2.0.tar.gz", hash = "sha256:961bfc102f2944a1f83fd61d3faab96fc8be47e4919089bd5ccad7a47a2738bb"}, ] [[package]] @@ -1983,7 +1983,7 @@ description = "C parser in Python" optional = false python-versions = ">=3.8" groups = ["main"] -markers = "implementation_name == \"pypy\" or platform_python_implementation != \"PyPy\"" +markers = "platform_python_implementation != \"PyPy\" or implementation_name == \"pypy\"" files = [ {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, @@ -2667,127 +2667,143 @@ files = [ [[package]] name = "regex" -version = "2025.11.3" +version = "2026.1.15" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "regex-2025.11.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2b441a4ae2c8049106e8b39973bfbddfb25a179dda2bdb99b0eeb60c40a6a3af"}, - {file = "regex-2025.11.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2fa2eed3f76677777345d2f81ee89f5de2f5745910e805f7af7386a920fa7313"}, - {file = "regex-2025.11.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d8b4a27eebd684319bdf473d39f1d79eed36bf2cd34bd4465cdb4618d82b3d56"}, - {file = "regex-2025.11.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5cf77eac15bd264986c4a2c63353212c095b40f3affb2bc6b4ef80c4776c1a28"}, - {file = "regex-2025.11.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b7f9ee819f94c6abfa56ec7b1dbab586f41ebbdc0a57e6524bd5e7f487a878c7"}, - {file = "regex-2025.11.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:838441333bc90b829406d4a03cb4b8bf7656231b84358628b0406d803931ef32"}, - {file = "regex-2025.11.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cfe6d3f0c9e3b7e8c0c694b24d25e677776f5ca26dce46fd6b0489f9c8339391"}, - {file = "regex-2025.11.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2ab815eb8a96379a27c3b6157fcb127c8f59c36f043c1678110cea492868f1d5"}, - {file = "regex-2025.11.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:728a9d2d173a65b62bdc380b7932dd8e74ed4295279a8fe1021204ce210803e7"}, - {file = "regex-2025.11.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:509dc827f89c15c66a0c216331260d777dd6c81e9a4e4f830e662b0bb296c313"}, - {file = "regex-2025.11.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:849202cd789e5f3cf5dcc7822c34b502181b4824a65ff20ce82da5524e45e8e9"}, - {file = "regex-2025.11.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b6f78f98741dcc89607c16b1e9426ee46ce4bf31ac5e6b0d40e81c89f3481ea5"}, - {file = "regex-2025.11.3-cp310-cp310-win32.whl", hash = "sha256:149eb0bba95231fb4f6d37c8f760ec9fa6fabf65bab555e128dde5f2475193ec"}, - {file = "regex-2025.11.3-cp310-cp310-win_amd64.whl", hash = "sha256:ee3a83ce492074c35a74cc76cf8235d49e77b757193a5365ff86e3f2f93db9fd"}, - {file = "regex-2025.11.3-cp310-cp310-win_arm64.whl", hash = "sha256:38af559ad934a7b35147716655d4a2f79fcef2d695ddfe06a06ba40ae631fa7e"}, - {file = "regex-2025.11.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:eadade04221641516fa25139273505a1c19f9bf97589a05bc4cfcd8b4a618031"}, - {file = "regex-2025.11.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:feff9e54ec0dd3833d659257f5c3f5322a12eee58ffa360984b716f8b92983f4"}, - {file = "regex-2025.11.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3b30bc921d50365775c09a7ed446359e5c0179e9e2512beec4a60cbcef6ddd50"}, - {file = "regex-2025.11.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f99be08cfead2020c7ca6e396c13543baea32343b7a9a5780c462e323bd8872f"}, - {file = "regex-2025.11.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6dd329a1b61c0ee95ba95385fb0c07ea0d3fe1a21e1349fa2bec272636217118"}, - {file = "regex-2025.11.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4c5238d32f3c5269d9e87be0cf096437b7622b6920f5eac4fd202468aaeb34d2"}, - {file = "regex-2025.11.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:10483eefbfb0adb18ee9474498c9a32fcf4e594fbca0543bb94c48bac6183e2e"}, - {file = "regex-2025.11.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:78c2d02bb6e1da0720eedc0bad578049cad3f71050ef8cd065ecc87691bed2b0"}, - {file = "regex-2025.11.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e6b49cd2aad93a1790ce9cffb18964f6d3a4b0b3dbdbd5de094b65296fce6e58"}, - {file = "regex-2025.11.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:885b26aa3ee56433b630502dc3d36ba78d186a00cc535d3806e6bfd9ed3c70ab"}, - {file = "regex-2025.11.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ddd76a9f58e6a00f8772e72cff8ebcff78e022be95edf018766707c730593e1e"}, - {file = "regex-2025.11.3-cp311-cp311-win32.whl", hash = "sha256:3e816cc9aac1cd3cc9a4ec4d860f06d40f994b5c7b4d03b93345f44e08cc68bf"}, - {file = "regex-2025.11.3-cp311-cp311-win_amd64.whl", hash = "sha256:087511f5c8b7dfbe3a03f5d5ad0c2a33861b1fc387f21f6f60825a44865a385a"}, - {file = "regex-2025.11.3-cp311-cp311-win_arm64.whl", hash = "sha256:1ff0d190c7f68ae7769cd0313fe45820ba07ffebfddfaa89cc1eb70827ba0ddc"}, - {file = "regex-2025.11.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bc8ab71e2e31b16e40868a40a69007bc305e1109bd4658eb6cad007e0bf67c41"}, - {file = "regex-2025.11.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:22b29dda7e1f7062a52359fca6e58e548e28c6686f205e780b02ad8ef710de36"}, - {file = "regex-2025.11.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3a91e4a29938bc1a082cc28fdea44be420bf2bebe2665343029723892eb073e1"}, - {file = "regex-2025.11.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:08b884f4226602ad40c5d55f52bf91a9df30f513864e0054bad40c0e9cf1afb7"}, - {file = "regex-2025.11.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3e0b11b2b2433d1c39c7c7a30e3f3d0aeeea44c2a8d0bae28f6b95f639927a69"}, - {file = "regex-2025.11.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:87eb52a81ef58c7ba4d45c3ca74e12aa4b4e77816f72ca25258a85b3ea96cb48"}, - {file = "regex-2025.11.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a12ab1f5c29b4e93db518f5e3872116b7e9b1646c9f9f426f777b50d44a09e8c"}, - {file = "regex-2025.11.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7521684c8c7c4f6e88e35ec89680ee1aa8358d3f09d27dfbdf62c446f5d4c695"}, - {file = "regex-2025.11.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7fe6e5440584e94cc4b3f5f4d98a25e29ca12dccf8873679a635638349831b98"}, - {file = "regex-2025.11.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:8e026094aa12b43f4fd74576714e987803a315c76edb6b098b9809db5de58f74"}, - {file = "regex-2025.11.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:435bbad13e57eb5606a68443af62bed3556de2f46deb9f7d4237bc2f1c9fb3a0"}, - {file = "regex-2025.11.3-cp312-cp312-win32.whl", hash = "sha256:3839967cf4dc4b985e1570fd8d91078f0c519f30491c60f9ac42a8db039be204"}, - {file = "regex-2025.11.3-cp312-cp312-win_amd64.whl", hash = "sha256:e721d1b46e25c481dc5ded6f4b3f66c897c58d2e8cfdf77bbced84339108b0b9"}, - {file = "regex-2025.11.3-cp312-cp312-win_arm64.whl", hash = "sha256:64350685ff08b1d3a6fff33f45a9ca183dc1d58bbfe4981604e70ec9801bbc26"}, - {file = "regex-2025.11.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c1e448051717a334891f2b9a620fe36776ebf3dd8ec46a0b877c8ae69575feb4"}, - {file = "regex-2025.11.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9b5aca4d5dfd7fbfbfbdaf44850fcc7709a01146a797536a8f84952e940cca76"}, - {file = "regex-2025.11.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:04d2765516395cf7dda331a244a3282c0f5ae96075f728629287dfa6f76ba70a"}, - {file = "regex-2025.11.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d9903ca42bfeec4cebedba8022a7c97ad2aab22e09573ce9976ba01b65e4361"}, - {file = "regex-2025.11.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:639431bdc89d6429f6721625e8129413980ccd62e9d3f496be618a41d205f160"}, - {file = "regex-2025.11.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f117efad42068f9715677c8523ed2be1518116d1c49b1dd17987716695181efe"}, - {file = "regex-2025.11.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4aecb6f461316adf9f1f0f6a4a1a3d79e045f9b71ec76055a791affa3b285850"}, - {file = "regex-2025.11.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3b3a5f320136873cc5561098dfab677eea139521cb9a9e8db98b7e64aef44cbc"}, - {file = "regex-2025.11.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:75fa6f0056e7efb1f42a1c34e58be24072cb9e61a601340cc1196ae92326a4f9"}, - {file = "regex-2025.11.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:dbe6095001465294f13f1adcd3311e50dd84e5a71525f20a10bd16689c61ce0b"}, - {file = "regex-2025.11.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:454d9b4ae7881afbc25015b8627c16d88a597479b9dea82b8c6e7e2e07240dc7"}, - {file = "regex-2025.11.3-cp313-cp313-win32.whl", hash = "sha256:28ba4d69171fc6e9896337d4fc63a43660002b7da53fc15ac992abcf3410917c"}, - {file = "regex-2025.11.3-cp313-cp313-win_amd64.whl", hash = "sha256:bac4200befe50c670c405dc33af26dad5a3b6b255dd6c000d92fe4629f9ed6a5"}, - {file = "regex-2025.11.3-cp313-cp313-win_arm64.whl", hash = "sha256:2292cd5a90dab247f9abe892ac584cb24f0f54680c73fcb4a7493c66c2bf2467"}, - {file = "regex-2025.11.3-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:1eb1ebf6822b756c723e09f5186473d93236c06c579d2cc0671a722d2ab14281"}, - {file = "regex-2025.11.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:1e00ec2970aab10dc5db34af535f21fcf32b4a31d99e34963419636e2f85ae39"}, - {file = "regex-2025.11.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a4cb042b615245d5ff9b3794f56be4138b5adc35a4166014d31d1814744148c7"}, - {file = "regex-2025.11.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:44f264d4bf02f3176467d90b294d59bf1db9fe53c141ff772f27a8b456b2a9ed"}, - {file = "regex-2025.11.3-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7be0277469bf3bd7a34a9c57c1b6a724532a0d235cd0dc4e7f4316f982c28b19"}, - {file = "regex-2025.11.3-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0d31e08426ff4b5b650f68839f5af51a92a5b51abd8554a60c2fbc7c71f25d0b"}, - {file = "regex-2025.11.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e43586ce5bd28f9f285a6e729466841368c4a0353f6fd08d4ce4630843d3648a"}, - {file = "regex-2025.11.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:0f9397d561a4c16829d4e6ff75202c1c08b68a3bdbfe29dbfcdb31c9830907c6"}, - {file = "regex-2025.11.3-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:dd16e78eb18ffdb25ee33a0682d17912e8cc8a770e885aeee95020046128f1ce"}, - {file = "regex-2025.11.3-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:ffcca5b9efe948ba0661e9df0fa50d2bc4b097c70b9810212d6b62f05d83b2dd"}, - {file = "regex-2025.11.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c56b4d162ca2b43318ac671c65bd4d563e841a694ac70e1a976ac38fcf4ca1d2"}, - {file = "regex-2025.11.3-cp313-cp313t-win32.whl", hash = "sha256:9ddc42e68114e161e51e272f667d640f97e84a2b9ef14b7477c53aac20c2d59a"}, - {file = "regex-2025.11.3-cp313-cp313t-win_amd64.whl", hash = "sha256:7a7c7fdf755032ffdd72c77e3d8096bdcb0eb92e89e17571a196f03d88b11b3c"}, - {file = "regex-2025.11.3-cp313-cp313t-win_arm64.whl", hash = "sha256:df9eb838c44f570283712e7cff14c16329a9f0fb19ca492d21d4b7528ee6821e"}, - {file = "regex-2025.11.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:9697a52e57576c83139d7c6f213d64485d3df5bf84807c35fa409e6c970801c6"}, - {file = "regex-2025.11.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e18bc3f73bd41243c9b38a6d9f2366cd0e0137a9aebe2d8ff76c5b67d4c0a3f4"}, - {file = "regex-2025.11.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:61a08bcb0ec14ff4e0ed2044aad948d0659604f824cbd50b55e30b0ec6f09c73"}, - {file = "regex-2025.11.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c9c30003b9347c24bcc210958c5d167b9e4f9be786cb380a7d32f14f9b84674f"}, - {file = "regex-2025.11.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4e1e592789704459900728d88d41a46fe3969b82ab62945560a31732ffc19a6d"}, - {file = "regex-2025.11.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6538241f45eb5a25aa575dbba1069ad786f68a4f2773a29a2bd3dd1f9de787be"}, - {file = "regex-2025.11.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bce22519c989bb72a7e6b36a199384c53db7722fe669ba891da75907fe3587db"}, - {file = "regex-2025.11.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:66d559b21d3640203ab9075797a55165d79017520685fb407b9234d72ab63c62"}, - {file = "regex-2025.11.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:669dcfb2e38f9e8c69507bace46f4889e3abbfd9b0c29719202883c0a603598f"}, - {file = "regex-2025.11.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:32f74f35ff0f25a5021373ac61442edcb150731fbaa28286bbc8bb1582c89d02"}, - {file = "regex-2025.11.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e6c7a21dffba883234baefe91bc3388e629779582038f75d2a5be918e250f0ed"}, - {file = "regex-2025.11.3-cp314-cp314-win32.whl", hash = "sha256:795ea137b1d809eb6836b43748b12634291c0ed55ad50a7d72d21edf1cd565c4"}, - {file = "regex-2025.11.3-cp314-cp314-win_amd64.whl", hash = "sha256:9f95fbaa0ee1610ec0fc6b26668e9917a582ba80c52cc6d9ada15e30aa9ab9ad"}, - {file = "regex-2025.11.3-cp314-cp314-win_arm64.whl", hash = "sha256:dfec44d532be4c07088c3de2876130ff0fbeeacaa89a137decbbb5f665855a0f"}, - {file = "regex-2025.11.3-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:ba0d8a5d7f04f73ee7d01d974d47c5834f8a1b0224390e4fe7c12a3a92a78ecc"}, - {file = "regex-2025.11.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:442d86cf1cfe4faabf97db7d901ef58347efd004934da045c745e7b5bd57ac49"}, - {file = "regex-2025.11.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:fd0a5e563c756de210bb964789b5abe4f114dacae9104a47e1a649b910361536"}, - {file = "regex-2025.11.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf3490bcbb985a1ae97b2ce9ad1c0f06a852d5b19dde9b07bdf25bf224248c95"}, - {file = "regex-2025.11.3-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3809988f0a8b8c9dcc0f92478d6501fac7200b9ec56aecf0ec21f4a2ec4b6009"}, - {file = "regex-2025.11.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f4ff94e58e84aedb9c9fce66d4ef9f27a190285b451420f297c9a09f2b9abee9"}, - {file = "regex-2025.11.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7eb542fd347ce61e1321b0a6b945d5701528dca0cd9759c2e3bb8bd57e47964d"}, - {file = "regex-2025.11.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d6c2d5919075a1f2e413c00b056ea0c2f065b3f5fe83c3d07d325ab92dce51d6"}, - {file = "regex-2025.11.3-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:3f8bf11a4827cc7ce5a53d4ef6cddd5ad25595d3c1435ef08f76825851343154"}, - {file = "regex-2025.11.3-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:22c12d837298651e5550ac1d964e4ff57c3f56965fc1812c90c9fb2028eaf267"}, - {file = "regex-2025.11.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:62ba394a3dda9ad41c7c780f60f6e4a70988741415ae96f6d1bf6c239cf01379"}, - {file = "regex-2025.11.3-cp314-cp314t-win32.whl", hash = "sha256:4bf146dca15cdd53224a1bf46d628bd7590e4a07fbb69e720d561aea43a32b38"}, - {file = "regex-2025.11.3-cp314-cp314t-win_amd64.whl", hash = "sha256:adad1a1bcf1c9e76346e091d22d23ac54ef28e1365117d99521631078dfec9de"}, - {file = "regex-2025.11.3-cp314-cp314t-win_arm64.whl", hash = "sha256:c54f768482cef41e219720013cd05933b6f971d9562544d691c68699bf2b6801"}, - {file = "regex-2025.11.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:81519e25707fc076978c6143b81ea3dc853f176895af05bf7ec51effe818aeec"}, - {file = "regex-2025.11.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3bf28b1873a8af8bbb58c26cc56ea6e534d80053b41fb511a35795b6de507e6a"}, - {file = "regex-2025.11.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:856a25c73b697f2ce2a24e7968285579e62577a048526161a2c0f53090bea9f9"}, - {file = "regex-2025.11.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a3d571bd95fade53c86c0517f859477ff3a93c3fde10c9e669086f038e0f207"}, - {file = "regex-2025.11.3-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:732aea6de26051af97b94bc98ed86448821f839d058e5d259c72bf6d73ad0fc0"}, - {file = "regex-2025.11.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:51c1c1847128238f54930edb8805b660305dca164645a9fd29243f5610beea34"}, - {file = "regex-2025.11.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22dd622a402aad4558277305350699b2be14bc59f64d64ae1d928ce7d072dced"}, - {file = "regex-2025.11.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f3b5a391c7597ffa96b41bd5cbd2ed0305f515fcbb367dfa72735679d5502364"}, - {file = "regex-2025.11.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:cc4076a5b4f36d849fd709284b4a3b112326652f3b0466f04002a6c15a0c96c1"}, - {file = "regex-2025.11.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:a295ca2bba5c1c885826ce3125fa0b9f702a1be547d821c01d65f199e10c01e2"}, - {file = "regex-2025.11.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:b4774ff32f18e0504bfc4e59a3e71e18d83bc1e171a3c8ed75013958a03b2f14"}, - {file = "regex-2025.11.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:22e7d1cdfa88ef33a2ae6aa0d707f9255eb286ffbd90045f1088246833223aee"}, - {file = "regex-2025.11.3-cp39-cp39-win32.whl", hash = "sha256:74d04244852ff73b32eeede4f76f51c5bcf44bc3c207bc3e6cf1c5c45b890708"}, - {file = "regex-2025.11.3-cp39-cp39-win_amd64.whl", hash = "sha256:7a50cd39f73faa34ec18d6720ee25ef10c4c1839514186fcda658a06c06057a2"}, - {file = "regex-2025.11.3-cp39-cp39-win_arm64.whl", hash = "sha256:43b4fb020e779ca81c1b5255015fe2b82816c76ec982354534ad9ec09ad7c9e3"}, - {file = "regex-2025.11.3.tar.gz", hash = "sha256:1fedc720f9bb2494ce31a58a1631f9c82df6a09b49c19517ea5cc280b4541e01"}, + {file = "regex-2026.1.15-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4e3dd93c8f9abe8aa4b6c652016da9a3afa190df5ad822907efe6b206c09896e"}, + {file = "regex-2026.1.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:97499ff7862e868b1977107873dd1a06e151467129159a6ffd07b66706ba3a9f"}, + {file = "regex-2026.1.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0bda75ebcac38d884240914c6c43d8ab5fb82e74cde6da94b43b17c411aa4c2b"}, + {file = "regex-2026.1.15-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7dcc02368585334f5bc81fc73a2a6a0bbade60e7d83da21cead622faf408f32c"}, + {file = "regex-2026.1.15-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:693b465171707bbe882a7a05de5e866f33c76aa449750bee94a8d90463533cc9"}, + {file = "regex-2026.1.15-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b0d190e6f013ea938623a58706d1469a62103fb2a241ce2873a9906e0386582c"}, + {file = "regex-2026.1.15-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5ff818702440a5878a81886f127b80127f5d50563753a28211482867f8318106"}, + {file = "regex-2026.1.15-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f052d1be37ef35a54e394de66136e30fa1191fab64f71fc06ac7bc98c9a84618"}, + {file = "regex-2026.1.15-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6bfc31a37fd1592f0c4fc4bfc674b5c42e52efe45b4b7a6a14f334cca4bcebe4"}, + {file = "regex-2026.1.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3d6ce5ae80066b319ae3bc62fd55a557c9491baa5efd0d355f0de08c4ba54e79"}, + {file = "regex-2026.1.15-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:1704d204bd42b6bb80167df0e4554f35c255b579ba99616def38f69e14a5ccb9"}, + {file = "regex-2026.1.15-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:e3174a5ed4171570dc8318afada56373aa9289eb6dc0d96cceb48e7358b0e220"}, + {file = "regex-2026.1.15-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:87adf5bd6d72e3e17c9cb59ac4096b1faaf84b7eb3037a5ffa61c4b4370f0f13"}, + {file = "regex-2026.1.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e85dc94595f4d766bd7d872a9de5ede1ca8d3063f3bdf1e2c725f5eb411159e3"}, + {file = "regex-2026.1.15-cp310-cp310-win32.whl", hash = "sha256:21ca32c28c30d5d65fc9886ff576fc9b59bbca08933e844fa2363e530f4c8218"}, + {file = "regex-2026.1.15-cp310-cp310-win_amd64.whl", hash = "sha256:3038a62fc7d6e5547b8915a3d927a0fbeef84cdbe0b1deb8c99bbd4a8961b52a"}, + {file = "regex-2026.1.15-cp310-cp310-win_arm64.whl", hash = "sha256:505831646c945e3e63552cc1b1b9b514f0e93232972a2d5bedbcc32f15bc82e3"}, + {file = "regex-2026.1.15-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1ae6020fb311f68d753b7efa9d4b9a5d47a5d6466ea0d5e3b5a471a960ea6e4a"}, + {file = "regex-2026.1.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:eddf73f41225942c1f994914742afa53dc0d01a6e20fe14b878a1b1edc74151f"}, + {file = "regex-2026.1.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e8cd52557603f5c66a548f69421310886b28b7066853089e1a71ee710e1cdc1"}, + {file = "regex-2026.1.15-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5170907244b14303edc5978f522f16c974f32d3aa92109fabc2af52411c9433b"}, + {file = "regex-2026.1.15-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2748c1ec0663580b4510bd89941a31560b4b439a0b428b49472a3d9944d11cd8"}, + {file = "regex-2026.1.15-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2f2775843ca49360508d080eaa87f94fa248e2c946bbcd963bb3aae14f333413"}, + {file = "regex-2026.1.15-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9ea2604370efc9a174c1b5dcc81784fb040044232150f7f33756049edfc9026"}, + {file = "regex-2026.1.15-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0dcd31594264029b57bf16f37fd7248a70b3b764ed9e0839a8f271b2d22c0785"}, + {file = "regex-2026.1.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c08c1f3e34338256732bd6938747daa3c0d5b251e04b6e43b5813e94d503076e"}, + {file = "regex-2026.1.15-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e43a55f378df1e7a4fa3547c88d9a5a9b7113f653a66821bcea4718fe6c58763"}, + {file = "regex-2026.1.15-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:f82110ab962a541737bd0ce87978d4c658f06e7591ba899192e2712a517badbb"}, + {file = "regex-2026.1.15-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:27618391db7bdaf87ac6c92b31e8f0dfb83a9de0075855152b720140bda177a2"}, + {file = "regex-2026.1.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bfb0d6be01fbae8d6655c8ca21b3b72458606c4aec9bbc932db758d47aba6db1"}, + {file = "regex-2026.1.15-cp311-cp311-win32.whl", hash = "sha256:b10e42a6de0e32559a92f2f8dc908478cc0fa02838d7dbe764c44dca3fa13569"}, + {file = "regex-2026.1.15-cp311-cp311-win_amd64.whl", hash = "sha256:e9bf3f0bbdb56633c07d7116ae60a576f846efdd86a8848f8d62b749e1209ca7"}, + {file = "regex-2026.1.15-cp311-cp311-win_arm64.whl", hash = "sha256:41aef6f953283291c4e4e6850607bd71502be67779586a61472beacb315c97ec"}, + {file = "regex-2026.1.15-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:4c8fcc5793dde01641a35905d6731ee1548f02b956815f8f1cab89e515a5bdf1"}, + {file = "regex-2026.1.15-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bfd876041a956e6a90ad7cdb3f6a630c07d491280bfeed4544053cd434901681"}, + {file = "regex-2026.1.15-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9250d087bc92b7d4899ccd5539a1b2334e44eee85d848c4c1aef8e221d3f8c8f"}, + {file = "regex-2026.1.15-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c8a154cf6537ebbc110e24dabe53095e714245c272da9c1be05734bdad4a61aa"}, + {file = "regex-2026.1.15-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8050ba2e3ea1d8731a549e83c18d2f0999fbc99a5f6bd06b4c91449f55291804"}, + {file = "regex-2026.1.15-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0bf065240704cb8951cc04972cf107063917022511273e0969bdb34fc173456c"}, + {file = "regex-2026.1.15-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c32bef3e7aeee75746748643667668ef941d28b003bfc89994ecf09a10f7a1b5"}, + {file = "regex-2026.1.15-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d5eaa4a4c5b1906bd0d2508d68927f15b81821f85092e06f1a34a4254b0e1af3"}, + {file = "regex-2026.1.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:86c1077a3cc60d453d4084d5b9649065f3bf1184e22992bd322e1f081d3117fb"}, + {file = "regex-2026.1.15-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:2b091aefc05c78d286657cd4db95f2e6313375ff65dcf085e42e4c04d9c8d410"}, + {file = "regex-2026.1.15-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:57e7d17f59f9ebfa9667e6e5a1c0127b96b87cb9cede8335482451ed00788ba4"}, + {file = "regex-2026.1.15-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:c6c4dcdfff2c08509faa15d36ba7e5ef5fcfab25f1e8f85a0c8f45bc3a30725d"}, + {file = "regex-2026.1.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cf8ff04c642716a7f2048713ddc6278c5fd41faa3b9cab12607c7abecd012c22"}, + {file = "regex-2026.1.15-cp312-cp312-win32.whl", hash = "sha256:82345326b1d8d56afbe41d881fdf62f1926d7264b2fc1537f99ae5da9aad7913"}, + {file = "regex-2026.1.15-cp312-cp312-win_amd64.whl", hash = "sha256:4def140aa6156bc64ee9912383d4038f3fdd18fee03a6f222abd4de6357ce42a"}, + {file = "regex-2026.1.15-cp312-cp312-win_arm64.whl", hash = "sha256:c6c565d9a6e1a8d783c1948937ffc377dd5771e83bd56de8317c450a954d2056"}, + {file = "regex-2026.1.15-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e69d0deeb977ffe7ed3d2e4439360089f9c3f217ada608f0f88ebd67afb6385e"}, + {file = "regex-2026.1.15-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3601ffb5375de85a16f407854d11cca8fe3f5febbe3ac78fb2866bb220c74d10"}, + {file = "regex-2026.1.15-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4c5ef43b5c2d4114eb8ea424bb8c9cec01d5d17f242af88b2448f5ee81caadbc"}, + {file = "regex-2026.1.15-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:968c14d4f03e10b2fd960f1d5168c1f0ac969381d3c1fcc973bc45fb06346599"}, + {file = "regex-2026.1.15-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:56a5595d0f892f214609c9f76b41b7428bed439d98dc961efafdd1354d42baae"}, + {file = "regex-2026.1.15-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0bf650f26087363434c4e560011f8e4e738f6f3e029b85d4904c50135b86cfa5"}, + {file = "regex-2026.1.15-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18388a62989c72ac24de75f1449d0fb0b04dfccd0a1a7c1c43af5eb503d890f6"}, + {file = "regex-2026.1.15-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6d220a2517f5893f55daac983bfa9fe998a7dbcaee4f5d27a88500f8b7873788"}, + {file = "regex-2026.1.15-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c9c08c2fbc6120e70abff5d7f28ffb4d969e14294fb2143b4b5c7d20e46d1714"}, + {file = "regex-2026.1.15-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7ef7d5d4bd49ec7364315167a4134a015f61e8266c6d446fc116a9ac4456e10d"}, + {file = "regex-2026.1.15-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:6e42844ad64194fa08d5ccb75fe6a459b9b08e6d7296bd704460168d58a388f3"}, + {file = "regex-2026.1.15-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:cfecdaa4b19f9ca534746eb3b55a5195d5c95b88cac32a205e981ec0a22b7d31"}, + {file = "regex-2026.1.15-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:08df9722d9b87834a3d701f3fca570b2be115654dbfd30179f30ab2f39d606d3"}, + {file = "regex-2026.1.15-cp313-cp313-win32.whl", hash = "sha256:d426616dae0967ca225ab12c22274eb816558f2f99ccb4a1d52ca92e8baf180f"}, + {file = "regex-2026.1.15-cp313-cp313-win_amd64.whl", hash = "sha256:febd38857b09867d3ed3f4f1af7d241c5c50362e25ef43034995b77a50df494e"}, + {file = "regex-2026.1.15-cp313-cp313-win_arm64.whl", hash = "sha256:8e32f7896f83774f91499d239e24cebfadbc07639c1494bb7213983842348337"}, + {file = "regex-2026.1.15-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:ec94c04149b6a7b8120f9f44565722c7ae31b7a6d2275569d2eefa76b83da3be"}, + {file = "regex-2026.1.15-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:40c86d8046915bb9aeb15d3f3f15b6fd500b8ea4485b30e1bbc799dab3fe29f8"}, + {file = "regex-2026.1.15-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:726ea4e727aba21643205edad8f2187ec682d3305d790f73b7a51c7587b64bdd"}, + {file = "regex-2026.1.15-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1cb740d044aff31898804e7bf1181cc72c03d11dfd19932b9911ffc19a79070a"}, + {file = "regex-2026.1.15-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:05d75a668e9ea16f832390d22131fe1e8acc8389a694c8febc3e340b0f810b93"}, + {file = "regex-2026.1.15-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d991483606f3dbec93287b9f35596f41aa2e92b7c2ebbb935b63f409e243c9af"}, + {file = "regex-2026.1.15-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:194312a14819d3e44628a44ed6fea6898fdbecb0550089d84c403475138d0a09"}, + {file = "regex-2026.1.15-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fe2fda4110a3d0bc163c2e0664be44657431440722c5c5315c65155cab92f9e5"}, + {file = "regex-2026.1.15-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:124dc36c85d34ef2d9164da41a53c1c8c122cfb1f6e1ec377a1f27ee81deb794"}, + {file = "regex-2026.1.15-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:a1774cd1981cd212506a23a14dba7fdeaee259f5deba2df6229966d9911e767a"}, + {file = "regex-2026.1.15-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:b5f7d8d2867152cdb625e72a530d2ccb48a3d199159144cbdd63870882fb6f80"}, + {file = "regex-2026.1.15-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:492534a0ab925d1db998defc3c302dae3616a2fc3fe2e08db1472348f096ddf2"}, + {file = "regex-2026.1.15-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c661fc820cfb33e166bf2450d3dadbda47c8d8981898adb9b6fe24e5e582ba60"}, + {file = "regex-2026.1.15-cp313-cp313t-win32.whl", hash = "sha256:99ad739c3686085e614bf77a508e26954ff1b8f14da0e3765ff7abbf7799f952"}, + {file = "regex-2026.1.15-cp313-cp313t-win_amd64.whl", hash = "sha256:32655d17905e7ff8ba5c764c43cb124e34a9245e45b83c22e81041e1071aee10"}, + {file = "regex-2026.1.15-cp313-cp313t-win_arm64.whl", hash = "sha256:b2a13dd6a95e95a489ca242319d18fc02e07ceb28fa9ad146385194d95b3c829"}, + {file = "regex-2026.1.15-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:d920392a6b1f353f4aa54328c867fec3320fa50657e25f64abf17af054fc97ac"}, + {file = "regex-2026.1.15-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b5a28980a926fa810dbbed059547b02783952e2efd9c636412345232ddb87ff6"}, + {file = "regex-2026.1.15-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:621f73a07595d83f28952d7bd1e91e9d1ed7625fb7af0064d3516674ec93a2a2"}, + {file = "regex-2026.1.15-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3d7d92495f47567a9b1669c51fc8d6d809821849063d168121ef801bbc213846"}, + {file = "regex-2026.1.15-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8dd16fba2758db7a3780a051f245539c4451ca20910f5a5e6ea1c08d06d4a76b"}, + {file = "regex-2026.1.15-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1e1808471fbe44c1a63e5f577a1d5f02fe5d66031dcbdf12f093ffc1305a858e"}, + {file = "regex-2026.1.15-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0751a26ad39d4f2ade8fe16c59b2bf5cb19eb3d2cd543e709e583d559bd9efde"}, + {file = "regex-2026.1.15-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0f0c7684c7f9ca241344ff95a1de964f257a5251968484270e91c25a755532c5"}, + {file = "regex-2026.1.15-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:74f45d170a21df41508cb67165456538425185baaf686281fa210d7e729abc34"}, + {file = "regex-2026.1.15-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:f1862739a1ffb50615c0fde6bae6569b5efbe08d98e59ce009f68a336f64da75"}, + {file = "regex-2026.1.15-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:453078802f1b9e2b7303fb79222c054cb18e76f7bdc220f7530fdc85d319f99e"}, + {file = "regex-2026.1.15-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:a30a68e89e5a218b8b23a52292924c1f4b245cb0c68d1cce9aec9bbda6e2c160"}, + {file = "regex-2026.1.15-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9479cae874c81bf610d72b85bb681a94c95722c127b55445285fb0e2c82db8e1"}, + {file = "regex-2026.1.15-cp314-cp314-win32.whl", hash = "sha256:d639a750223132afbfb8f429c60d9d318aeba03281a5f1ab49f877456448dcf1"}, + {file = "regex-2026.1.15-cp314-cp314-win_amd64.whl", hash = "sha256:4161d87f85fa831e31469bfd82c186923070fc970b9de75339b68f0c75b51903"}, + {file = "regex-2026.1.15-cp314-cp314-win_arm64.whl", hash = "sha256:91c5036ebb62663a6b3999bdd2e559fd8456d17e2b485bf509784cd31a8b1705"}, + {file = "regex-2026.1.15-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:ee6854c9000a10938c79238de2379bea30c82e4925a371711af45387df35cab8"}, + {file = "regex-2026.1.15-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2c2b80399a422348ce5de4fe40c418d6299a0fa2803dd61dc0b1a2f28e280fcf"}, + {file = "regex-2026.1.15-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:dca3582bca82596609959ac39e12b7dad98385b4fefccb1151b937383cec547d"}, + {file = "regex-2026.1.15-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef71d476caa6692eea743ae5ea23cde3260677f70122c4d258ca952e5c2d4e84"}, + {file = "regex-2026.1.15-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c243da3436354f4af6c3058a3f81a97d47ea52c9bd874b52fd30274853a1d5df"}, + {file = "regex-2026.1.15-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8355ad842a7c7e9e5e55653eade3b7d1885ba86f124dd8ab1f722f9be6627434"}, + {file = "regex-2026.1.15-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f192a831d9575271a22d804ff1a5355355723f94f31d9eef25f0d45a152fdc1a"}, + {file = "regex-2026.1.15-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:166551807ec20d47ceaeec380081f843e88c8949780cd42c40f18d16168bed10"}, + {file = "regex-2026.1.15-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f9ca1cbdc0fbfe5e6e6f8221ef2309988db5bcede52443aeaee9a4ad555e0dac"}, + {file = "regex-2026.1.15-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b30bcbd1e1221783c721483953d9e4f3ab9c5d165aa709693d3f3946747b1aea"}, + {file = "regex-2026.1.15-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:2a8d7b50c34578d0d3bf7ad58cde9652b7d683691876f83aedc002862a35dc5e"}, + {file = "regex-2026.1.15-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:9d787e3310c6a6425eb346be4ff2ccf6eece63017916fd77fe8328c57be83521"}, + {file = "regex-2026.1.15-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:619843841e220adca114118533a574a9cd183ed8a28b85627d2844c500a2b0db"}, + {file = "regex-2026.1.15-cp314-cp314t-win32.whl", hash = "sha256:e90b8db97f6f2c97eb045b51a6b2c5ed69cedd8392459e0642d4199b94fabd7e"}, + {file = "regex-2026.1.15-cp314-cp314t-win_amd64.whl", hash = "sha256:5ef19071f4ac9f0834793af85bd04a920b4407715624e40cb7a0631a11137cdf"}, + {file = "regex-2026.1.15-cp314-cp314t-win_arm64.whl", hash = "sha256:ca89c5e596fc05b015f27561b3793dc2fa0917ea0d7507eebb448efd35274a70"}, + {file = "regex-2026.1.15-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:55b4ea996a8e4458dd7b584a2f89863b1655dd3d17b88b46cbb9becc495a0ec5"}, + {file = "regex-2026.1.15-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7e1e28be779884189cdd57735e997f282b64fd7ccf6e2eef3e16e57d7a34a815"}, + {file = "regex-2026.1.15-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0057de9eaef45783ff69fa94ae9f0fd906d629d0bd4c3217048f46d1daa32e9b"}, + {file = "regex-2026.1.15-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cc7cd0b2be0f0269283a45c0d8b2c35e149d1319dcb4a43c9c3689fa935c1ee6"}, + {file = "regex-2026.1.15-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8db052bbd981e1666f09e957f3790ed74080c2229007c1dd67afdbf0b469c48b"}, + {file = "regex-2026.1.15-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:343db82cb3712c31ddf720f097ef17c11dab2f67f7a3e7be976c4f82eba4e6df"}, + {file = "regex-2026.1.15-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:55e9d0118d97794367309635df398bdfd7c33b93e2fdfa0b239661cd74b4c14e"}, + {file = "regex-2026.1.15-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:008b185f235acd1e53787333e5690082e4f156c44c87d894f880056089e9bc7c"}, + {file = "regex-2026.1.15-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fd65af65e2aaf9474e468f9e571bd7b189e1df3a61caa59dcbabd0000e4ea839"}, + {file = "regex-2026.1.15-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f42e68301ff4afee63e365a5fc302b81bb8ba31af625a671d7acb19d10168a8c"}, + {file = "regex-2026.1.15-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:f7792f27d3ee6e0244ea4697d92b825f9a329ab5230a78c1a68bd274e64b5077"}, + {file = "regex-2026.1.15-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:dbaf3c3c37ef190439981648ccbf0c02ed99ae066087dd117fcb616d80b010a4"}, + {file = "regex-2026.1.15-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:adc97a9077c2696501443d8ad3fa1b4fc6d131fc8fd7dfefd1a723f89071cf0a"}, + {file = "regex-2026.1.15-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:069f56a7bf71d286a6ff932a9e6fb878f151c998ebb2519a9f6d1cee4bffdba3"}, + {file = "regex-2026.1.15-cp39-cp39-win32.whl", hash = "sha256:ea4e6b3566127fda5e007e90a8fd5a4169f0cf0619506ed426db647f19c8454a"}, + {file = "regex-2026.1.15-cp39-cp39-win_amd64.whl", hash = "sha256:cda1ed70d2b264952e88adaa52eea653a33a1b98ac907ae2f86508eb44f65cdc"}, + {file = "regex-2026.1.15-cp39-cp39-win_arm64.whl", hash = "sha256:b325d4714c3c48277bfea1accd94e193ad6ed42b4bad79ad64f3b8f8a31260a5"}, + {file = "regex-2026.1.15.tar.gz", hash = "sha256:164759aa25575cbc0651bef59a0b18353e54300d79ace8084c818ad8ac72b7d5"}, ] [[package]] @@ -3695,4 +3711,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.1" python-versions = "^3.9" -content-hash = "bea28f4f7e6b82e849eaf109f6555f4503568b3b6891c5cdac6bb751cc8d48df" +content-hash = "d7c6eb86db7bf42d5de8fcb2a76b7a70c2612d42acf91f52196474a27b8094fc" diff --git a/pyproject.toml b/pyproject.toml index e71870910e..c826ae1aa5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "bbot" -version = "2.8.0" +version = "2.8.1" description = "OSINT automation for hackers." authors = [ "TheTechromancer", @@ -43,7 +43,7 @@ dnspython = ">=2.7.0,<2.8.0" cachetools = ">=5.3.2,<7.0.0" socksio = "^1.0.0" jinja2 = "^3.1.3" -regex = ">=2024.4.16,<2026.0.0" +regex = ">=2024.4.16,<2027.0.0" unidecode = "^1.3.8" mmh3 = ">=4.1,<6.0" xxhash = "^3.5.0" @@ -57,7 +57,7 @@ radixtarget = "^3.0.13" orjson = "^3.10.12" ansible-core = "^2.15.13" tldextract = "^5.3.0" -cloudcheck = "^8.7.2" +cloudcheck = "^9.2.0" [tool.poetry.group.dev.dependencies] poetry-dynamic-versioning = ">=0.21.4,<1.10.0" @@ -121,7 +121,7 @@ lint.ignore = ["E402", "E711", "E713", "E721", "E741", "F403", "F405", "E501"] [tool.poetry-dynamic-versioning] enable = true metadata = false -format-jinja = 'v2.8.0{% if branch == "dev" %}.{{ distance }}rc{% endif %}' +format-jinja = 'v2.8.1{% if branch == "dev" %}.{{ distance }}rc{% endif %}' [tool.poetry-dynamic-versioning.substitution] files = ["*/__init__.py"]