aioli-cli 0.1.2__tar.gz → 0.1.4__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 (109) hide show
  1. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/PKG-INFO +2 -1
  2. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/pyproject.toml +2 -2
  3. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_cli/main.py +6 -1
  4. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_image/doctor.py +1 -1
  5. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_music/doctor.py +1 -1
  6. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_voice/cli/doctor.py +4 -4
  7. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_voice/cli/generate.py +1 -1
  8. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_voice/engines/chatterbox.py +2 -2
  9. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_voice/engines/kokoro.py +1 -1
  10. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_voice/engines/moss.py +3 -3
  11. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_voice/engines/qwen3.py +2 -2
  12. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_voice/engines/voxcpm.py +2 -2
  13. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_voice/engines/xtts.py +2 -2
  14. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/.gitignore +0 -0
  15. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/LICENSE +0 -0
  16. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/README.md +0 -0
  17. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_cli/_plugins.py +0 -0
  18. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_cli/registry.py +0 -0
  19. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_cli/setup.py +0 -0
  20. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_contract/__init__.py +0 -0
  21. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_contract/advise.py +0 -0
  22. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_contract/config.py +0 -0
  23. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_contract/doctor.py +0 -0
  24. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_contract/fetch.py +0 -0
  25. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_contract/probe.py +0 -0
  26. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_image/__init__.py +0 -0
  27. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_image/cli.py +0 -0
  28. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_image/companions.py +0 -0
  29. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_image/config.py +0 -0
  30. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_image/data/models.toml +0 -0
  31. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_image/gpu.py +0 -0
  32. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_image/launcher.py +0 -0
  33. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_image/models.py +0 -0
  34. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_image/models_data.py +0 -0
  35. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_image/plugin.py +0 -0
  36. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_image/presets.py +0 -0
  37. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_image/stub.py +0 -0
  38. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_image/ui.py +0 -0
  39. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_master/cli.py +0 -0
  40. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_master/doctor.py +0 -0
  41. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_master/ops.py +0 -0
  42. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_master/plugin.py +0 -0
  43. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_music/__init__.py +0 -0
  44. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_music/backends/__init__.py +0 -0
  45. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_music/backends/acestep.py +0 -0
  46. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_music/backends/base.py +0 -0
  47. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_music/backends/llm_caption.py +0 -0
  48. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_music/backends/minimax_comfy.py +0 -0
  49. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_music/backends/process.py +0 -0
  50. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_music/backends/stub.py +0 -0
  51. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_music/backends/yue2.py +0 -0
  52. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_music/cli_commands/__init__.py +0 -0
  53. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_music/cli_commands/backend_cmd.py +0 -0
  54. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_music/cli_commands/generate_cmd.py +0 -0
  55. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_music/cli_commands/inspire_cmd.py +0 -0
  56. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_music/cli_commands/models_cmd.py +0 -0
  57. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_music/client.py +0 -0
  58. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_music/config.py +0 -0
  59. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_music/core/__init__.py +0 -0
  60. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_music/core/formats.py +0 -0
  61. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_music/core/generate.py +0 -0
  62. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_music/core/jobs.py +0 -0
  63. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_music/core/layout.py +0 -0
  64. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_music/generator.py +0 -0
  65. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_music/history.py +0 -0
  66. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_music/jsonstore.py +0 -0
  67. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_music/models.py +0 -0
  68. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_music/models_data.py +0 -0
  69. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_music/paths.py +0 -0
  70. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_music/plugin.py +0 -0
  71. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_music/presets.py +0 -0
  72. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_music/prompts.py +0 -0
  73. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_music/server.py +0 -0
  74. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_music/transport/__init__.py +0 -0
  75. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_music/transport/client.py +0 -0
  76. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_music/tui.py +0 -0
  77. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_podcast/cast.py +0 -0
  78. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_podcast/cli.py +0 -0
  79. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_podcast/doctor.py +0 -0
  80. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_podcast/episode.py +0 -0
  81. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_podcast/plugin.py +0 -0
  82. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_podcast/script.py +0 -0
  83. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_video/cli.py +0 -0
  84. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_video/doctor.py +0 -0
  85. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_video/models_data.py +0 -0
  86. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_video/paths.py +0 -0
  87. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_video/plugin.py +0 -0
  88. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_video/stub.py +0 -0
  89. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_video/wgp.py +0 -0
  90. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_video/worker.py +0 -0
  91. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_voice/__init__.py +0 -0
  92. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_voice/cli/engines_cmd.py +0 -0
  93. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_voice/cli/models_cmd.py +0 -0
  94. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_voice/cli/profiles.py +0 -0
  95. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_voice/config/__init__.py +0 -0
  96. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_voice/config/settings.py +0 -0
  97. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_voice/core/__init__.py +0 -0
  98. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_voice/core/generation.py +0 -0
  99. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_voice/core/model_manager.py +0 -0
  100. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_voice/core/profiles.py +0 -0
  101. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_voice/core/registry.py +0 -0
  102. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_voice/core/types.py +0 -0
  103. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_voice/devices.py +0 -0
  104. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_voice/doctor.py +0 -0
  105. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_voice/engines/__init__.py +0 -0
  106. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_voice/engines/piper.py +0 -0
  107. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_voice/engines/stub.py +0 -0
  108. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_voice/models_data.py +0 -0
  109. {aioli_cli-0.1.2 → aioli_cli-0.1.4}/src/aioli_voice/plugin.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: aioli-cli
3
- Version: 0.1.2
3
+ Version: 0.1.4
4
4
  Summary: aioli — local-first AI media suite CLI (images, video, music, voice, podcast)
5
5
  Author: aioli contributors
6
6
  License: MIT
@@ -25,6 +25,7 @@ Requires-Dist: typer>=0.12
25
25
  Provides-Extra: music-storage
26
26
  Requires-Dist: boto3>=1.34; extra == 'music-storage'
27
27
  Provides-Extra: voice-piper
28
+ Requires-Dist: piper-tts>=1.2; extra == 'voice-piper'
28
29
  Description-Content-Type: text/markdown
29
30
 
30
31
  <p align="center">
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "aioli-cli"
3
- version = "0.1.2"
3
+ version = "0.1.4"
4
4
  description = "aioli — local-first AI media suite CLI (images, video, music, voice, podcast)"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -35,7 +35,7 @@ dependencies = [
35
35
  # juntos. Los motores torch (qwen3/chatterbox/voxcpm/xtts/moss) se instalan a
36
36
  # mano — ver plugins/voice/README.md (son mundos de dependencias incompatibles
37
37
  # entre si: moss clava transformers==4.57.1, qwen-tts exige ==4.57.3).
38
- voice-piper = [] # binario externo (`uv tool install piper-tts`), sin deps python
38
+ voice-piper = ["piper-tts>=1.2"] # binario + onnxruntime via pip
39
39
  music-storage = ["boto3>=1.34"]
40
40
 
41
41
  [project.scripts]
@@ -53,7 +53,12 @@ def setup(
53
53
  @app.command()
54
54
  def version() -> None:
55
55
  """Show version."""
56
- console.print("aioli 0.1.0")
56
+ try:
57
+ from importlib.metadata import version as _v
58
+
59
+ console.print(f"aioli {_v('aioli-cli')}")
60
+ except Exception:
61
+ console.print("aioli (dev)")
57
62
 
58
63
 
59
64
  models_app = typer.Typer(help="Download + verify weight files.")
@@ -42,7 +42,7 @@ def image_checks() -> list[Check]:
42
42
  Check(
43
43
  name=f"pkg:{module}",
44
44
  ok=ok,
45
- hint=f"'{module}' importable" if ok else f"'{module}' missing — reinstall aioli-image",
45
+ hint=f"'{module}' importable" if ok else f"'{module}' missing — pip install pillow (image) / reinstall aioli-cli",
46
46
  )
47
47
  )
48
48
  return results
@@ -23,7 +23,7 @@ def music_checks() -> list[Check]:
23
23
  Check(
24
24
  name=f"pkg:{module}",
25
25
  ok=ok,
26
- hint=f"'{module}' importable" if ok else f"'{module}' missing — reinstall aioli-music",
26
+ hint=f"'{module}' importable" if ok else f"'{module}' missing — pip install pillow (image) / reinstall aioli-cli",
27
27
  )
28
28
  )
29
29
  models_root = paths.global_models_root()
@@ -68,7 +68,7 @@ def _check_torch(torch: ModuleType | None) -> CheckResult:
68
68
  name="torch",
69
69
  ok=False,
70
70
  detail="not installed",
71
- fix_hint="install an engine extra: `uv sync --extra qwen3` (pulls torch cu128)",
71
+ fix_hint="install an engine extra: `pip install qwen-tts torch (see plugins/voice/README.md)` (pulls torch cu128)",
72
72
  )
73
73
  return CheckResult(name="torch", ok=True, detail=f"torch {torch.__version__}")
74
74
 
@@ -79,7 +79,7 @@ def _check_cuda(torch: ModuleType | None) -> CheckResult:
79
79
  name="cuda",
80
80
  ok=False,
81
81
  detail="cannot probe (torch missing)",
82
- fix_hint="install an engine extra: `uv sync --extra qwen3`",
82
+ fix_hint="install an engine extra: `pip install qwen-tts torch (see plugins/voice/README.md)`",
83
83
  )
84
84
  if not torch.cuda.is_available():
85
85
  return CheckResult(
@@ -119,7 +119,7 @@ def _check_cuda_arch() -> CheckResult:
119
119
  ),
120
120
  fix_hint=(
121
121
  "reinstall torch from the cu128 index so sm kernels match your GPU: "
122
- "`uv sync --extra qwen3` (pyproject pins the pytorch-cu128 index)"
122
+ "`pip install qwen-tts torch (see plugins/voice/README.md)` (pyproject pins the pytorch-cu128 index)"
123
123
  ),
124
124
  )
125
125
  reason = "torch missing" if not report.torch_installed else "CUDA unavailable"
@@ -218,7 +218,7 @@ def _check_extras() -> list[CheckResult]:
218
218
  if installed
219
219
  else f"'{spec.extra_name}' not installed{license_note}"
220
220
  ),
221
- fix_hint=None if installed else f"`uv sync --extra {spec.extra_name}`",
221
+ fix_hint=None if installed else f"`manual engine install (see plugins/voice/README.md)`",
222
222
  )
223
223
  )
224
224
  return results
@@ -99,7 +99,7 @@ def generate(
99
99
  elif sdk_module is not None and importlib.util.find_spec(sdk_module) is None:
100
100
  _fail(
101
101
  f"engine '{effective}' needs extra '{spec.extra_name}' installed "
102
- f"(nothing was downloaded); run: uv sync --extra {spec.extra_name} "
102
+ f"(nothing was downloaded); run: manual engine install (see plugins/voice/README.md) "
103
103
  f"(in plugins/voice), or use --engine stub for offline tests"
104
104
  )
105
105
  if not spec.license_commercial:
@@ -42,7 +42,7 @@ def _import_torch():
42
42
  except ImportError as exc:
43
43
  raise ImportError(
44
44
  "the chatterbox engine requires torch; install it with: "
45
- "uv sync --extra chatterbox"
45
+ "pip install chatterbox-tts torch (see plugins/voice/README.md)"
46
46
  ) from exc
47
47
  return torch
48
48
 
@@ -54,7 +54,7 @@ def _import_chatterbox_mtl():
54
54
  raise ImportError(
55
55
  "the chatterbox engine requires the 'chatterbox-tts' package "
56
56
  "(with Multilingual V3 support); install it with: "
57
- "uv sync --extra chatterbox"
57
+ "pip install chatterbox-tts torch (see plugins/voice/README.md)"
58
58
  ) from exc
59
59
  return ChatterboxMultilingualTTS
60
60
 
@@ -41,7 +41,7 @@ class KokoroBackend:
41
41
  except ImportError as exc:
42
42
  raise ImportError(
43
43
  "kokoro engine needs extra 'kokoro' installed "
44
- "(uv sync --extra kokoro in plugins/voice)"
44
+ "(uv tool install --reinstall aioli-cli, kokoro ships in base)"
45
45
  ) from exc
46
46
  base = _base()
47
47
  if not (base / "kokoro-v1.0.onnx").exists():
@@ -61,7 +61,7 @@ def _import_moss() -> ModuleType:
61
61
  except ImportError as exc:
62
62
  raise ImportError(
63
63
  "the moss engine requires the 'moss-tts-nano' package (git dependency, "
64
- "not published on PyPI); install it with: uv sync --extra moss"
64
+ "not published on PyPI); install it with: manual install (see plugins/voice/README.md)"
65
65
  ) from exc
66
66
  return moss_tts_nano
67
67
 
@@ -71,7 +71,7 @@ def _import_torch() -> ModuleType:
71
71
  import torch
72
72
  except ImportError as exc:
73
73
  raise ImportError(
74
- "the moss engine requires torch; install it with: uv sync --extra moss"
74
+ "the moss engine requires torch; install it with: manual install (see plugins/voice/README.md)"
75
75
  ) from exc
76
76
  return torch
77
77
 
@@ -81,7 +81,7 @@ def _import_auto_model() -> type:
81
81
  from transformers import AutoModelForCausalLM
82
82
  except ImportError as exc:
83
83
  raise ImportError(
84
- "the moss engine requires 'transformers'; install it with: uv sync --extra moss"
84
+ "the moss engine requires 'transformers'; install it with: manual install (see plugins/voice/README.md)"
85
85
  ) from exc
86
86
  return AutoModelForCausalLM
87
87
 
@@ -41,7 +41,7 @@ def _import_torch() -> ModuleType:
41
41
  import torch
42
42
  except ImportError as exc:
43
43
  raise ImportError(
44
- "the qwen3 engine requires torch; install it with: uv sync --extra qwen3"
44
+ "the qwen3 engine requires torch; install it with: pip install qwen-tts torch (see plugins/voice/README.md)"
45
45
  ) from exc
46
46
  return torch
47
47
 
@@ -52,7 +52,7 @@ def _import_qwen_tts() -> ModuleType:
52
52
  except ImportError as exc:
53
53
  raise ImportError(
54
54
  "the qwen3 engine requires the 'qwen-tts' package; "
55
- "install it with: uv sync --extra qwen3"
55
+ "install it with: pip install qwen-tts torch (see plugins/voice/README.md)"
56
56
  ) from exc
57
57
  return qwen_tts
58
58
 
@@ -39,7 +39,7 @@ def _import_torch() -> ModuleType:
39
39
  import torch
40
40
  except ImportError as exc:
41
41
  raise ImportError(
42
- "the voxcpm engine requires torch; install it with: uv sync --extra voxcpm"
42
+ "the voxcpm engine requires torch; install it with: manual install (see plugins/voice/README.md)"
43
43
  ) from exc
44
44
  return torch
45
45
 
@@ -50,7 +50,7 @@ def _import_voxcpm() -> ModuleType:
50
50
  except ImportError as exc:
51
51
  raise ImportError(
52
52
  "the voxcpm engine requires the 'voxcpm' package; "
53
- "install it with: uv sync --extra voxcpm"
53
+ "install it with: manual install (see plugins/voice/README.md)"
54
54
  ) from exc
55
55
  return VoxCPM
56
56
 
@@ -47,7 +47,7 @@ def _import_torch() -> ModuleType:
47
47
  import torch
48
48
  except ImportError as exc:
49
49
  raise ImportError(
50
- "the xtts engine requires torch; install it with: uv sync --extra xtts"
50
+ "the xtts engine requires torch; install it with: manual install (see plugins/voice/README.md)"
51
51
  ) from exc
52
52
  return torch
53
53
 
@@ -58,7 +58,7 @@ def _import_coqui_tts() -> type:
58
58
  except ImportError as exc:
59
59
  raise ImportError(
60
60
  "the xtts engine requires the 'coqui-tts' package; "
61
- "install it with: uv sync --extra xtts"
61
+ "install it with: manual install (see plugins/voice/README.md)"
62
62
  ) from exc
63
63
  return TTS
64
64
 
File without changes
File without changes
File without changes