vantage6 5.0.0a18__py3-none-any.whl → 5.0.0a20__py3-none-any.whl

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.

Potentially problematic release.


This version of vantage6 might be problematic. Click here for more details.

@@ -417,8 +417,7 @@ class NodeCLITest(unittest.TestCase):
417
417
  @patch("vantage6.cli.node.common.debug")
418
418
  @patch("vantage6.cli.node.common.error")
419
419
  @patch("vantage6.cli.node.common.UserClient")
420
- @patch("vantage6.cli.node.common.q")
421
- def test_client(self, q, client, error, debug, info):
420
+ def test_client(self, client, error, debug, info):
422
421
  ctx = MagicMock(
423
422
  config={
424
423
  "server_url": "localhost",
tests_cli/test_wizard.py CHANGED
@@ -29,8 +29,10 @@ class WizardTest(unittest.TestCase):
29
29
  result[name] = None
30
30
  return result
31
31
 
32
- def test_node_wizard(self):
32
+ @patch("vantage6.cli.configuration_wizard.NodeClient.authenticate")
33
+ def test_node_wizard(self, authenticate):
33
34
  """An error is printed when docker is not running"""
35
+ authenticate.return_value = None
34
36
 
35
37
  with patch(f"{module_path}.q") as q:
36
38
  q.unsafe_prompt.side_effect = self.prompts
@@ -99,7 +101,6 @@ class WizardTest(unittest.TestCase):
99
101
  "api_path",
100
102
  "uri",
101
103
  "allow_drop_all",
102
- "jwt_secret_key",
103
104
  "logging",
104
105
  "vpn_server",
105
106
  "rabbitmq",
vantage6/cli/__build__ CHANGED
@@ -1 +1 @@
1
- 18
1
+ 20
@@ -1,3 +1,4 @@
1
+ import os
1
2
  from pathlib import Path
2
3
 
3
4
  import questionary as q
@@ -9,6 +10,7 @@ from vantage6.common.globals import (
9
10
  NodePolicy,
10
11
  Ports,
11
12
  DEFAULT_API_PATH,
13
+ RequiredNodeEnvVars,
12
14
  )
13
15
  from vantage6.common.client.node_client import NodeClient
14
16
  from vantage6.common.context import AppContext
@@ -168,9 +170,14 @@ def node_configuration_questionaire(dirs: dict, instance_name: str) -> dict:
168
170
  }
169
171
 
170
172
  # Check if we can login to the server to retrieve collaboration settings
171
- client = NodeClient(config["server_url"], config["port"], config["api_path"])
173
+ client = NodeClient(
174
+ instance_name,
175
+ config["api_key"],
176
+ server_url=f"{config['server_url']}:{config['port']}{config['api_path']}",
177
+ auth_url=os.environ.get(RequiredNodeEnvVars.KEYCLOAK_URL.value),
178
+ )
172
179
  try:
173
- client.authenticate(config["api_key"])
180
+ client.authenticate()
174
181
  except Exception as e:
175
182
  error(f"Could not authenticate with server: {e}")
176
183
  error("Please check (1) your API key and (2) if your server is online")
@@ -494,7 +501,7 @@ def algo_store_configuration_questionaire(instance_name: str) -> dict:
494
501
  default_v6_server_uri = (
495
502
  f"http://localhost:{Ports.DEV_SERVER.value}{DEFAULT_API_PATH}"
496
503
  )
497
- default_root_username = "root"
504
+ default_root_username = "admin"
498
505
 
499
506
  v6_server_uri = q.text(
500
507
  "What is the Vantage6 server linked to the algorithm store? "
@@ -314,7 +314,6 @@ def create_vserver_config(
314
314
  server_config = template.render(
315
315
  port=port,
316
316
  host_uri=server_url,
317
- jwt_secret_key=generate_apikey(),
318
317
  user_provided_config=extra_config,
319
318
  ui_port=ui_port,
320
319
  store_port=store_port,
@@ -2,12 +2,12 @@
2
2
  Common functions that are used in node CLI commands
3
3
  """
4
4
 
5
- import questionary as q
5
+ import os
6
6
  import docker
7
7
  from colorama import Fore, Style
8
8
 
9
9
  from vantage6.common import error, info, debug
10
- from vantage6.common.globals import APPNAME, InstanceType
10
+ from vantage6.common.globals import APPNAME, InstanceType, RequiredNodeEnvVars
11
11
  from vantage6.client import UserClient
12
12
 
13
13
  from vantage6.cli.context.node import NodeContext
@@ -35,12 +35,14 @@ def create_client(ctx: NodeContext) -> UserClient:
35
35
  port = ctx.config["port"]
36
36
  api_path = ctx.config["api_path"]
37
37
  info(f"Connecting to server at '{host}:{port}{api_path}'")
38
- return UserClient(host, port, api_path, log_level="warn")
38
+ return UserClient(
39
+ server_url=f"{host}:{port}{api_path}",
40
+ auth_url=os.environ.get(RequiredNodeEnvVars.KEYCLOAK_URL.value),
41
+ log_level="warn",
42
+ )
39
43
 
40
44
 
41
- def create_client_and_authenticate(
42
- ctx: NodeContext, ask_mfa: bool = False
43
- ) -> UserClient:
45
+ def create_client_and_authenticate(ctx: NodeContext) -> UserClient:
44
46
  """
45
47
  Generate a client and authenticate with the server.
46
48
 
@@ -48,8 +50,6 @@ def create_client_and_authenticate(
48
50
  ----------
49
51
  ctx : NodeContext
50
52
  Context of the node loaded from the configuration file
51
- ask_mfa : bool, optional
52
- Whether to ask for MFA code, by default False
53
53
 
54
54
  Returns
55
55
  -------
@@ -59,14 +59,7 @@ def create_client_and_authenticate(
59
59
  client = create_client(ctx)
60
60
 
61
61
  try:
62
- username, password, mfa_code = _get_auth_data()
63
- except KeyboardInterrupt:
64
- error("Authentication aborted.")
65
- exit(1)
66
-
67
- try:
68
- client.authenticate(username, password, mfa_code=mfa_code)
69
-
62
+ client.authenticate()
70
63
  except Exception as exc:
71
64
  error("Could not authenticate with server!")
72
65
  debug(exc)
@@ -75,21 +68,6 @@ def create_client_and_authenticate(
75
68
  return client
76
69
 
77
70
 
78
- def _get_auth_data() -> tuple[str, str, str]:
79
- """
80
- Get authentication data from the user.
81
-
82
- Returns
83
- -------
84
- tuple[str, str, str]
85
- Tuple containing username, password and MFA code
86
- """
87
- username = q.text("Username:").unsafe_ask()
88
- password = q.password("Password:").unsafe_ask()
89
- mfa_code = q.text("MFA code:").unsafe_ask()
90
- return username, password, mfa_code
91
-
92
-
93
71
  def select_node(name: str, system_folders: bool) -> tuple[str, str]:
94
72
  """
95
73
  Let user select node through questionnaire if name is not given.
@@ -59,21 +59,13 @@ from vantage6.cli.node.common import select_node, create_client_and_authenticate
59
59
  default=False,
60
60
  help="Overwrite existing private key if present",
61
61
  )
62
- @click.option(
63
- "--mfa",
64
- "ask_mfa",
65
- flag_value=True,
66
- default=False,
67
- help="Ask for multi-factor authentication code. Use this if MFA is enabled on the server.",
68
- )
69
62
  def cli_node_create_private_key(
70
63
  name: str,
71
64
  config: str,
72
65
  system_folders: bool,
73
66
  upload: bool,
74
- organization_name: str,
67
+ organization_name: str | None,
75
68
  overwrite: bool,
76
- ask_mfa: bool,
77
69
  ) -> None:
78
70
  """
79
71
  Create and upload a new private key
@@ -97,7 +89,7 @@ def cli_node_create_private_key(
97
89
  # Authenticate with the server to obtain organization name if it wasn't
98
90
  # provided
99
91
  if organization_name is None:
100
- client = create_client_and_authenticate(ctx, ask_mfa)
92
+ client = create_client_and_authenticate(ctx)
101
93
  organization_name = client.whoami.organization_name
102
94
 
103
95
  # create directory where private key goes if it doesn't exist yet
@@ -25,7 +25,6 @@ logging:
25
25
  name: requests_oauthlib.oauth2_session
26
26
  port: {{ port }}
27
27
  uri: sqlite:///default.sqlite
28
- jwt_secret_key: {{ jwt_secret_key }}
29
28
  dev:
30
29
  host_uri: {{ host_uri }}
31
30
  server_url: http://localhost:{{ port }}/api
@@ -8,22 +8,29 @@ from vantage6.cli.test.common.diagnostic_runner import DiagnosticRunner
8
8
 
9
9
 
10
10
  @click.command()
11
- @click.option("--host", type=str, default="http://localhost", help="URL of the server")
12
11
  @click.option(
13
- "--port", type=int, default=Ports.DEV_SERVER.value, help="Port of the server"
12
+ "--server-url",
13
+ type=str,
14
+ default=f"http://localhost:{Ports.DEV_SERVER.value}/api",
15
+ help="URL of the server",
16
+ )
17
+ @click.option(
18
+ "--auth-url",
19
+ type=str,
20
+ default="http://localhost:8080",
21
+ help="URL of the authentication server (Keycloak)",
14
22
  )
15
- @click.option("--api-path", type=str, default="/api", help="API path of the server")
16
23
  @click.option(
17
- "--username",
24
+ "--auth-realm",
18
25
  type=str,
19
- default="dev_admin",
20
- help="Username of vantage6 user account to create the task with",
26
+ default="vantage6",
27
+ help="Realm of the authentication server (Keycloak)",
21
28
  )
22
29
  @click.option(
23
- "--password",
30
+ "--auth-client",
24
31
  type=str,
25
- default="password",
26
- help="Password of vantage6 user account to create the task with",
32
+ default="public_client",
33
+ help="Client ID of the authentication server (Keycloak)",
27
34
  )
28
35
  @click.option(
29
36
  "--collaboration",
@@ -56,25 +63,17 @@ from vantage6.cli.test.common.diagnostic_runner import DiagnosticRunner
56
63
  default=None,
57
64
  help="Path to the private key for end-to-end encryption",
58
65
  )
59
- @click.option(
60
- "--mfa-code",
61
- type=str,
62
- help="Multi-factor authentication code. Use this if MFA is enabled on the "
63
- "server.",
64
- )
65
66
  def cli_test_features(
66
- host: str,
67
- port: int,
68
- api_path: str,
69
- username: str,
70
- password: str,
67
+ server_url: str,
68
+ auth_url: str,
69
+ auth_realm: str,
70
+ auth_client: str,
71
71
  collaboration: int,
72
72
  organizations: list[int] | None,
73
73
  all_nodes: bool,
74
74
  online_only: bool,
75
75
  no_vpn: bool,
76
76
  private_key: str | None,
77
- mfa_code: str | None,
78
77
  ) -> list[dict]:
79
78
  """
80
79
  Run diagnostic checks on an existing vantage6 network.
@@ -89,8 +88,14 @@ def cli_test_features(
89
88
  if all_nodes or not organizations:
90
89
  organizations = None
91
90
 
92
- client = UserClient(host=host, port=port, path=api_path, log_level="critical")
93
- client.authenticate(username=username, password=password, mfa_code=mfa_code)
91
+ client = UserClient(
92
+ server_url=server_url,
93
+ auth_url=auth_url,
94
+ auth_realm=auth_realm,
95
+ auth_client=auth_client,
96
+ log_level="critical",
97
+ )
98
+ client.authenticate()
94
99
  client.setup_encryption(private_key)
95
100
  diagnose = DiagnosticRunner(client, collaboration, organizations, online_only)
96
101
  res = diagnose(base=True, vpn=not no_vpn)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: vantage6
3
- Version: 5.0.0a18
3
+ Version: 5.0.0a20
4
4
  Summary: vantage6 command line interface
5
5
  Home-page: https://github.com/vantage6/vantage6
6
6
  Requires-Python: >=3.10
@@ -16,8 +16,8 @@ Requires-Dist: questionary==1.10.0
16
16
  Requires-Dist: rich==13.5.2
17
17
  Requires-Dist: schema==0.7.5
18
18
  Requires-Dist: sqlalchemy==2.0.37
19
- Requires-Dist: vantage6-common==5.0.0a18
20
- Requires-Dist: vantage6-client==5.0.0a18
19
+ Requires-Dist: vantage6-common==5.0.0a20
20
+ Requires-Dist: vantage6-client==5.0.0a20
21
21
  Provides-Extra: dev
22
22
  Requires-Dist: coverage==6.4.4; extra == "dev"
23
23
  Requires-Dist: black; extra == "dev"
@@ -42,7 +42,6 @@ Requires-Dist: pre-commit; extra == "dev"
42
42
  [![Discord](https://img.shields.io/discord/643526403207331841)](https://discord.gg/yAyFf6Y)
43
43
  [![Research software directory](https://img.shields.io/badge/rsd-vantage6-deepskyblue)](https://research-software-directory.org/software/vantage6)
44
44
 
45
-
46
45
  </h3>
47
46
 
48
47
  <p align="center">
@@ -129,8 +128,12 @@ For example, you can create a new organization by running:
129
128
  ```python
130
129
  from vantage6.client import Client
131
130
 
132
- client = Client('http://127.0.0.1', 7601, '/api', log_level='debug')
133
- client.authenticate('dev_admin', 'password')
131
+ client = Client(
132
+ server_url='http://127.0.0.1:7601/api',
133
+ auth_url='http://127.0.0.1:8080',
134
+ log_level='debug'
135
+ )
136
+ client.authenticate()
134
137
  client.setup_encryption(None)
135
138
 
136
139
  client.organization.create(
@@ -195,10 +198,10 @@ And finally there are some images released for algorithm development:
195
198
 
196
199
  ## :gift_heart: Join the community!
197
200
 
198
- We hope to continue developing, improving, and supporting **vantage6** with the help of
199
- the federated learning community. If you are interested in contributing, first of all,
200
- thank you! Second, please take a look at our
201
- [contributing guidelines](https://docs.vantage6.ai/en/main/devops/contribute.html)
201
+ We hope to continue developing, improving, and supporting **vantage6** with the help of
202
+ the federated learning community. If you are interested in contributing, first of all,
203
+ thank you! Second, please take a look at our
204
+ [contributing guidelines](https://docs.vantage6.ai/en/main/devops/contribute.html)
202
205
  and our [code of conduct](CODE_OF_CONDUCT.md).
203
206
 
204
207
  <a href="https://github.com/vantage6/vantage6/graphs/contributors">
@@ -1,14 +1,14 @@
1
1
  tests_cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  tests_cli/test_example.py,sha256=0fw_v-lgZEacshWSDwLNyLMA1_xc48bKUGM3ll-n1L0,146
3
- tests_cli/test_node_cli.py,sha256=ajFdG1sTa9H7PjqK2dhcp3k59HGsJyO6ZoRfxgIUHcA,16842
3
+ tests_cli/test_node_cli.py,sha256=jM-nZkcvdEwwHVgQi8C7cYAbTJOzVmFl60MFXYVH9ig,16798
4
4
  tests_cli/test_server_cli.py,sha256=Yv6k0mkqElrpPgFtro_OH2Bjixz7mDXioxhvXr9VsAQ,6550
5
- tests_cli/test_wizard.py,sha256=NIj59eiCBuVNJXwhofrWLmLIKAsD45gSOzqOFWLmWhY,4916
6
- vantage6/cli/__build__,sha256=TslZn8ID0XajAVNsLgkaGbyFJ1myVb1oGIEKQsX-0Uo,2
5
+ tests_cli/test_wizard.py,sha256=D0bIMqYJ8vgl4_hTQOH5Tb8JAFt1bIfPzU9zNSvYf8o,5009
6
+ vantage6/cli/__build__,sha256=9co490ih1ur3JrikL7V1w8cfGGSoFDMBeC3hPaLZICs,2
7
7
  vantage6/cli/__init__.py,sha256=ZXbeQ_-g2-M4XYteWZkoO5lMFYhqjm5doQgGy1fq8i0,125
8
8
  vantage6/cli/_version.py,sha256=iDijqhgy5jzZ0LAyzW1LlXeeuMcHWMyg9D8xbXtV7Ck,696
9
9
  vantage6/cli/cli.py,sha256=B0F328FSBBslwplMPk8lIlr0r-taKuCgb8v9DIdyE3Q,5699
10
10
  vantage6/cli/configuration_manager.py,sha256=CHGyYkHT8sIaEZjRrmWuiiDPfFdpFEbpl-yV5jG7OgM,3563
11
- vantage6/cli/configuration_wizard.py,sha256=ifqvrVqHkxoM0ZVUVIwlYXFByzAbuVlahNjmwFGLVRU,20874
11
+ vantage6/cli/configuration_wizard.py,sha256=aNpddEbUAye9HTVgo63_bwvnyKlC6FydDgURcmkkpzI,21048
12
12
  vantage6/cli/globals.py,sha256=ZmZHYG5Zm38L5eBSNXUaEznmL9bZHOU6F86aYAExq0I,1732
13
13
  vantage6/cli/utils.py,sha256=Jfr6IeHMQDk_wU5X7rJ1dRY118dhVVX8PwzwMYMv9Vw,2481
14
14
  vantage6/cli/algorithm/create.py,sha256=kRT1BlBcb0fDaB2Q988WxtA6EyAZmOW5QoU2uhbwBIo,2075
@@ -28,11 +28,11 @@ vantage6/cli/context/algorithm_store.py,sha256=RimxNcoqfWeu2WQede6wsOu1rx-azzXIP
28
28
  vantage6/cli/context/base_server.py,sha256=paKSzNrKWD-J6eakHAtGELk2cD05A8NqoCAuQfF7c2s,2972
29
29
  vantage6/cli/context/node.py,sha256=vEmlWtx7V0e5yqRp9Yi-FhIzSDd4LgnXPVXKYn2n048,7370
30
30
  vantage6/cli/context/server.py,sha256=vBGJWNsJoVcIryX5OLiWnFklNRcjOVkhqm2U5tqW5b0,3946
31
- vantage6/cli/dev/create.py,sha256=6LiK0MUZjZK_W932WnlMMVeCqX1L11F87Rk1UkU6O-4,19347
31
+ vantage6/cli/dev/create.py,sha256=yjG3y2phQw-yIiR2AIy1BpUG3oPVa-b0t7oeqCe1prA,19305
32
32
  vantage6/cli/dev/remove.py,sha256=R_OU_LXLDCnoD-2xnegg4lh0B3t8EgpqzDqueLx16io,3730
33
33
  vantage6/cli/node/attach.py,sha256=cmouPrkbIbg21_wlAe-L-ecmrKVxiDkzGmEtRaCnKQY,276
34
34
  vantage6/cli/node/clean.py,sha256=uCty2GNuwoTybs1nIOygQLxtbleQ-rnnS6_4ieWVmCw,1199
35
- vantage6/cli/node/create_private_key.py,sha256=yciL1DtACxrBeEGxeaDi0NefDTvegG6s4rr5jA9J5TY,5207
35
+ vantage6/cli/node/create_private_key.py,sha256=iGLK8x1aOmeObq-vZxlveosiqx1R0myfjU64R5lR0ho,5005
36
36
  vantage6/cli/node/files.py,sha256=V7bJeR8weX0Llpp6y9wQoNrRsvlotEE6e70aTJp9j6M,1331
37
37
  vantage6/cli/node/list.py,sha256=_WZ8EBIEUlzFhVp3cR2MK5FUuQicMEZHhD8npMwKSpM,1664
38
38
  vantage6/cli/node/new.py,sha256=wuv8mdL4sLV91TJMIksU8dx2LlcUFrA1oORyiICruMw,2039
@@ -42,7 +42,7 @@ vantage6/cli/node/set_api_key.py,sha256=2kB8wveTy9_N8kX4huVhJhY86Ppd2BI8v-d7MRXQ
42
42
  vantage6/cli/node/start.py,sha256=mV4vDBBtFcxva4MJdg5ymsstefDM4bV4pmhSsVX1o4k,12407
43
43
  vantage6/cli/node/stop.py,sha256=Hf5z2r6ttbW-DeU0cdHNXIJcgL-eIVRv8i7zZLo4foY,4159
44
44
  vantage6/cli/node/version.py,sha256=X921xyIvIPYObPac2Si5msZ2tay5ySidnPWmGj1ilZw,1959
45
- vantage6/cli/node/common/__init__.py,sha256=ziGS3skkX6Kf4uvFqe22kdFbSck7mubNK5a-KgDAxX8,3467
45
+ vantage6/cli/node/common/__init__.py,sha256=-nNEqN4Cfzkkz7ughjm0FErGI8NgcOzpKw4va5-0W-E,2882
46
46
  vantage6/cli/rabbitmq/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
47
47
  vantage6/cli/rabbitmq/definitions.py,sha256=CcS9jG7ZGB6LjzHQqZ2FliDurPItUvNSjHrOYptORZg,637
48
48
  vantage6/cli/rabbitmq/queue_manager.py,sha256=KGDGHy4NBN8O9xhjzfI7mh65i9lOQIqQwrOFqvGFdHI,7545
@@ -60,13 +60,13 @@ vantage6/cli/server/version.py,sha256=aXAztHEky_F2jPbfPdHPfsAY7rdTurl0_3S6bL94_Q
60
60
  vantage6/cli/server/common/__init__.py,sha256=htv0mFYa4GhIHdzA2xqUUgKhHcMh09UQERlIjIgrwOM,2062
61
61
  vantage6/cli/template/algo_store_config.j2,sha256=XR-ly-47p6egH8lVh4lZZDh3YSV4kFnkZprdsfSkS2Y,552
62
62
  vantage6/cli/template/node_config.j2,sha256=EyVKeyW0qAyvdUNSXTHUzPKRNunAMyn-cDTKiSyTbDc,730
63
- vantage6/cli/template/server_config.j2,sha256=3gEPY8YlqUMAQEgfR7a1HTU8WaCRhVzTS-IwPhsU1Gg,802
63
+ vantage6/cli/template/server_config.j2,sha256=K7svQM6HTmMrlKPVW9cbNPloH7LicBoLdIEiarD6CP8,765
64
64
  vantage6/cli/template/server_import_config.j2,sha256=9WT2XeG9-ADoYLb4ahXhof3i9Fcvg0oqwNPyFwLJpvc,1827
65
- vantage6/cli/test/feature_tester.py,sha256=M8hvebupPwYjcBZoUB8GB3qb8G1-d3ipNzRMc_3-Z8E,2761
65
+ vantage6/cli/test/feature_tester.py,sha256=Jd-dSB_4HRcvkDnAMs57m4WK0SDHsqTmg9ON56wnEOc,2634
66
66
  vantage6/cli/test/integration_test.py,sha256=MctR_t-WEyxzFpMdc6ByTcX1BQglZiT5-CIOQXTBBWo,4034
67
67
  vantage6/cli/test/common/diagnostic_runner.py,sha256=F8vEaCD6HeKWDcQGVzRkPYxdvEk9owqfciOVdN3bHbw,6607
68
- vantage6-5.0.0a18.dist-info/METADATA,sha256=BdqMJySslN2GpvxNSbFmTOhI-Q4vbAedD_tSJKbXhS0,10887
69
- vantage6-5.0.0a18.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
70
- vantage6-5.0.0a18.dist-info/entry_points.txt,sha256=YFBvwjxoeAGxYyPC-YevEgOBBYRGaXkS6jiOGGCLNy0,157
71
- vantage6-5.0.0a18.dist-info/top_level.txt,sha256=CYDIBS8jEfFq5YCs_Fuit54K9-3wdosZppTrsymIoUk,19
72
- vantage6-5.0.0a18.dist-info/RECORD,,
68
+ vantage6-5.0.0a20.dist-info/METADATA,sha256=tqcWvRAB1eIY-PC3aIUZjkodH9F-1-ZtGdDH56x6xyk,10907
69
+ vantage6-5.0.0a20.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
70
+ vantage6-5.0.0a20.dist-info/entry_points.txt,sha256=YFBvwjxoeAGxYyPC-YevEgOBBYRGaXkS6jiOGGCLNy0,157
71
+ vantage6-5.0.0a20.dist-info/top_level.txt,sha256=CYDIBS8jEfFq5YCs_Fuit54K9-3wdosZppTrsymIoUk,19
72
+ vantage6-5.0.0a20.dist-info/RECORD,,