anaplan-sdk 0.4.0a3__tar.gz → 0.4.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/PKG-INFO +3 -3
  2. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/anaplan_sdk/_async_clients/_bulk.py +5 -0
  3. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/anaplan_sdk/_auth.py +13 -5
  4. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/anaplan_sdk/_clients/_bulk.py +5 -0
  5. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/docs/guides/authentication.md +35 -0
  6. anaplan_sdk-0.4.1/docs/img/anaplan-sdk.webp +0 -0
  7. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/pyproject.toml +4 -4
  8. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/uv.lock +42 -42
  9. anaplan_sdk-0.4.0a3/docs/img/anaplan-sdk.webp +0 -0
  10. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/.github/dependabot.yml +0 -0
  11. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/.github/workflows/docs.yml +0 -0
  12. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/.github/workflows/lint.yml +0 -0
  13. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/.github/workflows/tests.yml +0 -0
  14. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/.gitignore +0 -0
  15. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/.pre-commit-config.yaml +0 -0
  16. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/LICENSE +0 -0
  17. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/README.md +0 -0
  18. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/anaplan_sdk/__init__.py +0 -0
  19. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/anaplan_sdk/_async_clients/__init__.py +0 -0
  20. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/anaplan_sdk/_async_clients/_alm.py +0 -0
  21. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/anaplan_sdk/_async_clients/_audit.py +0 -0
  22. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/anaplan_sdk/_async_clients/_cloud_works.py +0 -0
  23. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/anaplan_sdk/_async_clients/_cw_flow.py +0 -0
  24. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/anaplan_sdk/_async_clients/_transactional.py +0 -0
  25. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/anaplan_sdk/_base.py +0 -0
  26. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/anaplan_sdk/_clients/__init__.py +0 -0
  27. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/anaplan_sdk/_clients/_alm.py +0 -0
  28. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/anaplan_sdk/_clients/_audit.py +0 -0
  29. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/anaplan_sdk/_clients/_cloud_works.py +0 -0
  30. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/anaplan_sdk/_clients/_cw_flow.py +0 -0
  31. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/anaplan_sdk/_clients/_transactional.py +0 -0
  32. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/anaplan_sdk/exceptions.py +0 -0
  33. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/anaplan_sdk/models/__init__.py +0 -0
  34. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/anaplan_sdk/models/_alm.py +0 -0
  35. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/anaplan_sdk/models/_base.py +0 -0
  36. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/anaplan_sdk/models/_bulk.py +0 -0
  37. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/anaplan_sdk/models/_transactional.py +0 -0
  38. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/anaplan_sdk/models/cloud_works.py +0 -0
  39. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/anaplan_sdk/models/flows.py +0 -0
  40. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/docs/anaplan_explained.md +0 -0
  41. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/docs/api/async/async_alm_client.md +0 -0
  42. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/docs/api/async/async_audit_client.md +0 -0
  43. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/docs/api/async/async_client.md +0 -0
  44. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/docs/api/async/async_cw_client.md +0 -0
  45. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/docs/api/async/async_flows_client.md +0 -0
  46. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/docs/api/async/async_transactional_client.md +0 -0
  47. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/docs/api/exceptions.md +0 -0
  48. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/docs/api/models.md +0 -0
  49. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/docs/api/sync/sync_alm_client.md +0 -0
  50. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/docs/api/sync/sync_audit_client.md +0 -0
  51. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/docs/api/sync/sync_client.md +0 -0
  52. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/docs/api/sync/sync_cw_client.md +0 -0
  53. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/docs/api/sync/sync_flows_client.md +0 -0
  54. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/docs/api/sync/sync_transactional_client.md +0 -0
  55. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/docs/assets/overview.html +0 -0
  56. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/docs/css/styles.css +0 -0
  57. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/docs/guides/alm.md +0 -0
  58. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/docs/guides/audit.md +0 -0
  59. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/docs/guides/bulk.md +0 -0
  60. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/docs/guides/bulk_vs_transactional.md +0 -0
  61. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/docs/guides/cloud_works.md +0 -0
  62. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/docs/guides/index.md +0 -0
  63. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/docs/guides/logging.md +0 -0
  64. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/docs/guides/multiple_models.md +0 -0
  65. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/docs/guides/transactional.md +0 -0
  66. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/docs/index.md +0 -0
  67. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/docs/installation.md +0 -0
  68. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/docs/js/assets/hljs.js +0 -0
  69. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/docs/js/assets/hljs.min.js +0 -0
  70. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/docs/js/assets/python.js +0 -0
  71. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/docs/js/assets/python.min.js +0 -0
  72. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/docs/js/highlight.js +0 -0
  73. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/docs/js/highlight.min.js +0 -0
  74. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/docs/quickstart.md +0 -0
  75. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/mkdocs.yml +0 -0
  76. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/tests/async/conftest.py +0 -0
  77. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/tests/async/test_async_alm_client.py +0 -0
  78. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/tests/async/test_async_audit_client.py +0 -0
  79. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/tests/async/test_async_client.py +0 -0
  80. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/tests/async/test_async_cloud_works_client.py +0 -0
  81. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/tests/async/test_async_flows_client.py +0 -0
  82. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/tests/async/test_async_transactional_client.py +0 -0
  83. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/tests/conftest.py +0 -0
  84. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/tests/sync/conftest.py +0 -0
  85. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/tests/sync/test_alm_client.py +0 -0
  86. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/tests/sync/test_audit_client.py +0 -0
  87. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/tests/sync/test_client.py +0 -0
  88. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/tests/sync/test_cloud_works_client.py +0 -0
  89. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/tests/sync/test_flows_client.py +0 -0
  90. {anaplan_sdk-0.4.0a3 → anaplan_sdk-0.4.1}/tests/sync/test_transactional_client.py +0 -0
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: anaplan-sdk
3
- Version: 0.4.0a3
4
- Summary: Provides pythonic access to the Anaplan API
3
+ Version: 0.4.1
4
+ Summary: Streamlined Python Interface for Anaplan
5
5
  Project-URL: Homepage, https://vinzenzklass.github.io/anaplan-sdk/
6
6
  Project-URL: Repository, https://github.com/VinzenzKlass/anaplan-sdk
7
7
  Project-URL: Documentation, https://vinzenzklass.github.io/anaplan-sdk/
@@ -13,7 +13,7 @@ Requires-Python: >=3.10.4
13
13
  Requires-Dist: httpx<1.0.0,>=0.27.0
14
14
  Requires-Dist: pydantic<3.0.0,>=2.7.2
15
15
  Provides-Extra: cert
16
- Requires-Dist: cryptography<45.0.0,>=42.0.7; extra == 'cert'
16
+ Requires-Dist: cryptography<46.0.0,>=42.0.7; extra == 'cert'
17
17
  Provides-Extra: oauth
18
18
  Requires-Dist: oauthlib<4.0.0,>=3.0.0; extra == 'oauth'
19
19
  Description-Content-Type: text/markdown
@@ -56,6 +56,7 @@ class AsyncClient(_AsyncBaseClient):
56
56
  redirect_uri: str | None = None,
57
57
  refresh_token: str | None = None,
58
58
  oauth2_scope: str = "openid profile email offline_access",
59
+ on_auth_code: Callable[[str], str] | None = None,
59
60
  on_token_refresh: Callable[[dict[str, str]], None] | None = None,
60
61
  timeout: float | httpx.Timeout = 30,
61
62
  retry_count: int = 2,
@@ -91,6 +92,9 @@ class AsyncClient(_AsyncBaseClient):
91
92
  :param refresh_token: If you have a valid refresh token, you can pass it to skip the
92
93
  interactive authentication code step.
93
94
  :param oauth2_scope: The scope of the Oauth2 token, if you want to narrow it.
95
+ :param on_auth_code: A callback that takes the redirect URI as a single argument and must
96
+ return the entire response URI. This will substitute the interactive
97
+ authentication code step in the terminal.
94
98
  :param on_token_refresh: A callback function that is called whenever the token is refreshed.
95
99
  With this you can for example securely store the token in your
96
100
  application or on your server for later reuse. The function
@@ -124,6 +128,7 @@ class AsyncClient(_AsyncBaseClient):
124
128
  redirect_uri=redirect_uri,
125
129
  refresh_token=refresh_token,
126
130
  oauth2_scope=oauth2_scope,
131
+ on_auth_code=on_auth_code,
127
132
  on_token_refresh=on_token_refresh,
128
133
  )
129
134
  ),
@@ -144,6 +144,7 @@ class AnaplanOauth2AuthCodeAuth(_AnaplanAuth):
144
144
  redirect_uri: str,
145
145
  refresh_token: str | None = None,
146
146
  scope: str = "openid profile email offline_access",
147
+ on_auth_code: Callable[[str], str] | None = None,
147
148
  on_token_refresh: Callable[[dict[str, str]], None] | None = None,
148
149
  ):
149
150
  try:
@@ -163,6 +164,7 @@ class AnaplanOauth2AuthCodeAuth(_AnaplanAuth):
163
164
  self._refresh_token = refresh_token
164
165
  self._scope = scope
165
166
  self._id_token = None
167
+ self._on_auth_code = on_auth_code
166
168
  self._on_token_refresh = on_token_refresh
167
169
  if not refresh_token:
168
170
  self.__auth_code_flow()
@@ -195,13 +197,17 @@ class AnaplanOauth2AuthCodeAuth(_AnaplanAuth):
195
197
  try:
196
198
  logger.info("Creating Authentication Token with OAuth2 Authorization Code Flow.")
197
199
  url, _, _ = self._oauth.prepare_authorization_request(
198
- "https://us1a.app.anaplan.com/auth/authorize",
200
+ "https://us1a.app.anaplan.com/auth/prelogin",
199
201
  redirect_url=self._redirect_uri,
200
202
  scope=self._scope,
201
203
  )
202
- authorization_response = input(
203
- f"Please go to {url} and authorize the app.\n"
204
- "Then paste the entire redirect URL here: "
204
+ authorization_response = (
205
+ self._on_auth_code(url)
206
+ if self._on_auth_code
207
+ else input(
208
+ f"Please go to {url} and authorize the app.\n"
209
+ "Then paste the entire redirect URL here: "
210
+ )
205
211
  )
206
212
  url, headers, body = self._oauth.prepare_token_request(
207
213
  token_url=self._token_url,
@@ -211,7 +217,7 @@ class AnaplanOauth2AuthCodeAuth(_AnaplanAuth):
211
217
  )
212
218
  self._parse_auth_response(httpx.post(url=url, headers=headers, content=body))
213
219
  except (httpx.HTTPError, ValueError, TypeError, OAuth2Error) as error:
214
- raise AnaplanException("Error during OAuth2 authorization flow.") from error
220
+ raise InvalidCredentialsException("Error during OAuth2 authorization flow.") from error
215
221
 
216
222
 
217
223
  def create_auth(
@@ -225,6 +231,7 @@ def create_auth(
225
231
  redirect_uri: str | None = None,
226
232
  refresh_token: str | None = None,
227
233
  oauth2_scope: str = "openid profile email offline_access",
234
+ on_auth_code: Callable[[str], str] | None = None,
228
235
  on_token_refresh: Callable[[dict[str, str]], None] | None = None,
229
236
  ) -> _AnaplanAuth:
230
237
  if certificate and private_key:
@@ -238,6 +245,7 @@ def create_auth(
238
245
  redirect_uri=redirect_uri,
239
246
  refresh_token=refresh_token,
240
247
  scope=oauth2_scope,
248
+ on_auth_code=on_auth_code,
241
249
  on_token_refresh=on_token_refresh,
242
250
  )
243
251
  raise ValueError(
@@ -58,6 +58,7 @@ class Client(_BaseClient):
58
58
  redirect_uri: str | None = None,
59
59
  refresh_token: str | None = None,
60
60
  oauth2_scope: str = "openid profile email offline_access",
61
+ on_auth_code: Callable[[str], str] | None = None,
61
62
  on_token_refresh: Callable[[dict[str, str]], None] | None = None,
62
63
  timeout: float | httpx.Timeout = 30,
63
64
  retry_count: int = 2,
@@ -94,6 +95,9 @@ class Client(_BaseClient):
94
95
  :param refresh_token: If you have a valid refresh token, you can pass it to skip the
95
96
  interactive authentication code step.
96
97
  :param oauth2_scope: The scope of the Oauth2 token, if you want to narrow it.
98
+ :param on_auth_code: A callback that takes the redirect URI as a single argument and must
99
+ return the entire response URI. This will substitute the interactive
100
+ authentication code step in the terminal.
97
101
  :param on_token_refresh: A callback function that is called whenever the token is refreshed.
98
102
  With this you can for example securely store the token in your
99
103
  application or on your server for later reuse. The function
@@ -130,6 +134,7 @@ class Client(_BaseClient):
130
134
  redirect_uri=redirect_uri,
131
135
  refresh_token=refresh_token,
132
136
  oauth2_scope=oauth2_scope,
137
+ on_auth_code=on_auth_code,
133
138
  on_token_refresh=on_token_refresh,
134
139
  )
135
140
  ),
@@ -142,6 +142,41 @@ will need to copy the entire redirect URI from your browser and paste it into th
142
142
  Unfortunately, registering localhost redirect URIs is not supported by Anaplan. This means we cannot intercept the
143
143
  redirect URI and extract the `authorization_code` automatically. This is a limitation of Anaplan's OAuth2 implementation. See [this Community Note](https://community.anaplan.com/discussion/156599/oauth-rediredt-url-port-for-desktop-apps).
144
144
 
145
+ ### Authorization Code
146
+
147
+ When using OAuth authentication, the default behavior prompts you to manually open a URL, authorize the application, and paste the redirect URL back into your terminal. However, you can customize this flow by providing the `on_auth_code` callback.
148
+
149
+ The `on_auth_code` callback lets you hook into the Auth Flow to handle the authorization URL programmatically and return the authorization response. `on_auth_code` must be a callable that takes the authorization URL as a single argument of type `str` and returns the redirect URL as a `str`.
150
+
151
+ === "Synchronous"
152
+ ```python
153
+ def on_auth_code(redirect_uri: str) -> str:
154
+ return input(f"Go fetch! {redirect_uri}\nPaste here: ")
155
+
156
+ anaplan = anaplan_sdk.Client(
157
+ workspace_id="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
158
+ model_id="11111111111111111111111111111111",
159
+ redirect_uri="https://vinzenzklass.github.io/anaplan-sdk",
160
+ client_id="my_anaplan_oauth_client_id",
161
+ client_secret="my_anaplan_oauth_client_secret",
162
+ on_auth_code=on_auth_code,
163
+ )
164
+ ```
165
+ === "Asynchronous"
166
+ ```python
167
+ def on_auth_code(redirect_uri: str) -> str:
168
+ return input(f"Go fetch! {redirect_uri}\nPaste here: ")
169
+
170
+ anaplan = anaplan_sdk.AsyncClient(
171
+ workspace_id="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
172
+ model_id="11111111111111111111111111111111",
173
+ redirect_uri="https://vinzenzklass.github.io/anaplan-sdk",
174
+ client_id="my_anaplan_oauth_client_id",
175
+ client_secret="my_anaplan_oauth_client_secret",
176
+ on_auth_code=on_auth_code,
177
+ )
178
+ ```
179
+
145
180
  ### Refresh Tokens
146
181
 
147
182
  You can extend the above example to also pass a `refresh_token` to authenticate without any user interaction, and
@@ -1,7 +1,7 @@
1
1
  [project]
2
2
  name = "anaplan-sdk"
3
- version = "0.4.0a3"
4
- description = "Provides pythonic access to the Anaplan API"
3
+ version = "0.4.1"
4
+ description = "Streamlined Python Interface for Anaplan"
5
5
  license = "Apache-2.0"
6
6
  authors = [{ name = "Vinzenz Klass", email = "vinzenz.klass@valantic.com" }]
7
7
  readme = "README.md"
@@ -24,7 +24,7 @@ dependencies = [
24
24
  ]
25
25
 
26
26
  [project.optional-dependencies]
27
- cert = ["cryptography>=42.0.7,<45.0.0"]
27
+ cert = ["cryptography>=42.0.7,<46.0.0"]
28
28
  oauth = ["oauthlib>=3.0.0,<4.0.0"]
29
29
 
30
30
  [dependency-groups]
@@ -40,7 +40,7 @@ dev = [
40
40
  "polars>=1.29.0",
41
41
  "griffe-fieldz>=0.2.1",
42
42
  "oauthlib>=3.2.2",
43
- "cryptography>=42.0.7",
43
+ "cryptography>=45.0.0",
44
44
  ]
45
45
 
46
46
  [project.urls]
@@ -4,7 +4,7 @@ requires-python = ">=3.10.4"
4
4
 
5
5
  [[package]]
6
6
  name = "anaplan-sdk"
7
- version = "0.4.0a3"
7
+ version = "0.4.1"
8
8
  source = { editable = "." }
9
9
  dependencies = [
10
10
  { name = "httpx" },
@@ -37,7 +37,7 @@ dev = [
37
37
 
38
38
  [package.metadata]
39
39
  requires-dist = [
40
- { name = "cryptography", marker = "extra == 'cert'", specifier = ">=42.0.7,<45.0.0" },
40
+ { name = "cryptography", marker = "extra == 'cert'", specifier = ">=42.0.7,<46.0.0" },
41
41
  { name = "httpx", specifier = ">=0.27.0,<1.0.0" },
42
42
  { name = "oauthlib", marker = "extra == 'oauth'", specifier = ">=3.0.0,<4.0.0" },
43
43
  { name = "pydantic", specifier = ">=2.7.2,<3.0.0" },
@@ -46,7 +46,7 @@ provides-extras = ["cert", "oauth"]
46
46
 
47
47
  [package.metadata.requires-dev]
48
48
  dev = [
49
- { name = "cryptography", specifier = ">=42.0.7" },
49
+ { name = "cryptography", specifier = ">=45.0.0" },
50
50
  { name = "griffe-fieldz", specifier = ">=0.2.1" },
51
51
  { name = "mkdocs", specifier = ">=1.6.1" },
52
52
  { name = "mkdocs-material", specifier = ">=9.5.41" },
@@ -265,49 +265,49 @@ wheels = [
265
265
 
266
266
  [[package]]
267
267
  name = "cryptography"
268
- version = "44.0.3"
268
+ version = "45.0.2"
269
269
  source = { registry = "https://pypi.org/simple" }
270
270
  dependencies = [
271
271
  { name = "cffi", marker = "platform_python_implementation != 'PyPy'" },
272
272
  ]
273
- sdist = { url = "https://files.pythonhosted.org/packages/53/d6/1411ab4d6108ab167d06254c5be517681f1e331f90edf1379895bcb87020/cryptography-44.0.3.tar.gz", hash = "sha256:fe19d8bc5536a91a24a8133328880a41831b6c5df54599a8417b62fe015d3053", size = 711096, upload-time = "2025-05-02T19:36:04.667Z" }
274
- wheels = [
275
- { url = "https://files.pythonhosted.org/packages/08/53/c776d80e9d26441bb3868457909b4e74dd9ccabd182e10b2b0ae7a07e265/cryptography-44.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:962bc30480a08d133e631e8dfd4783ab71cc9e33d5d7c1e192f0b7c06397bb88", size = 6670281, upload-time = "2025-05-02T19:34:50.665Z" },
276
- { url = "https://files.pythonhosted.org/packages/6a/06/af2cf8d56ef87c77319e9086601bef621bedf40f6f59069e1b6d1ec498c5/cryptography-44.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ffc61e8f3bf5b60346d89cd3d37231019c17a081208dfbbd6e1605ba03fa137", size = 3959305, upload-time = "2025-05-02T19:34:53.042Z" },
277
- { url = "https://files.pythonhosted.org/packages/ae/01/80de3bec64627207d030f47bf3536889efee8913cd363e78ca9a09b13c8e/cryptography-44.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58968d331425a6f9eedcee087f77fd3c927c88f55368f43ff7e0a19891f2642c", size = 4171040, upload-time = "2025-05-02T19:34:54.675Z" },
278
- { url = "https://files.pythonhosted.org/packages/bd/48/bb16b7541d207a19d9ae8b541c70037a05e473ddc72ccb1386524d4f023c/cryptography-44.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:e28d62e59a4dbd1d22e747f57d4f00c459af22181f0b2f787ea83f5a876d7c76", size = 3963411, upload-time = "2025-05-02T19:34:56.61Z" },
279
- { url = "https://files.pythonhosted.org/packages/42/b2/7d31f2af5591d217d71d37d044ef5412945a8a8e98d5a2a8ae4fd9cd4489/cryptography-44.0.3-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:af653022a0c25ef2e3ffb2c673a50e5a0d02fecc41608f4954176f1933b12359", size = 3689263, upload-time = "2025-05-02T19:34:58.591Z" },
280
- { url = "https://files.pythonhosted.org/packages/25/50/c0dfb9d87ae88ccc01aad8eb93e23cfbcea6a6a106a9b63a7b14c1f93c75/cryptography-44.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:157f1f3b8d941c2bd8f3ffee0af9b049c9665c39d3da9db2dc338feca5e98a43", size = 4196198, upload-time = "2025-05-02T19:35:00.988Z" },
281
- { url = "https://files.pythonhosted.org/packages/66/c9/55c6b8794a74da652690c898cb43906310a3e4e4f6ee0b5f8b3b3e70c441/cryptography-44.0.3-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:c6cd67722619e4d55fdb42ead64ed8843d64638e9c07f4011163e46bc512cf01", size = 3966502, upload-time = "2025-05-02T19:35:03.091Z" },
282
- { url = "https://files.pythonhosted.org/packages/b6/f7/7cb5488c682ca59a02a32ec5f975074084db4c983f849d47b7b67cc8697a/cryptography-44.0.3-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:b424563394c369a804ecbee9b06dfb34997f19d00b3518e39f83a5642618397d", size = 4196173, upload-time = "2025-05-02T19:35:05.018Z" },
283
- { url = "https://files.pythonhosted.org/packages/d2/0b/2f789a8403ae089b0b121f8f54f4a3e5228df756e2146efdf4a09a3d5083/cryptography-44.0.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c91fc8e8fd78af553f98bc7f2a1d8db977334e4eea302a4bfd75b9461c2d8904", size = 4087713, upload-time = "2025-05-02T19:35:07.187Z" },
284
- { url = "https://files.pythonhosted.org/packages/1d/aa/330c13655f1af398fc154089295cf259252f0ba5df93b4bc9d9c7d7f843e/cryptography-44.0.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:25cd194c39fa5a0aa4169125ee27d1172097857b27109a45fadc59653ec06f44", size = 4299064, upload-time = "2025-05-02T19:35:08.879Z" },
285
- { url = "https://files.pythonhosted.org/packages/10/a8/8c540a421b44fd267a7d58a1fd5f072a552d72204a3f08194f98889de76d/cryptography-44.0.3-cp37-abi3-win32.whl", hash = "sha256:3be3f649d91cb182c3a6bd336de8b61a0a71965bd13d1a04a0e15b39c3d5809d", size = 2773887, upload-time = "2025-05-02T19:35:10.41Z" },
286
- { url = "https://files.pythonhosted.org/packages/b9/0d/c4b1657c39ead18d76bbd122da86bd95bdc4095413460d09544000a17d56/cryptography-44.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:3883076d5c4cc56dbef0b898a74eb6992fdac29a7b9013870b34efe4ddb39a0d", size = 3209737, upload-time = "2025-05-02T19:35:12.12Z" },
287
- { url = "https://files.pythonhosted.org/packages/34/a3/ad08e0bcc34ad436013458d7528e83ac29910943cea42ad7dd4141a27bbb/cryptography-44.0.3-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:5639c2b16764c6f76eedf722dbad9a0914960d3489c0cc38694ddf9464f1bb2f", size = 6673501, upload-time = "2025-05-02T19:35:13.775Z" },
288
- { url = "https://files.pythonhosted.org/packages/b1/f0/7491d44bba8d28b464a5bc8cc709f25a51e3eac54c0a4444cf2473a57c37/cryptography-44.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3ffef566ac88f75967d7abd852ed5f182da252d23fac11b4766da3957766759", size = 3960307, upload-time = "2025-05-02T19:35:15.917Z" },
289
- { url = "https://files.pythonhosted.org/packages/f7/c8/e5c5d0e1364d3346a5747cdcd7ecbb23ca87e6dea4f942a44e88be349f06/cryptography-44.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:192ed30fac1728f7587c6f4613c29c584abdc565d7417c13904708db10206645", size = 4170876, upload-time = "2025-05-02T19:35:18.138Z" },
290
- { url = "https://files.pythonhosted.org/packages/73/96/025cb26fc351d8c7d3a1c44e20cf9a01e9f7cf740353c9c7a17072e4b264/cryptography-44.0.3-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:7d5fe7195c27c32a64955740b949070f21cba664604291c298518d2e255931d2", size = 3964127, upload-time = "2025-05-02T19:35:19.864Z" },
291
- { url = "https://files.pythonhosted.org/packages/01/44/eb6522db7d9f84e8833ba3bf63313f8e257729cf3a8917379473fcfd6601/cryptography-44.0.3-cp39-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3f07943aa4d7dad689e3bb1638ddc4944cc5e0921e3c227486daae0e31a05e54", size = 3689164, upload-time = "2025-05-02T19:35:21.449Z" },
292
- { url = "https://files.pythonhosted.org/packages/68/fb/d61a4defd0d6cee20b1b8a1ea8f5e25007e26aeb413ca53835f0cae2bcd1/cryptography-44.0.3-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:cb90f60e03d563ca2445099edf605c16ed1d5b15182d21831f58460c48bffb93", size = 4198081, upload-time = "2025-05-02T19:35:23.187Z" },
293
- { url = "https://files.pythonhosted.org/packages/1b/50/457f6911d36432a8811c3ab8bd5a6090e8d18ce655c22820994913dd06ea/cryptography-44.0.3-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:ab0b005721cc0039e885ac3503825661bd9810b15d4f374e473f8c89b7d5460c", size = 3967716, upload-time = "2025-05-02T19:35:25.426Z" },
294
- { url = "https://files.pythonhosted.org/packages/35/6e/dca39d553075980ccb631955c47b93d87d27f3596da8d48b1ae81463d915/cryptography-44.0.3-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:3bb0847e6363c037df8f6ede57d88eaf3410ca2267fb12275370a76f85786a6f", size = 4197398, upload-time = "2025-05-02T19:35:27.678Z" },
295
- { url = "https://files.pythonhosted.org/packages/9b/9d/d1f2fe681eabc682067c66a74addd46c887ebacf39038ba01f8860338d3d/cryptography-44.0.3-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:b0cc66c74c797e1db750aaa842ad5b8b78e14805a9b5d1348dc603612d3e3ff5", size = 4087900, upload-time = "2025-05-02T19:35:29.312Z" },
296
- { url = "https://files.pythonhosted.org/packages/c4/f5/3599e48c5464580b73b236aafb20973b953cd2e7b44c7c2533de1d888446/cryptography-44.0.3-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6866df152b581f9429020320e5eb9794c8780e90f7ccb021940d7f50ee00ae0b", size = 4301067, upload-time = "2025-05-02T19:35:31.547Z" },
297
- { url = "https://files.pythonhosted.org/packages/a7/6c/d2c48c8137eb39d0c193274db5c04a75dab20d2f7c3f81a7dcc3a8897701/cryptography-44.0.3-cp39-abi3-win32.whl", hash = "sha256:c138abae3a12a94c75c10499f1cbae81294a6f983b3af066390adee73f433028", size = 2775467, upload-time = "2025-05-02T19:35:33.805Z" },
298
- { url = "https://files.pythonhosted.org/packages/c9/ad/51f212198681ea7b0deaaf8846ee10af99fba4e894f67b353524eab2bbe5/cryptography-44.0.3-cp39-abi3-win_amd64.whl", hash = "sha256:5d186f32e52e66994dce4f766884bcb9c68b8da62d61d9d215bfe5fb56d21334", size = 3210375, upload-time = "2025-05-02T19:35:35.369Z" },
299
- { url = "https://files.pythonhosted.org/packages/7f/10/abcf7418536df1eaba70e2cfc5c8a0ab07aa7aa02a5cbc6a78b9d8b4f121/cryptography-44.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:cad399780053fb383dc067475135e41c9fe7d901a97dd5d9c5dfb5611afc0d7d", size = 3393192, upload-time = "2025-05-02T19:35:37.468Z" },
300
- { url = "https://files.pythonhosted.org/packages/06/59/ecb3ef380f5891978f92a7f9120e2852b1df6f0a849c277b8ea45b865db2/cryptography-44.0.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:21a83f6f35b9cc656d71b5de8d519f566df01e660ac2578805ab245ffd8523f8", size = 3898419, upload-time = "2025-05-02T19:35:39.065Z" },
301
- { url = "https://files.pythonhosted.org/packages/bb/d0/35e2313dbb38cf793aa242182ad5bc5ef5c8fd4e5dbdc380b936c7d51169/cryptography-44.0.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fc3c9babc1e1faefd62704bb46a69f359a9819eb0292e40df3fb6e3574715cd4", size = 4117892, upload-time = "2025-05-02T19:35:40.839Z" },
302
- { url = "https://files.pythonhosted.org/packages/dc/c8/31fb6e33b56c2c2100d76de3fd820afaa9d4d0b6aea1ccaf9aaf35dc7ce3/cryptography-44.0.3-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:e909df4053064a97f1e6565153ff8bb389af12c5c8d29c343308760890560aff", size = 3900855, upload-time = "2025-05-02T19:35:42.599Z" },
303
- { url = "https://files.pythonhosted.org/packages/43/2a/08cc2ec19e77f2a3cfa2337b429676406d4bb78ddd130a05c458e7b91d73/cryptography-44.0.3-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:dad80b45c22e05b259e33ddd458e9e2ba099c86ccf4e88db7bbab4b747b18d06", size = 4117619, upload-time = "2025-05-02T19:35:44.774Z" },
304
- { url = "https://files.pythonhosted.org/packages/02/68/fc3d3f84022a75f2ac4b1a1c0e5d6a0c2ea259e14cd4aae3e0e68e56483c/cryptography-44.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:479d92908277bed6e1a1c69b277734a7771c2b78633c224445b5c60a9f4bc1d9", size = 3136570, upload-time = "2025-05-02T19:35:46.94Z" },
305
- { url = "https://files.pythonhosted.org/packages/8d/4b/c11ad0b6c061902de5223892d680e89c06c7c4d606305eb8de56c5427ae6/cryptography-44.0.3-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:896530bc9107b226f265effa7ef3f21270f18a2026bc09fed1ebd7b66ddf6375", size = 3390230, upload-time = "2025-05-02T19:35:49.062Z" },
306
- { url = "https://files.pythonhosted.org/packages/58/11/0a6bf45d53b9b2290ea3cec30e78b78e6ca29dc101e2e296872a0ffe1335/cryptography-44.0.3-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:9b4d4a5dbee05a2c390bf212e78b99434efec37b17a4bff42f50285c5c8c9647", size = 3895216, upload-time = "2025-05-02T19:35:51.351Z" },
307
- { url = "https://files.pythonhosted.org/packages/0a/27/b28cdeb7270e957f0077a2c2bfad1b38f72f1f6d699679f97b816ca33642/cryptography-44.0.3-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:02f55fb4f8b79c1221b0961488eaae21015b69b210e18c386b69de182ebb1259", size = 4115044, upload-time = "2025-05-02T19:35:53.044Z" },
308
- { url = "https://files.pythonhosted.org/packages/35/b0/ec4082d3793f03cb248881fecefc26015813199b88f33e3e990a43f79835/cryptography-44.0.3-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:dd3db61b8fe5be220eee484a17233287d0be6932d056cf5738225b9c05ef4fff", size = 3898034, upload-time = "2025-05-02T19:35:54.72Z" },
309
- { url = "https://files.pythonhosted.org/packages/0b/7f/adf62e0b8e8d04d50c9a91282a57628c00c54d4ae75e2b02a223bd1f2613/cryptography-44.0.3-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:978631ec51a6bbc0b7e58f23b68a8ce9e5f09721940933e9c217068388789fe5", size = 4114449, upload-time = "2025-05-02T19:35:57.139Z" },
310
- { url = "https://files.pythonhosted.org/packages/87/62/d69eb4a8ee231f4bf733a92caf9da13f1c81a44e874b1d4080c25ecbb723/cryptography-44.0.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:5d20cc348cca3a8aa7312f42ab953a56e15323800ca3ab0706b8cd452a3a056c", size = 3134369, upload-time = "2025-05-02T19:35:58.907Z" },
273
+ sdist = { url = "https://files.pythonhosted.org/packages/f6/47/92a8914716f2405f33f1814b97353e3cfa223cd94a77104075d42de3099e/cryptography-45.0.2.tar.gz", hash = "sha256:d784d57b958ffd07e9e226d17272f9af0c41572557604ca7554214def32c26bf", size = 743865, upload-time = "2025-05-18T02:46:34.986Z" }
274
+ wheels = [
275
+ { url = "https://files.pythonhosted.org/packages/3d/2f/46b9e715157643ad16f039ec3c3c47d174da6f825bf5034b1c5f692ab9e2/cryptography-45.0.2-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:61a8b1bbddd9332917485b2453d1de49f142e6334ce1d97b7916d5a85d179c84", size = 7043448, upload-time = "2025-05-18T02:45:12.495Z" },
276
+ { url = "https://files.pythonhosted.org/packages/90/52/49e6c86278e1b5ec226e96b62322538ccc466306517bf9aad8854116a088/cryptography-45.0.2-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4cc31c66411e14dd70e2f384a9204a859dc25b05e1f303df0f5326691061b839", size = 4201098, upload-time = "2025-05-18T02:45:15.178Z" },
277
+ { url = "https://files.pythonhosted.org/packages/7b/3a/201272539ac5b66b4cb1af89021e423fc0bfacb73498950280c51695fb78/cryptography-45.0.2-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:463096533acd5097f8751115bc600b0b64620c4aafcac10c6d0041e6e68f88fe", size = 4429839, upload-time = "2025-05-18T02:45:17.614Z" },
278
+ { url = "https://files.pythonhosted.org/packages/99/89/fa1a84832b8f8f3917875cb15324bba98def5a70175a889df7d21a45dc75/cryptography-45.0.2-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:cdafb86eb673c3211accffbffdb3cdffa3aaafacd14819e0898d23696d18e4d3", size = 4205154, upload-time = "2025-05-18T02:45:19.874Z" },
279
+ { url = "https://files.pythonhosted.org/packages/1c/c5/5225d5230d538ab461725711cf5220560a813d1eb68bafcfb00131b8f631/cryptography-45.0.2-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:05c2385b1f5c89a17df19900cfb1345115a77168f5ed44bdf6fd3de1ce5cc65b", size = 3897145, upload-time = "2025-05-18T02:45:22.209Z" },
280
+ { url = "https://files.pythonhosted.org/packages/fe/24/f19aae32526cc55ae17d473bc4588b1234af2979483d99cbfc57e55ffea6/cryptography-45.0.2-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:e9e4bdcd70216b08801e267c0b563316b787f957a46e215249921f99288456f9", size = 4462192, upload-time = "2025-05-18T02:45:24.773Z" },
281
+ { url = "https://files.pythonhosted.org/packages/19/18/4a69ac95b0b3f03355970baa6c3f9502bbfc54e7df81fdb179654a00f48e/cryptography-45.0.2-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:b2de529027579e43b6dc1f805f467b102fb7d13c1e54c334f1403ee2b37d0059", size = 4208093, upload-time = "2025-05-18T02:45:27.028Z" },
282
+ { url = "https://files.pythonhosted.org/packages/7c/54/2dea55ccc9558b8fa14f67156250b6ee231e31765601524e4757d0b5db6b/cryptography-45.0.2-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:10d68763892a7b19c22508ab57799c4423c7c8cd61d7eee4c5a6a55a46511949", size = 4461819, upload-time = "2025-05-18T02:45:29.39Z" },
283
+ { url = "https://files.pythonhosted.org/packages/37/f1/1b220fcd5ef4b1f0ff3e59e733b61597505e47f945606cc877adab2c1a17/cryptography-45.0.2-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d2a90ce2f0f5b695e4785ac07c19a58244092f3c85d57db6d8eb1a2b26d2aad6", size = 4329202, upload-time = "2025-05-18T02:45:31.925Z" },
284
+ { url = "https://files.pythonhosted.org/packages/6d/e0/51d1dc4f96f819a56db70f0b4039b4185055bbb8616135884c3c3acc4c6d/cryptography-45.0.2-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:59c0c8f043dd376bbd9d4f636223836aed50431af4c5a467ed9bf61520294627", size = 4570412, upload-time = "2025-05-18T02:45:34.348Z" },
285
+ { url = "https://files.pythonhosted.org/packages/dc/44/88efb40a3600d15277a77cdc69eeeab45a98532078d2a36cffd9325d3b3f/cryptography-45.0.2-cp311-abi3-win32.whl", hash = "sha256:80303ee6a02ef38c4253160446cbeb5c400c07e01d4ddbd4ff722a89b736d95a", size = 2933584, upload-time = "2025-05-18T02:45:36.198Z" },
286
+ { url = "https://files.pythonhosted.org/packages/d9/a1/bc9f82ba08760442cc8346d1b4e7b769b86d197193c45b42b3595d231e84/cryptography-45.0.2-cp311-abi3-win_amd64.whl", hash = "sha256:7429936146063bd1b2cfc54f0e04016b90ee9b1c908a7bed0800049cbace70eb", size = 3408537, upload-time = "2025-05-18T02:45:38.184Z" },
287
+ { url = "https://files.pythonhosted.org/packages/59/bc/1b6acb1dca366f9c0b3880888ecd7fcfb68023930d57df854847c6da1d10/cryptography-45.0.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:e86c8d54cd19a13e9081898b3c24351683fd39d726ecf8e774aaa9d8d96f5f3a", size = 7025581, upload-time = "2025-05-18T02:45:40.632Z" },
288
+ { url = "https://files.pythonhosted.org/packages/31/a3/a3e4a298d3db4a04085728f5ae6c8cda157e49c5bb784886d463b9fbff70/cryptography-45.0.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e328357b6bbf79928363dbf13f4635b7aac0306afb7e5ad24d21d0c5761c3253", size = 4189148, upload-time = "2025-05-18T02:45:42.538Z" },
289
+ { url = "https://files.pythonhosted.org/packages/53/90/100dfadd4663b389cb56972541ec1103490a19ebad0132af284114ba0868/cryptography-45.0.2-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49af56491473231159c98c2c26f1a8f3799a60e5cf0e872d00745b858ddac9d2", size = 4424113, upload-time = "2025-05-18T02:45:44.316Z" },
290
+ { url = "https://files.pythonhosted.org/packages/0d/40/e2b9177dbed6f3fcbbf1942e1acea2fd15b17007204b79d675540dd053af/cryptography-45.0.2-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f169469d04a23282de9d0be349499cb6683b6ff1b68901210faacac9b0c24b7d", size = 4189696, upload-time = "2025-05-18T02:45:46.622Z" },
291
+ { url = "https://files.pythonhosted.org/packages/70/ae/ec29c79f481e1767c2ff916424ba36f3cf7774de93bbd60428a3c52d1357/cryptography-45.0.2-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:9cfd1399064b13043082c660ddd97a0358e41c8b0dc7b77c1243e013d305c344", size = 3881498, upload-time = "2025-05-18T02:45:48.884Z" },
292
+ { url = "https://files.pythonhosted.org/packages/5f/4a/72937090e5637a232b2f73801c9361cd08404a2d4e620ca4ec58c7ea4b70/cryptography-45.0.2-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:18f8084b7ca3ce1b8d38bdfe33c48116edf9a08b4d056ef4a96dceaa36d8d965", size = 4451678, upload-time = "2025-05-18T02:45:50.706Z" },
293
+ { url = "https://files.pythonhosted.org/packages/d3/fa/1377fced81fd67a4a27514248261bb0d45c3c1e02169411fe231583088c8/cryptography-45.0.2-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:2cb03a944a1a412724d15a7c051d50e63a868031f26b6a312f2016965b661942", size = 4192296, upload-time = "2025-05-18T02:45:52.422Z" },
294
+ { url = "https://files.pythonhosted.org/packages/d1/cf/b6fe837c83a08b9df81e63299d75fc5b3c6d82cf24b3e1e0e331050e9e5c/cryptography-45.0.2-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:a9727a21957d3327cf6b7eb5ffc9e4b663909a25fea158e3fcbc49d4cdd7881b", size = 4451749, upload-time = "2025-05-18T02:45:55.025Z" },
295
+ { url = "https://files.pythonhosted.org/packages/af/d8/5a655675cc635c7190bfc8cffb84bcdc44fc62ce945ad1d844adaa884252/cryptography-45.0.2-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ddb8d01aa900b741d6b7cc585a97aff787175f160ab975e21f880e89d810781a", size = 4317601, upload-time = "2025-05-18T02:45:56.911Z" },
296
+ { url = "https://files.pythonhosted.org/packages/b9/d4/75d2375a20d80aa262a8adee77bf56950e9292929e394b9fae2481803f11/cryptography-45.0.2-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:c0c000c1a09f069632d8a9eb3b610ac029fcc682f1d69b758e625d6ee713f4ed", size = 4560535, upload-time = "2025-05-18T02:45:59.33Z" },
297
+ { url = "https://files.pythonhosted.org/packages/aa/18/c3a94474987ebcfb88692036b2ec44880d243fefa73794bdcbf748679a6e/cryptography-45.0.2-cp37-abi3-win32.whl", hash = "sha256:08281de408e7eb71ba3cd5098709a356bfdf65eebd7ee7633c3610f0aa80d79b", size = 2922045, upload-time = "2025-05-18T02:46:01.012Z" },
298
+ { url = "https://files.pythonhosted.org/packages/63/63/fb28b30c144182fd44ce93d13ab859791adbf923e43bdfb610024bfecda1/cryptography-45.0.2-cp37-abi3-win_amd64.whl", hash = "sha256:48caa55c528617fa6db1a9c3bf2e37ccb31b73e098ac2b71408d1f2db551dde4", size = 3393321, upload-time = "2025-05-18T02:46:03.441Z" },
299
+ { url = "https://files.pythonhosted.org/packages/6e/f5/d1d4dead3b269671cda7be6d6b2970b25398e84219681cb397139bdce88b/cryptography-45.0.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a8ec324711596fbf21837d3a5db543937dd84597d364769b46e0102250023f77", size = 3578517, upload-time = "2025-05-18T02:46:05.263Z" },
300
+ { url = "https://files.pythonhosted.org/packages/ac/7b/00e18d24f08bc642e4018e0066a6f872d85c744e3265910c3beabb1f4d73/cryptography-45.0.2-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:965611880c3fa8e504b7458484c0697e00ae6e937279cd6734fdaa2bc954dc49", size = 4135515, upload-time = "2025-05-18T02:46:07.241Z" },
301
+ { url = "https://files.pythonhosted.org/packages/29/9f/ea7ad5239c33c36f0e2cbdf631a0e3b7633466e87e55923f5b5ea1b0b92d/cryptography-45.0.2-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d891942592789fa0ab71b502550bbadb12f540d7413d7d7c4cef4b02af0f5bc6", size = 4378133, upload-time = "2025-05-18T02:46:09.035Z" },
302
+ { url = "https://files.pythonhosted.org/packages/47/f8/b4e29d87fbc4d2cf46b36e01fcb98305bf76699f34de6b877cddd8bc3a64/cryptography-45.0.2-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:b19f4b28dd2ef2e6d600307fee656c00825a2980c4356a7080bd758d633c3a6f", size = 4136787, upload-time = "2025-05-18T02:46:10.772Z" },
303
+ { url = "https://files.pythonhosted.org/packages/dc/7c/ac19bbf24d261667a67aac712d8aa3bb740f94bc2391f06ccc90e783f3ff/cryptography-45.0.2-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:7c73968fbb7698a4c5d6160859db560d3aac160edde89c751edd5a8bc6560c88", size = 4377741, upload-time = "2025-05-18T02:46:13.215Z" },
304
+ { url = "https://files.pythonhosted.org/packages/e2/69/51f1c3d03ef4e3bcac4d3f00738f6ac0a205199809e2b92368b6f15a9ec4/cryptography-45.0.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:501de1296b2041dccf2115e3c7d4947430585601b251b140970ce255c5cfb985", size = 3326934, upload-time = "2025-05-18T02:46:15.081Z" },
305
+ { url = "https://files.pythonhosted.org/packages/d7/74/2a0fb642c4c34d8c46c12b6eac89b10769b378c7b6a901ff94a8d4ba1b52/cryptography-45.0.2-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1655d3a76e3dedb683c982a6c3a2cbfae2d08f47a48ec5a3d58db52b3d29ea6f", size = 3587805, upload-time = "2025-05-18T02:46:17.531Z" },
306
+ { url = "https://files.pythonhosted.org/packages/8a/18/57bc98fa5d93e74c2c2b16a3c5383f7ec218f957aa44559c0008a46c3629/cryptography-45.0.2-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dc7693573f16535428183de8fd27f0ca1ca37a51baa0b41dc5ed7b3d68fe80e2", size = 4143347, upload-time = "2025-05-18T02:46:19.934Z" },
307
+ { url = "https://files.pythonhosted.org/packages/84/6f/d015e7e7bd7f3a6c538973005de5a780d93b68138c2d88c804422cf46b1c/cryptography-45.0.2-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:614bca7c6ed0d8ad1dce683a6289afae1f880675b4090878a0136c3da16bc693", size = 4387414, upload-time = "2025-05-18T02:46:21.944Z" },
308
+ { url = "https://files.pythonhosted.org/packages/de/9e/fa5ec89cce7e4b86e430438da4d66b79113bdf321d0a00167d34b61daf19/cryptography-45.0.2-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:4142e20c29224cec63e9e32eb1e6014fb285fe39b7be66b3564ca978a3a8afe9", size = 4145849, upload-time = "2025-05-18T02:46:24.327Z" },
309
+ { url = "https://files.pythonhosted.org/packages/7c/09/5887d4fcc6f9c6fb19920789d094c4e25c2f604cc1b10b7e69d6f56187fe/cryptography-45.0.2-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:9a900036b42f7324df7c7ad9569eb92ba0b613cf699160dd9c2154b24fd02f8e", size = 4387449, upload-time = "2025-05-18T02:46:26.144Z" },
310
+ { url = "https://files.pythonhosted.org/packages/a5/4a/e27ab71dc3e517becc3f2ae358454bb4b78c0cb5af52f8e11b8943525ea6/cryptography-45.0.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:057723b79752a142efbc609e90b0dff27b0361ccbee3bd48312d70f5cdf53b78", size = 3335090, upload-time = "2025-05-18T02:46:27.913Z" },
311
311
  ]
312
312
 
313
313
  [[package]]
File without changes
File without changes
File without changes
File without changes
File without changes