cmsdials 2.2.0__tar.gz → 2.3.0__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.
- {cmsdials-2.2.0 → cmsdials-2.3.0}/.gitlab-ci.yml +2 -2
- {cmsdials-2.2.0 → cmsdials-2.3.0}/PKG-INFO +5 -5
- {cmsdials-2.2.0 → cmsdials-2.3.0}/README.md +4 -4
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/_version.py +3 -3
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/clients/workspace/client.py +3 -3
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials.egg-info/PKG-INFO +5 -5
- cmsdials-2.3.0/cmsdials.egg-info/scm_version.json +8 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/tests/integration/env.py +4 -4
- {cmsdials-2.2.0 → cmsdials-2.3.0}/tests/integration/test_auth_client.py +3 -3
- {cmsdials-2.2.0 → cmsdials-2.3.0}/tests/integration/utils.py +2 -2
- {cmsdials-2.2.0 → cmsdials-2.3.0}/tox.ini +1 -1
- cmsdials-2.2.0/cmsdials.egg-info/scm_version.json +0 -8
- {cmsdials-2.2.0 → cmsdials-2.3.0}/.coveragerc +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/.editorconfig +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/.gitignore +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/.mailmap +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/.pre-commit-config.yaml +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/.tool-versions +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/LICENSE +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/__init__.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/auth/__init__.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/auth/_base.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/auth/bearer.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/auth/client.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/auth/exceptions.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/auth/models.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/auth/secret_key.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/clients/__init__.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/clients/dataset_index/__init__.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/clients/dataset_index/client.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/clients/dataset_index/models.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/clients/file_index/__init__.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/clients/file_index/client.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/clients/file_index/models.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/clients/h1d/__init__.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/clients/h1d/client.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/clients/h1d/models.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/clients/h2d/__init__.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/clients/h2d/client.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/clients/h2d/models.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/clients/lumisection/__init__.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/clients/lumisection/client.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/clients/lumisection/models.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/clients/mes/__init__.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/clients/mes/client.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/clients/mes/models.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/clients/ml_bad_lumisection/__init__.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/clients/ml_bad_lumisection/client.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/clients/ml_bad_lumisection/models.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/clients/ml_models_index/__init__.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/clients/ml_models_index/client.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/clients/ml_models_index/models.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/clients/oms_proxy/__init__.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/clients/oms_proxy/client.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/clients/oms_proxy/models.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/clients/run/__init__.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/clients/run/client.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/clients/run/models.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/clients/workspace/__init__.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/cmsdials.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/filters.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/utils/__init__.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/utils/_json.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/utils/api_client.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/utils/base_model.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials/utils/logger.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials.egg-info/SOURCES.txt +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials.egg-info/dependency_links.txt +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials.egg-info/requires.txt +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials.egg-info/scm_file_list.json +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/cmsdials.egg-info/top_level.txt +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/mypy.ini +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/pyproject.toml +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/pytest.ini +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/ruff.toml +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/setup.cfg +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/tests/integration/__init__.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/tests/integration/test_file_index_client.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/tests/integration/test_h1d_client.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/tests/integration/test_h2d_client.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/tests/integration/test_lumisection_client.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/tests/integration/test_mes_client.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/tests/integration/test_oms_proxy_client.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/tests/integration/test_resume.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/tests/integration/test_run_client.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/tests/unit/__init__.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/tests/unit/test_auth.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/tests/unit/test_base_api_client.py +0 -0
- {cmsdials-2.2.0 → cmsdials-2.3.0}/uv.lock +0 -0
|
@@ -81,8 +81,8 @@ test_matrix:
|
|
|
81
81
|
coverage_format: cobertura
|
|
82
82
|
path: coverage.xml
|
|
83
83
|
variables:
|
|
84
|
-
|
|
85
|
-
# Application owning
|
|
84
|
+
CLIENT_SECRET: "$CLIENT_SECRET"
|
|
85
|
+
# Application owning CLIENT_SECRET, enables the api-access token tests
|
|
86
86
|
CLIENT_ID: "cms-dials-dev-api-client-test"
|
|
87
87
|
rules:
|
|
88
88
|
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: cmsdials
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.3.0
|
|
4
4
|
Summary: The Python api client interface to DIALS service
|
|
5
5
|
Author-email: Gabriel Moreira <gabriel.moreira@cern.ch>
|
|
6
6
|
Project-URL: Repository, https://gitlab.cern.ch/cms-dqmdc/libraries/dials-py
|
|
@@ -368,15 +368,15 @@ uv pip install -e .
|
|
|
368
368
|
The repository has some tests written to make sure DIALS responses are compatible with pydantic metaclasses, you can use pytest to run all tests but you need to specify a secret key to authenticate non-interactively against DIALS api:
|
|
369
369
|
|
|
370
370
|
```bash
|
|
371
|
-
|
|
371
|
+
CLIENT_SECRET=... uv run pytest tests
|
|
372
372
|
```
|
|
373
373
|
|
|
374
|
-
The secret key is an api client enabled secret key and can be obtained from the applications portal, any api client secret key whitelisted in DIALS can be used. Set `CLIENT_ID` to the client id of the same application to test the api-access token flow (`
|
|
374
|
+
The secret key is an api client enabled secret key and can be obtained from the applications portal, any api client secret key whitelisted in DIALS can be used. Set `CLIENT_ID` to the client id of the same application to test the api-access token flow (`CLIENT_SECRET=... CLIENT_ID=... uv run pytest tests`); otherwise those tests are skipped and the deprecated `X-CLIENT-SECRET` header is used. Tests target the dev Keycloak applications by default, overwrite them with `AUTH_CLIENT_ID` and `AUTH_AUDIENCE`. The interactive authentication flow should be tested manually, an example for this can be found in [test_auth_client.py](/tests/integration/test_auth_client.py).
|
|
375
375
|
|
|
376
376
|
If testing against a local version of DIALS you need to specify the BASE_URL:
|
|
377
377
|
|
|
378
378
|
```bash
|
|
379
|
-
|
|
379
|
+
CLIENT_SECRET=... BASE_URL=http://localhost:8000 uv run pytest tests
|
|
380
380
|
```
|
|
381
381
|
|
|
382
382
|
#### Tox
|
|
@@ -384,7 +384,7 @@ SECRET_KEY=... BASE_URL=http://localhost:8000 uv run pytest tests
|
|
|
384
384
|
Tox is pre-configured in `tox.ini`, so you can run the following to test against multiple python versions locally:
|
|
385
385
|
|
|
386
386
|
```bash
|
|
387
|
-
|
|
387
|
+
CLIENT_SECRET=... uv run tox
|
|
388
388
|
```
|
|
389
389
|
|
|
390
390
|
**[asdf](https://asdf-vm.com/) users**
|
|
@@ -345,15 +345,15 @@ uv pip install -e .
|
|
|
345
345
|
The repository has some tests written to make sure DIALS responses are compatible with pydantic metaclasses, you can use pytest to run all tests but you need to specify a secret key to authenticate non-interactively against DIALS api:
|
|
346
346
|
|
|
347
347
|
```bash
|
|
348
|
-
|
|
348
|
+
CLIENT_SECRET=... uv run pytest tests
|
|
349
349
|
```
|
|
350
350
|
|
|
351
|
-
The secret key is an api client enabled secret key and can be obtained from the applications portal, any api client secret key whitelisted in DIALS can be used. Set `CLIENT_ID` to the client id of the same application to test the api-access token flow (`
|
|
351
|
+
The secret key is an api client enabled secret key and can be obtained from the applications portal, any api client secret key whitelisted in DIALS can be used. Set `CLIENT_ID` to the client id of the same application to test the api-access token flow (`CLIENT_SECRET=... CLIENT_ID=... uv run pytest tests`); otherwise those tests are skipped and the deprecated `X-CLIENT-SECRET` header is used. Tests target the dev Keycloak applications by default, overwrite them with `AUTH_CLIENT_ID` and `AUTH_AUDIENCE`. The interactive authentication flow should be tested manually, an example for this can be found in [test_auth_client.py](/tests/integration/test_auth_client.py).
|
|
352
352
|
|
|
353
353
|
If testing against a local version of DIALS you need to specify the BASE_URL:
|
|
354
354
|
|
|
355
355
|
```bash
|
|
356
|
-
|
|
356
|
+
CLIENT_SECRET=... BASE_URL=http://localhost:8000 uv run pytest tests
|
|
357
357
|
```
|
|
358
358
|
|
|
359
359
|
#### Tox
|
|
@@ -361,7 +361,7 @@ SECRET_KEY=... BASE_URL=http://localhost:8000 uv run pytest tests
|
|
|
361
361
|
Tox is pre-configured in `tox.ini`, so you can run the following to test against multiple python versions locally:
|
|
362
362
|
|
|
363
363
|
```bash
|
|
364
|
-
|
|
364
|
+
CLIENT_SECRET=... uv run tox
|
|
365
365
|
```
|
|
366
366
|
|
|
367
367
|
**[asdf](https://asdf-vm.com/) users**
|
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '2.
|
|
22
|
-
__version_tuple__ = version_tuple = (2,
|
|
21
|
+
__version__ = version = '2.3.0'
|
|
22
|
+
__version_tuple__ = version_tuple = (2, 3, 0)
|
|
23
23
|
|
|
24
|
-
__commit_id__ = commit_id = '
|
|
24
|
+
__commit_id__ = commit_id = 'g044d28ceb'
|
|
@@ -8,7 +8,7 @@ from ...utils.logger import logger
|
|
|
8
8
|
|
|
9
9
|
class WorkspaceClient(BaseAPIClient):
|
|
10
10
|
default_timeout = 30
|
|
11
|
-
lookup_url = "
|
|
11
|
+
lookup_url = "workspaces/"
|
|
12
12
|
|
|
13
13
|
def __init__(
|
|
14
14
|
self,
|
|
@@ -46,7 +46,7 @@ class WorkspaceClient(BaseAPIClient):
|
|
|
46
46
|
return response.json()
|
|
47
47
|
|
|
48
48
|
def list(self, retries=DEFAULT_RETRIES):
|
|
49
|
-
return self.__get("
|
|
49
|
+
return self.__get("", retries=retries)
|
|
50
50
|
|
|
51
51
|
def my_workspace(self, retries=DEFAULT_RETRIES):
|
|
52
|
-
return self.__get("
|
|
52
|
+
return self.__get("my-default/", retries=retries)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: cmsdials
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.3.0
|
|
4
4
|
Summary: The Python api client interface to DIALS service
|
|
5
5
|
Author-email: Gabriel Moreira <gabriel.moreira@cern.ch>
|
|
6
6
|
Project-URL: Repository, https://gitlab.cern.ch/cms-dqmdc/libraries/dials-py
|
|
@@ -368,15 +368,15 @@ uv pip install -e .
|
|
|
368
368
|
The repository has some tests written to make sure DIALS responses are compatible with pydantic metaclasses, you can use pytest to run all tests but you need to specify a secret key to authenticate non-interactively against DIALS api:
|
|
369
369
|
|
|
370
370
|
```bash
|
|
371
|
-
|
|
371
|
+
CLIENT_SECRET=... uv run pytest tests
|
|
372
372
|
```
|
|
373
373
|
|
|
374
|
-
The secret key is an api client enabled secret key and can be obtained from the applications portal, any api client secret key whitelisted in DIALS can be used. Set `CLIENT_ID` to the client id of the same application to test the api-access token flow (`
|
|
374
|
+
The secret key is an api client enabled secret key and can be obtained from the applications portal, any api client secret key whitelisted in DIALS can be used. Set `CLIENT_ID` to the client id of the same application to test the api-access token flow (`CLIENT_SECRET=... CLIENT_ID=... uv run pytest tests`); otherwise those tests are skipped and the deprecated `X-CLIENT-SECRET` header is used. Tests target the dev Keycloak applications by default, overwrite them with `AUTH_CLIENT_ID` and `AUTH_AUDIENCE`. The interactive authentication flow should be tested manually, an example for this can be found in [test_auth_client.py](/tests/integration/test_auth_client.py).
|
|
375
375
|
|
|
376
376
|
If testing against a local version of DIALS you need to specify the BASE_URL:
|
|
377
377
|
|
|
378
378
|
```bash
|
|
379
|
-
|
|
379
|
+
CLIENT_SECRET=... BASE_URL=http://localhost:8000 uv run pytest tests
|
|
380
380
|
```
|
|
381
381
|
|
|
382
382
|
#### Tox
|
|
@@ -384,7 +384,7 @@ SECRET_KEY=... BASE_URL=http://localhost:8000 uv run pytest tests
|
|
|
384
384
|
Tox is pre-configured in `tox.ini`, so you can run the following to test against multiple python versions locally:
|
|
385
385
|
|
|
386
386
|
```bash
|
|
387
|
-
|
|
387
|
+
CLIENT_SECRET=... uv run tox
|
|
388
388
|
```
|
|
389
389
|
|
|
390
390
|
**[asdf](https://asdf-vm.com/) users**
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import os
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
if not
|
|
6
|
-
raise OSError("
|
|
4
|
+
CLIENT_SECRET = os.getenv("CLIENT_SECRET")
|
|
5
|
+
if not CLIENT_SECRET:
|
|
6
|
+
raise OSError("CLIENT_SECRET environment variable is not set.")
|
|
7
7
|
|
|
8
8
|
BASE_URL = os.getenv("BASE_URL", "https://dev-cmsdials-api.web.cern.ch/")
|
|
9
|
-
# Client id of the application owning
|
|
9
|
+
# Client id of the application owning CLIENT_SECRET. When set, tests authenticate
|
|
10
10
|
# with api-access tokens instead of the deprecated X-CLIENT-SECRET header.
|
|
11
11
|
CLIENT_ID = os.getenv("CLIENT_ID") or None
|
|
12
12
|
AUTH_CLIENT_ID = os.getenv("AUTH_CLIENT_ID", "cms-dials-dev-public-app")
|
|
@@ -9,7 +9,7 @@ from cmsdials.auth.bearer import Credentials as BearerCredentials
|
|
|
9
9
|
from cmsdials.auth.models import Token
|
|
10
10
|
from cmsdials.auth.secret_key import Credentials as SecretKeyCredentials
|
|
11
11
|
|
|
12
|
-
from .env import BASE_URL, CLIENT_ID,
|
|
12
|
+
from .env import BASE_URL, CLIENT_ID, CLIENT_SECRET, TEST_WORKSPACE
|
|
13
13
|
from .utils import build_auth_client
|
|
14
14
|
|
|
15
15
|
|
|
@@ -23,14 +23,14 @@ def __setup_dials_from_creds_and_test(
|
|
|
23
23
|
|
|
24
24
|
|
|
25
25
|
def test_secret_key_success() -> None:
|
|
26
|
-
creds = SecretKeyCredentials(token=
|
|
26
|
+
creds = SecretKeyCredentials(token=CLIENT_SECRET)
|
|
27
27
|
__setup_dials_from_creds_and_test(creds)
|
|
28
28
|
|
|
29
29
|
|
|
30
30
|
@pytest.mark.skipif(CLIENT_ID is None, reason="CLIENT_ID is not set")
|
|
31
31
|
def test_api_access_success() -> None:
|
|
32
32
|
creds = SecretKeyCredentials(
|
|
33
|
-
token=
|
|
33
|
+
token=CLIENT_SECRET, client_id=CLIENT_ID, client=build_auth_client()
|
|
34
34
|
)
|
|
35
35
|
headers: dict[str, str] = {}
|
|
36
36
|
creds.before_request(headers)
|
|
@@ -7,7 +7,7 @@ from .env import (
|
|
|
7
7
|
AUTH_CLIENT_ID,
|
|
8
8
|
BASE_URL,
|
|
9
9
|
CLIENT_ID,
|
|
10
|
-
|
|
10
|
+
CLIENT_SECRET,
|
|
11
11
|
TEST_WORKSPACE,
|
|
12
12
|
)
|
|
13
13
|
|
|
@@ -18,6 +18,6 @@ def build_auth_client() -> AuthClient:
|
|
|
18
18
|
|
|
19
19
|
def setup_dials_object() -> Dials:
|
|
20
20
|
creds = Credentials(
|
|
21
|
-
token=
|
|
21
|
+
token=CLIENT_SECRET, client_id=CLIENT_ID, client=build_auth_client()
|
|
22
22
|
)
|
|
23
23
|
return Dials(creds, base_url=BASE_URL, workspace=TEST_WORKSPACE)
|
|
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
|
|
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
|