dulus 0.2.11__tar.gz → 0.2.12__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 (156) hide show
  1. {dulus-0.2.11/dulus.egg-info → dulus-0.2.12}/PKG-INFO +5 -3
  2. {dulus-0.2.11 → dulus-0.2.12}/README.md +1 -1
  3. {dulus-0.2.11 → dulus-0.2.12/dulus.egg-info}/PKG-INFO +5 -3
  4. {dulus-0.2.11 → dulus-0.2.12}/dulus.egg-info/requires.txt +4 -1
  5. {dulus-0.2.11 → dulus-0.2.12}/pyproject.toml +3 -3
  6. {dulus-0.2.11 → dulus-0.2.12}/LICENSE +0 -0
  7. {dulus-0.2.11 → dulus-0.2.12}/MANIFEST.in +0 -0
  8. {dulus-0.2.11 → dulus-0.2.12}/agent.py +0 -0
  9. {dulus-0.2.11 → dulus-0.2.12}/backend/__init__.py +0 -0
  10. {dulus-0.2.11 → dulus-0.2.12}/backend/compressor.py +0 -0
  11. {dulus-0.2.11 → dulus-0.2.12}/backend/context.py +0 -0
  12. {dulus-0.2.11 → dulus-0.2.12}/backend/githook.py +0 -0
  13. {dulus-0.2.11 → dulus-0.2.12}/backend/marketplace.py +0 -0
  14. {dulus-0.2.11 → dulus-0.2.12}/backend/mempalace_bridge.py +0 -0
  15. {dulus-0.2.11 → dulus-0.2.12}/backend/personas.py +0 -0
  16. {dulus-0.2.11 → dulus-0.2.12}/backend/plugins.py +0 -0
  17. {dulus-0.2.11 → dulus-0.2.12}/backend/server.py +0 -0
  18. {dulus-0.2.11 → dulus-0.2.12}/backend/tasks.py +0 -0
  19. {dulus-0.2.11 → dulus-0.2.12}/batch_api.py +0 -0
  20. {dulus-0.2.11 → dulus-0.2.12}/checkpoint/__init__.py +0 -0
  21. {dulus-0.2.11 → dulus-0.2.12}/checkpoint/hooks.py +0 -0
  22. {dulus-0.2.11 → dulus-0.2.12}/checkpoint/store.py +0 -0
  23. {dulus-0.2.11 → dulus-0.2.12}/checkpoint/types.py +0 -0
  24. {dulus-0.2.11 → dulus-0.2.12}/claude_code_watcher.py +0 -0
  25. {dulus-0.2.11 → dulus-0.2.12}/clipboard_utils.py +0 -0
  26. {dulus-0.2.11 → dulus-0.2.12}/cloudsave.py +0 -0
  27. {dulus-0.2.11 → dulus-0.2.12}/common.py +0 -0
  28. {dulus-0.2.11 → dulus-0.2.12}/compaction.py +0 -0
  29. {dulus-0.2.11 → dulus-0.2.12}/config.py +0 -0
  30. {dulus-0.2.11 → dulus-0.2.12}/context.py +0 -0
  31. {dulus-0.2.11 → dulus-0.2.12}/data/__init__.py +0 -0
  32. {dulus-0.2.11 → dulus-0.2.12}/data/active_persona.json +0 -0
  33. {dulus-0.2.11 → dulus-0.2.12}/data/context.json +0 -0
  34. {dulus-0.2.11 → dulus-0.2.12}/data/marketplace.json +0 -0
  35. {dulus-0.2.11 → dulus-0.2.12}/data/personas.json +0 -0
  36. {dulus-0.2.11 → dulus-0.2.12}/data/tasks.json +0 -0
  37. {dulus-0.2.11 → dulus-0.2.12}/docs/README.md +0 -0
  38. {dulus-0.2.11 → dulus-0.2.12}/docs/__init__.py +0 -0
  39. {dulus-0.2.11 → dulus-0.2.12}/docs/api.html +0 -0
  40. {dulus-0.2.11 → dulus-0.2.12}/docs/architecture.md +0 -0
  41. {dulus-0.2.11 → dulus-0.2.12}/docs/azure-speech-template.json +0 -0
  42. {dulus-0.2.11 → dulus-0.2.12}/docs/dashboard/index.html +0 -0
  43. {dulus-0.2.11 → dulus-0.2.12}/docs/divider.svg +0 -0
  44. {dulus-0.2.11 → dulus-0.2.12}/docs/generate.py +0 -0
  45. {dulus-0.2.11 → dulus-0.2.12}/docs/hero.svg +0 -0
  46. {dulus-0.2.11 → dulus-0.2.12}/docs/index.html +0 -0
  47. {dulus-0.2.11 → dulus-0.2.12}/docs/news.md +0 -0
  48. {dulus-0.2.11 → dulus-0.2.12}/docs/nvidia-models.svg +0 -0
  49. {dulus-0.2.11 → dulus-0.2.12}/docs/particle-playground.html +0 -0
  50. {dulus-0.2.11 → dulus-0.2.12}/docs/personas/index.html +0 -0
  51. {dulus-0.2.11 → dulus-0.2.12}/docs/preview.html +0 -0
  52. {dulus-0.2.11 → dulus-0.2.12}/docs/sec-agents.svg +0 -0
  53. {dulus-0.2.11 → dulus-0.2.12}/docs/sec-brainstorm.svg +0 -0
  54. {dulus-0.2.11 → dulus-0.2.12}/docs/sec-bridges.svg +0 -0
  55. {dulus-0.2.11 → dulus-0.2.12}/docs/sec-features.svg +0 -0
  56. {dulus-0.2.11 → dulus-0.2.12}/docs/sec-freetier.svg +0 -0
  57. {dulus-0.2.11 → dulus-0.2.12}/docs/sec-memory.svg +0 -0
  58. {dulus-0.2.11 → dulus-0.2.12}/docs/sec-models.svg +0 -0
  59. {dulus-0.2.11 → dulus-0.2.12}/docs/sec-perms.svg +0 -0
  60. {dulus-0.2.11 → dulus-0.2.12}/docs/sec-plugins.svg +0 -0
  61. {dulus-0.2.11 → dulus-0.2.12}/docs/sec-quickstart.svg +0 -0
  62. {dulus-0.2.11 → dulus-0.2.12}/docs/sec-ssj.svg +0 -0
  63. {dulus-0.2.11 → dulus-0.2.12}/docs/spinners.svg +0 -0
  64. {dulus-0.2.11 → dulus-0.2.12}/docs/split-pane.svg +0 -0
  65. {dulus-0.2.11 → dulus-0.2.12}/docs/terminal-boot.svg +0 -0
  66. {dulus-0.2.11 → dulus-0.2.12}/docs/uploads/particle-playground.html +0 -0
  67. {dulus-0.2.11 → dulus-0.2.12}/dulus.egg-info/SOURCES.txt +0 -0
  68. {dulus-0.2.11 → dulus-0.2.12}/dulus.egg-info/dependency_links.txt +0 -0
  69. {dulus-0.2.11 → dulus-0.2.12}/dulus.egg-info/entry_points.txt +0 -0
  70. {dulus-0.2.11 → dulus-0.2.12}/dulus.egg-info/top_level.txt +0 -0
  71. {dulus-0.2.11 → dulus-0.2.12}/dulus.py +0 -0
  72. {dulus-0.2.11 → dulus-0.2.12}/dulus_gui.py +0 -0
  73. {dulus-0.2.11 → dulus-0.2.12}/dulus_mcp/__init__.py +0 -0
  74. {dulus-0.2.11 → dulus-0.2.12}/dulus_mcp/client.py +0 -0
  75. {dulus-0.2.11 → dulus-0.2.12}/dulus_mcp/config.py +0 -0
  76. {dulus-0.2.11 → dulus-0.2.12}/dulus_mcp/tools.py +0 -0
  77. {dulus-0.2.11 → dulus-0.2.12}/dulus_mcp/types.py +0 -0
  78. {dulus-0.2.11 → dulus-0.2.12}/gui/__init__.py +0 -0
  79. {dulus-0.2.11 → dulus-0.2.12}/gui/agent_bridge.py +0 -0
  80. {dulus-0.2.11 → dulus-0.2.12}/gui/chat_widget.py +0 -0
  81. {dulus-0.2.11 → dulus-0.2.12}/gui/main_window.py +0 -0
  82. {dulus-0.2.11 → dulus-0.2.12}/gui/personas.py +0 -0
  83. {dulus-0.2.11 → dulus-0.2.12}/gui/session_utils.py +0 -0
  84. {dulus-0.2.11 → dulus-0.2.12}/gui/settings_dialog.py +0 -0
  85. {dulus-0.2.11 → dulus-0.2.12}/gui/sidebar.py +0 -0
  86. {dulus-0.2.11 → dulus-0.2.12}/gui/tasks_view.py +0 -0
  87. {dulus-0.2.11 → dulus-0.2.12}/gui/themes.py +0 -0
  88. {dulus-0.2.11 → dulus-0.2.12}/gui/tool_panel.py +0 -0
  89. {dulus-0.2.11 → dulus-0.2.12}/input.py +0 -0
  90. {dulus-0.2.11 → dulus-0.2.12}/license_manager.py +0 -0
  91. {dulus-0.2.11 → dulus-0.2.12}/memory/__init__.py +0 -0
  92. {dulus-0.2.11 → dulus-0.2.12}/memory/audit.py +0 -0
  93. {dulus-0.2.11 → dulus-0.2.12}/memory/consolidator.py +0 -0
  94. {dulus-0.2.11 → dulus-0.2.12}/memory/context.py +0 -0
  95. {dulus-0.2.11 → dulus-0.2.12}/memory/offload.py +0 -0
  96. {dulus-0.2.11 → dulus-0.2.12}/memory/palace.py +0 -0
  97. {dulus-0.2.11 → dulus-0.2.12}/memory/scan.py +0 -0
  98. {dulus-0.2.11 → dulus-0.2.12}/memory/sessions.py +0 -0
  99. {dulus-0.2.11 → dulus-0.2.12}/memory/store.py +0 -0
  100. {dulus-0.2.11 → dulus-0.2.12}/memory/tools.py +0 -0
  101. {dulus-0.2.11 → dulus-0.2.12}/memory/types.py +0 -0
  102. {dulus-0.2.11 → dulus-0.2.12}/memory/vector_search.py +0 -0
  103. {dulus-0.2.11 → dulus-0.2.12}/multi_agent/__init__.py +0 -0
  104. {dulus-0.2.11 → dulus-0.2.12}/multi_agent/subagent.py +0 -0
  105. {dulus-0.2.11 → dulus-0.2.12}/multi_agent/tools.py +0 -0
  106. {dulus-0.2.11 → dulus-0.2.12}/offload_helper.py +0 -0
  107. {dulus-0.2.11 → dulus-0.2.12}/plugin/__init__.py +0 -0
  108. {dulus-0.2.11 → dulus-0.2.12}/plugin/autoadapter.py +0 -0
  109. {dulus-0.2.11 → dulus-0.2.12}/plugin/loader.py +0 -0
  110. {dulus-0.2.11 → dulus-0.2.12}/plugin/recommend.py +0 -0
  111. {dulus-0.2.11 → dulus-0.2.12}/plugin/store.py +0 -0
  112. {dulus-0.2.11 → dulus-0.2.12}/plugin/types.py +0 -0
  113. {dulus-0.2.11 → dulus-0.2.12}/providers.py +0 -0
  114. {dulus-0.2.11 → dulus-0.2.12}/setup.cfg +0 -0
  115. {dulus-0.2.11 → dulus-0.2.12}/skill/__init__.py +0 -0
  116. {dulus-0.2.11 → dulus-0.2.12}/skill/builtin.py +0 -0
  117. {dulus-0.2.11 → dulus-0.2.12}/skill/clawhub.py +0 -0
  118. {dulus-0.2.11 → dulus-0.2.12}/skill/executor.py +0 -0
  119. {dulus-0.2.11 → dulus-0.2.12}/skill/loader.py +0 -0
  120. {dulus-0.2.11 → dulus-0.2.12}/skill/tools.py +0 -0
  121. {dulus-0.2.11 → dulus-0.2.12}/skills.py +0 -0
  122. {dulus-0.2.11 → dulus-0.2.12}/spinner.py +0 -0
  123. {dulus-0.2.11 → dulus-0.2.12}/string_utils.py +0 -0
  124. {dulus-0.2.11 → dulus-0.2.12}/subagent.py +0 -0
  125. {dulus-0.2.11 → dulus-0.2.12}/task/__init__.py +0 -0
  126. {dulus-0.2.11 → dulus-0.2.12}/task/store.py +0 -0
  127. {dulus-0.2.11 → dulus-0.2.12}/task/tools.py +0 -0
  128. {dulus-0.2.11 → dulus-0.2.12}/task/types.py +0 -0
  129. {dulus-0.2.11 → dulus-0.2.12}/tests/test_checkpoint.py +0 -0
  130. {dulus-0.2.11 → dulus-0.2.12}/tests/test_compaction.py +0 -0
  131. {dulus-0.2.11 → dulus-0.2.12}/tests/test_diff_view.py +0 -0
  132. {dulus-0.2.11 → dulus-0.2.12}/tests/test_injection_fix.py +0 -0
  133. {dulus-0.2.11 → dulus-0.2.12}/tests/test_license.py +0 -0
  134. {dulus-0.2.11 → dulus-0.2.12}/tests/test_mcp.py +0 -0
  135. {dulus-0.2.11 → dulus-0.2.12}/tests/test_memory.py +0 -0
  136. {dulus-0.2.11 → dulus-0.2.12}/tests/test_plugin.py +0 -0
  137. {dulus-0.2.11 → dulus-0.2.12}/tests/test_skills.py +0 -0
  138. {dulus-0.2.11 → dulus-0.2.12}/tests/test_subagent.py +0 -0
  139. {dulus-0.2.11 → dulus-0.2.12}/tests/test_task.py +0 -0
  140. {dulus-0.2.11 → dulus-0.2.12}/tests/test_telegram_buffer.py +0 -0
  141. {dulus-0.2.11 → dulus-0.2.12}/tests/test_tool_registry.py +0 -0
  142. {dulus-0.2.11 → dulus-0.2.12}/tests/test_voice.py +0 -0
  143. {dulus-0.2.11 → dulus-0.2.12}/tmux_offloader.py +0 -0
  144. {dulus-0.2.11 → dulus-0.2.12}/tmux_tools.py +0 -0
  145. {dulus-0.2.11 → dulus-0.2.12}/tool_registry.py +0 -0
  146. {dulus-0.2.11 → dulus-0.2.12}/tools.py +0 -0
  147. {dulus-0.2.11 → dulus-0.2.12}/ui/__init__.py +0 -0
  148. {dulus-0.2.11 → dulus-0.2.12}/ui/input.py +0 -0
  149. {dulus-0.2.11 → dulus-0.2.12}/ui/render.py +0 -0
  150. {dulus-0.2.11 → dulus-0.2.12}/voice/__init__.py +0 -0
  151. {dulus-0.2.11 → dulus-0.2.12}/voice/keyterms.py +0 -0
  152. {dulus-0.2.11 → dulus-0.2.12}/voice/recorder.py +0 -0
  153. {dulus-0.2.11 → dulus-0.2.12}/voice/stt.py +0 -0
  154. {dulus-0.2.11 → dulus-0.2.12}/voice/tts.py +0 -0
  155. {dulus-0.2.11 → dulus-0.2.12}/webchat.py +0 -0
  156. {dulus-0.2.11 → dulus-0.2.12}/webchat_server.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dulus
3
- Version: 0.2.11
3
+ Version: 0.2.12
4
4
  Summary: Spanish-first multi-provider AI CLI — 14 NVIDIA models free, Mesa Redonda, voice, TTS, RTK token reducer, MemPalace
5
5
  Author: KevRojo
6
6
  License: GPL-3.0
@@ -31,14 +31,16 @@ Requires-Dist: rich>=13.0.0
31
31
  Requires-Dist: prompt_toolkit>=3.0.0
32
32
  Requires-Dist: Flask>=3.1.3
33
33
  Requires-Dist: bubblewrap-cli>=1.0.0
34
- Requires-Dist: sounddevice
35
34
  Requires-Dist: customtkinter>=5.2.0
36
35
  Requires-Dist: Pillow>=10.0.0
37
36
  Requires-Dist: typing-extensions>=4.10.0
38
37
  Provides-Extra: memory
39
38
  Requires-Dist: mempalace>=3.3.4; extra == "memory"
39
+ Provides-Extra: voice
40
+ Requires-Dist: sounddevice; extra == "voice"
40
41
  Provides-Extra: full
41
42
  Requires-Dist: mempalace>=3.3.4; extra == "full"
43
+ Requires-Dist: sounddevice; extra == "full"
42
44
  Dynamic: license-file
43
45
 
44
46
  # ▲ DULUS
@@ -88,7 +90,7 @@ SET /sticky_input ON since the first run for the best experience!
88
90
 
89
91
  Dulus is a **lightweight Python reimplementation of Claude Code** that isn't locked to Claude. It ships the whole loop — REPL, tool dispatch, streaming, context compaction, checkpoints, sub-agents, voice, Telegram bridge, MCP, plugins — in roughly **12K lines you can actually read**. Fork it. Bend it. Run it offline against Qwen on your M2.
90
92
 
91
- > **v0.2.11 — May 8, 2026** — `mempalace` moved to `[memory]` extra so `pip install dulus` is now fast and works on termux/Android out of the box (chromadb's 26 transitive deps were the resolver killer). MemPalace per-turn injection still loads at runtime when present; opt in with `pip install "dulus[memory]"`.
93
+ > **v0.2.12 — May 8, 2026** — `sounddevice` also moved to `[voice]` extra (it pulls `cffi`, which needs `libffi-dev` to compile and breaks termux installs). Core `pip install dulus` is now zero-compile. Opt in to extras: `[memory]` for MemPalace, `[voice]` for mic input, `[full]` for both.
92
94
  > Type `/news` to see what changed.
93
95
 
94
96
  ---
@@ -45,7 +45,7 @@ SET /sticky_input ON since the first run for the best experience!
45
45
 
46
46
  Dulus is a **lightweight Python reimplementation of Claude Code** that isn't locked to Claude. It ships the whole loop — REPL, tool dispatch, streaming, context compaction, checkpoints, sub-agents, voice, Telegram bridge, MCP, plugins — in roughly **12K lines you can actually read**. Fork it. Bend it. Run it offline against Qwen on your M2.
47
47
 
48
- > **v0.2.11 — May 8, 2026** — `mempalace` moved to `[memory]` extra so `pip install dulus` is now fast and works on termux/Android out of the box (chromadb's 26 transitive deps were the resolver killer). MemPalace per-turn injection still loads at runtime when present; opt in with `pip install "dulus[memory]"`.
48
+ > **v0.2.12 — May 8, 2026** — `sounddevice` also moved to `[voice]` extra (it pulls `cffi`, which needs `libffi-dev` to compile and breaks termux installs). Core `pip install dulus` is now zero-compile. Opt in to extras: `[memory]` for MemPalace, `[voice]` for mic input, `[full]` for both.
49
49
  > Type `/news` to see what changed.
50
50
 
51
51
  ---
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dulus
3
- Version: 0.2.11
3
+ Version: 0.2.12
4
4
  Summary: Spanish-first multi-provider AI CLI — 14 NVIDIA models free, Mesa Redonda, voice, TTS, RTK token reducer, MemPalace
5
5
  Author: KevRojo
6
6
  License: GPL-3.0
@@ -31,14 +31,16 @@ Requires-Dist: rich>=13.0.0
31
31
  Requires-Dist: prompt_toolkit>=3.0.0
32
32
  Requires-Dist: Flask>=3.1.3
33
33
  Requires-Dist: bubblewrap-cli>=1.0.0
34
- Requires-Dist: sounddevice
35
34
  Requires-Dist: customtkinter>=5.2.0
36
35
  Requires-Dist: Pillow>=10.0.0
37
36
  Requires-Dist: typing-extensions>=4.10.0
38
37
  Provides-Extra: memory
39
38
  Requires-Dist: mempalace>=3.3.4; extra == "memory"
39
+ Provides-Extra: voice
40
+ Requires-Dist: sounddevice; extra == "voice"
40
41
  Provides-Extra: full
41
42
  Requires-Dist: mempalace>=3.3.4; extra == "full"
43
+ Requires-Dist: sounddevice; extra == "full"
42
44
  Dynamic: license-file
43
45
 
44
46
  # ▲ DULUS
@@ -88,7 +90,7 @@ SET /sticky_input ON since the first run for the best experience!
88
90
 
89
91
  Dulus is a **lightweight Python reimplementation of Claude Code** that isn't locked to Claude. It ships the whole loop — REPL, tool dispatch, streaming, context compaction, checkpoints, sub-agents, voice, Telegram bridge, MCP, plugins — in roughly **12K lines you can actually read**. Fork it. Bend it. Run it offline against Qwen on your M2.
90
92
 
91
- > **v0.2.11 — May 8, 2026** — `mempalace` moved to `[memory]` extra so `pip install dulus` is now fast and works on termux/Android out of the box (chromadb's 26 transitive deps were the resolver killer). MemPalace per-turn injection still loads at runtime when present; opt in with `pip install "dulus[memory]"`.
93
+ > **v0.2.12 — May 8, 2026** — `sounddevice` also moved to `[voice]` extra (it pulls `cffi`, which needs `libffi-dev` to compile and breaks termux installs). Core `pip install dulus` is now zero-compile. Opt in to extras: `[memory]` for MemPalace, `[voice]` for mic input, `[full]` for both.
92
94
  > Type `/news` to see what changed.
93
95
 
94
96
  ---
@@ -6,13 +6,16 @@ rich>=13.0.0
6
6
  prompt_toolkit>=3.0.0
7
7
  Flask>=3.1.3
8
8
  bubblewrap-cli>=1.0.0
9
- sounddevice
10
9
  customtkinter>=5.2.0
11
10
  Pillow>=10.0.0
12
11
  typing-extensions>=4.10.0
13
12
 
14
13
  [full]
15
14
  mempalace>=3.3.4
15
+ sounddevice
16
16
 
17
17
  [memory]
18
18
  mempalace>=3.3.4
19
+
20
+ [voice]
21
+ sounddevice
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "dulus"
7
- version = "0.2.11"
7
+ version = "0.2.12"
8
8
  description = "Spanish-first multi-provider AI CLI — 14 NVIDIA models free, Mesa Redonda, voice, TTS, RTK token reducer, MemPalace"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -36,7 +36,6 @@ dependencies = [
36
36
  "prompt_toolkit>=3.0.0",
37
37
  "Flask>=3.1.3",
38
38
  "bubblewrap-cli>=1.0.0",
39
- "sounddevice",
40
39
  "customtkinter>=5.2.0",
41
40
  "Pillow>=10.0.0",
42
41
  "typing-extensions>=4.10.0",
@@ -50,7 +49,8 @@ dependencies = [
50
49
  # (or `dulus[full]`) when they want MemPalace per-turn injection.
51
50
  [project.optional-dependencies]
52
51
  memory = ["mempalace>=3.3.4"]
53
- full = ["mempalace>=3.3.4"]
52
+ voice = ["sounddevice"]
53
+ full = ["mempalace>=3.3.4", "sounddevice"]
54
54
 
55
55
  [project.scripts]
56
56
  dulus = "dulus:main"
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
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