modal 0.73.167__tar.gz → 0.73.168__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.
Files changed (184) hide show
  1. {modal-0.73.167 → modal-0.73.168}/PKG-INFO +1 -1
  2. {modal-0.73.167 → modal-0.73.168}/modal/_container_entrypoint.py +3 -6
  3. {modal-0.73.167 → modal-0.73.168}/modal/_functions.py +0 -6
  4. {modal-0.73.167 → modal-0.73.168}/modal/client.pyi +2 -2
  5. {modal-0.73.167 → modal-0.73.168}/modal.egg-info/PKG-INFO +1 -1
  6. {modal-0.73.167 → modal-0.73.168}/modal.egg-info/SOURCES.txt +0 -1
  7. {modal-0.73.167 → modal-0.73.168}/modal_version/_version_generated.py +1 -1
  8. modal-0.73.167/modal/_proxy_tunnel.py +0 -63
  9. {modal-0.73.167 → modal-0.73.168}/LICENSE +0 -0
  10. {modal-0.73.167 → modal-0.73.168}/README.md +0 -0
  11. {modal-0.73.167 → modal-0.73.168}/modal/__init__.py +0 -0
  12. {modal-0.73.167 → modal-0.73.168}/modal/__main__.py +0 -0
  13. {modal-0.73.167 → modal-0.73.168}/modal/_clustered_functions.py +0 -0
  14. {modal-0.73.167 → modal-0.73.168}/modal/_clustered_functions.pyi +0 -0
  15. {modal-0.73.167 → modal-0.73.168}/modal/_ipython.py +0 -0
  16. {modal-0.73.167 → modal-0.73.168}/modal/_location.py +0 -0
  17. {modal-0.73.167 → modal-0.73.168}/modal/_object.py +0 -0
  18. {modal-0.73.167 → modal-0.73.168}/modal/_output.py +0 -0
  19. {modal-0.73.167 → modal-0.73.168}/modal/_partial_function.py +0 -0
  20. {modal-0.73.167 → modal-0.73.168}/modal/_pty.py +0 -0
  21. {modal-0.73.167 → modal-0.73.168}/modal/_resolver.py +0 -0
  22. {modal-0.73.167 → modal-0.73.168}/modal/_resources.py +0 -0
  23. {modal-0.73.167 → modal-0.73.168}/modal/_runtime/__init__.py +0 -0
  24. {modal-0.73.167 → modal-0.73.168}/modal/_runtime/asgi.py +0 -0
  25. {modal-0.73.167 → modal-0.73.168}/modal/_runtime/container_io_manager.py +0 -0
  26. {modal-0.73.167 → modal-0.73.168}/modal/_runtime/container_io_manager.pyi +0 -0
  27. {modal-0.73.167 → modal-0.73.168}/modal/_runtime/execution_context.py +0 -0
  28. {modal-0.73.167 → modal-0.73.168}/modal/_runtime/execution_context.pyi +0 -0
  29. {modal-0.73.167 → modal-0.73.168}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  30. {modal-0.73.167 → modal-0.73.168}/modal/_runtime/telemetry.py +0 -0
  31. {modal-0.73.167 → modal-0.73.168}/modal/_runtime/user_code_imports.py +0 -0
  32. {modal-0.73.167 → modal-0.73.168}/modal/_serialization.py +0 -0
  33. {modal-0.73.167 → modal-0.73.168}/modal/_traceback.py +0 -0
  34. {modal-0.73.167 → modal-0.73.168}/modal/_tunnel.py +0 -0
  35. {modal-0.73.167 → modal-0.73.168}/modal/_tunnel.pyi +0 -0
  36. {modal-0.73.167 → modal-0.73.168}/modal/_type_manager.py +0 -0
  37. {modal-0.73.167 → modal-0.73.168}/modal/_utils/__init__.py +0 -0
  38. {modal-0.73.167 → modal-0.73.168}/modal/_utils/app_utils.py +0 -0
  39. {modal-0.73.167 → modal-0.73.168}/modal/_utils/async_utils.py +0 -0
  40. {modal-0.73.167 → modal-0.73.168}/modal/_utils/blob_utils.py +0 -0
  41. {modal-0.73.167 → modal-0.73.168}/modal/_utils/bytes_io_segment_payload.py +0 -0
  42. {modal-0.73.167 → modal-0.73.168}/modal/_utils/deprecation.py +0 -0
  43. {modal-0.73.167 → modal-0.73.168}/modal/_utils/docker_utils.py +0 -0
  44. {modal-0.73.167 → modal-0.73.168}/modal/_utils/function_utils.py +0 -0
  45. {modal-0.73.167 → modal-0.73.168}/modal/_utils/git_utils.py +0 -0
  46. {modal-0.73.167 → modal-0.73.168}/modal/_utils/grpc_testing.py +0 -0
  47. {modal-0.73.167 → modal-0.73.168}/modal/_utils/grpc_utils.py +0 -0
  48. {modal-0.73.167 → modal-0.73.168}/modal/_utils/hash_utils.py +0 -0
  49. {modal-0.73.167 → modal-0.73.168}/modal/_utils/http_utils.py +0 -0
  50. {modal-0.73.167 → modal-0.73.168}/modal/_utils/jwt_utils.py +0 -0
  51. {modal-0.73.167 → modal-0.73.168}/modal/_utils/logger.py +0 -0
  52. {modal-0.73.167 → modal-0.73.168}/modal/_utils/mount_utils.py +0 -0
  53. {modal-0.73.167 → modal-0.73.168}/modal/_utils/name_utils.py +0 -0
  54. {modal-0.73.167 → modal-0.73.168}/modal/_utils/package_utils.py +0 -0
  55. {modal-0.73.167 → modal-0.73.168}/modal/_utils/pattern_utils.py +0 -0
  56. {modal-0.73.167 → modal-0.73.168}/modal/_utils/rand_pb_testing.py +0 -0
  57. {modal-0.73.167 → modal-0.73.168}/modal/_utils/shell_utils.py +0 -0
  58. {modal-0.73.167 → modal-0.73.168}/modal/_vendor/__init__.py +0 -0
  59. {modal-0.73.167 → modal-0.73.168}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  60. {modal-0.73.167 → modal-0.73.168}/modal/_vendor/cloudpickle.py +0 -0
  61. {modal-0.73.167 → modal-0.73.168}/modal/_vendor/tblib.py +0 -0
  62. {modal-0.73.167 → modal-0.73.168}/modal/_watcher.py +0 -0
  63. {modal-0.73.167 → modal-0.73.168}/modal/app.py +0 -0
  64. {modal-0.73.167 → modal-0.73.168}/modal/app.pyi +0 -0
  65. {modal-0.73.167 → modal-0.73.168}/modal/call_graph.py +0 -0
  66. {modal-0.73.167 → modal-0.73.168}/modal/cli/__init__.py +0 -0
  67. {modal-0.73.167 → modal-0.73.168}/modal/cli/_download.py +0 -0
  68. {modal-0.73.167 → modal-0.73.168}/modal/cli/_traceback.py +0 -0
  69. {modal-0.73.167 → modal-0.73.168}/modal/cli/app.py +0 -0
  70. {modal-0.73.167 → modal-0.73.168}/modal/cli/config.py +0 -0
  71. {modal-0.73.167 → modal-0.73.168}/modal/cli/container.py +0 -0
  72. {modal-0.73.167 → modal-0.73.168}/modal/cli/dict.py +0 -0
  73. {modal-0.73.167 → modal-0.73.168}/modal/cli/entry_point.py +0 -0
  74. {modal-0.73.167 → modal-0.73.168}/modal/cli/environment.py +0 -0
  75. {modal-0.73.167 → modal-0.73.168}/modal/cli/import_refs.py +0 -0
  76. {modal-0.73.167 → modal-0.73.168}/modal/cli/launch.py +0 -0
  77. {modal-0.73.167 → modal-0.73.168}/modal/cli/network_file_system.py +0 -0
  78. {modal-0.73.167 → modal-0.73.168}/modal/cli/profile.py +0 -0
  79. {modal-0.73.167 → modal-0.73.168}/modal/cli/programs/__init__.py +0 -0
  80. {modal-0.73.167 → modal-0.73.168}/modal/cli/programs/run_jupyter.py +0 -0
  81. {modal-0.73.167 → modal-0.73.168}/modal/cli/programs/vscode.py +0 -0
  82. {modal-0.73.167 → modal-0.73.168}/modal/cli/queues.py +0 -0
  83. {modal-0.73.167 → modal-0.73.168}/modal/cli/run.py +0 -0
  84. {modal-0.73.167 → modal-0.73.168}/modal/cli/secret.py +0 -0
  85. {modal-0.73.167 → modal-0.73.168}/modal/cli/token.py +0 -0
  86. {modal-0.73.167 → modal-0.73.168}/modal/cli/utils.py +0 -0
  87. {modal-0.73.167 → modal-0.73.168}/modal/cli/volume.py +0 -0
  88. {modal-0.73.167 → modal-0.73.168}/modal/client.py +0 -0
  89. {modal-0.73.167 → modal-0.73.168}/modal/cloud_bucket_mount.py +0 -0
  90. {modal-0.73.167 → modal-0.73.168}/modal/cloud_bucket_mount.pyi +0 -0
  91. {modal-0.73.167 → modal-0.73.168}/modal/cls.py +0 -0
  92. {modal-0.73.167 → modal-0.73.168}/modal/cls.pyi +0 -0
  93. {modal-0.73.167 → modal-0.73.168}/modal/config.py +0 -0
  94. {modal-0.73.167 → modal-0.73.168}/modal/container_process.py +0 -0
  95. {modal-0.73.167 → modal-0.73.168}/modal/container_process.pyi +0 -0
  96. {modal-0.73.167 → modal-0.73.168}/modal/dict.py +0 -0
  97. {modal-0.73.167 → modal-0.73.168}/modal/dict.pyi +0 -0
  98. {modal-0.73.167 → modal-0.73.168}/modal/environments.py +0 -0
  99. {modal-0.73.167 → modal-0.73.168}/modal/environments.pyi +0 -0
  100. {modal-0.73.167 → modal-0.73.168}/modal/exception.py +0 -0
  101. {modal-0.73.167 → modal-0.73.168}/modal/experimental/__init__.py +0 -0
  102. {modal-0.73.167 → modal-0.73.168}/modal/experimental/ipython.py +0 -0
  103. {modal-0.73.167 → modal-0.73.168}/modal/file_io.py +0 -0
  104. {modal-0.73.167 → modal-0.73.168}/modal/file_io.pyi +0 -0
  105. {modal-0.73.167 → modal-0.73.168}/modal/file_pattern_matcher.py +0 -0
  106. {modal-0.73.167 → modal-0.73.168}/modal/functions.py +0 -0
  107. {modal-0.73.167 → modal-0.73.168}/modal/functions.pyi +0 -0
  108. {modal-0.73.167 → modal-0.73.168}/modal/gpu.py +0 -0
  109. {modal-0.73.167 → modal-0.73.168}/modal/image.py +0 -0
  110. {modal-0.73.167 → modal-0.73.168}/modal/image.pyi +0 -0
  111. {modal-0.73.167 → modal-0.73.168}/modal/io_streams.py +0 -0
  112. {modal-0.73.167 → modal-0.73.168}/modal/io_streams.pyi +0 -0
  113. {modal-0.73.167 → modal-0.73.168}/modal/mount.py +0 -0
  114. {modal-0.73.167 → modal-0.73.168}/modal/mount.pyi +0 -0
  115. {modal-0.73.167 → modal-0.73.168}/modal/network_file_system.py +0 -0
  116. {modal-0.73.167 → modal-0.73.168}/modal/network_file_system.pyi +0 -0
  117. {modal-0.73.167 → modal-0.73.168}/modal/object.py +0 -0
  118. {modal-0.73.167 → modal-0.73.168}/modal/object.pyi +0 -0
  119. {modal-0.73.167 → modal-0.73.168}/modal/output.py +0 -0
  120. {modal-0.73.167 → modal-0.73.168}/modal/parallel_map.py +0 -0
  121. {modal-0.73.167 → modal-0.73.168}/modal/parallel_map.pyi +0 -0
  122. {modal-0.73.167 → modal-0.73.168}/modal/partial_function.py +0 -0
  123. {modal-0.73.167 → modal-0.73.168}/modal/partial_function.pyi +0 -0
  124. {modal-0.73.167 → modal-0.73.168}/modal/proxy.py +0 -0
  125. {modal-0.73.167 → modal-0.73.168}/modal/proxy.pyi +0 -0
  126. {modal-0.73.167 → modal-0.73.168}/modal/py.typed +0 -0
  127. {modal-0.73.167 → modal-0.73.168}/modal/queue.py +0 -0
  128. {modal-0.73.167 → modal-0.73.168}/modal/queue.pyi +0 -0
  129. {modal-0.73.167 → modal-0.73.168}/modal/requirements/2023.12.312.txt +0 -0
  130. {modal-0.73.167 → modal-0.73.168}/modal/requirements/2023.12.txt +0 -0
  131. {modal-0.73.167 → modal-0.73.168}/modal/requirements/2024.04.txt +0 -0
  132. {modal-0.73.167 → modal-0.73.168}/modal/requirements/2024.10.txt +0 -0
  133. {modal-0.73.167 → modal-0.73.168}/modal/requirements/PREVIEW.txt +0 -0
  134. {modal-0.73.167 → modal-0.73.168}/modal/requirements/README.md +0 -0
  135. {modal-0.73.167 → modal-0.73.168}/modal/requirements/base-images.json +0 -0
  136. {modal-0.73.167 → modal-0.73.168}/modal/retries.py +0 -0
  137. {modal-0.73.167 → modal-0.73.168}/modal/runner.py +0 -0
  138. {modal-0.73.167 → modal-0.73.168}/modal/runner.pyi +0 -0
  139. {modal-0.73.167 → modal-0.73.168}/modal/running_app.py +0 -0
  140. {modal-0.73.167 → modal-0.73.168}/modal/sandbox.py +0 -0
  141. {modal-0.73.167 → modal-0.73.168}/modal/sandbox.pyi +0 -0
  142. {modal-0.73.167 → modal-0.73.168}/modal/schedule.py +0 -0
  143. {modal-0.73.167 → modal-0.73.168}/modal/scheduler_placement.py +0 -0
  144. {modal-0.73.167 → modal-0.73.168}/modal/secret.py +0 -0
  145. {modal-0.73.167 → modal-0.73.168}/modal/secret.pyi +0 -0
  146. {modal-0.73.167 → modal-0.73.168}/modal/serving.py +0 -0
  147. {modal-0.73.167 → modal-0.73.168}/modal/serving.pyi +0 -0
  148. {modal-0.73.167 → modal-0.73.168}/modal/snapshot.py +0 -0
  149. {modal-0.73.167 → modal-0.73.168}/modal/snapshot.pyi +0 -0
  150. {modal-0.73.167 → modal-0.73.168}/modal/stream_type.py +0 -0
  151. {modal-0.73.167 → modal-0.73.168}/modal/token_flow.py +0 -0
  152. {modal-0.73.167 → modal-0.73.168}/modal/token_flow.pyi +0 -0
  153. {modal-0.73.167 → modal-0.73.168}/modal/volume.py +0 -0
  154. {modal-0.73.167 → modal-0.73.168}/modal/volume.pyi +0 -0
  155. {modal-0.73.167 → modal-0.73.168}/modal.egg-info/dependency_links.txt +0 -0
  156. {modal-0.73.167 → modal-0.73.168}/modal.egg-info/entry_points.txt +0 -0
  157. {modal-0.73.167 → modal-0.73.168}/modal.egg-info/requires.txt +0 -0
  158. {modal-0.73.167 → modal-0.73.168}/modal.egg-info/top_level.txt +0 -0
  159. {modal-0.73.167 → modal-0.73.168}/modal_docs/__init__.py +0 -0
  160. {modal-0.73.167 → modal-0.73.168}/modal_docs/gen_cli_docs.py +0 -0
  161. {modal-0.73.167 → modal-0.73.168}/modal_docs/gen_reference_docs.py +0 -0
  162. {modal-0.73.167 → modal-0.73.168}/modal_docs/mdmd/__init__.py +0 -0
  163. {modal-0.73.167 → modal-0.73.168}/modal_docs/mdmd/mdmd.py +0 -0
  164. {modal-0.73.167 → modal-0.73.168}/modal_docs/mdmd/signatures.py +0 -0
  165. {modal-0.73.167 → modal-0.73.168}/modal_proto/__init__.py +0 -0
  166. {modal-0.73.167 → modal-0.73.168}/modal_proto/api.proto +0 -0
  167. {modal-0.73.167 → modal-0.73.168}/modal_proto/api_grpc.py +0 -0
  168. {modal-0.73.167 → modal-0.73.168}/modal_proto/api_pb2.py +0 -0
  169. {modal-0.73.167 → modal-0.73.168}/modal_proto/api_pb2.pyi +0 -0
  170. {modal-0.73.167 → modal-0.73.168}/modal_proto/api_pb2_grpc.py +0 -0
  171. {modal-0.73.167 → modal-0.73.168}/modal_proto/api_pb2_grpc.pyi +0 -0
  172. {modal-0.73.167 → modal-0.73.168}/modal_proto/modal_api_grpc.py +0 -0
  173. {modal-0.73.167 → modal-0.73.168}/modal_proto/modal_options_grpc.py +0 -0
  174. {modal-0.73.167 → modal-0.73.168}/modal_proto/options.proto +0 -0
  175. {modal-0.73.167 → modal-0.73.168}/modal_proto/options_grpc.py +0 -0
  176. {modal-0.73.167 → modal-0.73.168}/modal_proto/options_pb2.py +0 -0
  177. {modal-0.73.167 → modal-0.73.168}/modal_proto/options_pb2.pyi +0 -0
  178. {modal-0.73.167 → modal-0.73.168}/modal_proto/options_pb2_grpc.py +0 -0
  179. {modal-0.73.167 → modal-0.73.168}/modal_proto/options_pb2_grpc.pyi +0 -0
  180. {modal-0.73.167 → modal-0.73.168}/modal_proto/py.typed +0 -0
  181. {modal-0.73.167 → modal-0.73.168}/modal_version/__init__.py +0 -0
  182. {modal-0.73.167 → modal-0.73.168}/modal_version/__main__.py +0 -0
  183. {modal-0.73.167 → modal-0.73.168}/pyproject.toml +0 -0
  184. {modal-0.73.167 → modal-0.73.168}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 0.73.167
3
+ Version: 0.73.168
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -33,7 +33,6 @@ from modal._partial_function import (
33
33
  _find_callables_for_obj,
34
34
  _PartialFunctionFlags,
35
35
  )
36
- from modal._proxy_tunnel import proxy_tunnel
37
36
  from modal._serialization import deserialize_params
38
37
  from modal._utils.async_utils import TaskContext, synchronizer
39
38
  from modal._utils.function_utils import (
@@ -586,11 +585,9 @@ if __name__ == "__main__":
586
585
  client = Client.from_env()
587
586
 
588
587
  try:
589
- with proxy_tunnel(container_args.proxy_info):
590
- try:
591
- main(container_args, client)
592
- except UserException:
593
- logger.info("User exception caught, exiting")
588
+ main(container_args, client)
589
+ except UserException:
590
+ logger.info("User exception caught, exiting")
594
591
  except KeyboardInterrupt:
595
592
  logger.debug("Container: interrupted")
596
593
 
@@ -530,12 +530,6 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
530
530
  if is_generator:
531
531
  raise InvalidError("Generator functions do not support retries.")
532
532
 
533
- if proxy:
534
- # HACK: remove this once we stop using ssh tunnels for this.
535
- if image:
536
- # TODO(elias): this will cause an error if users use prior `.add_local_*` commands without copy=True
537
- image = image.apt_install("autossh")
538
-
539
533
  function_spec = _FunctionSpec(
540
534
  mounts=all_mounts,
541
535
  secrets=secrets,
@@ -31,7 +31,7 @@ class _Client:
31
31
  server_url: str,
32
32
  client_type: int,
33
33
  credentials: typing.Optional[tuple[str, str]],
34
- version: str = "0.73.167",
34
+ version: str = "0.73.168",
35
35
  ): ...
36
36
  def is_closed(self) -> bool: ...
37
37
  @property
@@ -93,7 +93,7 @@ class Client:
93
93
  server_url: str,
94
94
  client_type: int,
95
95
  credentials: typing.Optional[tuple[str, str]],
96
- version: str = "0.73.167",
96
+ version: str = "0.73.168",
97
97
  ): ...
98
98
  def is_closed(self) -> bool: ...
99
99
  @property
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 0.73.167
3
+ Version: 0.73.168
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -12,7 +12,6 @@ modal/_location.py
12
12
  modal/_object.py
13
13
  modal/_output.py
14
14
  modal/_partial_function.py
15
- modal/_proxy_tunnel.py
16
15
  modal/_pty.py
17
16
  modal/_resolver.py
18
17
  modal/_resources.py
@@ -1,4 +1,4 @@
1
1
  # Copyright Modal Labs 2025
2
2
 
3
3
  # Note: Reset this value to -1 whenever you make a minor `0.X` release of the client.
4
- build_number = 167 # git: b37dda4
4
+ build_number = 168 # git: cafe25f
@@ -1,63 +0,0 @@
1
- # Copyright Modal Labs 2022
2
- import contextlib
3
- import os
4
- import subprocess
5
- import tempfile
6
-
7
- from modal_proto import api_pb2
8
-
9
-
10
- @contextlib.contextmanager
11
- def proxy_tunnel(info: api_pb2.ProxyInfo):
12
- if not info.elastic_ip:
13
- yield
14
- return
15
-
16
- with tempfile.NamedTemporaryFile(suffix=".pem") as t:
17
- f = open(t.name, "w")
18
- f.write(info.proxy_key)
19
- f.close()
20
-
21
- if info.remote_addr:
22
- # Forward port from address.
23
- args = [
24
- "-L",
25
- f"{info.remote_port}:{info.remote_addr}:{info.remote_port}",
26
- ]
27
- else:
28
- # Set up SOCKS proxy.
29
- # TODO: add a local_port column and proxy_type (this is all being rewritten anyway)
30
- args = ["-D", f"{info.remote_port}"]
31
- os.environ["HTTP_PROXY"] = f"socks5://localhost:{info.remote_port}"
32
-
33
- # https://github.com/getsentry/sentry-python/issues/1049
34
- os.environ["NO_PROXY"] = "sentry.io"
35
-
36
- cmd = [
37
- "autossh",
38
- "-M 0", # don't use a monitoring port for autossh
39
- "-i",
40
- t.name, # use pem file
41
- "-T", # ignore the tty
42
- "-n", # no input
43
- "-N", # don't execute a command
44
- *args,
45
- f"ubuntu@{info.elastic_ip}",
46
- "-o",
47
- "StrictHostKeyChecking=no", # avoid prompt for host
48
- "-o",
49
- "ServerAliveInterval=5", # seconds before client sends keepalive to server
50
- "-o",
51
- "ServerAliveCountMax=1", # number of failures before terminating ssh (autossh will restart)
52
- "-o",
53
- "LogLevel=ERROR", # disable warning "Permanently added '...' to the list of known hosts."
54
- ]
55
- p = subprocess.Popen(cmd)
56
-
57
- import time
58
-
59
- time.sleep(3)
60
- try:
61
- yield
62
- finally:
63
- p.kill()
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
File without changes
File without changes
File without changes