dulus 0.2.36__tar.gz → 0.2.38__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.
- {dulus-0.2.36/dulus.egg-info → dulus-0.2.38}/PKG-INFO +1 -1
- {dulus-0.2.36 → dulus-0.2.38/dulus.egg-info}/PKG-INFO +1 -1
- {dulus-0.2.36 → dulus-0.2.38}/dulus.py +14 -5
- {dulus-0.2.36 → dulus-0.2.38}/dulus_gui.py +28 -5
- {dulus-0.2.36 → dulus-0.2.38}/memory/tools.py +42 -3
- {dulus-0.2.36 → dulus-0.2.38}/pyproject.toml +1 -1
- {dulus-0.2.36 → dulus-0.2.38}/LICENSE +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/MANIFEST.in +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/README.md +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/agent.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/backend/__init__.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/backend/compressor.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/backend/context.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/backend/githook.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/backend/marketplace.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/backend/mempalace_bridge.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/backend/personas.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/backend/plugins.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/backend/server.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/backend/tasks.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/batch_api.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/checkpoint/__init__.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/checkpoint/hooks.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/checkpoint/store.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/checkpoint/types.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/claude_code_watcher.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/clipboard_utils.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/cloudsave.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/common.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/compaction.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/config.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/context.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/data/__init__.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/data/active_persona.json +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/data/context.json +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/data/marketplace.json +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/data/personas.json +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/data/plugins/__init__.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/data/plugins/composio/__init__.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/data/plugins/composio/composio_plugin/__init__.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/data/plugins/composio/composio_plugin/session_manager.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/data/plugins/composio/composio_plugin/tool_generator.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/data/plugins/composio/plugin.json +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/data/plugins/composio/plugin_tool.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/data/tasks.json +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/docs/README.md +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/docs/__init__.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/docs/api.html +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/docs/architecture.md +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/docs/azure-speech-template.json +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/docs/dashboard/index.html +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/docs/divider.svg +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/docs/generate.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/docs/hero.svg +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/docs/index.html +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/docs/news.md +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/docs/nvidia-models.svg +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/docs/particle-playground.html +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/docs/personas/index.html +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/docs/poetry-banner.png +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/docs/preview.html +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/docs/sec-agents.svg +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/docs/sec-brainstorm.svg +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/docs/sec-bridges.svg +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/docs/sec-features.svg +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/docs/sec-freetier.svg +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/docs/sec-memory.svg +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/docs/sec-models.svg +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/docs/sec-perms.svg +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/docs/sec-plugins.svg +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/docs/sec-quickstart.svg +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/docs/sec-ssj.svg +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/docs/spinners.svg +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/docs/split-pane.svg +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/docs/terminal-boot.svg +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/docs/uploads/particle-playground.html +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/dulus.egg-info/SOURCES.txt +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/dulus.egg-info/dependency_links.txt +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/dulus.egg-info/entry_points.txt +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/dulus.egg-info/requires.txt +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/dulus.egg-info/top_level.txt +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/dulus_mcp/__init__.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/dulus_mcp/client.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/dulus_mcp/config.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/dulus_mcp/tools.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/dulus_mcp/types.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/gui/__init__.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/gui/agent_bridge.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/gui/chat_widget.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/gui/main_window.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/gui/personas.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/gui/session_utils.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/gui/settings_dialog.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/gui/sidebar.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/gui/tasks_view.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/gui/themes.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/gui/tool_panel.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/input.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/license_manager.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/memory/__init__.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/memory/audit.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/memory/consolidator.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/memory/context.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/memory/offload.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/memory/palace.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/memory/scan.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/memory/sessions.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/memory/store.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/memory/types.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/memory/vector_search.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/multi_agent/__init__.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/multi_agent/subagent.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/multi_agent/tools.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/offload_helper.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/plugin/__init__.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/plugin/autoadapter.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/plugin/loader.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/plugin/recommend.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/plugin/store.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/plugin/types.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/providers.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/setup.cfg +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/skill/__init__.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/skill/builtin.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/skill/clawhub.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/skill/executor.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/skill/loader.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/skill/tools.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/skills.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/spinner.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/string_utils.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/subagent.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/task/__init__.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/task/store.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/task/tools.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/task/types.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/tests/test_checkpoint.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/tests/test_compaction.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/tests/test_diff_view.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/tests/test_injection_fix.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/tests/test_license.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/tests/test_mcp.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/tests/test_memory.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/tests/test_plugin.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/tests/test_skills.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/tests/test_subagent.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/tests/test_task.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/tests/test_telegram_buffer.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/tests/test_tool_registry.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/tests/test_voice.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/tmux_offloader.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/tmux_tools.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/tool_registry.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/tools.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/ui/__init__.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/ui/input.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/ui/render.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/voice/__init__.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/voice/keyterms.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/voice/recorder.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/voice/stt.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/voice/tts.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/webchat.py +0 -0
- {dulus-0.2.36 → dulus-0.2.38}/webchat_server.py +0 -0
|
@@ -1459,11 +1459,20 @@ def cmd_context(_args: str, state, config) -> bool:
|
|
|
1459
1459
|
|
|
1460
1460
|
def cmd_cost(_args: str, state, config) -> bool:
|
|
1461
1461
|
from config import calc_cost
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
-
|
|
1462
|
+
from compaction import estimate_tokens
|
|
1463
|
+
|
|
1464
|
+
# The accumulated counters (total_input_tokens etc.) sum the provider's
|
|
1465
|
+
# reported "tokens in this request" which includes the ENTIRE context
|
|
1466
|
+
# window every turn. That creates a quadratic explosion and is useless
|
|
1467
|
+
# for cost estimation. Instead, estimate from the actual message list.
|
|
1468
|
+
est_input = estimate_tokens(state.messages, model=config.get("model", ""), config=config)
|
|
1469
|
+
# Output is trickier to estimate from history alone; use the accumulated
|
|
1470
|
+
# counter as a lower-bound fallback but cap it to something sane.
|
|
1471
|
+
est_output = min(state.total_output_tokens, est_input)
|
|
1472
|
+
|
|
1473
|
+
cost = calc_cost(config["model"], est_input, est_output)
|
|
1474
|
+
info(f"Input tokens: ~{est_input:,} (estimated from {len(state.messages)} messages)")
|
|
1475
|
+
info(f"Output tokens: ~{est_output:,}")
|
|
1467
1476
|
c_read = getattr(state, "total_cache_read_tokens", 0)
|
|
1468
1477
|
c_write = getattr(state, "total_cache_creation_tokens", 0)
|
|
1469
1478
|
if c_read > 0 or c_write > 0:
|
|
@@ -127,6 +127,26 @@ def launch_gui(config: dict | None = None, initial_prompt: str | None = None) ->
|
|
|
127
127
|
"""
|
|
128
128
|
cfg = config or load_config()
|
|
129
129
|
|
|
130
|
+
# ── Ensure MemPalace is initialized for fresh installs ──────────────────
|
|
131
|
+
try:
|
|
132
|
+
from pathlib import Path as _Path
|
|
133
|
+
import subprocess as _sp, sys as _sys, os as _os
|
|
134
|
+
_mp_cfg = _Path.home() / ".mempalace" / "config.json"
|
|
135
|
+
if not _mp_cfg.exists():
|
|
136
|
+
_mem_dir = _Path.home() / ".dulus" / "memory"
|
|
137
|
+
_mem_dir.mkdir(parents=True, exist_ok=True)
|
|
138
|
+
_env = {**_os.environ, "PYTHONIOENCODING": "utf-8", "PYTHONUTF8": "1"}
|
|
139
|
+
_sp.run(
|
|
140
|
+
[_sys.executable, "-X", "utf8", "-m", "mempalace", "init",
|
|
141
|
+
str(_mem_dir), "--yes", "--no-llm"],
|
|
142
|
+
stdout=_sp.DEVNULL, stderr=_sp.DEVNULL,
|
|
143
|
+
env=_env,
|
|
144
|
+
creationflags=getattr(_sp, "CREATE_NO_WINDOW", 0),
|
|
145
|
+
check=False,
|
|
146
|
+
)
|
|
147
|
+
except Exception:
|
|
148
|
+
pass # best-effort; don't block GUI startup
|
|
149
|
+
|
|
130
150
|
# Theme
|
|
131
151
|
ctk.set_appearance_mode(cfg.get("appearance", "dark"))
|
|
132
152
|
ctk.set_default_color_theme("dark-blue")
|
|
@@ -266,11 +286,14 @@ def launch_gui(config: dict | None = None, initial_prompt: str | None = None) ->
|
|
|
266
286
|
itok = event.get("input_tokens", 0)
|
|
267
287
|
otok = event.get("output_tokens", 0)
|
|
268
288
|
app.set_status(f"Listo (+{itok}/{otok} tok)", t["success"])
|
|
269
|
-
|
|
270
|
-
#
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
289
|
+
|
|
290
|
+
# Only rebuild sidebar if this is a brand-new session not yet in the list.
|
|
291
|
+
# Rebuilding after every message causes annoying flicker.
|
|
292
|
+
sid = event.get("session_id")
|
|
293
|
+
if sid and sid not in app.sidebar._session_buttons:
|
|
294
|
+
app.set_sessions(scan_sessions())
|
|
295
|
+
if sid:
|
|
296
|
+
app.set_active_session(sid)
|
|
274
297
|
|
|
275
298
|
elif etype == "permission":
|
|
276
299
|
_show_perm(event.get("description", ""))
|
|
@@ -13,6 +13,45 @@ from .scan import scan_all_memories, format_memory_manifest
|
|
|
13
13
|
from .sessions import search_session_history
|
|
14
14
|
|
|
15
15
|
|
|
16
|
+
# ── MemPalace auto-init helper ─────────────────────────────────────────────
|
|
17
|
+
|
|
18
|
+
def _mempalace_env() -> dict:
|
|
19
|
+
"""Return environment dict with UTF-8 overrides for Windows safety."""
|
|
20
|
+
import os as _os
|
|
21
|
+
return {**_os.environ, "PYTHONIOENCODING": "utf-8", "PYTHONUTF8": "1"}
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def _is_mempalace_initialized() -> bool:
|
|
25
|
+
"""Check whether MemPalace has been init'd (config dir exists)."""
|
|
26
|
+
try:
|
|
27
|
+
from pathlib import Path as _Path
|
|
28
|
+
return (_Path.home() / ".mempalace" / "config.json").exists()
|
|
29
|
+
except Exception:
|
|
30
|
+
return False
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def _ensure_mempalace_initialized(mem_dir: "Path") -> None:
|
|
34
|
+
"""Run ``mempalace init`` if the global palace has never been set up.
|
|
35
|
+
|
|
36
|
+
This is a no-op for existing installations so it is safe to call on every
|
|
37
|
+
startup / save.
|
|
38
|
+
"""
|
|
39
|
+
if _is_mempalace_initialized():
|
|
40
|
+
return
|
|
41
|
+
try:
|
|
42
|
+
import subprocess as _sp, sys as _sys
|
|
43
|
+
_sp.run(
|
|
44
|
+
[_sys.executable, "-X", "utf8", "-m", "mempalace", "init",
|
|
45
|
+
str(mem_dir), "--yes", "--no-llm"],
|
|
46
|
+
stdout=_sp.DEVNULL, stderr=_sp.DEVNULL,
|
|
47
|
+
env=_mempalace_env(),
|
|
48
|
+
creationflags=getattr(_sp, "CREATE_NO_WINDOW", 0),
|
|
49
|
+
check=False,
|
|
50
|
+
)
|
|
51
|
+
except Exception:
|
|
52
|
+
pass # best-effort; don't crash the UI on init failure
|
|
53
|
+
|
|
54
|
+
|
|
16
55
|
# ── Tool implementations ───────────────────────────────────────────────────
|
|
17
56
|
|
|
18
57
|
def _memory_save(params: dict, config: dict) -> str:
|
|
@@ -37,15 +76,15 @@ def _memory_save(params: dict, config: dict) -> str:
|
|
|
37
76
|
# mempalace skips already-filed files, so only the new MD gets indexed.
|
|
38
77
|
if config.get("mem_palace", True) and scope == "user":
|
|
39
78
|
try:
|
|
40
|
-
import subprocess as _sp, sys as _sys
|
|
79
|
+
import subprocess as _sp, sys as _sys
|
|
41
80
|
from pathlib import Path as _Path
|
|
42
81
|
_mem_dir = _Path.home() / ".dulus" / "memory"
|
|
43
|
-
|
|
82
|
+
_ensure_mempalace_initialized(_mem_dir)
|
|
44
83
|
_sp.Popen(
|
|
45
84
|
[_sys.executable, "-X", "utf8", "-m", "mempalace", "mine",
|
|
46
85
|
str(_mem_dir), "--wing", "memory", "--agent", "dulus"],
|
|
47
86
|
stdout=_sp.DEVNULL, stderr=_sp.DEVNULL,
|
|
48
|
-
env=
|
|
87
|
+
env=_mempalace_env(),
|
|
49
88
|
creationflags=getattr(_sp, "CREATE_NO_WINDOW", 0),
|
|
50
89
|
)
|
|
51
90
|
except Exception:
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "dulus"
|
|
7
|
-
version = "0.2.
|
|
7
|
+
version = "0.2.38"
|
|
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"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|