qbraid-cli 0.12.0a3__tar.gz → 0.12.0a4__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.
- {qbraid_cli-0.12.0a3/qbraid_cli.egg-info → qbraid_cli-0.12.0a4}/PKG-INFO +1 -1
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/pyproject.toml +1 -1
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/qbraid_cli/account/app.py +2 -2
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/qbraid_cli/devices/app.py +42 -28
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/qbraid_cli/devices/validation.py +6 -2
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/qbraid_cli/jobs/app.py +58 -34
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4/qbraid_cli.egg-info}/PKG-INFO +1 -1
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/LICENSE +0 -0
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/README.md +0 -0
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/qbraid_cli/__init__.py +0 -0
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/qbraid_cli/_version.py +0 -0
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/qbraid_cli/account/__init__.py +0 -0
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/qbraid_cli/admin/__init__.py +0 -0
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/qbraid_cli/admin/app.py +0 -0
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/qbraid_cli/admin/headers.py +0 -0
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/qbraid_cli/admin/validation.py +0 -0
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/qbraid_cli/chat/__init__.py +0 -0
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/qbraid_cli/chat/app.py +0 -0
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/qbraid_cli/configure/__init__.py +0 -0
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/qbraid_cli/configure/actions.py +0 -0
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/qbraid_cli/configure/app.py +0 -0
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/qbraid_cli/configure/claude_config.py +0 -0
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/qbraid_cli/devices/__init__.py +0 -0
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/qbraid_cli/envs/__init__.py +0 -0
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/qbraid_cli/envs/activate.py +0 -0
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/qbraid_cli/envs/app.py +0 -0
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/qbraid_cli/envs/create.py +0 -0
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/qbraid_cli/envs/data_handling.py +0 -0
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/qbraid_cli/exceptions.py +0 -0
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/qbraid_cli/files/__init__.py +0 -0
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/qbraid_cli/files/app.py +0 -0
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/qbraid_cli/handlers.py +0 -0
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/qbraid_cli/jobs/__init__.py +0 -0
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/qbraid_cli/jobs/toggle_braket.py +0 -0
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/qbraid_cli/jobs/validation.py +0 -0
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/qbraid_cli/kernels/__init__.py +0 -0
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/qbraid_cli/kernels/app.py +0 -0
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/qbraid_cli/main.py +0 -0
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/qbraid_cli/mcp/__init__.py +0 -0
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/qbraid_cli/mcp/app.py +0 -0
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/qbraid_cli/mcp/serve.py +0 -0
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/qbraid_cli/pip/__init__.py +0 -0
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/qbraid_cli/pip/app.py +0 -0
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/qbraid_cli/pip/hooks.py +0 -0
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/qbraid_cli/py.typed +0 -0
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/qbraid_cli.egg-info/SOURCES.txt +0 -0
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/qbraid_cli.egg-info/dependency_links.txt +0 -0
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/qbraid_cli.egg-info/entry_points.txt +0 -0
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/qbraid_cli.egg-info/requires.txt +0 -0
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/qbraid_cli.egg-info/top_level.txt +0 -0
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/setup.cfg +0 -0
- {qbraid_cli-0.12.0a3 → qbraid_cli-0.12.0a4}/tests/test_version.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: qbraid-cli
|
|
3
|
-
Version: 0.12.
|
|
3
|
+
Version: 0.12.0a4
|
|
4
4
|
Summary: Command Line Interface for interacting with all parts of the qBraid platform.
|
|
5
5
|
Author-email: qBraid Development Team <contact@qbraid.com>
|
|
6
6
|
License-Expression: LicenseRef-Proprietary
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "qbraid-cli"
|
|
7
|
-
version = "0.12.
|
|
7
|
+
version = "0.12.0a4"
|
|
8
8
|
description = "Command Line Interface for interacting with all parts of the qBraid platform."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
authors = [{ name = "qBraid Development Team", email = "contact@qbraid.com" }]
|
|
@@ -22,9 +22,9 @@ def account_credits():
|
|
|
22
22
|
"""Get number of qBraid credits remaining."""
|
|
23
23
|
|
|
24
24
|
def get_credits() -> float:
|
|
25
|
-
from qbraid_core import
|
|
25
|
+
from qbraid_core.client import QbraidClientV1
|
|
26
26
|
|
|
27
|
-
client =
|
|
27
|
+
client = QbraidClientV1()
|
|
28
28
|
return client.user_credits_value()
|
|
29
29
|
|
|
30
30
|
qbraid_credits: float = run_progress_task(get_credits)
|
|
@@ -6,7 +6,7 @@ Module defining commands in the 'qbraid devices' namespace.
|
|
|
6
6
|
|
|
7
7
|
"""
|
|
8
8
|
|
|
9
|
-
from typing import Any,
|
|
9
|
+
from typing import Any, Optional
|
|
10
10
|
|
|
11
11
|
import typer
|
|
12
12
|
from rich.console import Console
|
|
@@ -18,9 +18,13 @@ devices_app = typer.Typer(help="Manage qBraid quantum devices.", no_args_is_help
|
|
|
18
18
|
|
|
19
19
|
|
|
20
20
|
@devices_app.command(name="list")
|
|
21
|
-
def devices_list(
|
|
21
|
+
def devices_list(
|
|
22
22
|
status: Optional[str] = typer.Option(
|
|
23
|
-
None,
|
|
23
|
+
None,
|
|
24
|
+
"--status",
|
|
25
|
+
"-s",
|
|
26
|
+
help="'ONLINE'|'OFFLINE'|'UNAVAILABLE'|'RETIRED'",
|
|
27
|
+
callback=validate_status,
|
|
24
28
|
),
|
|
25
29
|
device_type: Optional[str] = typer.Option(
|
|
26
30
|
None, "--type", "-t", help="'QPU'|'SIMULATOR'", callback=validate_type
|
|
@@ -37,51 +41,58 @@ def devices_list( # pylint: disable=too-many-branches
|
|
|
37
41
|
),
|
|
38
42
|
) -> None:
|
|
39
43
|
"""List qBraid quantum devices."""
|
|
40
|
-
filters = {}
|
|
41
|
-
if status:
|
|
42
|
-
filters["status"] = status
|
|
43
|
-
if device_type:
|
|
44
|
-
filters["type"] = "Simulator" if device_type == "SIMULATOR" else device_type
|
|
45
|
-
if provider:
|
|
46
|
-
filters["provider"] = provider
|
|
47
44
|
|
|
48
|
-
def
|
|
49
|
-
from qbraid_core.services.
|
|
45
|
+
def fetch_devices():
|
|
46
|
+
from qbraid_core.services.runtime import QuantumRuntimeClient
|
|
50
47
|
|
|
51
|
-
client =
|
|
48
|
+
client = QuantumRuntimeClient()
|
|
49
|
+
return client.list_devices()
|
|
52
50
|
|
|
53
|
-
|
|
51
|
+
devices = run_progress_task(fetch_devices)
|
|
54
52
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
53
|
+
# Apply filters (client returns all devices, we filter locally)
|
|
54
|
+
if status:
|
|
55
|
+
devices = [d for d in devices if d.status.value == status]
|
|
56
|
+
if device_type:
|
|
57
|
+
devices = [d for d in devices if d.deviceType == device_type]
|
|
58
|
+
if provider:
|
|
59
|
+
devices = [d for d in devices if d.vendor.lower() == provider.lower()]
|
|
59
60
|
|
|
60
61
|
console = Console()
|
|
61
|
-
header_1 = "
|
|
62
|
+
header_1 = "Vendor"
|
|
62
63
|
header_2 = "Device Name"
|
|
63
|
-
header_3 = "
|
|
64
|
+
header_3 = "QRN"
|
|
64
65
|
header_4 = "Status"
|
|
65
66
|
console.print(
|
|
66
|
-
f"[bold]{header_1.ljust(12)}{header_2.ljust(35)}{header_3.ljust(
|
|
67
|
+
f"[bold]{header_1.ljust(12)}{header_2.ljust(35)}{header_3.ljust(50)}{header_4}[/bold]"
|
|
67
68
|
)
|
|
68
|
-
|
|
69
|
+
|
|
70
|
+
for device in devices:
|
|
71
|
+
device_status = device.status.value
|
|
69
72
|
if device_status == "ONLINE":
|
|
70
73
|
status_color = "green"
|
|
71
74
|
elif device_status == "OFFLINE":
|
|
72
75
|
status_color = "red"
|
|
76
|
+
elif device_status == "UNAVAILABLE":
|
|
77
|
+
status_color = "yellow"
|
|
73
78
|
else:
|
|
74
79
|
status_color = "grey"
|
|
80
|
+
|
|
81
|
+
# Truncate long names/qrns for display
|
|
82
|
+
name = device.name[:33] + ".." if len(device.name) > 35 else device.name
|
|
83
|
+
qrn = device.qrn[:48] + ".." if len(device.qrn) > 50 else device.qrn
|
|
84
|
+
|
|
75
85
|
console.print(
|
|
76
|
-
f"{
|
|
86
|
+
f"{device.vendor.ljust(12)}{name.ljust(35)}{qrn.ljust(50)}",
|
|
77
87
|
f"[{status_color}]{device_status}[/{status_color}]",
|
|
78
88
|
)
|
|
79
|
-
|
|
89
|
+
|
|
90
|
+
console.print(f"\n[italic]Displaying {len(devices)} devices[/italic]")
|
|
80
91
|
|
|
81
92
|
|
|
82
93
|
@devices_app.command(name="get")
|
|
83
94
|
def devices_get(
|
|
84
|
-
device_id: str = typer.Argument(..., help="The ID of the device to get."),
|
|
95
|
+
device_id: str = typer.Argument(..., help="The QRN or ID of the device to get."),
|
|
85
96
|
fmt: bool = typer.Option(
|
|
86
97
|
True, "--no-fmt", help="Disable rich console formatting (output raw data)"
|
|
87
98
|
),
|
|
@@ -89,12 +100,15 @@ def devices_get(
|
|
|
89
100
|
"""Get a qBraid quantum device."""
|
|
90
101
|
|
|
91
102
|
def get_device():
|
|
92
|
-
from qbraid_core.services.
|
|
103
|
+
from qbraid_core.services.runtime import QuantumRuntimeClient
|
|
93
104
|
|
|
94
|
-
client =
|
|
105
|
+
client = QuantumRuntimeClient()
|
|
95
106
|
return client.get_device(device_id)
|
|
96
107
|
|
|
97
|
-
|
|
108
|
+
device = run_progress_task(get_device)
|
|
109
|
+
|
|
110
|
+
# Convert Pydantic model to dict for display
|
|
111
|
+
data: dict[str, Any] = device.model_dump()
|
|
98
112
|
|
|
99
113
|
print_formatted_data(data, fmt)
|
|
100
114
|
|
|
@@ -13,7 +13,7 @@ from qbraid_cli.handlers import validate_item
|
|
|
13
13
|
|
|
14
14
|
def validate_status(value: Optional[str]) -> Union[str, None]:
|
|
15
15
|
"""Validate device status query parameter."""
|
|
16
|
-
return validate_item(value, ["ONLINE", "OFFLINE", "RETIRED"], "Status")
|
|
16
|
+
return validate_item(value, ["ONLINE", "OFFLINE", "UNAVAILABLE", "RETIRED"], "Status")
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
def validate_type(value: Optional[str]) -> Union[str, None]:
|
|
@@ -23,4 +23,8 @@ def validate_type(value: Optional[str]) -> Union[str, None]:
|
|
|
23
23
|
|
|
24
24
|
def validate_provider(value: Optional[str]) -> Union[str, None]:
|
|
25
25
|
"""Validate device provider query parameter."""
|
|
26
|
-
return validate_item(
|
|
26
|
+
return validate_item(
|
|
27
|
+
value,
|
|
28
|
+
["aws", "azure", "ibm", "ionq", "qbraid"],
|
|
29
|
+
"Provider",
|
|
30
|
+
)
|
|
@@ -6,7 +6,7 @@ Module defining commands in the 'qbraid jobs' namespace.
|
|
|
6
6
|
|
|
7
7
|
"""
|
|
8
8
|
|
|
9
|
-
from typing import Any, Callable
|
|
9
|
+
from typing import Any, Callable, Optional
|
|
10
10
|
|
|
11
11
|
import typer
|
|
12
12
|
from rich.console import Console
|
|
@@ -95,59 +95,80 @@ def jobs_list(
|
|
|
95
95
|
limit: int = typer.Option(
|
|
96
96
|
10, "--limit", "-l", help="Limit the maximum number of results returned"
|
|
97
97
|
),
|
|
98
|
+
status: Optional[str] = typer.Option(
|
|
99
|
+
None,
|
|
100
|
+
"--status",
|
|
101
|
+
"-s",
|
|
102
|
+
help="Filter by status (QUEUED, RUNNING, COMPLETED, FAILED, CANCELLED)",
|
|
103
|
+
),
|
|
104
|
+
vendor: Optional[str] = typer.Option(
|
|
105
|
+
None, "--vendor", "-v", help="Filter by vendor (aws, azure, ibm, ionq, qbraid)"
|
|
106
|
+
),
|
|
98
107
|
) -> None:
|
|
99
108
|
"""List qBraid Quantum Jobs."""
|
|
100
109
|
|
|
101
|
-
def
|
|
102
|
-
from qbraid_core.services.
|
|
110
|
+
def fetch_jobs():
|
|
111
|
+
from qbraid_core.services.runtime import QuantumRuntimeClient
|
|
112
|
+
|
|
113
|
+
client = QuantumRuntimeClient()
|
|
114
|
+
return client.list_jobs(limit=limit, status=status, vendor=vendor)
|
|
103
115
|
|
|
104
|
-
|
|
116
|
+
try:
|
|
117
|
+
jobs = run_progress_task(fetch_jobs)
|
|
105
118
|
|
|
106
|
-
|
|
119
|
+
if not jobs:
|
|
120
|
+
console = Console()
|
|
121
|
+
console.print("[dim]No jobs found.[/dim]")
|
|
122
|
+
return
|
|
107
123
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
job_data, msg = process_job_data(raw_data)
|
|
124
|
+
# Calculate column width based on longest job QRN
|
|
125
|
+
longest_job_id = max(len(job.jobQrn) for job in jobs)
|
|
126
|
+
spacing = min(longest_job_id + 3, 50)
|
|
112
127
|
|
|
113
|
-
longest_job_id = max(len(item[0]) for item in job_data)
|
|
114
|
-
spacing = longest_job_id + 5
|
|
115
|
-
try:
|
|
116
128
|
console = Console()
|
|
117
|
-
header_1 = "Job
|
|
129
|
+
header_1 = "Job QRN"
|
|
118
130
|
header_2 = "Submitted"
|
|
119
131
|
header_3 = "Status"
|
|
120
|
-
console.print(f"[bold]{header_1.ljust(spacing)}{header_2.ljust(
|
|
121
|
-
|
|
122
|
-
|
|
132
|
+
console.print(f"[bold]{header_1.ljust(spacing)}{header_2.ljust(28)}{header_3}[/bold]")
|
|
133
|
+
|
|
134
|
+
for job in jobs:
|
|
135
|
+
job_status = job.status.value if hasattr(job.status, "value") else str(job.status)
|
|
136
|
+
|
|
137
|
+
# Format timestamp
|
|
138
|
+
if job.timeStamps and job.timeStamps.createdAt:
|
|
139
|
+
submitted = job.timeStamps.createdAt.strftime("%Y-%m-%d %H:%M:%S")
|
|
140
|
+
else:
|
|
141
|
+
submitted = "N/A"
|
|
142
|
+
|
|
143
|
+
# Color based on status
|
|
144
|
+
if job_status == "COMPLETED":
|
|
123
145
|
status_color = "green"
|
|
124
|
-
elif
|
|
146
|
+
elif job_status in ["FAILED", "CANCELLED"]:
|
|
125
147
|
status_color = "red"
|
|
126
|
-
elif
|
|
127
|
-
"INITIALIZING",
|
|
128
|
-
"INITIALIZED",
|
|
129
|
-
"CREATED",
|
|
130
|
-
"QUEUED",
|
|
131
|
-
"VALIDATING",
|
|
132
|
-
"RUNNING",
|
|
133
|
-
]:
|
|
148
|
+
elif job_status in ["INITIALIZING", "QUEUED", "VALIDATING", "RUNNING"]:
|
|
134
149
|
status_color = "blue"
|
|
135
150
|
else:
|
|
136
151
|
status_color = "grey"
|
|
152
|
+
|
|
153
|
+
# Truncate long QRNs
|
|
154
|
+
job_qrn = job.jobQrn
|
|
155
|
+
if len(job_qrn) > spacing - 2:
|
|
156
|
+
job_qrn = job_qrn[: spacing - 4] + ".."
|
|
157
|
+
|
|
137
158
|
console.print(
|
|
138
|
-
f"{
|
|
139
|
-
f"[{status_color}]{
|
|
159
|
+
f"{job_qrn.ljust(spacing)}{submitted.ljust(28)}",
|
|
160
|
+
f"[{status_color}]{job_status}[/{status_color}]",
|
|
140
161
|
)
|
|
141
162
|
|
|
142
|
-
console.print(f"\n{
|
|
163
|
+
console.print(f"\n[italic]Displaying {len(jobs)} jobs[/italic]")
|
|
143
164
|
|
|
144
|
-
except Exception: # pylint: disable=broad-exception-caught
|
|
145
|
-
handle_error(message="Failed to fetch quantum jobs
|
|
165
|
+
except Exception as err: # pylint: disable=broad-exception-caught
|
|
166
|
+
handle_error(message=f"Failed to fetch quantum jobs: {err}")
|
|
146
167
|
|
|
147
168
|
|
|
148
169
|
@jobs_app.command(name="get")
|
|
149
170
|
def jobs_get(
|
|
150
|
-
job_id: str = typer.Argument(..., help="The ID of the job to get."),
|
|
171
|
+
job_id: str = typer.Argument(..., help="The QRN or ID of the job to get."),
|
|
151
172
|
fmt: bool = typer.Option(
|
|
152
173
|
True, "--no-fmt", help="Disable rich console formatting (output raw data)"
|
|
153
174
|
),
|
|
@@ -155,12 +176,15 @@ def jobs_get(
|
|
|
155
176
|
"""Get a qBraid Quantum Job."""
|
|
156
177
|
|
|
157
178
|
def get_job():
|
|
158
|
-
from qbraid_core.services.
|
|
179
|
+
from qbraid_core.services.runtime import QuantumRuntimeClient
|
|
159
180
|
|
|
160
|
-
client =
|
|
181
|
+
client = QuantumRuntimeClient()
|
|
161
182
|
return client.get_job(job_id)
|
|
162
183
|
|
|
163
|
-
|
|
184
|
+
job = run_progress_task(get_job)
|
|
185
|
+
|
|
186
|
+
# Convert Pydantic model to dict for display
|
|
187
|
+
data: dict[str, Any] = job.model_dump()
|
|
164
188
|
|
|
165
189
|
print_formatted_data(data, fmt)
|
|
166
190
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: qbraid-cli
|
|
3
|
-
Version: 0.12.
|
|
3
|
+
Version: 0.12.0a4
|
|
4
4
|
Summary: Command Line Interface for interacting with all parts of the qBraid platform.
|
|
5
5
|
Author-email: qBraid Development Team <contact@qbraid.com>
|
|
6
6
|
License-Expression: LicenseRef-Proprietary
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|