lightning-sdk 2025.8.1__py3-none-any.whl → 2025.8.6rc0__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.
- lightning_sdk/__init__.py +1 -1
- lightning_sdk/api/deployment_api.py +6 -4
- lightning_sdk/api/job_api.py +2 -0
- lightning_sdk/api/mmt_api.py +2 -0
- lightning_sdk/deployment/deployment.py +5 -0
- lightning_sdk/lightning_cloud/login.py +1 -8
- lightning_sdk/pipeline/steps.py +30 -1
- {lightning_sdk-2025.8.1.dist-info → lightning_sdk-2025.8.6rc0.dist-info}/METADATA +1 -1
- {lightning_sdk-2025.8.1.dist-info → lightning_sdk-2025.8.6rc0.dist-info}/RECORD +13 -13
- {lightning_sdk-2025.8.1.dist-info → lightning_sdk-2025.8.6rc0.dist-info}/LICENSE +0 -0
- {lightning_sdk-2025.8.1.dist-info → lightning_sdk-2025.8.6rc0.dist-info}/WHEEL +0 -0
- {lightning_sdk-2025.8.1.dist-info → lightning_sdk-2025.8.6rc0.dist-info}/entry_points.txt +0 -0
- {lightning_sdk-2025.8.1.dist-info → lightning_sdk-2025.8.6rc0.dist-info}/top_level.txt +0 -0
lightning_sdk/__init__.py
CHANGED
|
@@ -103,7 +103,7 @@ class ExecHealthCheck(HealthCheck):
|
|
|
103
103
|
self,
|
|
104
104
|
command: str,
|
|
105
105
|
initial_delay_seconds: int = 0,
|
|
106
|
-
failure_threshold: int =
|
|
106
|
+
failure_threshold: int = 3600,
|
|
107
107
|
interval_seconds: int = 1,
|
|
108
108
|
timeout_seconds: int = 30,
|
|
109
109
|
) -> None:
|
|
@@ -132,7 +132,7 @@ class HttpHealthCheck(HealthCheck):
|
|
|
132
132
|
path: str,
|
|
133
133
|
port: float,
|
|
134
134
|
initial_delay_seconds: int = 0,
|
|
135
|
-
failure_threshold: int =
|
|
135
|
+
failure_threshold: int = 3600,
|
|
136
136
|
interval_seconds: int = 1,
|
|
137
137
|
timeout_seconds: int = 30,
|
|
138
138
|
) -> None:
|
|
@@ -538,10 +538,10 @@ def to_health_check(
|
|
|
538
538
|
# Use Default health check if none is provided
|
|
539
539
|
if not health_check:
|
|
540
540
|
return V1JobHealthCheckConfig(
|
|
541
|
-
failure_threshold=
|
|
541
|
+
failure_threshold=3600,
|
|
542
542
|
initial_delay_seconds=0,
|
|
543
543
|
interval_seconds=1,
|
|
544
|
-
timeout_seconds=
|
|
544
|
+
timeout_seconds=60,
|
|
545
545
|
)
|
|
546
546
|
|
|
547
547
|
health_check_config = V1JobHealthCheckConfig(
|
|
@@ -574,6 +574,7 @@ def to_spec(
|
|
|
574
574
|
include_credentials: Optional[bool] = None,
|
|
575
575
|
cloudspace_id: Optional[None] = None,
|
|
576
576
|
max_runtime: Optional[int] = None,
|
|
577
|
+
machine_image_version: Optional[str] = None,
|
|
577
578
|
) -> V1JobSpec:
|
|
578
579
|
if cloud_account is None:
|
|
579
580
|
raise ValueError("The cloud account should be defined.")
|
|
@@ -607,6 +608,7 @@ def to_spec(
|
|
|
607
608
|
quantity=quantity,
|
|
608
609
|
include_credentials=include_credentials,
|
|
609
610
|
cloudspace_id=cloudspace_id,
|
|
611
|
+
machine_image_version=machine_image_version,
|
|
610
612
|
**optional_spec_kwargs,
|
|
611
613
|
)
|
|
612
614
|
|
lightning_sdk/api/job_api.py
CHANGED
|
@@ -288,6 +288,7 @@ class JobApiV2:
|
|
|
288
288
|
artifacts_local: Optional[str], # deprecated in favor of path_mappings
|
|
289
289
|
artifacts_remote: Optional[str], # deprecated in favor of path_mappings)
|
|
290
290
|
max_runtime: Optional[int] = None,
|
|
291
|
+
machine_image_version: Optional[str] = None,
|
|
291
292
|
) -> ProjectIdJobsBody:
|
|
292
293
|
env_vars = []
|
|
293
294
|
if env is not None:
|
|
@@ -322,6 +323,7 @@ class JobApiV2:
|
|
|
322
323
|
image_cluster_credentials=cloud_account_auth,
|
|
323
324
|
image_secret_ref=image_credentials or "",
|
|
324
325
|
path_mappings=path_mappings_list,
|
|
326
|
+
machine_image_version=machine_image_version,
|
|
325
327
|
**optional_spec_kwargs,
|
|
326
328
|
)
|
|
327
329
|
return ProjectIdJobsBody(name=name, spec=spec)
|
lightning_sdk/api/mmt_api.py
CHANGED
|
@@ -129,6 +129,7 @@ class MMTApiV2:
|
|
|
129
129
|
artifacts_local: Optional[str], # deprecated in favor of path_mappings
|
|
130
130
|
artifacts_remote: Optional[str], # deprecated in favor of path_mappings
|
|
131
131
|
max_runtime: Optional[int] = None,
|
|
132
|
+
machine_image_version: Optional[str] = None,
|
|
132
133
|
) -> ProjectIdMultimachinejobsBody:
|
|
133
134
|
env_vars = []
|
|
134
135
|
if env is not None:
|
|
@@ -163,6 +164,7 @@ class MMTApiV2:
|
|
|
163
164
|
image_cluster_credentials=cloud_account_auth,
|
|
164
165
|
image_secret_ref=image_credentials or "",
|
|
165
166
|
path_mappings=path_mappings_list,
|
|
167
|
+
machine_image_version=machine_image_version,
|
|
166
168
|
**optional_spec_kwargs,
|
|
167
169
|
)
|
|
168
170
|
return ProjectIdMultimachinejobsBody(
|
|
@@ -171,14 +171,18 @@ class Deployment:
|
|
|
171
171
|
if self._is_created:
|
|
172
172
|
raise RuntimeError("This deployment has already been started.")
|
|
173
173
|
|
|
174
|
+
machine_image_version = None
|
|
175
|
+
|
|
174
176
|
if isinstance(studio, Studio):
|
|
175
177
|
cloudspace_id = studio._studio.id
|
|
176
178
|
cloud_account = studio._studio.cluster_id
|
|
179
|
+
machine_image_version = studio._studio.machine_image_version
|
|
177
180
|
|
|
178
181
|
if isinstance(studio, str):
|
|
179
182
|
studio = Studio(studio)
|
|
180
183
|
cloudspace_id = studio._studio.id
|
|
181
184
|
cloud_account = studio._studio.cluster_id
|
|
185
|
+
machine_image_version = studio._studio.machine_image_version
|
|
182
186
|
|
|
183
187
|
if cloud_account is None:
|
|
184
188
|
cloud_account = _resolve_deprecated_cluster(cloud_account, cluster)
|
|
@@ -233,6 +237,7 @@ class Deployment:
|
|
|
233
237
|
include_credentials=include_credentials if include_credentials is not None else True,
|
|
234
238
|
cloudspace_id=cloudspace_id,
|
|
235
239
|
max_runtime=max_runtime,
|
|
240
|
+
machine_image_version=machine_image_version,
|
|
236
241
|
),
|
|
237
242
|
strategy=to_strategy(release_strategy),
|
|
238
243
|
),
|
|
@@ -43,14 +43,7 @@ class Auth:
|
|
|
43
43
|
for key in Keys:
|
|
44
44
|
setattr(self, key.suffix, os.environ.get(key.value, None))
|
|
45
45
|
|
|
46
|
-
|
|
47
|
-
self._with_env_var = bool(self.user_id and self.api_key)
|
|
48
|
-
if self.api_key and not self.user_id:
|
|
49
|
-
raise ValueError(
|
|
50
|
-
f"{Keys.USER_ID.value} is missing from env variables. "
|
|
51
|
-
"To use env vars for authentication both "
|
|
52
|
-
f"{Keys.USER_ID.value} and {Keys.API_KEY.value} should be set."
|
|
53
|
-
)
|
|
46
|
+
self._with_env_var = bool(self.api_key)
|
|
54
47
|
|
|
55
48
|
def load(self) -> bool:
|
|
56
49
|
"""Load credentials from disk and update properties with credentials.
|
lightning_sdk/pipeline/steps.py
CHANGED
|
@@ -59,6 +59,7 @@ class DeploymentStep:
|
|
|
59
59
|
include_credentials: Optional[bool] = None,
|
|
60
60
|
max_runtime: Optional[int] = None,
|
|
61
61
|
wait_for: Optional[Union[str, List[str]]] = DEFAULT,
|
|
62
|
+
cloud_provider: Optional[Union["CloudProvider", str]] = None,
|
|
62
63
|
) -> None:
|
|
63
64
|
self.name = name
|
|
64
65
|
self.studio = _get_studio(studio)
|
|
@@ -99,11 +100,28 @@ class DeploymentStep:
|
|
|
99
100
|
self.include_credentials = include_credentials or True
|
|
100
101
|
self.max_runtime = max_runtime
|
|
101
102
|
self.wait_for = wait_for
|
|
103
|
+
self.cloud_provider = cloud_provider
|
|
102
104
|
|
|
103
105
|
def to_proto(
|
|
104
106
|
self, teamspace: "Teamspace", cloud_account: str, shared_filesystem: Union[bool, V1SharedFilesystem]
|
|
105
107
|
) -> V1PipelineStep:
|
|
106
|
-
|
|
108
|
+
machine_image_version = None
|
|
109
|
+
|
|
110
|
+
studio = _get_studio(self.studio)
|
|
111
|
+
if isinstance(studio, Studio):
|
|
112
|
+
machine_image_version = studio._studio.machine_image_version
|
|
113
|
+
|
|
114
|
+
if self.cloud_account is None:
|
|
115
|
+
self.cloud_account = studio.cloud_account
|
|
116
|
+
elif studio.cloud_account != self.cloud_account:
|
|
117
|
+
raise ValueError("The provided cloud account doesn't match the studio")
|
|
118
|
+
|
|
119
|
+
resolved_cloud_account = CloudAccountApi().resolve_cloud_account(
|
|
120
|
+
teamspace.id, self.cloud_account, self.cloud_provider, teamspace.default_cloud_account
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
_validate_cloud_account(cloud_account, resolved_cloud_account, shared_filesystem)
|
|
124
|
+
|
|
107
125
|
return V1PipelineStep(
|
|
108
126
|
name=self.name,
|
|
109
127
|
type=V1PipelineStepType.DEPLOYMENT,
|
|
@@ -127,6 +145,7 @@ class DeploymentStep:
|
|
|
127
145
|
cloudspace_id=self.studio._studio.id if self.studio else None,
|
|
128
146
|
include_credentials=self.include_credentials,
|
|
129
147
|
max_runtime=self.max_runtime,
|
|
148
|
+
machine_image_version=machine_image_version,
|
|
130
149
|
),
|
|
131
150
|
strategy=to_strategy(self.release_strategy),
|
|
132
151
|
),
|
|
@@ -186,8 +205,12 @@ class JobStep:
|
|
|
186
205
|
def to_proto(
|
|
187
206
|
self, teamspace: "Teamspace", cloud_account: str, shared_filesystem: Union[bool, V1SharedFilesystem]
|
|
188
207
|
) -> V1PipelineStep:
|
|
208
|
+
machine_image_version = None
|
|
209
|
+
|
|
189
210
|
studio = _get_studio(self.studio)
|
|
190
211
|
if isinstance(studio, Studio):
|
|
212
|
+
machine_image_version = studio._studio.machine_image_version
|
|
213
|
+
|
|
191
214
|
if self.cloud_account is None:
|
|
192
215
|
self.cloud_account = studio.cloud_account
|
|
193
216
|
elif studio.cloud_account != self.cloud_account:
|
|
@@ -215,6 +238,7 @@ class JobStep:
|
|
|
215
238
|
artifacts_local=None,
|
|
216
239
|
artifacts_remote=None,
|
|
217
240
|
max_runtime=self.max_runtime,
|
|
241
|
+
machine_image_version=machine_image_version,
|
|
218
242
|
)
|
|
219
243
|
|
|
220
244
|
return V1PipelineStep(
|
|
@@ -277,8 +301,12 @@ class MMTStep:
|
|
|
277
301
|
def to_proto(
|
|
278
302
|
self, teamspace: "Teamspace", cloud_account: str, shared_filesystem: Union[bool, V1SharedFilesystem]
|
|
279
303
|
) -> V1PipelineStep:
|
|
304
|
+
machine_image_version = None
|
|
305
|
+
|
|
280
306
|
studio = _get_studio(self.studio)
|
|
281
307
|
if isinstance(studio, Studio):
|
|
308
|
+
machine_image_version = studio._studio.machine_image_version
|
|
309
|
+
|
|
282
310
|
if self.cloud_account is None:
|
|
283
311
|
self.cloud_account = studio.cloud_account
|
|
284
312
|
elif studio.cloud_account != self.cloud_account:
|
|
@@ -303,6 +331,7 @@ class MMTStep:
|
|
|
303
331
|
artifacts_local=None, # deprecated in favor of path_mappings
|
|
304
332
|
artifacts_remote=None, # deprecated in favor of path_mappings
|
|
305
333
|
max_runtime=self.max_runtime,
|
|
334
|
+
machine_image_version=machine_image_version,
|
|
306
335
|
)
|
|
307
336
|
|
|
308
337
|
return V1PipelineStep(
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
docs/source/conf.py,sha256=r8yX20eC-4mHhMTd0SbQb5TlSWHhO6wnJ0VJ_FBFpag,13249
|
|
2
|
-
lightning_sdk/__init__.py,sha256=
|
|
2
|
+
lightning_sdk/__init__.py,sha256=I-NEEYsT0l2oHbX8ai0KlhtH5pqVw2A_Hh4oJP29_6o,1148
|
|
3
3
|
lightning_sdk/agents.py,sha256=ly6Ma1j0ZgGPFyvPvMN28JWiB9dATIstFa5XM8pMi6I,1577
|
|
4
4
|
lightning_sdk/ai_hub.py,sha256=iI1vNhgcz_Ff1c3rN1ogN7dK-r-HXRj6NMtS2cA14UA,6925
|
|
5
5
|
lightning_sdk/base_studio.py,sha256=_Pwwl37R9GRd7t-f2kO5aQXiLNrP4sUtUNht2ZkP8LE,3678
|
|
@@ -22,12 +22,12 @@ lightning_sdk/api/agents_api.py,sha256=G47TbFo9kYqnBMqdw2RW-lfS1VAUBSXDmzs6fpIEM
|
|
|
22
22
|
lightning_sdk/api/ai_hub_api.py,sha256=azqDZ-PzasVAcoQHno7k7OO_xFOHQ4NDozxF8jEh83Y,7864
|
|
23
23
|
lightning_sdk/api/base_studio_api.py,sha256=3R8tucZX2e9yKHBcY2rWFRP4dxqLrC6H75vdBDkH0ck,3617
|
|
24
24
|
lightning_sdk/api/cloud_account_api.py,sha256=Rxet7QuXjzkeAok-_azvB0r_koO7K-NioAldmFVsibs,8223
|
|
25
|
-
lightning_sdk/api/deployment_api.py,sha256=
|
|
26
|
-
lightning_sdk/api/job_api.py,sha256=
|
|
25
|
+
lightning_sdk/api/deployment_api.py,sha256=v2AfoTDkQ-1CBh75FOjFkRpf6yc3U_edDy43uYSn19I,24852
|
|
26
|
+
lightning_sdk/api/job_api.py,sha256=7spFPyotlSQ0Krx6WymslnpSQaaeOmFkydvhtg6p0Ic,16410
|
|
27
27
|
lightning_sdk/api/license_api.py,sha256=XV3RhefyPQDYjwY9AaBZe4rByZTEAnsvLDxcdm9q0Wo,2438
|
|
28
28
|
lightning_sdk/api/lit_container_api.py,sha256=jCJVwd-3MNjejL9FyvH89pzt-SeG3G8qCJD16iTMJAQ,11454
|
|
29
29
|
lightning_sdk/api/llm_api.py,sha256=oc3OB1l0Jca5Nc6MAkfI-Nq-42hXJkgmkSqn22J4TeA,9261
|
|
30
|
-
lightning_sdk/api/mmt_api.py,sha256=
|
|
30
|
+
lightning_sdk/api/mmt_api.py,sha256=hIBsGiJ2qn5UjcHDxP5WUyKGT_AIFfpSHrQVwg0afBw,10699
|
|
31
31
|
lightning_sdk/api/org_api.py,sha256=Ze3z_ATVrukobujV5YdC42DKj45Vuwl7X52q_Vr-o3U,803
|
|
32
32
|
lightning_sdk/api/pipeline_api.py,sha256=rJYp_FN7uUjC5xbc6K67l2eRSmVuOkijd5i8Nm5BF7I,4621
|
|
33
33
|
lightning_sdk/api/studio_api.py,sha256=LbZQ2HtOHNcLXLtrOtG1jhkqNOhqfelBxIQy6lSbirQ,32306
|
|
@@ -65,7 +65,7 @@ lightning_sdk/cli/deploy/_auth.py,sha256=ccIzl0W9hJtFmhdEAn1xcBGIHQfO4d_k8grTbq4
|
|
|
65
65
|
lightning_sdk/cli/deploy/devbox.py,sha256=HOQMWehwaveawVTyBDaZhNZs_NL5g4RCWs_lf0hIW5U,6800
|
|
66
66
|
lightning_sdk/cli/deploy/serve.py,sha256=K2e7gz1gg_UTr0j5FuI1_EKRa0t6hRaoHGpwFAXRSso,15040
|
|
67
67
|
lightning_sdk/deployment/__init__.py,sha256=dXsa4psDzFYFklsq3JC-2V_L4FQjGZnQAf-ZiVlqG9c,545
|
|
68
|
-
lightning_sdk/deployment/deployment.py,sha256=
|
|
68
|
+
lightning_sdk/deployment/deployment.py,sha256=7Sk4ORKmgMDk7Owpk_q-89ws8-Y9orX0jRZF99tNv1E,21775
|
|
69
69
|
lightning_sdk/job/__init__.py,sha256=1MxjQ6rHkyUHCypSW9RuXuVMVH11WiqhIXcU2LCFMwE,64
|
|
70
70
|
lightning_sdk/job/base.py,sha256=GAE7wvTH9e_F9bU8sogT88EMCP4D0d1deZMeVmBtWTE,20856
|
|
71
71
|
lightning_sdk/job/job.py,sha256=jPlW3u34lJ6tpszm-Q6EHzWrfMIpQfM7-z8UCFFVyaE,14780
|
|
@@ -75,7 +75,7 @@ lightning_sdk/job/work.py,sha256=aRknNDja-96qQaYw0fNboEGtOZCmvztYEzUPxLNAt8g,245
|
|
|
75
75
|
lightning_sdk/lightning_cloud/__init__.py,sha256=o91SMAlwr4Ke5ESe8fHjqXcj31_h7rT-MlFoXA-n2EI,173
|
|
76
76
|
lightning_sdk/lightning_cloud/__version__.py,sha256=lOfmWHtjmiuSG28TbKQqd2B3nwmSGOlKVFwhaj_cRJk,23
|
|
77
77
|
lightning_sdk/lightning_cloud/env.py,sha256=XZXpF4sD9jlB8DY0herTy_8XiUJuDVjxy5APjRD2_aU,1379
|
|
78
|
-
lightning_sdk/lightning_cloud/login.py,sha256=
|
|
78
|
+
lightning_sdk/lightning_cloud/login.py,sha256=HGfixrD_j5pifen3KvnYGmTE3ZeR-z8AXN3aSN0x73U,7275
|
|
79
79
|
lightning_sdk/lightning_cloud/rest_client.py,sha256=K2J_QXihpbp5tVzs9PzffgMCQY1NeH5tRpuJBYj27vU,7125
|
|
80
80
|
lightning_sdk/lightning_cloud/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
81
81
|
lightning_sdk/lightning_cloud/cli/__main__.py,sha256=aHrigVV0qIp74MuYTdN6uO8a9Xp6E1aOwdR8w1fG-7c,688
|
|
@@ -1100,7 +1100,7 @@ lightning_sdk/pipeline/__init__.py,sha256=Sja_0NJ8vgh-2ThSVP3WDI9a9qghrWd21LkaQp
|
|
|
1100
1100
|
lightning_sdk/pipeline/pipeline.py,sha256=A11Q_bRhiQm89n-VcdaXBJsvK8Yb_EY_IijOGnBmPoI,6163
|
|
1101
1101
|
lightning_sdk/pipeline/printer.py,sha256=fsewFE_nnI-x5KscviYvQbKgNcgMyn-uT0UWlArGn-8,4828
|
|
1102
1102
|
lightning_sdk/pipeline/schedule.py,sha256=J6lfjeuUMqGhX6xo6-qIliyi7KmB4e8BimTKJh7cJXY,20059
|
|
1103
|
-
lightning_sdk/pipeline/steps.py,sha256=
|
|
1103
|
+
lightning_sdk/pipeline/steps.py,sha256=wCpZr8MOXCEWJ3_WMwtuxMpqAG6ZT8ep2vnA9Jhl8hs,14164
|
|
1104
1104
|
lightning_sdk/pipeline/utils.py,sha256=3L7UgY78w2VAVSQmelQNnz_X9zJdFo1NJBtez221ge0,3923
|
|
1105
1105
|
lightning_sdk/services/__init__.py,sha256=wi1yv0SCnfJub5tOq8y9SblK3-CEseHJuvH-HmtAy7U,229
|
|
1106
1106
|
lightning_sdk/services/file_endpoint.py,sha256=we5HC_o74J4Y6fSP_31jIizi_I_1FO_Rb2qblspD9eE,7855
|
|
@@ -1111,9 +1111,9 @@ lightning_sdk/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSu
|
|
|
1111
1111
|
lightning_sdk/utils/dynamic.py,sha256=glUTO1JC9APtQ6Gr9SO02a3zr56-sPAXM5C3NrTpgyQ,1959
|
|
1112
1112
|
lightning_sdk/utils/enum.py,sha256=h2JRzqoBcSlUdanFHmkj_j5DleBHAu1esQYUsdNI-hU,4106
|
|
1113
1113
|
lightning_sdk/utils/resolve.py,sha256=JjHwWNQq375d1JBcVkJrZWkcTehvuTxF2h6awvSUDoo,8094
|
|
1114
|
-
lightning_sdk-2025.8.
|
|
1115
|
-
lightning_sdk-2025.8.
|
|
1116
|
-
lightning_sdk-2025.8.
|
|
1117
|
-
lightning_sdk-2025.8.
|
|
1118
|
-
lightning_sdk-2025.8.
|
|
1119
|
-
lightning_sdk-2025.8.
|
|
1114
|
+
lightning_sdk-2025.8.6rc0.dist-info/LICENSE,sha256=uFIuZwj5z-4TeF2UuacPZ1o17HkvKObT8fY50qN84sg,1064
|
|
1115
|
+
lightning_sdk-2025.8.6rc0.dist-info/METADATA,sha256=e_zqAI7G1vHn8qXPosKEI2zyIKCuX_9zW1ux7RjYCK4,4110
|
|
1116
|
+
lightning_sdk-2025.8.6rc0.dist-info/WHEEL,sha256=iAkIy5fosb7FzIOwONchHf19Qu7_1wCWyFNR5gu9nU0,91
|
|
1117
|
+
lightning_sdk-2025.8.6rc0.dist-info/entry_points.txt,sha256=msB9PJWIJ784dX-OP8by51d4IbKYH3Fj1vCuA9oXjHY,68
|
|
1118
|
+
lightning_sdk-2025.8.6rc0.dist-info/top_level.txt,sha256=ps8doKILFXmN7F1mHncShmnQoTxKBRPIcchC8TpoBw4,19
|
|
1119
|
+
lightning_sdk-2025.8.6rc0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|