webbee 0.7.0__tar.gz → 0.7.1__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 (159) hide show
  1. {webbee-0.7.0 → webbee-0.7.1}/CHANGELOG.md +7 -0
  2. {webbee-0.7.0 → webbee-0.7.1}/PKG-INFO +2 -2
  3. {webbee-0.7.0 → webbee-0.7.1}/pyproject.toml +2 -2
  4. webbee-0.7.1/src/webbee/__init__.py +1 -0
  5. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/boot.py +11 -1
  6. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/tools.py +5 -1
  7. {webbee-0.7.0 → webbee-0.7.1}/tests/test_tools.py +15 -0
  8. webbee-0.7.0/src/webbee/__init__.py +0 -1
  9. {webbee-0.7.0 → webbee-0.7.1}/.github/workflows/publish.yml +0 -0
  10. {webbee-0.7.0 → webbee-0.7.1}/.gitignore +0 -0
  11. {webbee-0.7.0 → webbee-0.7.1}/LICENSE +0 -0
  12. {webbee-0.7.0 → webbee-0.7.1}/README.md +0 -0
  13. {webbee-0.7.0 → webbee-0.7.1}/install.sh +0 -0
  14. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/__main__.py +0 -0
  15. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/_launch.py +0 -0
  16. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/account.py +0 -0
  17. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/active_sessions.py +0 -0
  18. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/autoupdate.py +0 -0
  19. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/banner_art.py +0 -0
  20. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/browser.py +0 -0
  21. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/checkpoints.py +0 -0
  22. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/cli.py +0 -0
  23. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/clipboard.py +0 -0
  24. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/clipboard_read.py +0 -0
  25. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/clipboard_session.py +0 -0
  26. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/coding_context.py +0 -0
  27. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/commands.py +0 -0
  28. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/config.py +0 -0
  29. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/consent.py +0 -0
  30. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/details.py +0 -0
  31. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/events.py +0 -0
  32. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/frames.py +0 -0
  33. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/home.py +0 -0
  34. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/home_view.py +0 -0
  35. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/http.py +0 -0
  36. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/instance_lock.py +0 -0
  37. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/intel/__init__.py +0 -0
  38. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/intel/graph.py +0 -0
  39. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/intel/outline.py +0 -0
  40. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/intel/query.py +0 -0
  41. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/intel/service.py +0 -0
  42. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/intel/store.py +0 -0
  43. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/intel/tree.py +0 -0
  44. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/intel/vectors.py +0 -0
  45. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/intel/watch.py +0 -0
  46. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/media.py +0 -0
  47. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/modals.py +0 -0
  48. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/mode_store.py +0 -0
  49. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/native_files.py +0 -0
  50. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/native_read.py +0 -0
  51. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/newtab_mode.py +0 -0
  52. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/output_pane.py +0 -0
  53. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/pricing_constants.py +0 -0
  54. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/queue_panel.py +0 -0
  55. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/reflow.py +0 -0
  56. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/remote.py +0 -0
  57. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/render.py +0 -0
  58. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/repl.py +0 -0
  59. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/repo.py +0 -0
  60. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/selection.py +0 -0
  61. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/session.py +0 -0
  62. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/sessions.py +0 -0
  63. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/sizing.py +0 -0
  64. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/slots.py +0 -0
  65. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/steer.py +0 -0
  66. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/stream.py +0 -0
  67. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/tab_store.py +0 -0
  68. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/tabs.py +0 -0
  69. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/thread.py +0 -0
  70. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/tier_store.py +0 -0
  71. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/todo_panel.py +0 -0
  72. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/tokens.py +0 -0
  73. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/tui.py +0 -0
  74. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/update.py +0 -0
  75. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/urlopen.py +0 -0
  76. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/wallet.py +0 -0
  77. {webbee-0.7.0 → webbee-0.7.1}/src/webbee/worktrees.py +0 -0
  78. {webbee-0.7.0 → webbee-0.7.1}/tests/__init__.py +0 -0
  79. {webbee-0.7.0 → webbee-0.7.1}/tests/conftest.py +0 -0
  80. {webbee-0.7.0 → webbee-0.7.1}/tests/test_account.py +0 -0
  81. {webbee-0.7.0 → webbee-0.7.1}/tests/test_active_sessions.py +0 -0
  82. {webbee-0.7.0 → webbee-0.7.1}/tests/test_audit_2026_07_25_findings.py +0 -0
  83. {webbee-0.7.0 → webbee-0.7.1}/tests/test_autoupdate.py +0 -0
  84. {webbee-0.7.0 → webbee-0.7.1}/tests/test_checkpoints.py +0 -0
  85. {webbee-0.7.0 → webbee-0.7.1}/tests/test_checkpoints_nested_1030.py +0 -0
  86. {webbee-0.7.0 → webbee-0.7.1}/tests/test_cli.py +0 -0
  87. {webbee-0.7.0 → webbee-0.7.1}/tests/test_clipboard.py +0 -0
  88. {webbee-0.7.0 → webbee-0.7.1}/tests/test_clipboard_read.py +0 -0
  89. {webbee-0.7.0 → webbee-0.7.1}/tests/test_code_map_fresh.py +0 -0
  90. {webbee-0.7.0 → webbee-0.7.1}/tests/test_coding_context.py +0 -0
  91. {webbee-0.7.0 → webbee-0.7.1}/tests/test_commands.py +0 -0
  92. {webbee-0.7.0 → webbee-0.7.1}/tests/test_config.py +0 -0
  93. {webbee-0.7.0 → webbee-0.7.1}/tests/test_cpc_contract_stable.py +0 -0
  94. {webbee-0.7.0 → webbee-0.7.1}/tests/test_cpc_outline.py +0 -0
  95. {webbee-0.7.0 → webbee-0.7.1}/tests/test_cross_loop_token.py +0 -0
  96. {webbee-0.7.0 → webbee-0.7.1}/tests/test_details.py +0 -0
  97. {webbee-0.7.0 → webbee-0.7.1}/tests/test_events.py +0 -0
  98. {webbee-0.7.0 → webbee-0.7.1}/tests/test_freeze_fix.py +0 -0
  99. {webbee-0.7.0 → webbee-0.7.1}/tests/test_home.py +0 -0
  100. {webbee-0.7.0 → webbee-0.7.1}/tests/test_home_view.py +0 -0
  101. {webbee-0.7.0 → webbee-0.7.1}/tests/test_home_view_mouse.py +0 -0
  102. {webbee-0.7.0 → webbee-0.7.1}/tests/test_inspect_page.py +0 -0
  103. {webbee-0.7.0 → webbee-0.7.1}/tests/test_instance_lock.py +0 -0
  104. {webbee-0.7.0 → webbee-0.7.1}/tests/test_intel_any_folder.py +0 -0
  105. {webbee-0.7.0 → webbee-0.7.1}/tests/test_intel_cache_and_sync_worker.py +0 -0
  106. {webbee-0.7.0 → webbee-0.7.1}/tests/test_intel_checksum_tree.py +0 -0
  107. {webbee-0.7.0 → webbee-0.7.1}/tests/test_intel_chunker.py +0 -0
  108. {webbee-0.7.0 → webbee-0.7.1}/tests/test_intel_embed.py +0 -0
  109. {webbee-0.7.0 → webbee-0.7.1}/tests/test_intel_graph.py +0 -0
  110. {webbee-0.7.0 → webbee-0.7.1}/tests/test_intel_no_numpy.py +0 -0
  111. {webbee-0.7.0 → webbee-0.7.1}/tests/test_intel_query.py +0 -0
  112. {webbee-0.7.0 → webbee-0.7.1}/tests/test_intel_service.py +0 -0
  113. {webbee-0.7.0 → webbee-0.7.1}/tests/test_intel_store.py +0 -0
  114. {webbee-0.7.0 → webbee-0.7.1}/tests/test_intel_vectors.py +0 -0
  115. {webbee-0.7.0 → webbee-0.7.1}/tests/test_intel_watch.py +0 -0
  116. {webbee-0.7.0 → webbee-0.7.1}/tests/test_launch.py +0 -0
  117. {webbee-0.7.0 → webbee-0.7.1}/tests/test_marathon.py +0 -0
  118. {webbee-0.7.0 → webbee-0.7.1}/tests/test_modals_e2e.py +0 -0
  119. {webbee-0.7.0 → webbee-0.7.1}/tests/test_mode_and_remote_0_6_8.py +0 -0
  120. {webbee-0.7.0 → webbee-0.7.1}/tests/test_mode_store.py +0 -0
  121. {webbee-0.7.0 → webbee-0.7.1}/tests/test_native_files.py +0 -0
  122. {webbee-0.7.0 → webbee-0.7.1}/tests/test_newtab_mode.py +0 -0
  123. {webbee-0.7.0 → webbee-0.7.1}/tests/test_packaging.py +0 -0
  124. {webbee-0.7.0 → webbee-0.7.1}/tests/test_probe_cost.py +0 -0
  125. {webbee-0.7.0 → webbee-0.7.1}/tests/test_queue_manage_0337.py +0 -0
  126. {webbee-0.7.0 → webbee-0.7.1}/tests/test_reflow.py +0 -0
  127. {webbee-0.7.0 → webbee-0.7.1}/tests/test_remote_code_reads.py +0 -0
  128. {webbee-0.7.0 → webbee-0.7.1}/tests/test_render.py +0 -0
  129. {webbee-0.7.0 → webbee-0.7.1}/tests/test_repl.py +0 -0
  130. {webbee-0.7.0 → webbee-0.7.1}/tests/test_repo.py +0 -0
  131. {webbee-0.7.0 → webbee-0.7.1}/tests/test_resilient_http.py +0 -0
  132. {webbee-0.7.0 → webbee-0.7.1}/tests/test_review_fixes_1030.py +0 -0
  133. {webbee-0.7.0 → webbee-0.7.1}/tests/test_session.py +0 -0
  134. {webbee-0.7.0 → webbee-0.7.1}/tests/test_session_review_1030.py +0 -0
  135. {webbee-0.7.0 → webbee-0.7.1}/tests/test_sessions.py +0 -0
  136. {webbee-0.7.0 → webbee-0.7.1}/tests/test_sizing.py +0 -0
  137. {webbee-0.7.0 → webbee-0.7.1}/tests/test_slots.py +0 -0
  138. {webbee-0.7.0 → webbee-0.7.1}/tests/test_steer.py +0 -0
  139. {webbee-0.7.0 → webbee-0.7.1}/tests/test_stream.py +0 -0
  140. {webbee-0.7.0 → webbee-0.7.1}/tests/test_tab_bar_stability.py +0 -0
  141. {webbee-0.7.0 → webbee-0.7.1}/tests/test_tab_restore_0337.py +0 -0
  142. {webbee-0.7.0 → webbee-0.7.1}/tests/test_tabs.py +0 -0
  143. {webbee-0.7.0 → webbee-0.7.1}/tests/test_terminal_ux_0336.py +0 -0
  144. {webbee-0.7.0 → webbee-0.7.1}/tests/test_thread.py +0 -0
  145. {webbee-0.7.0 → webbee-0.7.1}/tests/test_tier_invalidation.py +0 -0
  146. {webbee-0.7.0 → webbee-0.7.1}/tests/test_tier_store.py +0 -0
  147. {webbee-0.7.0 → webbee-0.7.1}/tests/test_todo_panel.py +0 -0
  148. {webbee-0.7.0 → webbee-0.7.1}/tests/test_tokens.py +0 -0
  149. {webbee-0.7.0 → webbee-0.7.1}/tests/test_tools_eol_cancel_1030.py +0 -0
  150. {webbee-0.7.0 → webbee-0.7.1}/tests/test_tools_vision_websearch.py +0 -0
  151. {webbee-0.7.0 → webbee-0.7.1}/tests/test_tui.py +0 -0
  152. {webbee-0.7.0 → webbee-0.7.1}/tests/test_tui_hardening.py +0 -0
  153. {webbee-0.7.0 → webbee-0.7.1}/tests/test_update.py +0 -0
  154. {webbee-0.7.0 → webbee-0.7.1}/tests/test_update_badge_0340.py +0 -0
  155. {webbee-0.7.0 → webbee-0.7.1}/tests/test_urlopen.py +0 -0
  156. {webbee-0.7.0 → webbee-0.7.1}/tests/test_version.py +0 -0
  157. {webbee-0.7.0 → webbee-0.7.1}/tests/test_version_badge_corner.py +0 -0
  158. {webbee-0.7.0 → webbee-0.7.1}/tests/test_wallet.py +0 -0
  159. {webbee-0.7.0 → webbee-0.7.1}/tests/test_worktrees.py +0 -0
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.7.1
4
+
5
+ * **A missing code index says why**: when the index did not start (a failure while building it, or it is turned off),
6
+ `impact_of_change`, `graph_slice` and the other code-map tools now name the real reason instead of the wrong
7
+ "install webbee[intel]" -- the index has shipped in the base install since 0.7.0, there is nothing to install.
8
+ * Needs imperal-mcp 0.9.1 (install commands that work on Debian 12+, Ubuntu 23.04+ and Homebrew: `pipx` / `uv tool`).
9
+
3
10
  ## 0.7.0
4
11
 
5
12
  * **The local index takes any folder and every file kind**: open webbee in a home folder, a folder of contracts or a
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: webbee
3
- Version: 0.7.0
3
+ Version: 0.7.1
4
4
  Summary: Webbee 🐝 — the Imperal Cloud coding agent in your terminal
5
5
  Project-URL: Homepage, https://imperal.io
6
6
  Project-URL: Documentation, https://docs.imperal.io
@@ -31,7 +31,7 @@ Requires-Python: >=3.7
31
31
  Requires-Dist: asyncssh>=2.14; python_version >= '3.10'
32
32
  Requires-Dist: httpx-sse>=0.4; python_version >= '3.10'
33
33
  Requires-Dist: httpx>=0.27; python_version >= '3.10'
34
- Requires-Dist: imperal-mcp>=0.9.0; python_version >= '3.10'
34
+ Requires-Dist: imperal-mcp>=0.9.1; python_version >= '3.10'
35
35
  Requires-Dist: imperal-sdk[universal-index]>=6.4.1; python_version >= '3.10'
36
36
  Requires-Dist: model2vec>=0.8.2; python_version >= '3.10' and (sys_platform != 'darwin' or platform_machine != 'x86_64' or python_version < '3.13')
37
37
  Requires-Dist: numpy>=2; python_version >= '3.10' and (sys_platform != 'darwin' or platform_machine != 'x86_64' or python_version < '3.13')
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "webbee"
3
- version = "0.7.0"
3
+ version = "0.7.1"
4
4
  description = "Webbee 🐝 — the Imperal Cloud coding agent in your terminal"
5
5
  readme = "README.md"
6
6
  license = "GPL-3.0-or-later"
@@ -13,7 +13,7 @@ dependencies = [
13
13
  # release on a Python 3.12 it sets up once with uv -- `uv` comes as a wheel on 3.8+,
14
14
  # 3.7 fetches it with uv's own installer.
15
15
  'uv>=0.4; python_version >= "3.8" and python_version < "3.10"',
16
- 'imperal-mcp>=0.9.0; python_version >= "3.10"', # raised to the newest at each release
16
+ 'imperal-mcp>=0.9.1; python_version >= "3.10"', # raised to the newest at each release
17
17
  'imperal-sdk[universal-index]>=6.4.1; python_version >= "3.10"',
18
18
  'asyncssh>=2.14; python_version >= "3.10"',
19
19
  'httpx>=0.27; python_version >= "3.10"',
@@ -0,0 +1 @@
1
+ __version__ = "0.7.1"
@@ -7,6 +7,11 @@ import asyncio
7
7
  import os
8
8
  import subprocess
9
9
 
10
+ # Why the code index is NOT running in this process ("" while it runs or before the boot). The boot swallows the
11
+ # failure so the REPL never crashes -- but a tool that needs the index must be able to say the real reason instead of
12
+ # guessing ("install webbee[intel]" was wrong since 0.7.0: intel ships in the base install).
13
+ INTEL_DOWN_REASON = ""
14
+
10
15
 
11
16
  def _git_branch(workspace: str) -> str:
12
17
  try:
@@ -105,6 +110,7 @@ async def start_intel(cfg, workspace: str, intel_factory):
105
110
  failure here (missing extra, bad repo, etc.) must degrade to
106
111
  (None, None), never crash the boot -- coding still works, just
107
112
  without repo intelligence. Returns (intel, watcher_task)."""
113
+ global INTEL_DOWN_REASON
108
114
  try:
109
115
  svc = (intel_factory or _default_intel_factory)(cfg, workspace)
110
116
  await asyncio.to_thread(svc.build)
@@ -118,8 +124,10 @@ async def start_intel(cfg, workspace: str, intel_factory):
118
124
  # its end is always collected: an exception is never printed when webbee quits ("Task exception was never
119
125
  # retrieved", live 2026-10-25)
120
126
  watcher_task.add_done_callback(lambda t: t.cancelled() or t.exception())
127
+ INTEL_DOWN_REASON = ""
121
128
  return svc, watcher_task
122
- except Exception:
129
+ except Exception as exc:
130
+ INTEL_DOWN_REASON = f"the code index failed to start: {type(exc).__name__}: {str(exc)[:200]}"
123
131
  return None, None
124
132
 
125
133
 
@@ -155,10 +163,12 @@ async def boot_workspace(cfg, workspace: str, intel_factory, shadow_factory) ->
155
163
  behavior per job (a crash in one never blocks the others or the boot),
156
164
  just concurrent instead of serial."""
157
165
  async def _intel_job():
166
+ global INTEL_DOWN_REASON
158
167
  if cfg.intel_enabled:
159
168
  # Guarded off-loop build + watcher; any failure degrades to
160
169
  # intel=None, never crashes the boot (start_intel above).
161
170
  return await start_intel(cfg, workspace, intel_factory)
171
+ INTEL_DOWN_REASON = "the code index is turned off in this configuration (intel_enabled = false)"
162
172
  return None, None
163
173
 
164
174
  (intel, watcher_task), shadow, git_branch = await asyncio.gather(
@@ -1002,7 +1002,11 @@ class LocalToolExecutor:
1002
1002
 
1003
1003
  def _cpc_local(self, verb: str, a: dict) -> dict:
1004
1004
  if self.indexer is None:
1005
- return {"ok": False, "content": "intel not available; install webbee[intel]"}
1005
+ from webbee import boot
1006
+ why = boot.INTEL_DOWN_REASON or "the code index is not running in this session"
1007
+ return {"ok": False, "content": f"intel not available: {why}. It ships with webbee (no extra to install); "
1008
+ "restart webbee in the repository, and if it repeats, see "
1009
+ "~/.cache/webbee/tui-stderr.log"}
1006
1010
  from webbee.intel import query
1007
1011
  if verb == "repo_profile":
1008
1012
  return query.repo_profile(self.indexer)
@@ -178,6 +178,21 @@ def test_cpc_shim_degrades_without_indexer(tmp_path):
178
178
  ex = LocalToolExecutor(str(tmp_path)) # indexer=None
179
179
  out = ex.run("graph_slice", {"symbols": ["x"]})
180
180
  assert out["ok"] is False and "intel not available" in out["content"]
181
+ assert "install webbee[intel]" not in out["content"] # intel ships in the base install since 0.7.0
182
+
183
+
184
+ def test_cpc_shim_says_why_the_index_is_down(tmp_path, monkeypatch):
185
+ import asyncio
186
+ from webbee import boot
187
+ from webbee.tools import LocalToolExecutor
188
+
189
+ def broken_factory(cfg, ws):
190
+ raise PermissionError("cannot write the index cache")
191
+ monkeypatch.setattr(boot, "INTEL_DOWN_REASON", "")
192
+ assert asyncio.run(boot.start_intel(object(), str(tmp_path), broken_factory)) == (None, None)
193
+ out = LocalToolExecutor(str(tmp_path)).run("impact_of_change", {"symbols": ["x"]})
194
+ assert out["ok"] is False
195
+ assert "PermissionError: cannot write the index cache" in out["content"]
181
196
 
182
197
 
183
198
  def test_cpc_graph_slice_coerces_stringified_symbols(tmp_path):
@@ -1 +0,0 @@
1
- __version__ = "0.7.0"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes