devservices 1.2.1__tar.gz → 1.2.2__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.
- {devservices-1.2.1 → devservices-1.2.2}/PKG-INFO +1 -1
- {devservices-1.2.1 → devservices-1.2.2}/README.md +23 -2
- {devservices-1.2.1 → devservices-1.2.2}/devservices/commands/up.py +6 -4
- {devservices-1.2.1 → devservices-1.2.2}/devservices/utils/docker.py +8 -0
- {devservices-1.2.1 → devservices-1.2.2}/devservices.egg-info/PKG-INFO +1 -1
- {devservices-1.2.1 → devservices-1.2.2}/pyproject.toml +1 -1
- {devservices-1.2.1 → devservices-1.2.2}/tests/commands/test_up.py +43 -12
- {devservices-1.2.1 → devservices-1.2.2}/tests/utils/test_docker.py +21 -6
- {devservices-1.2.1 → devservices-1.2.2}/tests/utils/test_docker_compose.py +4 -1
- {devservices-1.2.1 → devservices-1.2.2}/LICENSE.md +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/devservices/__init__.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/devservices/commands/__init__.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/devservices/commands/down.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/devservices/commands/foreground.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/devservices/commands/list_dependencies.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/devservices/commands/list_services.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/devservices/commands/logs.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/devservices/commands/purge.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/devservices/commands/reset.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/devservices/commands/serve.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/devservices/commands/status.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/devservices/commands/toggle.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/devservices/commands/update.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/devservices/configs/service_config.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/devservices/constants.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/devservices/exceptions.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/devservices/main.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/devservices/utils/__init__.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/devservices/utils/check_for_update.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/devservices/utils/console.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/devservices/utils/dependencies.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/devservices/utils/devenv.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/devservices/utils/docker_compose.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/devservices/utils/file_lock.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/devservices/utils/git.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/devservices/utils/install_binary.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/devservices/utils/services.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/devservices/utils/state.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/devservices/utils/supervisor.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/devservices.egg-info/SOURCES.txt +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/devservices.egg-info/dependency_links.txt +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/devservices.egg-info/entry_points.txt +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/devservices.egg-info/requires.txt +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/devservices.egg-info/top_level.txt +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/setup.cfg +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/testing/__init__.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/testing/utils.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/tests/__init__.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/tests/commands/test_down.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/tests/commands/test_foreground.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/tests/commands/test_list_dependencies.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/tests/commands/test_list_services.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/tests/commands/test_logs.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/tests/commands/test_purge.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/tests/commands/test_reset.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/tests/commands/test_serve.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/tests/commands/test_status.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/tests/commands/test_toggle.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/tests/commands/test_update.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/tests/configs/test_service_config.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/tests/conftest.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/tests/utils/test_check_for_update.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/tests/utils/test_dependencies.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/tests/utils/test_git.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/tests/utils/test_install_binary.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/tests/utils/test_services.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/tests/utils/test_state.py +0 -0
- {devservices-1.2.1 → devservices-1.2.2}/tests/utils/test_supervisor.py +0 -0
|
@@ -33,7 +33,7 @@ NOTE: service-name is an optional parameter. If not provided, devservices will a
|
|
|
33
33
|
The recommended way to install devservices is through a virtualenv in the requirements.txt. Once that is installed and a devservices config file is added, you should be able to run `devservices up` to begin local development.
|
|
34
34
|
|
|
35
35
|
```
|
|
36
|
-
devservices==1.2.
|
|
36
|
+
devservices==1.2.2
|
|
37
37
|
```
|
|
38
38
|
|
|
39
39
|
### 2. Add devservices config files
|
|
@@ -47,7 +47,7 @@ The configuration file is a yaml file that looks like this:
|
|
|
47
47
|
# - version: The version of the devservices config file. This is used to ensure compatibility between devservices and the config file.
|
|
48
48
|
# - service_name: The name of the service. This is used to identify the service in the config file.
|
|
49
49
|
# - dependencies: A list of dependencies for the service. Each dependency is a yaml block that holds the dependency configuration. There are two types of dependencies:
|
|
50
|
-
# - local: A dependency that is defined in the config file. These dependencies do not have a remote field
|
|
50
|
+
# - local: A dependency that is defined in the config file. These dependencies do not have a remote field and must correspond to either a service defined in the 'services' section or a program defined in the 'x-programs' section.
|
|
51
51
|
# - remote: A dependency that is defined in the devservices directory in a remote repository. These configs are automatically fetched from the remote repository and installed. Any dependency with a remote field will be treated as a remote dependency. Example: https://github.com/getsentry/snuba/blob/59a5258ccbb502827ebc1d3b1bf80c607a3301bf/devservices/config.yml#L8
|
|
52
52
|
# - modes: A list of modes for the service. Each mode includes a list of dependencies that are used in that mode.
|
|
53
53
|
x-sentry-service-config:
|
|
@@ -69,6 +69,27 @@ x-sentry-service-config:
|
|
|
69
69
|
default: [example-dependency-1, example-remote-dependency]
|
|
70
70
|
custom-mode: [example-dependency-1, example-dependency-2, example-remote-dependency]
|
|
71
71
|
|
|
72
|
+
# This block defines supervisor programs that can be managed by devservices.
|
|
73
|
+
# Programs defined here are managed using Python's supervisor package and can be:
|
|
74
|
+
# - Started and stopped along with docker services when running `devservices up/down`
|
|
75
|
+
# - Run in the foreground for interactive debugging using `devservices foreground <program-name>`
|
|
76
|
+
# - Used as development server with `devservices serve` (requires a program named "devserver")
|
|
77
|
+
#
|
|
78
|
+
# These are particularly useful for:
|
|
79
|
+
# - Defining a devserver to run locally
|
|
80
|
+
# - Background workers or task processors
|
|
81
|
+
# - Any process that needs to be managed alongside your docker services
|
|
82
|
+
x-programs:
|
|
83
|
+
# Example devserver
|
|
84
|
+
devserver:
|
|
85
|
+
# Required: The command to execute
|
|
86
|
+
command: "python manage.py run_server"
|
|
87
|
+
# Optional: You can also specify any of the supervisor program settings defined here: https://supervisord.org/configuration.html#program-x-section-settings
|
|
88
|
+
|
|
89
|
+
# Example background worker
|
|
90
|
+
example-worker:
|
|
91
|
+
command: "python manage.py worker"
|
|
92
|
+
|
|
72
93
|
# This will be a standard block used by docker compose to define dependencies.
|
|
73
94
|
#
|
|
74
95
|
# The following fields are important to all dependencies:
|
|
@@ -98,14 +98,16 @@ def up(args: Namespace, existing_status: Status | None = None) -> None:
|
|
|
98
98
|
|
|
99
99
|
with Status(
|
|
100
100
|
lambda: (
|
|
101
|
-
console.warning(f"Starting '{service.name}' in mode: '{mode}'")
|
|
101
|
+
console.warning(f"Starting '{service.name}' dependencies in mode: '{mode}'")
|
|
102
102
|
if existing_status is None
|
|
103
|
-
else existing_status.warning(
|
|
103
|
+
else existing_status.warning(
|
|
104
|
+
f"Starting '{service.name}' dependencies in mode: '{mode}'"
|
|
105
|
+
)
|
|
104
106
|
),
|
|
105
107
|
lambda: (
|
|
106
|
-
console.success(f"{service.name} started")
|
|
108
|
+
console.success(f"{service.name} dependencies started")
|
|
107
109
|
if existing_status is None
|
|
108
|
-
else existing_status.success(f"{service.name} started")
|
|
110
|
+
else existing_status.success(f"{service.name} dependencies started")
|
|
109
111
|
),
|
|
110
112
|
) as status:
|
|
111
113
|
local_runtime_dependency_names = set()
|
|
@@ -10,6 +10,7 @@ from devservices.constants import HEALTHCHECK_TIMEOUT
|
|
|
10
10
|
from devservices.exceptions import ContainerHealthcheckFailedError
|
|
11
11
|
from devservices.exceptions import DockerDaemonNotRunningError
|
|
12
12
|
from devservices.exceptions import DockerError
|
|
13
|
+
from devservices.utils.console import Console
|
|
13
14
|
from devservices.utils.console import Status
|
|
14
15
|
|
|
15
16
|
|
|
@@ -20,6 +21,7 @@ class ContainerNames(NamedTuple):
|
|
|
20
21
|
|
|
21
22
|
def check_docker_daemon_running() -> None:
|
|
22
23
|
"""Checks if the Docker daemon is running. Raises DockerDaemonNotRunningError if not."""
|
|
24
|
+
console = Console()
|
|
23
25
|
try:
|
|
24
26
|
subprocess.run(
|
|
25
27
|
["docker", "info"],
|
|
@@ -27,7 +29,13 @@ def check_docker_daemon_running() -> None:
|
|
|
27
29
|
text=True,
|
|
28
30
|
check=True,
|
|
29
31
|
)
|
|
32
|
+
return
|
|
33
|
+
except subprocess.CalledProcessError:
|
|
34
|
+
console.info("Docker daemon is not running. Checking if colima is available")
|
|
35
|
+
try:
|
|
36
|
+
subprocess.run(["devenv", "colima", "start"], check=True)
|
|
30
37
|
except subprocess.CalledProcessError as e:
|
|
38
|
+
console.failure("Failed to start colima")
|
|
31
39
|
raise DockerDaemonNotRunningError from e
|
|
32
40
|
|
|
33
41
|
|
|
@@ -170,7 +170,10 @@ def test_up_simple(
|
|
|
170
170
|
mock_check_all_containers_healthy.assert_called_once()
|
|
171
171
|
captured = capsys.readouterr()
|
|
172
172
|
assert "Retrieving dependencies" in captured.out.strip()
|
|
173
|
-
assert
|
|
173
|
+
assert (
|
|
174
|
+
"Starting 'example-service' dependencies in mode: 'default'"
|
|
175
|
+
in captured.out.strip()
|
|
176
|
+
)
|
|
174
177
|
assert "Starting clickhouse" in captured.out.strip()
|
|
175
178
|
assert "Starting redis" in captured.out.strip()
|
|
176
179
|
|
|
@@ -238,7 +241,8 @@ def test_up_dependency_error(
|
|
|
238
241
|
captured = capsys.readouterr()
|
|
239
242
|
assert "Retrieving dependencies" not in captured.out.strip()
|
|
240
243
|
assert (
|
|
241
|
-
"Starting 'example-service' in mode: 'default'"
|
|
244
|
+
"Starting 'example-service' dependencies in mode: 'default'"
|
|
245
|
+
not in captured.out.strip()
|
|
242
246
|
)
|
|
243
247
|
assert "Starting clickhouse" not in captured.out.strip()
|
|
244
248
|
assert "Starting redis" not in captured.out.strip()
|
|
@@ -348,7 +352,10 @@ def test_up_error(
|
|
|
348
352
|
mock_remove_service_entry.assert_not_called()
|
|
349
353
|
|
|
350
354
|
assert "Retrieving dependencies" in captured.out.strip()
|
|
351
|
-
assert
|
|
355
|
+
assert (
|
|
356
|
+
"Starting 'example-service' dependencies in mode: 'default'"
|
|
357
|
+
in captured.out.strip()
|
|
358
|
+
)
|
|
352
359
|
assert "Starting clickhouse" not in captured.out.strip()
|
|
353
360
|
assert "Starting redis" not in captured.out.strip()
|
|
354
361
|
|
|
@@ -564,7 +571,7 @@ def test_up_pull_error_eventual_success(
|
|
|
564
571
|
mock_create_devservices_network.assert_called_once()
|
|
565
572
|
captured = capsys.readouterr()
|
|
566
573
|
|
|
567
|
-
assert "example-service started" in captured.out.strip()
|
|
574
|
+
assert "example-service dependencies started" in captured.out.strip()
|
|
568
575
|
|
|
569
576
|
|
|
570
577
|
@mock.patch("devservices.utils.state.State.remove_service_entry")
|
|
@@ -704,7 +711,10 @@ def test_up_docker_compose_container_lookup_error(
|
|
|
704
711
|
mock_check_all_containers_healthy.assert_not_called()
|
|
705
712
|
captured = capsys.readouterr()
|
|
706
713
|
assert "Retrieving dependencies" in captured.out.strip()
|
|
707
|
-
assert
|
|
714
|
+
assert (
|
|
715
|
+
"Starting 'example-service' dependencies in mode: 'default'"
|
|
716
|
+
in captured.out.strip()
|
|
717
|
+
)
|
|
708
718
|
assert "Starting clickhouse" in captured.out.strip()
|
|
709
719
|
assert "Starting redis" in captured.out.strip()
|
|
710
720
|
assert (
|
|
@@ -848,7 +858,10 @@ def test_up_docker_compose_container_healthcheck_failed(
|
|
|
848
858
|
mock_check_all_containers_healthy.assert_called_once()
|
|
849
859
|
captured = capsys.readouterr()
|
|
850
860
|
assert "Retrieving dependencies" in captured.out.strip()
|
|
851
|
-
assert
|
|
861
|
+
assert (
|
|
862
|
+
"Starting 'example-service' dependencies in mode: 'default'"
|
|
863
|
+
in captured.out.strip()
|
|
864
|
+
)
|
|
852
865
|
assert "Starting clickhouse" in captured.out.strip()
|
|
853
866
|
assert "Starting redis" in captured.out.strip()
|
|
854
867
|
assert (
|
|
@@ -993,7 +1006,10 @@ def test_up_mode_simple(
|
|
|
993
1006
|
assert (
|
|
994
1007
|
"Starting dependencies with local runtimes..." not in captured.out.strip()
|
|
995
1008
|
), "This shouldn't be printed since we don't have any dependencies with local runtimes"
|
|
996
|
-
assert
|
|
1009
|
+
assert (
|
|
1010
|
+
"Starting 'example-service' dependencies in mode: 'test'"
|
|
1011
|
+
in captured.out.strip()
|
|
1012
|
+
)
|
|
997
1013
|
assert "Starting redis" in captured.out.strip()
|
|
998
1014
|
|
|
999
1015
|
|
|
@@ -1079,7 +1095,10 @@ def test_up_mode_does_not_exist(
|
|
|
1079
1095
|
assert (
|
|
1080
1096
|
"Starting dependencies with local runtimes..." not in captured.out.strip()
|
|
1081
1097
|
), "This shouldn't be printed since we don't have any dependencies with local runtimes"
|
|
1082
|
-
assert
|
|
1098
|
+
assert (
|
|
1099
|
+
"Starting 'example-service' dependencies in mode: 'test'"
|
|
1100
|
+
not in captured.out.strip()
|
|
1101
|
+
)
|
|
1083
1102
|
assert "Starting clickhouse" not in captured.out.strip()
|
|
1084
1103
|
assert "Starting redis" not in captured.out.strip()
|
|
1085
1104
|
|
|
@@ -1184,7 +1203,10 @@ def test_up_multiple_modes(
|
|
|
1184
1203
|
mock_check_all_containers_healthy.assert_called_once()
|
|
1185
1204
|
|
|
1186
1205
|
captured = capsys.readouterr()
|
|
1187
|
-
assert
|
|
1206
|
+
assert (
|
|
1207
|
+
"Starting 'example-service' dependencies in mode: 'test'"
|
|
1208
|
+
in captured.out.strip()
|
|
1209
|
+
)
|
|
1188
1210
|
assert (
|
|
1189
1211
|
"Starting dependencies with local runtimes..." not in captured.out.strip()
|
|
1190
1212
|
), "This shouldn't be printed since we don't have any dependencies with local runtimes"
|
|
@@ -1351,7 +1373,10 @@ def test_up_multiple_modes_overlapping_running_service(
|
|
|
1351
1373
|
)
|
|
1352
1374
|
|
|
1353
1375
|
captured = capsys.readouterr()
|
|
1354
|
-
assert
|
|
1376
|
+
assert (
|
|
1377
|
+
"Starting 'example-service' dependencies in mode: 'test'"
|
|
1378
|
+
in captured.out.strip()
|
|
1379
|
+
)
|
|
1355
1380
|
assert "Retrieving dependencies" in captured.out.strip()
|
|
1356
1381
|
assert (
|
|
1357
1382
|
"Starting dependencies with local runtimes..." not in captured.out.strip()
|
|
@@ -2522,7 +2547,10 @@ def test_up_supervisor_program(
|
|
|
2522
2547
|
assert (
|
|
2523
2548
|
"Starting dependencies with local runtimes..." not in captured.out.strip()
|
|
2524
2549
|
), "This shouldn't be printed since we don't have any dependencies with local runtimes"
|
|
2525
|
-
assert
|
|
2550
|
+
assert (
|
|
2551
|
+
"Starting 'example-service' dependencies in mode: 'default'"
|
|
2552
|
+
in captured.out.strip()
|
|
2553
|
+
)
|
|
2526
2554
|
assert "Starting supervisor daemon" in captured.out.strip()
|
|
2527
2555
|
assert "Starting supervisor-program" in captured.out.strip()
|
|
2528
2556
|
|
|
@@ -2615,7 +2643,10 @@ def test_up_supervisor_program_error(
|
|
|
2615
2643
|
assert (
|
|
2616
2644
|
"Starting dependencies with local runtimes..." not in captured.out.strip()
|
|
2617
2645
|
), "This shouldn't be printed since we don't have any dependencies with local runtimes"
|
|
2618
|
-
assert
|
|
2646
|
+
assert (
|
|
2647
|
+
"Starting 'example-service' dependencies in mode: 'default'"
|
|
2648
|
+
in captured.out.strip()
|
|
2649
|
+
)
|
|
2619
2650
|
assert "Starting supervisor daemon" in captured.out.strip()
|
|
2620
2651
|
assert "Error starting supervisor daemon" in captured.out.strip()
|
|
2621
2652
|
|
|
@@ -7,6 +7,7 @@ from unittest import mock
|
|
|
7
7
|
import pytest
|
|
8
8
|
from freezegun import freeze_time
|
|
9
9
|
|
|
10
|
+
from devservices.constants import Color
|
|
10
11
|
from devservices.constants import DEVSERVICES_ORCHESTRATOR_LABEL
|
|
11
12
|
from devservices.constants import DOCKER_NETWORK_NAME
|
|
12
13
|
from devservices.constants import HEALTHCHECK_INTERVAL
|
|
@@ -25,15 +26,29 @@ from devservices.utils.docker import wait_for_healthy
|
|
|
25
26
|
|
|
26
27
|
|
|
27
28
|
@mock.patch("subprocess.run")
|
|
28
|
-
def test_check_docker_daemon_running_error(
|
|
29
|
+
def test_check_docker_daemon_running_error(
|
|
30
|
+
mock_run: mock.Mock, capsys: pytest.CaptureFixture[str]
|
|
31
|
+
) -> None:
|
|
29
32
|
mock_run.side_effect = subprocess.CalledProcessError(1, "cmd")
|
|
30
33
|
with pytest.raises(DockerDaemonNotRunningError):
|
|
31
34
|
check_docker_daemon_running()
|
|
32
|
-
mock_run.
|
|
33
|
-
[
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
mock_run.assert_has_calls(
|
|
36
|
+
[
|
|
37
|
+
mock.call(
|
|
38
|
+
["docker", "info"],
|
|
39
|
+
capture_output=True,
|
|
40
|
+
text=True,
|
|
41
|
+
check=True,
|
|
42
|
+
),
|
|
43
|
+
mock.call(
|
|
44
|
+
["devenv", "colima", "start"],
|
|
45
|
+
check=True,
|
|
46
|
+
),
|
|
47
|
+
]
|
|
48
|
+
)
|
|
49
|
+
assert (
|
|
50
|
+
capsys.readouterr().out
|
|
51
|
+
== f"Docker daemon is not running. Checking if colima is available\n{Color.RED}Failed to start colima{Color.RESET}\n"
|
|
37
52
|
)
|
|
38
53
|
|
|
39
54
|
|
|
@@ -79,7 +79,10 @@ def test_check_docker_compose_invalid_version(
|
|
|
79
79
|
|
|
80
80
|
@mock.patch(
|
|
81
81
|
"subprocess.run",
|
|
82
|
-
side_effect=[
|
|
82
|
+
side_effect=[
|
|
83
|
+
subprocess.CalledProcessError(returncode=1, cmd="docker info"),
|
|
84
|
+
subprocess.CalledProcessError(returncode=1, cmd="devenv colima start"),
|
|
85
|
+
],
|
|
83
86
|
)
|
|
84
87
|
@mock.patch(
|
|
85
88
|
"devservices.utils.docker_compose.install_docker_compose", side_effect=lambda: None
|
|
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
|