agentx-python 0.8.17__tar.gz → 0.8.19__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.
- {agentx_python-0.8.17/agentx_python.egg-info → agentx_python-0.8.19}/PKG-INFO +1 -1
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/monitor/client.py +13 -6
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/monitor/patterns.py +4 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/monitor/scorer_groups.py +2 -2
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/monitor/sessions.py +3 -2
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/tracing/tracer.py +68 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/version.py +2 -2
- {agentx_python-0.8.17 → agentx_python-0.8.19/agentx_python.egg-info}/PKG-INFO +1 -1
- {agentx_python-0.8.17 → agentx_python-0.8.19}/tests/test_selfhost_analysis_fallback.py +6 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/tests/test_span_tree.py +16 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/LICENSE +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/README.md +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/__init__.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/agentx.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/cli.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/evaluations/__init__.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/evaluations/_term.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/evaluations/adapters/__init__.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/evaluations/adapters/http_endpoint.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/evaluations/adapters/precomputed.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/evaluations/adapters/raw.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/evaluations/client.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/evaluations/datasets.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/evaluations/evaluation_settings.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/evaluations/models.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/evaluations/prompts.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/evaluations/reporting.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/evaluations/results.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/evaluations/runner.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/evaluations/tool_schemas.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/evaluations/tracing.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/exceptions.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/export.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/feedback.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/integrations/__init__.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/integrations/_traced_call.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/integrations/anthropic.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/integrations/autogen.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/integrations/crewai.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/integrations/databricks.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/integrations/google_adk.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/integrations/google_genai.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/integrations/langchain.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/integrations/litellm.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/integrations/llamaindex.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/integrations/moveworks.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/integrations/openai.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/integrations/openai_agents.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/monitor/__init__.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/monitor/agents.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/monitor/improvement_groups.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/monitor/judge_scorers.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/monitor/models.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/monitor/online_evaluators.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/monitor/profile.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/monitor/review_queue.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/monitor/rules.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/monitor/scorers.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/monitor/signals.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/outcomes.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/projects.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/py.typed +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/resources/__init__.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/resources/agent.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/resources/conversation.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/resources/workforce.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/testing.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/traces.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/tracing/__init__.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/tracing/ci_types.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/tracing/eval_scope.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/tracing/framework_detect.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/tracing/ingest_client.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx/util.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx_python.egg-info/SOURCES.txt +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx_python.egg-info/dependency_links.txt +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx_python.egg-info/entry_points.txt +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx_python.egg-info/not-zip-safe +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx_python.egg-info/requires.txt +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/agentx_python.egg-info/top_level.txt +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/setup.cfg +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/setup.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/tests/test_cli_launcher.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/tests/test_deep_dive_fixes.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/tests/test_docs_match_sdk.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/tests/test_eval_scope.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/tests/test_framework_detect.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/tests/test_integration.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/tests/test_integrations.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/tests/test_judge_scorers.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/tests/test_multi_judge.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/tests/test_pairwise.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/tests/test_review_queue.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/tests/test_runner_features.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/tests/test_selfhost_compat.py +0 -0
- {agentx_python-0.8.17 → agentx_python-0.8.19}/tests/test_testing.py +0 -0
|
@@ -187,10 +187,17 @@ class MonitorClient:
|
|
|
187
187
|
return self._base_url[: -len(suffix)]
|
|
188
188
|
return self._base_url
|
|
189
189
|
|
|
190
|
-
def _request(
|
|
190
|
+
def _request(
|
|
191
|
+
self, method: str, path: str, timeout: int = 30, base: Optional[str] = None, retry: bool = True, **kwargs
|
|
192
|
+
) -> Any:
|
|
193
|
+
# retry=False for non-idempotent judge-spending POSTs (sweep, coherence, portability,
|
|
194
|
+
# tuning): a client-side timeout must not fire the same LLM-billing work a second time
|
|
195
|
+
# while the first invocation is still running server-side. Same precedent as
|
|
196
|
+
# EvaluationsClient._request / analyze_run.
|
|
191
197
|
url = f"{base or self._base_url}{path}"
|
|
192
198
|
last_exc: Optional[Exception] = None
|
|
193
|
-
|
|
199
|
+
schedule = [0.0] + _RETRY_BACKOFF if retry else [0.0]
|
|
200
|
+
for attempt, wait in enumerate(schedule):
|
|
194
201
|
if wait:
|
|
195
202
|
time.sleep(wait)
|
|
196
203
|
try:
|
|
@@ -204,7 +211,7 @@ class MonitorClient:
|
|
|
204
211
|
raise AgentXAuthError("Invalid or missing API key")
|
|
205
212
|
if resp.status_code == 422:
|
|
206
213
|
raise AgentXValidationError(resp.text)
|
|
207
|
-
if resp.status_code in _RETRYABLE_STATUS and attempt < _MAX_RETRIES - 1:
|
|
214
|
+
if retry and resp.status_code in _RETRYABLE_STATUS and attempt < _MAX_RETRIES - 1:
|
|
208
215
|
logger.debug(
|
|
209
216
|
"Retryable status %d (attempt %d)", resp.status_code, attempt + 1
|
|
210
217
|
)
|
|
@@ -421,7 +428,7 @@ class MonitorClient:
|
|
|
421
428
|
button. Raises AgentXMonitorError if the engine has no judge key configured."""
|
|
422
429
|
data = self._request(
|
|
423
430
|
"POST", f"/agent-monitoring/sessions/{session_id}/coherence-check",
|
|
424
|
-
base=self._api_root(), timeout=180,
|
|
431
|
+
base=self._api_root(), timeout=180, retry=False,
|
|
425
432
|
)
|
|
426
433
|
return data.get("score", data) if isinstance(data, dict) else data
|
|
427
434
|
|
|
@@ -444,7 +451,7 @@ class MonitorClient:
|
|
|
444
451
|
engines run this automatically every minute; the manual trigger exists for demos,
|
|
445
452
|
tests, and backfills. Returns ``{"judged": n}``."""
|
|
446
453
|
return self._request(
|
|
447
|
-
"POST", "/agent-monitoring/session-sweep/run", base=self._api_root(), timeout=300
|
|
454
|
+
"POST", "/agent-monitoring/session-sweep/run", base=self._api_root(), timeout=300, retry=False
|
|
448
455
|
)
|
|
449
456
|
|
|
450
457
|
# ------------------------------------------------------------------
|
|
@@ -457,7 +464,7 @@ class MonitorClient:
|
|
|
457
464
|
plus judging, so expect tens of seconds."""
|
|
458
465
|
return self._request(
|
|
459
466
|
"POST", f"/agent-monitoring/traces/{trace_id}/portability",
|
|
460
|
-
base=self._api_root(), json={"modelIds": model_ids}, timeout=300,
|
|
467
|
+
base=self._api_root(), json={"modelIds": model_ids}, timeout=300, retry=False,
|
|
461
468
|
)
|
|
462
469
|
|
|
463
470
|
# ------------------------------------------------------------------
|
|
@@ -114,6 +114,10 @@ class MonitorPatternClient:
|
|
|
114
114
|
agent_ids=agent_ids,
|
|
115
115
|
)
|
|
116
116
|
|
|
117
|
+
def delete(self, pattern_id: str) -> None:
|
|
118
|
+
"""Delete a pattern. Its historical signals remain as history."""
|
|
119
|
+
self._client._request("DELETE", f"/agent-monitoring/patterns/{pattern_id}", base=self._client._api_root())
|
|
120
|
+
|
|
117
121
|
def get(self, pattern_id: str) -> MonitorPattern:
|
|
118
122
|
return self._client.get_pattern(pattern_id)
|
|
119
123
|
|
|
@@ -67,8 +67,8 @@ class ScorerGroupsClient:
|
|
|
67
67
|
"""``members``: [{"kind": "judge"|"pattern"|"custom", "refId": ..., "weight": 1, "gate": False}].
|
|
68
68
|
``online``: {"enabled": True, "sampleRate": 0.1, "alertThreshold": 5, "severity": "medium"}.
|
|
69
69
|
Add ``"scope": "session", "idleSeconds": 120`` to score whole multi-turn sessions once
|
|
70
|
-
idle, instead of each sampled trace.
|
|
71
|
-
|
|
70
|
+
idle, instead of each sampled trace. Pass ``online=None`` (the default) for a group
|
|
71
|
+
that only grades offline dataset runs."""
|
|
72
72
|
payload: Dict[str, Any] = {"name": name, "members": members}
|
|
73
73
|
if description is not None:
|
|
74
74
|
payload["description"] = description
|
|
@@ -22,8 +22,9 @@ class MonitorSessionClient:
|
|
|
22
22
|
|
|
23
23
|
def scores(self, session_id: str) -> List[dict]:
|
|
24
24
|
"""Session-level verdicts, newest first. ``kind`` says who scored: a session-scoped
|
|
25
|
-
online evaluator (``online-eval:<id>``)
|
|
26
|
-
(``scorer-group:<id>``)
|
|
25
|
+
online evaluator (``online-eval:<id>``), a session-scoped scorer group
|
|
26
|
+
(``scorer-group:<id>``), or legacy ``"coherence"`` rows written before the Session
|
|
27
|
+
Baseline Judge existed - branch defensively on unknown kinds."""
|
|
27
28
|
return self._client.list_session_scores(session_id)
|
|
28
29
|
|
|
29
30
|
def run_sweep(self) -> dict:
|
|
@@ -581,6 +581,14 @@ class _RetrievalRecorder:
|
|
|
581
581
|
self.output: Any = None
|
|
582
582
|
|
|
583
583
|
|
|
584
|
+
class _MemoryOpRecorder:
|
|
585
|
+
"""Handle yielded by ``Tracer.trace_memory()`` - set ``output`` (what was recalled or
|
|
586
|
+
stored) inside the block."""
|
|
587
|
+
|
|
588
|
+
def __init__(self) -> None:
|
|
589
|
+
self.output: Any = None
|
|
590
|
+
|
|
591
|
+
|
|
584
592
|
class _ToolCallRecorder:
|
|
585
593
|
"""Handle yielded by ``Tracer.trace_tool_call()`` - set ``output`` inside the block.
|
|
586
594
|
``success``/``error`` may be set manually; an exception escaping the block sets them
|
|
@@ -832,6 +840,66 @@ class Tracer:
|
|
|
832
840
|
span_kind="retrieval",
|
|
833
841
|
)
|
|
834
842
|
|
|
843
|
+
def record_memory(
|
|
844
|
+
self,
|
|
845
|
+
name: str = "Memory",
|
|
846
|
+
*,
|
|
847
|
+
operation: Optional[str] = None,
|
|
848
|
+
query: Optional[str] = None,
|
|
849
|
+
output: Any = None,
|
|
850
|
+
duration_ms: Optional[float] = None,
|
|
851
|
+
start_time: Optional[float] = None,
|
|
852
|
+
end_time: Optional[float] = None,
|
|
853
|
+
) -> None:
|
|
854
|
+
"""
|
|
855
|
+
Manually record a long-term-memory operation (a Mem0/Zep/Letta-style recall or store)
|
|
856
|
+
as a ``span_kind="memory"`` child span of the active span. ``operation`` is free text -
|
|
857
|
+
conventionally ``"read"`` or ``"write"`` - carried in the span's metadata; the kind
|
|
858
|
+
itself stays one value so dashboards and scorers can select all memory activity at once.
|
|
859
|
+
Deliberately NOT a retrieval: retrieval spans feed the RAG judges' ``{context}``
|
|
860
|
+
(knowledge grounding), while memory is recalled state - see the engine's spanKind.ts.
|
|
861
|
+
"""
|
|
862
|
+
active_span = self.current_span
|
|
863
|
+
if active_span is None:
|
|
864
|
+
return
|
|
865
|
+
active_span.child_span(
|
|
866
|
+
name,
|
|
867
|
+
start_time=start_time,
|
|
868
|
+
end_time=end_time,
|
|
869
|
+
duration_ms=duration_ms,
|
|
870
|
+
input=query,
|
|
871
|
+
output=output,
|
|
872
|
+
metadata={"kind": "memory", **({"operation": operation} if operation else {})},
|
|
873
|
+
span_kind="memory",
|
|
874
|
+
)
|
|
875
|
+
|
|
876
|
+
@contextmanager
|
|
877
|
+
def trace_memory(
|
|
878
|
+
self, name: str = "Memory", *, operation: Optional[str] = None, query: Optional[str] = None
|
|
879
|
+
) -> Iterator["_MemoryOpRecorder"]:
|
|
880
|
+
"""
|
|
881
|
+
Context manager that times a memory operation and records it via
|
|
882
|
+
:meth:`record_memory` on exit::
|
|
883
|
+
|
|
884
|
+
with tracer.trace_memory("user prefs", operation="read", query=user_id) as m:
|
|
885
|
+
m.output = memory.search(user_id, question)
|
|
886
|
+
"""
|
|
887
|
+
start_t = time.time()
|
|
888
|
+
recorder = _MemoryOpRecorder()
|
|
889
|
+
try:
|
|
890
|
+
yield recorder
|
|
891
|
+
finally:
|
|
892
|
+
end_t = time.time()
|
|
893
|
+
self.record_memory(
|
|
894
|
+
name,
|
|
895
|
+
operation=operation,
|
|
896
|
+
query=query,
|
|
897
|
+
output=recorder.output,
|
|
898
|
+
duration_ms=(end_t - start_t) * 1000,
|
|
899
|
+
start_time=start_t,
|
|
900
|
+
end_time=end_t,
|
|
901
|
+
)
|
|
902
|
+
|
|
835
903
|
@contextmanager
|
|
836
904
|
def trace_retrieval(self, name: str = "Retrieval", *, query: Optional[str] = None) -> Iterator["_RetrievalRecorder"]:
|
|
837
905
|
"""
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
VERSION = "0.8.
|
|
1
|
+
VERSION = "0.8.19"
|
|
2
2
|
|
|
3
3
|
# The AgentX-trace-eval release this SDK version is tested against - what `agentx-trace-eval`
|
|
4
4
|
# installs and converges to (see agentx/cli.py). Bump together with VERSION when releasing, so
|
|
5
5
|
# every published SDK names a known-good engine+dashboard pair. Users can override with
|
|
6
6
|
# AGENTX_TRACE_EVAL_VERSION=<tag|latest>.
|
|
7
|
-
ENGINE_VERSION = "v0.3.
|
|
7
|
+
ENGINE_VERSION = "v0.3.19"
|
|
@@ -217,6 +217,12 @@ def test_the_fallback_request_gets_the_long_analysis_timeout():
|
|
|
217
217
|
assert kwargs["timeout"] > 60, "a synchronous judge pass needs more than the 30s default"
|
|
218
218
|
assert kwargs["json"]["judges"] == [{"model": "gpt-5.6-luna"}]
|
|
219
219
|
|
|
220
|
+
# judges=None must OMIT the key - the engine then scores with its platform default model;
|
|
221
|
+
# injecting a hosted-only default (the old "gpt-5.5") produced uncallable judges.
|
|
222
|
+
client.analyze_run(RUN)
|
|
223
|
+
_, _, kwargs = session.calls[-1]
|
|
224
|
+
assert "judges" not in kwargs["json"]
|
|
225
|
+
|
|
220
226
|
|
|
221
227
|
# ---------------------------------------------------------------------------
|
|
222
228
|
# Only a 404 means "wrong engine"
|
|
@@ -594,6 +594,22 @@ def test_trace_tool_call_emits_real_child_span():
|
|
|
594
594
|
assert root["tool_calls"][0]["output"] == "digital purchases are final"
|
|
595
595
|
|
|
596
596
|
|
|
597
|
+
def test_trace_memory_emits_a_memory_kind_child_span():
|
|
598
|
+
tracer = make_tracer()
|
|
599
|
+
with tracer.trace("agent") as span:
|
|
600
|
+
with tracer.trace_memory("user prefs", operation="read", query="u-42") as m:
|
|
601
|
+
m.output = ["prefers window seats"]
|
|
602
|
+
|
|
603
|
+
wires = enqueued_wires(tracer)
|
|
604
|
+
child = wires[0]
|
|
605
|
+
assert child["name"] == "user prefs"
|
|
606
|
+
assert child["span_kind"] == "memory"
|
|
607
|
+
assert child["metadata"]["kind"] == "memory"
|
|
608
|
+
assert child["metadata"]["operation"] == "read"
|
|
609
|
+
assert child["input"] == "u-42"
|
|
610
|
+
assert child["output"] == ["prefers window seats"]
|
|
611
|
+
|
|
612
|
+
|
|
597
613
|
def test_trace_retrieval_emits_real_child_span():
|
|
598
614
|
tracer = make_tracer()
|
|
599
615
|
with tracer.trace("agent") as span:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|