Commit 9e80808
* feat: add ha_mcp_tools sync-read WS capabilities and info timezone
Adds six in-process ha_mcp_tools/* commands behind the #1812 capability seam
(component side only): config_entries, registry_lookup, system_snapshot,
entity_lookup, backup_prep, registries. Each follows the existing pattern
(WS constant, voluptuous schema, _command_specs row, CAPABILITIES entry,
pure _do_* handler with an optional async prep).
config_entries emits the config_entries/get row shape, scrubs resolved
!secret values from options, and never reads entry.data; registry_lookup
returns EVERY entity of a config entry (not the single-valued index);
system_snapshot reads its four health slices in one synchronous pass;
registries rows are full-field and byte-compatible with the
config/<x>_registry/list WS shapes (verified against core).
_do_info now reports hass.config.time_zone as an additive field, and the
server-side ComponentCaps caches it (nothing consumes it yet).
Component unit tests appended; component_api tests extended for timezone.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015FBYnVcu8ueWjeCfVTTDAc
* fix: add error_reason_translation_key/placeholders and num_subentries to config_entries row
The config_entries capability row omitted three fields core's config_entries/get
WS command passes through opaquely via ConfigEntry.as_json_fragment
(error_reason_translation_key, error_reason_translation_placeholders,
num_subentries), making the component response subtractive vs the legacy path.
Verified against home-assistant/core's config_entries.py: the first two are
plain instance attributes defaulting to None; num_subentries is computed
inline as len(entry.subentries), not a stored attribute.
* feat: add phase 2 async-prep component capabilities
Add five ha_mcp_tools component WS capabilities, all consumed later by the
server behind the capability handshake with legacy fallback:
- dashboards (list/get/search) — async _dashboards_prep does all lovelace
Store loads; list mirrors lovelace/dashboards/list + additive mode, get
returns a storage body (yaml_excluded status for YAML dashboards), search
walks storage dashboards' cards/sections capped at 200. YAML bodies never
emitted.
- services_list — REST /api/services reshape from async_get_all_descriptions
+ services translations, with a coarse superset filter the server refines.
- reference_data — the service index + entity-id universe the config
reference validator's build_service_index/build_entity_set consume.
- search_visibility — an optional visibility param on ha_mcp_tools/search;
_visibility_hidden_set mirrors the server's hidden_entity_ids resolver,
delegating the Assist dimension to core's async_should_expose, applied as a
hard exclude before counts/pagination so ha_search can drop its filter gate.
- server_entry — the component's own server config entry (entry_id/channel/
pip_spec), reading only the CONF_ENTRY_TYPE marker from entry.data.
Bump COMPONENT_VERSION and the manifest to 1.2.0.
* fix: reject scope-less category and target-less registry_lookup requests
Both were silently returning an empty result instead of signaling caller
error. registries now requires a non-empty category_scopes when "category"
is requested, and registry_lookup requires entity_ids or config_entry_id.
Both raise HomeAssistantError (mirroring _do_backup_prep) rather than
voluptuous, since a flat schema can't express these cross-field rules.
* feat: route ha_get_integration through the config_entries component capability
Serve a config entry's identity, its already-materialized options (raw
persisted, secret-scrubbed), and its subentries from one ha_mcp_tools/
config_entries frame, replacing the REST list-all get, the per-entry
OptionsFlow start/abort probe, and the subentries WS call. include_schema /
include_subentry_schema stay on the legacy live flow (a schema only exists in an
open flow); the component's raw options are kept over the flow-derived shape.
Falls back to the legacy path on any capability miss / downgrade / command
error, per the standard routing taxonomy.
* fix: guarantee options key on component-served integration entries
Mirror the legacy path's entry.setdefault("options", {}) on the
component path so a (theoretical) options-less component row can't
produce a missing key. Also note that the options-shape caveat test
compares against a synthetic flow dict, not a real live flow.
* feat: route helper delete/create entity resolution through registry_lookup
Consume the component's registry_lookup capability from the helper
delete/create paths, adding component_registry.py as the caps-gated seam
(mirroring component_devices.py).
- _delete_simple_helper: when registry_lookup is advertised, resolve the
unique_id with ONE registry_lookup(entity_ids=[id]) read instead of the
3-attempt exponential-backoff config/entity_registry/get loop. An
in-process read has no WS-timing race, so the retry loop (and its sleeps)
is skipped; on capability miss / component error the legacy loop runs
unchanged. The {type}/delete calls, both fallbacks, and the exact
NOT_FOUND vs SERVICE_CALL_FAILED classification are preserved.
- _get_entities_for_config_entry: one registry_lookup(config_entry_id=id)
read replaces the whole config/entity_registry/list dump (rows are the
byte-identical as_partial_dict shape, already scoped to the entry). This
covers both the flow-helper delete sub-entity collection and the
ha_config_set_helper post-create wait poll via the shared helper. The
component read runs inside the existing warnings-swallow guard so a WS
drop degrades identically to the legacy dump.
- _get_entry_id_for_flow_helper is left legacy (a single targeted
config/entity_registry/get, not a dump) — the brief permits either and
this keeps its error classification untouched.
Legacy paths are kept forever; component-less installs are unaffected.
* fix: path-accurate component resolve error detail and falsy unique_id coverage
* feat: route ha_manage_backup identity resolution through backup_prep component capability
create_backup and restore_backup each resolved the local backup agent and
default password via two sequential backup/agents/info + backup/config/info
WS calls. When the ha_mcp_tools component advertises backup_prep, one
in-process read now supplies both, falling back to the legacy sequential
calls on capability miss, unknown_command, or a non-fatal command error.
A component local_agent_id: None raises the same "no local agent" error the
legacy path does; a missing default_password preserves each call site's
existing behavior (create_backup raises, restore_backup warns and proceeds
without a safety backup). The backup/generate and backup/restore write path
is unchanged.
* fix: align component-path available_agents context with legacy shape
* feat: route ha_list_floors_areas and registry auto-backup reads through the component
ha_list_floors_areas fetched the area and floor registries via two
concurrent but independent WebSocket calls, leaving a TOCTOU window where a
registry change between the two reads could misclassify an area as
orphaned/unassigned. The auto-backup capture reads for label, category, and
area/floor each dumped a whole registry to find one entry.
Add a shared fetch_registries_via_component helper (src/ha_mcp/tools/component_registries.py)
that reads the ha_mcp_tools component's registries capability in one
in-process frame when available, with a legacy fallback otherwise. Wire it
into ha_list_floors_areas (closing the TOCTOU window with a single
consistent snapshot) and into backup_manager's _fetch_label / _fetch_category
/ _fetch_area_or_floor (lazy-imported to avoid the backup_manager/tools
import cycle, mirroring the existing _fetch_device pattern). _fetch_zone
and all _restore_* writes are unchanged.
* fix: validate component registry slice shapes and cover backup fetcher fallbacks
fetch_registries_via_component only checked that the outer result was a
dict, not that each requested slice (areas/floors/labels/categories) had
the expected shape. Add a shape guard mirroring the legacy path's
_require_list-style check (never raises; falls back to legacy on
mismatch). Also add routing tests for backup_manager's label/category/
area/floor fetchers falling back to legacy on caps-absent and
component-error conditions.
* feat: serve HA timezone from the ha_mcp_tools info handshake when available
ha_get_history and the logbook-source ha_get_logs localize timestamps via
add_timezone_metadata, which issued a fresh GET /api/config REST call on
every single call purely to read time_zone. _fetch_ha_timezone now consults
the cached ha_mcp_tools/info handshake (ComponentCaps.timezone) first; a
non-empty value is used directly with no REST call, falling back to the
unchanged legacy fetch when the component is absent, predates the field, or
reports it empty.
* test: stop history fixtures paying a real WS probe for component caps
_fetch_ha_timezone now calls get_component_caps(client) before falling
back to client.get_config(). test_tools_history.py's mock clients carry
a real-looking base_url/token without patching get_websocket_client, so
each affected test paid a real (failing) WS connection attempt on every
call — get_component_caps never caches a HomeAssistantConnectionError.
Patch get_websocket_client to raise deterministically so the tests fall
straight to their already-mocked legacy get_config path.
* test: pin allow-mode and deny-precedence visibility dimensions
* feat: route ha_get_system_health through the system_snapshot component capability
One ha_mcp_tools/system_snapshot read replaces the 3x config_entries/get
fetches (a TOCTOU across zwave_network/matter_network/dead_entities) plus the
repairs/list_issues and dead_entities registry/state fetches, threaded into
_fetch_repairs, _fetch_zwave_network, _fetch_matter_network, and
_fetch_dead_entities. All-or-nothing per call: a capability miss, command
error, or malformed slice falls back to every consuming section's own legacy
fetch.
* fix: explicit snapshot prefetch gate and propagation/dismissed coverage
_fetch_dead_entities now requires all three prefetched slices together
(states/registry/entries) rather than gating on prefetched_registry
alone, making the system_snapshot all-or-nothing invariant explicit in
the function instead of relying on the call site. Adds routing
coverage that a HomeAssistantConnectionError during the snapshot read
propagates rather than degrading to per-section legacy fallbacks, and
contract coverage that include_dismissed_repairs=True through the
prefetched-repairs path matches the legacy fetch.
* feat: route find_server_config_entry through the server_entry capability
When the ha_mcp_tools component advertises server_entry, one in-process
read identifies the server config entry directly instead of probing every
ha_mcp_tools-domain entry's options flow for the pip_spec schema shape.
Exactly one options flow is still opened (for the identified entry) since
ha_dev_manage_server submits it; current_options is built from that flow's
own schema so the preserved-option-keys resend logic is unaffected. Capability
miss, command errors, or a failure to open the identified entry's flow fall
back to the unchanged legacy per-candidate probe loop.
* fix: shared flow-fields helper and empty entry_id handling for server_entry path
Factors the duplicated flow-schema-to-fields-dict derivation in
_open_server_entry_flow and find_server_config_entry's legacy probe loop
into one _fields_from_flow_schema helper, and makes
_fetch_server_entry_via_component treat an empty-string entry_id as a
component miss (falls back to the legacy probe) rather than trusting it
as the authoritative "no entry" verdict that only a real None means.
* feat: route ha_list_services through the services_list component capability
Threads domain (not query) to ha_mcp_tools/services_list so one component
frame replaces the legacy REST get_services() + WS frontend/get_translations
pair; _process_services still runs unchanged and does the exact query
filtering server-side. query is deliberately kept off the wire call: the
component's coarse query filter can drop a domain from the payload entirely,
but _process_services's domains field is gated only by domain_filter, so a
query-trimmed payload would silently list fewer domains than legacy.
* test: correct the query-forwarding parity narrative in services_list contract docstring
* feat: route ha_search through the component under an active visibility filter
An active entity-visibility filter previously forced ha_search onto the legacy
path unconditionally, since a plain `search` component applies no filtering and
would leak hidden entities. The `search_visibility` capability closes that gap: a
component that advertises it accepts the serialized hide config (new
`VisibilityConfig.to_wire`) as the `search` `visibility` param and excludes hidden
entities before its own counts/pagination, so a visibility-active install can now
take the fast path too.
Gate matrix (only entered when the component advertises `search`):
- filter inactive -> component, no `visibility` param (old components unaffected)
- filter active + `search_visibility` -> component WITH the serialized config
- filter active without the capability -> legacy (unchanged)
- config unloadable -> fail-closed to legacy (never route unfiltered)
The config load reuses the memoized local read (`load_visibility_wire`); no
hide-set is precomputed server-side and no Assist exposure is fetched on this path
(the component's in-process `async_should_expose` handles it). ha_get_overview is
unchanged. Adds a routing suite and a cross-seam contract suite asserting the
component-filtered surviving set equals the legacy resolver's over identical
fixtures for every hide dimension (category, hidden, deny, area incl.
device-inherited, label, allow-mode, assist) and the include_hidden interaction.
* refactor: single visibility config load on the component search path
* feat: route dashboard reads through the dashboards component capability
Consume the ha_mcp_tools/dashboards capability for the dashboard read
surface (Global-Constraint-2 idiom): fetch_dashboards_list, the get-mode
config read, _verify_config_unchanged, and the auto-backup capture prefer
one in-process component frame and fall back to the legacy lovelace WS
reads. list rows are filtered to storage-only to match legacy; a
yaml_excluded / not_found / unavailable component response falls back
per call.
Add a cross-dashboard search mode (mode="search", query=) that answers
"which dashboards contain this entity/card". It works component-less via
a server-side walk that is a byte-for-byte port of the component walk, so
both paths return identical matches.
All writes (lovelace/config/save, dashboards/delete/create/update) are
unchanged.
* test: pin dashboard search asymmetry, truncation, and icon-shape parity
Adds a docstring caveat for the component-less default-dashboard search
exclusion, plus contract tests for case-insensitive search, the 200-match
truncation cap, the default-dashboard search asymmetry, and the icon-less
list-row shape divergence between the component and legacy paths.
* feat: route automation/scene resolvers + reference validator through component
Add entity_lookup + reference_data consumers for issue #1813 Phase 2. Three
set/remove/post-write consumers pay for a whole-collection fetch to answer a
single question and now route through the ha_mcp_tools component when it
advertises the capability, falling back to the legacy path otherwise:
- ConfigSceneTools._resolve_scene_entity_id and
AutomationConfigTools._resolve_automation_entity_id gain an allow_component
flag (set/remove/post-write call sites only) that routes one entity_lookup
frame in place of the whole entity-registry dump (scene) / get_states scan
(automation). The scene path drops its 0.2s sleep + retry — the in-process
read is authoritative on return.
- validate_config_references routes one reference_data frame in place of
gather(get_services, get_states); build_service_index / build_entity_set
consume the payload unchanged.
The automation/script/scene config-get tools keep making ZERO component calls:
the resolvers gate the whole component branch (caps probe included) behind
allow_component, which the get paths never pass. TestConfigGetSeam still passes
unmodified. A new component_config_reads module owns the caps-gated fetch +
error taxonomy (unknown_command invalidates caps, command errors fall back,
connection errors propagate) so the routing discipline lives in one place.
New tests: test_ha_config_resolvers_component_routing (routing taxonomy per
consumer) and test_component_entity_lookup_contract (real _do_entity_lookup /
_do_reference_data driven through the real consumers — multi-platform unique_id
collision, automation unique_id==config-id equivalence, reference-warning parity
with the legacy path). Existing legacy-path tool tests are made credential-less
so the component gate short-circuits to the path they pin.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015FBYnVcu8ueWjeCfVTTDAc
* fix: absorb registration lag on component scene resolve and restore validator exception surface
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015FBYnVcu8ueWjeCfVTTDAc
* test: deterministic exception stubs and caps-probe isolation for full-suite runs
Pin homeassistant.exceptions to the file's stub per-test in
test_component_ws_search.py so registry_lookup/backup_prep/registries raise
assertions don't depend on module collection order, and mirror
test_tools_history.py's caps-probe fixture in test_tools_utility_log_order.py
so the logbook path's timezone-caps probe can't attempt a real WS connection.
* refactor: disambiguate registry helper module names and close review test gaps
- Rename component_registry.py to component_registry_lookup.py so its
filename matches its capability (registry_lookup) and no longer
collides with component_registries.py at a glance.
- Add a malformed-params rejection test for the server_entry schema.
- Add the missing unknown_command-invalidates and
HomeAssistantConnectionError-propagates fallback tests for the
search_visibility routing path.
* fix: address PR #1902 CI round 1 (format, hassfest deps, typing, section-flattened options)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015FBYnVcu8ueWjeCfVTTDAc
* fix: address Codex review findings on PR #1902 (yaml dashboard parity, empty entry_id, rest-legacy fallbacks)
- Keep YAML dashboards' metadata rows in dashboards list results on both the
component and legacy paths (listing metadata is safe; bodies stay excluded).
- Skip mode="yaml" rows in the component-less legacy search walk so a YAML
Lovelace config's resolved !secret is never fetched into a match.
- Treat an empty-string entry_id as a single-entry lookup for a nonexistent id
(entries: []) in the component config_entries handler, not list mode.
- On a scene resolve, when the component recheck returns None (component gone
mid-retry), fall back to the legacy list+retry resolver instead of the naive
scene.{scene_id} guess; only an authoritative empty goes to the naive guess.
- For ha_list_services and ha_get_integration only, catch
HomeAssistantConnectionError from the component fetch and fall back to their
REST legacy paths (their legacy is REST, not the shared pooled WS).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015FBYnVcu8ueWjeCfVTTDAc
* fix: address Codex round-2 findings (fail-closed dashboard walk, transport fallbacks, force_reload, visibility warnings)
* fix: correct dashboard mode provenance and drop the dead yaml-mode constant
Core's schemas stamp mode on every lovelace/dashboards/list row (storage
items default it, YAML entries require it) — the fail-closed storage-only
walk stays, but the untagged case is legacy-era storage items, not every
component-less row. Removes _DASHBOARD_YAML_MODE, dead after the flip.
* fix: component-side review fixes (read-only assist, walk coverage, entry fields, schema tightening)
* fix: server-side review fixes (repairs active filter, walk parity, radio entries routing, dashboard search guards)
* fix: uniform transport fallback across component fetch helpers and transient-negative caps cache
Every component fetch helper now applies one taxonomy: a HomeAssistantConnectionError
off send_command AND the plain Exception get_websocket_client() raises when
WebSocketManager can't build the pooled socket are caught and routed to the legacy
path (return None, or inline-legacy + warning for search/overview/zones/helpers),
never propagated. Six reviews proved the "legacy shares the socket and fails
identically" premise false for every consumer (swallowing send_websocket_message
bridge / REST / dedicated one-shot capture socket / dedicated health WS), so an
escaping transport error could abort a landed write, block an auto-backup-wrapped
write, or fail a whole tool the legacy path would have served. Docstrings rewritten
to the honest per-consumer rationale.
Add a short-TTL (30s) transient-negative caps cache in component_api so a WS-broken
install stops re-paying the slow connect on every tool call, self-healing past the
window; kept independent from the 300s absent-negative.
Convert the component accessor drift guards (_do_entity_lookup / _do_registries /
_do_reference_data / _fetch_service_descriptions) to raise HomeAssistantError on an
unavailable core substrate (None registry / non-Mapping services) so the server
falls back to legacy, instead of serving a well-formed empty it would trust as
authoritative; a present-but-empty substrate still returns empty.
Invert every connection-error-propagates routing test to pin fallback, add
establish-failure fallback tests via patch_ws_establish_failure across the helper
suites, and add caps transient-cache + drift-guard component tests.
* test: align gate probes and seam-error conversion with the uniform transport taxonomy
* fix: satisfy format and typing gates on the transport-sweep additions
* fix: resolve CodeQL findings on the review-wave additions
---------
Co-authored-by: kingpanther13 <kingpanther13@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
1 parent 017e44b commit 9e80808
71 files changed
Lines changed: 17979 additions & 411 deletions
File tree
- custom_components/ha_mcp_tools
- src/ha_mcp
- tools
- radio
- visibility
- tests/src/unit
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
24 | 24 | | |
25 | 25 | | |
26 | 26 | | |
27 | | - | |
| 27 | + | |
28 | 28 | | |
29 | 29 | | |
30 | 30 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2 | 2 | | |
3 | 3 | | |
4 | 4 | | |
5 | | - | |
| 5 | + | |
6 | 6 | | |
7 | | - | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
8 | 10 | | |
9 | 11 | | |
10 | 12 | | |
| |||
19 | 21 | | |
20 | 22 | | |
21 | 23 | | |
22 | | - | |
| 24 | + | |
23 | 25 | | |
Large diffs are not rendered by default.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1296 | 1296 | | |
1297 | 1297 | | |
1298 | 1298 | | |
1299 | | - | |
1300 | | - | |
1301 | | - | |
1302 | | - | |
| 1299 | + | |
| 1300 | + | |
| 1301 | + | |
| 1302 | + | |
| 1303 | + | |
| 1304 | + | |
| 1305 | + | |
1303 | 1306 | | |
1304 | 1307 | | |
1305 | 1308 | | |
1306 | 1309 | | |
| 1310 | + | |
1307 | 1311 | | |
1308 | 1312 | | |
1309 | 1313 | | |
| |||
1329 | 1333 | | |
1330 | 1334 | | |
1331 | 1335 | | |
| 1336 | + | |
| 1337 | + | |
| 1338 | + | |
| 1339 | + | |
| 1340 | + | |
| 1341 | + | |
1332 | 1342 | | |
1333 | 1343 | | |
1334 | 1344 | | |
| |||
1442 | 1452 | | |
1443 | 1453 | | |
1444 | 1454 | | |
1445 | | - | |
1446 | | - | |
1447 | | - | |
1448 | | - | |
| 1455 | + | |
| 1456 | + | |
| 1457 | + | |
| 1458 | + | |
| 1459 | + | |
| 1460 | + | |
| 1461 | + | |
| 1462 | + | |
| 1463 | + | |
| 1464 | + | |
| 1465 | + | |
| 1466 | + | |
| 1467 | + | |
| 1468 | + | |
| 1469 | + | |
1449 | 1470 | | |
1450 | 1471 | | |
1451 | 1472 | | |
| |||
1466 | 1487 | | |
1467 | 1488 | | |
1468 | 1489 | | |
1469 | | - | |
1470 | | - | |
1471 | | - | |
1472 | | - | |
1473 | | - | |
| 1490 | + | |
| 1491 | + | |
| 1492 | + | |
| 1493 | + | |
| 1494 | + | |
| 1495 | + | |
1474 | 1496 | | |
| 1497 | + | |
| 1498 | + | |
| 1499 | + | |
| 1500 | + | |
| 1501 | + | |
| 1502 | + | |
| 1503 | + | |
| 1504 | + | |
| 1505 | + | |
1475 | 1506 | | |
1476 | 1507 | | |
1477 | 1508 | | |
| |||
1607 | 1638 | | |
1608 | 1639 | | |
1609 | 1640 | | |
| 1641 | + | |
| 1642 | + | |
| 1643 | + | |
1610 | 1644 | | |
1611 | | - | |
1612 | | - | |
1613 | | - | |
1614 | | - | |
| 1645 | + | |
| 1646 | + | |
| 1647 | + | |
| 1648 | + | |
| 1649 | + | |
| 1650 | + | |
| 1651 | + | |
| 1652 | + | |
1615 | 1653 | | |
1616 | 1654 | | |
1617 | 1655 | | |
1618 | 1656 | | |
1619 | | - | |
1620 | | - | |
1621 | | - | |
1622 | | - | |
| 1657 | + | |
| 1658 | + | |
| 1659 | + | |
| 1660 | + | |
| 1661 | + | |
| 1662 | + | |
| 1663 | + | |
| 1664 | + | |
1623 | 1665 | | |
1624 | 1666 | | |
1625 | 1667 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
30 | 30 | | |
31 | 31 | | |
32 | 32 | | |
33 | | - | |
34 | | - | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
35 | 40 | | |
36 | 41 | | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
37 | 48 | | |
38 | 49 | | |
39 | 50 | | |
| |||
89 | 100 | | |
90 | 101 | | |
91 | 102 | | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
92 | 106 | | |
93 | 107 | | |
94 | 108 | | |
| |||
217 | 231 | | |
218 | 232 | | |
219 | 233 | | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
| 255 | + | |
| 256 | + | |
| 257 | + | |
| 258 | + | |
| 259 | + | |
| 260 | + | |
| 261 | + | |
| 262 | + | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
| 268 | + | |
| 269 | + | |
| 270 | + | |
| 271 | + | |
| 272 | + | |
| 273 | + | |
| 274 | + | |
| 275 | + | |
| 276 | + | |
| 277 | + | |
| 278 | + | |
| 279 | + | |
| 280 | + | |
| 281 | + | |
| 282 | + | |
| 283 | + | |
| 284 | + | |
| 285 | + | |
| 286 | + | |
| 287 | + | |
| 288 | + | |
| 289 | + | |
| 290 | + | |
| 291 | + | |
| 292 | + | |
| 293 | + | |
| 294 | + | |
| 295 | + | |
| 296 | + | |
| 297 | + | |
| 298 | + | |
| 299 | + | |
| 300 | + | |
| 301 | + | |
| 302 | + | |
| 303 | + | |
| 304 | + | |
| 305 | + | |
| 306 | + | |
| 307 | + | |
| 308 | + | |
| 309 | + | |
| 310 | + | |
| 311 | + | |
| 312 | + | |
| 313 | + | |
| 314 | + | |
| 315 | + | |
| 316 | + | |
| 317 | + | |
| 318 | + | |
220 | 319 | | |
221 | 320 | | |
222 | 321 | | |
| |||
530 | 629 | | |
531 | 630 | | |
532 | 631 | | |
533 | | - | |
534 | | - | |
| 632 | + | |
| 633 | + | |
| 634 | + | |
| 635 | + | |
| 636 | + | |
| 637 | + | |
| 638 | + | |
| 639 | + | |
| 640 | + | |
| 641 | + | |
| 642 | + | |
| 643 | + | |
| 644 | + | |
535 | 645 | | |
536 | | - | |
537 | | - | |
538 | | - | |
539 | | - | |
| 646 | + | |
| 647 | + | |
| 648 | + | |
| 649 | + | |
540 | 650 | | |
541 | 651 | | |
542 | 652 | | |
| |||
768 | 878 | | |
769 | 879 | | |
770 | 880 | | |
771 | | - | |
772 | | - | |
773 | | - | |
774 | | - | |
| 881 | + | |
| 882 | + | |
| 883 | + | |
| 884 | + | |
| 885 | + | |
| 886 | + | |
| 887 | + | |
| 888 | + | |
| 889 | + | |
| 890 | + | |
| 891 | + | |
| 892 | + | |
| 893 | + | |
| 894 | + | |
| 895 | + | |
| 896 | + | |
| 897 | + | |
| 898 | + | |
| 899 | + | |
| 900 | + | |
| 901 | + | |
| 902 | + | |
| 903 | + | |
775 | 904 | | |
776 | | - | |
777 | | - | |
778 | | - | |
779 | | - | |
780 | | - | |
781 | | - | |
782 | | - | |
783 | | - | |
| 905 | + | |
| 906 | + | |
| 907 | + | |
| 908 | + | |
| 909 | + | |
| 910 | + | |
| 911 | + | |
| 912 | + | |
784 | 913 | | |
785 | 914 | | |
786 | 915 | | |
| |||
0 commit comments